mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-24 22:14:36 +02:00
Integrated shortcuts into adventure window configuration
This commit is contained in:
parent
0000541291
commit
019d7b6811
@ -4,6 +4,7 @@ set(client_SRCS
|
|||||||
|
|
||||||
adventureMap/CAdventureMapInterface.cpp
|
adventureMap/CAdventureMapInterface.cpp
|
||||||
adventureMap/CAdventureMapWidget.cpp
|
adventureMap/CAdventureMapWidget.cpp
|
||||||
|
adventureMap/AdventureMapShortcuts.cpp
|
||||||
adventureMap/CAdventureOptions.cpp
|
adventureMap/CAdventureOptions.cpp
|
||||||
adventureMap/CInGameConsole.cpp
|
adventureMap/CInGameConsole.cpp
|
||||||
adventureMap/CInfoBar.cpp
|
adventureMap/CInfoBar.cpp
|
||||||
@ -132,6 +133,7 @@ set(client_HEADERS
|
|||||||
|
|
||||||
adventureMap/CAdventureMapInterface.h
|
adventureMap/CAdventureMapInterface.h
|
||||||
adventureMap/CAdventureMapWidget.h
|
adventureMap/CAdventureMapWidget.h
|
||||||
|
adventureMap/AdventureMapShortcuts.h
|
||||||
adventureMap/CAdventureOptions.h
|
adventureMap/CAdventureOptions.h
|
||||||
adventureMap/CInGameConsole.h
|
adventureMap/CInGameConsole.h
|
||||||
adventureMap/CInfoBar.h
|
adventureMap/CInfoBar.h
|
||||||
|
351
client/adventureMap/AdventureMapShortcuts.cpp
Normal file
351
client/adventureMap/AdventureMapShortcuts.cpp
Normal file
@ -0,0 +1,351 @@
|
|||||||
|
/*
|
||||||
|
* AdventureMapShortcuts.cpp, part of VCMI engine
|
||||||
|
*
|
||||||
|
* Authors: listed in file AUTHORS in main folder
|
||||||
|
*
|
||||||
|
* License: GNU General Public License v2.0 or later
|
||||||
|
* Full text of license available in license.txt file, in main folder
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "StdInc.h"
|
||||||
|
#include "AdventureMapShortcuts.h"
|
||||||
|
|
||||||
|
#include "../windows/CKingdomInterface.h"
|
||||||
|
#include "../windows/CSpellWindow.h"
|
||||||
|
#include "../windows/CTradeWindow.h"
|
||||||
|
#include "../lobby/CSavingScreen.h"
|
||||||
|
|
||||||
|
#include "../gui/CGuiHandler.h"
|
||||||
|
#include "../gui/Shortcut.h"
|
||||||
|
#include "../CPlayerInterface.h"
|
||||||
|
#include "../PlayerLocalState.h"
|
||||||
|
#include "../CGameInfo.h"
|
||||||
|
#include "CAdventureMapInterface.h"
|
||||||
|
#include "CAdventureOptions.h"
|
||||||
|
#include "../windows/settings/SettingsMainWindow.h"
|
||||||
|
|
||||||
|
#include "../../CCallback.h"
|
||||||
|
#include "../../lib/CConfigHandler.h"
|
||||||
|
#include "../../lib/CGeneralTextHandler.h"
|
||||||
|
#include "../../lib/mapObjects/CGHeroInstance.h"
|
||||||
|
#include "../../lib/mapObjects/CGTownInstance.h"
|
||||||
|
#include "../../lib/CPathfinder.h"
|
||||||
|
|
||||||
|
AdventureMapShortcuts::AdventureMapShortcuts(CAdventureMapInterface & owner)
|
||||||
|
:owner(owner)
|
||||||
|
{}
|
||||||
|
|
||||||
|
std::map<EShortcut, std::function<void()>> AdventureMapShortcuts::getFunctors()
|
||||||
|
{
|
||||||
|
std::map<EShortcut, std::function<void()>> result = {
|
||||||
|
{ EShortcut::ADVENTURE_KINGDOM_OVERVIEW, [this]() { this->showOverview(); } },
|
||||||
|
{ EShortcut::NONE, [this]() { this->worldViewBack(); } },
|
||||||
|
{ EShortcut::NONE, [this]() { this->worldViewScale1x(); } },
|
||||||
|
{ EShortcut::NONE, [this]() { this->worldViewScale2x(); } },
|
||||||
|
{ EShortcut::NONE, [this]() { this->worldViewScale4x(); } },
|
||||||
|
{ EShortcut::ADVENTURE_TOGGLE_MAP_LEVEL, [this]() { this->switchMapLevel(); } },
|
||||||
|
{ EShortcut::ADVENTURE_QUEST_LOG, [this]() { this->showQuestlog(); } },
|
||||||
|
{ EShortcut::ADVENTURE_TOGGLE_SLEEP, [this]() { this->toggleSleepWake(); } },
|
||||||
|
{ EShortcut::ADVENTURE_SET_HERO_ASLEEP, [this]() { this->setHeroSleeping(); } },
|
||||||
|
{ EShortcut::ADVENTURE_SET_HERO_AWAKE, [this]() { this->setHeroAwake(); } },
|
||||||
|
{ EShortcut::ADVENTURE_MOVE_HERO, [this]() { this->moveHeroAlongPath(); } },
|
||||||
|
{ EShortcut::ADVENTURE_CAST_SPELL, [this]() { this->showSpellbook(); } },
|
||||||
|
{ EShortcut::ADVENTURE_GAME_OPTIONS, [this]() { this->adventureOptions(); } },
|
||||||
|
{ EShortcut::GLOBAL_OPTIONS, [this]() { this->systemOptions(); } },
|
||||||
|
{ EShortcut::ADVENTURE_NEXT_HERO, [this]() { this->nextHero(); } },
|
||||||
|
{ EShortcut::GAME_END_TURN, [this]() { this->endTurn(); } },
|
||||||
|
{ EShortcut::ADVENTURE_THIEVES_GUILD, [this]() { this->showThievesGuild(); } },
|
||||||
|
{ EShortcut::ADVENTURE_VIEW_SCENARIO, [this]() { this->showScenarioInfo(); } },
|
||||||
|
{ EShortcut::GAME_SAVE_GAME, [this]() { this->saveGame(); } },
|
||||||
|
{ EShortcut::GAME_LOAD_GAME, [this]() { this->loadGame(); } },
|
||||||
|
{ EShortcut::ADVENTURE_DIG_GRAIL, [this]() { this->digGrail(); } },
|
||||||
|
{ EShortcut::ADVENTURE_VIEW_PUZZLE, [this]() { this->viewPuzzleMap(); } },
|
||||||
|
{ EShortcut::ADVENTURE_VIEW_WORLD, [this]() { this->viewWorldMap(); } },
|
||||||
|
{ EShortcut::GAME_RESTART_GAME, [this]() { this->restartGame(); } },
|
||||||
|
{ EShortcut::ADVENTURE_VISIT_OBJECT, [this]() { this->visitObject(); } },
|
||||||
|
{ EShortcut::ADVENTURE_VIEW_SELECTED, [this]() { this->openObject(); } },
|
||||||
|
{ EShortcut::GLOBAL_CANCEL, [this]() { this->abortSpellcasting(); } },
|
||||||
|
{ EShortcut::GAME_OPEN_MARKETPLACE, [this]() { this->showMarketplace(); } },
|
||||||
|
{ EShortcut::ADVENTURE_NEXT_TOWN, [this]() { this->nextTown(); } },
|
||||||
|
// { EShortcut::ADVENTURE_NEXT_OBJECT, [this]() { this->nextObject(); } },
|
||||||
|
{ EShortcut::ADVENTURE_MOVE_HERO_SW, [this]() { this->moveHeroDirectional({-1, +1}); } },
|
||||||
|
{ EShortcut::ADVENTURE_MOVE_HERO_SS, [this]() { this->moveHeroDirectional({ 0, +1}); } },
|
||||||
|
{ EShortcut::ADVENTURE_MOVE_HERO_SE, [this]() { this->moveHeroDirectional({+1, +1}); } },
|
||||||
|
{ EShortcut::ADVENTURE_MOVE_HERO_WW, [this]() { this->moveHeroDirectional({-1, 0}); } },
|
||||||
|
{ EShortcut::ADVENTURE_MOVE_HERO_EE, [this]() { this->moveHeroDirectional({+1, 0}); } },
|
||||||
|
{ EShortcut::ADVENTURE_MOVE_HERO_NW, [this]() { this->moveHeroDirectional({-1, -1}); } },
|
||||||
|
{ EShortcut::ADVENTURE_MOVE_HERO_NN, [this]() { this->moveHeroDirectional({ 0, -1}); } },
|
||||||
|
{ EShortcut::ADVENTURE_MOVE_HERO_NE, [this]() { this->moveHeroDirectional({+1, -1}); } },
|
||||||
|
};
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::showOverview()
|
||||||
|
{
|
||||||
|
GH.pushIntT<CKingdomInterface>();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::worldViewBack()
|
||||||
|
{
|
||||||
|
owner.hotkeyExitWorldView();
|
||||||
|
|
||||||
|
auto hero = LOCPLINT->localState->getCurrentHero();
|
||||||
|
if (hero)
|
||||||
|
owner.centerOnObject(hero);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::worldViewScale1x()
|
||||||
|
{
|
||||||
|
// TODO set corresponding scale button to "selected" mode
|
||||||
|
owner.openWorldView(7);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::worldViewScale2x()
|
||||||
|
{
|
||||||
|
owner.openWorldView(11);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::worldViewScale4x()
|
||||||
|
{
|
||||||
|
owner.openWorldView(16);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::switchMapLevel()
|
||||||
|
{
|
||||||
|
// with support for future multi-level maps :)
|
||||||
|
int maxLevels = LOCPLINT->cb->getMapSize().z;
|
||||||
|
if (maxLevels < 2)
|
||||||
|
return;
|
||||||
|
|
||||||
|
owner.hotkeySwitchMapLevel();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::showQuestlog()
|
||||||
|
{
|
||||||
|
LOCPLINT->showQuestLog();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::toggleSleepWake()
|
||||||
|
{
|
||||||
|
const CGHeroInstance *h = LOCPLINT->localState->getCurrentHero();
|
||||||
|
if (!h)
|
||||||
|
return;
|
||||||
|
bool newSleep = !LOCPLINT->localState->isHeroSleeping(h);
|
||||||
|
|
||||||
|
if (newSleep)
|
||||||
|
LOCPLINT->localState->setHeroAsleep(h);
|
||||||
|
else
|
||||||
|
LOCPLINT->localState->setHeroAwaken(h);
|
||||||
|
|
||||||
|
owner.onHeroChanged(h);
|
||||||
|
|
||||||
|
if (newSleep)
|
||||||
|
nextHero();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::setHeroSleeping()
|
||||||
|
{
|
||||||
|
const CGHeroInstance *h = LOCPLINT->localState->getCurrentHero();
|
||||||
|
if (h)
|
||||||
|
{
|
||||||
|
LOCPLINT->localState->setHeroAsleep(h);
|
||||||
|
owner.onHeroChanged(h);
|
||||||
|
nextHero();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::setHeroAwake()
|
||||||
|
{
|
||||||
|
const CGHeroInstance *h = LOCPLINT->localState->getCurrentHero();
|
||||||
|
if (h)
|
||||||
|
{
|
||||||
|
LOCPLINT->localState->setHeroAsleep(h);
|
||||||
|
owner.onHeroChanged(h);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::moveHeroAlongPath()
|
||||||
|
{
|
||||||
|
const CGHeroInstance *h = LOCPLINT->localState->getCurrentHero();
|
||||||
|
if (!h || !LOCPLINT->localState->hasPath(h))
|
||||||
|
return;
|
||||||
|
|
||||||
|
LOCPLINT->moveHero(h, LOCPLINT->localState->getPath(h));
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::showSpellbook()
|
||||||
|
{
|
||||||
|
if (!LOCPLINT->localState->getCurrentHero()) //checking necessary values
|
||||||
|
return;
|
||||||
|
|
||||||
|
owner.centerOnObject(LOCPLINT->localState->getCurrentHero());
|
||||||
|
|
||||||
|
GH.pushIntT<CSpellWindow>(LOCPLINT->localState->getCurrentHero(), LOCPLINT, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::adventureOptions()
|
||||||
|
{
|
||||||
|
GH.pushIntT<CAdventureOptions>();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::systemOptions()
|
||||||
|
{
|
||||||
|
GH.pushIntT<SettingsMainWindow>();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::nextHero()
|
||||||
|
{
|
||||||
|
const auto * currHero = LOCPLINT->localState->getCurrentHero();
|
||||||
|
const auto * nextHero = LOCPLINT->localState->getNextWanderingHero(currHero);
|
||||||
|
|
||||||
|
if (nextHero)
|
||||||
|
{
|
||||||
|
LOCPLINT->localState->setSelection(nextHero);
|
||||||
|
owner.centerOnObject(nextHero);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::endTurn()
|
||||||
|
{
|
||||||
|
if(!LOCPLINT->makingTurn)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(settings["adventure"]["heroReminder"].Bool())
|
||||||
|
{
|
||||||
|
for(auto hero : LOCPLINT->localState->getWanderingHeroes())
|
||||||
|
{
|
||||||
|
if(!LOCPLINT->localState->isHeroSleeping(hero) && hero->movement > 0)
|
||||||
|
{
|
||||||
|
// Only show hero reminder if conditions met:
|
||||||
|
// - There still movement points
|
||||||
|
// - Hero don't have a path or there not points for first step on path
|
||||||
|
LOCPLINT->localState->verifyPath(hero);
|
||||||
|
|
||||||
|
if(!LOCPLINT->localState->hasPath(hero))
|
||||||
|
{
|
||||||
|
LOCPLINT->showYesNoDialog( CGI->generaltexth->allTexts[55], [this](){ owner.hotkeyEndingTurn(); }, nullptr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto path = LOCPLINT->localState->getPath(hero);
|
||||||
|
if (path.nodes.size() < 2 || path.nodes[path.nodes.size() - 2].turns)
|
||||||
|
{
|
||||||
|
LOCPLINT->showYesNoDialog( CGI->generaltexth->allTexts[55], [this](){ owner.hotkeyEndingTurn(); }, nullptr);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
owner.hotkeyEndingTurn();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::showThievesGuild()
|
||||||
|
{
|
||||||
|
//find first town with tavern
|
||||||
|
auto itr = range::find_if(LOCPLINT->localState->getOwnedTowns(), [](const CGTownInstance * town)
|
||||||
|
{
|
||||||
|
return town->hasBuilt(BuildingID::TAVERN);
|
||||||
|
});
|
||||||
|
|
||||||
|
if(itr != LOCPLINT->localState->getOwnedTowns().end())
|
||||||
|
LOCPLINT->showThievesGuildWindow(*itr);
|
||||||
|
else
|
||||||
|
LOCPLINT->showInfoDialog(CGI->generaltexth->translate("vcmi.adventureMap.noTownWithTavern"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::showScenarioInfo()
|
||||||
|
{
|
||||||
|
CAdventureOptions::showScenarioInfo();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::saveGame()
|
||||||
|
{
|
||||||
|
GH.pushIntT<CSavingScreen>();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::loadGame()
|
||||||
|
{
|
||||||
|
LOCPLINT->proposeLoadingGame();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::digGrail()
|
||||||
|
{
|
||||||
|
const CGHeroInstance *h = LOCPLINT->localState->getCurrentHero();
|
||||||
|
|
||||||
|
if(h && LOCPLINT->makingTurn)
|
||||||
|
LOCPLINT->tryDiggging(h);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::viewPuzzleMap()
|
||||||
|
{
|
||||||
|
LOCPLINT->showPuzzleMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::viewWorldMap()
|
||||||
|
{
|
||||||
|
LOCPLINT->viewWorldMap();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::restartGame()
|
||||||
|
{
|
||||||
|
LOCPLINT->showYesNoDialog(CGI->generaltexth->translate("vcmi.adventureMap.confirmRestartGame"),
|
||||||
|
[](){ GH.pushUserEvent(EUserEvent::RESTART_GAME); }, nullptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::visitObject()
|
||||||
|
{
|
||||||
|
const CGHeroInstance *h = LOCPLINT->localState->getCurrentHero();
|
||||||
|
|
||||||
|
if(h)
|
||||||
|
LOCPLINT->cb->moveHero(h,h->pos);
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::openObject()
|
||||||
|
{
|
||||||
|
const CGHeroInstance *h = LOCPLINT->localState->getCurrentHero();
|
||||||
|
const CGTownInstance *t = LOCPLINT->localState->getCurrentTown();
|
||||||
|
if(h)
|
||||||
|
LOCPLINT->openHeroWindow(h);
|
||||||
|
|
||||||
|
if(t)
|
||||||
|
LOCPLINT->openTownWindow(t);
|
||||||
|
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::abortSpellcasting()
|
||||||
|
{
|
||||||
|
owner.hotkeyAbortCastingMode();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::showMarketplace()
|
||||||
|
{
|
||||||
|
//check if we have any marketplace
|
||||||
|
const CGTownInstance *townWithMarket = nullptr;
|
||||||
|
for(const CGTownInstance *t : LOCPLINT->cb->getTownsInfo())
|
||||||
|
{
|
||||||
|
if(t->hasBuilt(BuildingID::MARKETPLACE))
|
||||||
|
{
|
||||||
|
townWithMarket = t;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(townWithMarket) //if any town has marketplace, open window
|
||||||
|
GH.pushIntT<CMarketplaceWindow>(townWithMarket);
|
||||||
|
else //if not - complain
|
||||||
|
LOCPLINT->showInfoDialog(CGI->generaltexth->translate("vcmi.adventureMap.noTownWithMarket"));
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::nextTown()
|
||||||
|
{
|
||||||
|
owner.hotkeyEndingTurn();
|
||||||
|
}
|
||||||
|
|
||||||
|
void AdventureMapShortcuts::moveHeroDirectional(const Point & direction)
|
||||||
|
{
|
||||||
|
owner.hotkeyMoveHeroDirectional(direction);
|
||||||
|
}
|
61
client/adventureMap/AdventureMapShortcuts.h
Normal file
61
client/adventureMap/AdventureMapShortcuts.h
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
* AdventureMapShortcuts.h, part of VCMI engine
|
||||||
|
*
|
||||||
|
* Authors: listed in file AUTHORS in main folder
|
||||||
|
*
|
||||||
|
* License: GNU General Public License v2.0 or later
|
||||||
|
* Full text of license available in license.txt file, in main folder
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
VCMI_LIB_NAMESPACE_BEGIN
|
||||||
|
class Point;
|
||||||
|
VCMI_LIB_NAMESPACE_END
|
||||||
|
|
||||||
|
enum class EShortcut;
|
||||||
|
class CAdventureMapInterface;
|
||||||
|
|
||||||
|
/// Class that contains list of functions for shortcuts available from adventure map
|
||||||
|
class AdventureMapShortcuts
|
||||||
|
{
|
||||||
|
CAdventureMapInterface & owner;
|
||||||
|
|
||||||
|
void showOverview();
|
||||||
|
void worldViewBack();
|
||||||
|
void worldViewScale1x();
|
||||||
|
void worldViewScale2x();
|
||||||
|
void worldViewScale4x();
|
||||||
|
void switchMapLevel();
|
||||||
|
void showQuestlog();
|
||||||
|
void toggleSleepWake();
|
||||||
|
void setHeroSleeping();
|
||||||
|
void setHeroAwake();
|
||||||
|
void moveHeroAlongPath();
|
||||||
|
void showSpellbook();
|
||||||
|
void adventureOptions();
|
||||||
|
void systemOptions();
|
||||||
|
void nextHero();
|
||||||
|
void endTurn();
|
||||||
|
void showThievesGuild();
|
||||||
|
void showScenarioInfo();
|
||||||
|
void saveGame();
|
||||||
|
void loadGame();
|
||||||
|
void digGrail();
|
||||||
|
void viewPuzzleMap();
|
||||||
|
void viewWorldMap();
|
||||||
|
void restartGame();
|
||||||
|
void visitObject();
|
||||||
|
void openObject();
|
||||||
|
void abortSpellcasting();
|
||||||
|
void showMarketplace();
|
||||||
|
void nextTown();
|
||||||
|
void nextObject();
|
||||||
|
void moveHeroDirectional(const Point & direction);
|
||||||
|
|
||||||
|
public:
|
||||||
|
explicit AdventureMapShortcuts(CAdventureMapInterface & owner);
|
||||||
|
|
||||||
|
std::map<EShortcut, std::function<void()>> getFunctors();
|
||||||
|
};
|
@ -17,35 +17,23 @@
|
|||||||
#include "CInfoBar.h"
|
#include "CInfoBar.h"
|
||||||
#include "MapAudioPlayer.h"
|
#include "MapAudioPlayer.h"
|
||||||
#include "CAdventureMapWidget.h"
|
#include "CAdventureMapWidget.h"
|
||||||
|
#include "AdventureMapShortcuts.h"
|
||||||
|
|
||||||
#include "../mapView/mapHandler.h"
|
#include "../mapView/mapHandler.h"
|
||||||
#include "../mapView/MapView.h"
|
#include "../mapView/MapView.h"
|
||||||
#include "../windows/CKingdomInterface.h"
|
|
||||||
#include "../windows/CSpellWindow.h"
|
|
||||||
#include "../windows/CTradeWindow.h"
|
|
||||||
#include "../windows/GUIClasses.h"
|
|
||||||
#include "../windows/InfoWindows.h"
|
#include "../windows/InfoWindows.h"
|
||||||
#include "../CGameInfo.h"
|
#include "../CGameInfo.h"
|
||||||
#include "../CPlayerInterface.h"
|
|
||||||
#include "../lobby/CSavingScreen.h"
|
|
||||||
#include "../render/CAnimation.h"
|
|
||||||
#include "../gui/CursorHandler.h"
|
#include "../gui/CursorHandler.h"
|
||||||
#include "../render/IImage.h"
|
|
||||||
#include "../renderSDL/SDL_Extensions.h"
|
|
||||||
#include "../gui/CGuiHandler.h"
|
#include "../gui/CGuiHandler.h"
|
||||||
#include "../gui/Shortcut.h"
|
|
||||||
#include "../widgets/TextControls.h"
|
|
||||||
#include "../widgets/Buttons.h"
|
|
||||||
#include "../windows/settings/SettingsMainWindow.h"
|
|
||||||
#include "../CMT.h"
|
#include "../CMT.h"
|
||||||
#include "../PlayerLocalState.h"
|
#include "../PlayerLocalState.h"
|
||||||
|
#include "../CPlayerInterface.h"
|
||||||
|
|
||||||
#include "../../CCallback.h"
|
#include "../../CCallback.h"
|
||||||
#include "../../lib/CConfigHandler.h"
|
#include "../../lib/CConfigHandler.h"
|
||||||
#include "../../lib/CGeneralTextHandler.h"
|
#include "../../lib/CGeneralTextHandler.h"
|
||||||
#include "../../lib/spells/CSpellHandler.h"
|
#include "../../lib/spells/CSpellHandler.h"
|
||||||
#include "../../lib/mapObjects/CGHeroInstance.h"
|
#include "../../lib/mapObjects/CGHeroInstance.h"
|
||||||
#include "../../lib/mapObjects/CGTownInstance.h"
|
|
||||||
#include "../../lib/CPathfinder.h"
|
#include "../../lib/CPathfinder.h"
|
||||||
#include "../../lib/mapping/CMap.h"
|
#include "../../lib/mapping/CMap.h"
|
||||||
|
|
||||||
@ -62,53 +50,16 @@ CAdventureMapInterface::CAdventureMapInterface():
|
|||||||
pos.h = GH.screenDimensions().y;
|
pos.h = GH.screenDimensions().y;
|
||||||
strongInterest = true; // handle all mouse move events to prevent dead mouse move space in fullscreen mode
|
strongInterest = true; // handle all mouse move events to prevent dead mouse move space in fullscreen mode
|
||||||
|
|
||||||
widget = std::make_shared<CAdventureMapWidget>();
|
shortcuts = std::make_shared<AdventureMapShortcuts>(*this);
|
||||||
exitWorldView();
|
|
||||||
|
widget = std::make_shared<CAdventureMapWidget>(shortcuts);
|
||||||
|
widget->setState(EGameState::MAKING_TURN);
|
||||||
|
widget->getMapView()->onViewMapActivated();
|
||||||
|
|
||||||
widget->setOptionHasQuests(!CGI->mh->getMap()->quests.empty());
|
widget->setOptionHasQuests(!CGI->mh->getMap()->quests.empty());
|
||||||
widget->setOptionHasUnderground(CGI->mh->getMap()->twoLevel);
|
widget->setOptionHasUnderground(CGI->mh->getMap()->twoLevel);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAdventureMapInterface::fshowOverview()
|
|
||||||
{
|
|
||||||
GH.pushIntT<CKingdomInterface>();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CAdventureMapInterface::fworldViewBack()
|
|
||||||
{
|
|
||||||
exitWorldView();
|
|
||||||
|
|
||||||
auto hero = LOCPLINT->localState->getCurrentHero();
|
|
||||||
if (hero)
|
|
||||||
centerOnObject(hero);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CAdventureMapInterface::fworldViewScale1x()
|
|
||||||
{
|
|
||||||
// TODO set corresponding scale button to "selected" mode
|
|
||||||
openWorldView(7);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CAdventureMapInterface::fworldViewScale2x()
|
|
||||||
{
|
|
||||||
openWorldView(11);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CAdventureMapInterface::fworldViewScale4x()
|
|
||||||
{
|
|
||||||
openWorldView(16);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CAdventureMapInterface::fswitchLevel()
|
|
||||||
{
|
|
||||||
// with support for future multi-level maps :)
|
|
||||||
int maxLevels = CGI->mh->getMap()->levels();
|
|
||||||
if (maxLevels < 2)
|
|
||||||
return;
|
|
||||||
|
|
||||||
widget->getMapView()->onMapLevelSwitched();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CAdventureMapInterface::onMapViewMoved(const Rect & visibleArea, int mapLevel)
|
void CAdventureMapInterface::onMapViewMoved(const Rect & visibleArea, int mapLevel)
|
||||||
{
|
{
|
||||||
widget->setOptionUndergroundLevel(mapLevel > 0);
|
widget->setOptionUndergroundLevel(mapLevel > 0);
|
||||||
@ -125,104 +76,6 @@ void CAdventureMapInterface::onAudioPaused()
|
|||||||
mapAudio->onAudioPaused();
|
mapAudio->onAudioPaused();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAdventureMapInterface::fshowQuestlog()
|
|
||||||
{
|
|
||||||
LOCPLINT->showQuestLog();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CAdventureMapInterface::fsleepWake()
|
|
||||||
{
|
|
||||||
const CGHeroInstance *h = LOCPLINT->localState->getCurrentHero();
|
|
||||||
if (!h)
|
|
||||||
return;
|
|
||||||
bool newSleep = !LOCPLINT->localState->isHeroSleeping(h);
|
|
||||||
|
|
||||||
if (newSleep)
|
|
||||||
LOCPLINT->localState->setHeroAsleep(h);
|
|
||||||
else
|
|
||||||
LOCPLINT->localState->setHeroAwaken(h);
|
|
||||||
|
|
||||||
onHeroChanged(h);
|
|
||||||
|
|
||||||
if (newSleep)
|
|
||||||
fnextHero();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CAdventureMapInterface::fmoveHero()
|
|
||||||
{
|
|
||||||
const CGHeroInstance *h = LOCPLINT->localState->getCurrentHero();
|
|
||||||
if (!h || !LOCPLINT->localState->hasPath(h) || CGI->mh->hasOngoingAnimations())
|
|
||||||
return;
|
|
||||||
|
|
||||||
LOCPLINT->moveHero(h, LOCPLINT->localState->getPath(h));
|
|
||||||
}
|
|
||||||
|
|
||||||
void CAdventureMapInterface::fshowSpellbok()
|
|
||||||
{
|
|
||||||
if (!LOCPLINT->localState->getCurrentHero()) //checking necessary values
|
|
||||||
return;
|
|
||||||
|
|
||||||
centerOnObject(LOCPLINT->localState->getCurrentHero());
|
|
||||||
|
|
||||||
GH.pushIntT<CSpellWindow>(LOCPLINT->localState->getCurrentHero(), LOCPLINT, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
void CAdventureMapInterface::fadventureOPtions()
|
|
||||||
{
|
|
||||||
GH.pushIntT<CAdventureOptions>();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CAdventureMapInterface::fsystemOptions()
|
|
||||||
{
|
|
||||||
GH.pushIntT<SettingsMainWindow>();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CAdventureMapInterface::fnextHero()
|
|
||||||
{
|
|
||||||
const auto * currHero = LOCPLINT->localState->getCurrentHero();
|
|
||||||
const auto * nextHero = LOCPLINT->localState->getNextWanderingHero(currHero);
|
|
||||||
|
|
||||||
if (nextHero)
|
|
||||||
{
|
|
||||||
LOCPLINT->localState->setSelection(nextHero);
|
|
||||||
centerOnObject(nextHero);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void CAdventureMapInterface::fendTurn()
|
|
||||||
{
|
|
||||||
if(!LOCPLINT->makingTurn)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if(settings["adventure"]["heroReminder"].Bool())
|
|
||||||
{
|
|
||||||
for(auto hero : LOCPLINT->localState->getWanderingHeroes())
|
|
||||||
{
|
|
||||||
if(!LOCPLINT->localState->isHeroSleeping(hero) && hero->movement > 0)
|
|
||||||
{
|
|
||||||
// Only show hero reminder if conditions met:
|
|
||||||
// - There still movement points
|
|
||||||
// - Hero don't have a path or there not points for first step on path
|
|
||||||
LOCPLINT->localState->verifyPath(hero);
|
|
||||||
|
|
||||||
if(!LOCPLINT->localState->hasPath(hero))
|
|
||||||
{
|
|
||||||
LOCPLINT->showYesNoDialog( CGI->generaltexth->allTexts[55], std::bind(&CAdventureMapInterface::endingTurn, this), nullptr );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
auto path = LOCPLINT->localState->getPath(hero);
|
|
||||||
if (path.nodes.size() < 2 || path.nodes[path.nodes.size() - 2].turns)
|
|
||||||
{
|
|
||||||
LOCPLINT->showYesNoDialog( CGI->generaltexth->allTexts[55], std::bind(&CAdventureMapInterface::endingTurn, this), nullptr );
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
endingTurn();
|
|
||||||
}
|
|
||||||
|
|
||||||
void CAdventureMapInterface::updateButtons()
|
void CAdventureMapInterface::updateButtons()
|
||||||
{
|
{
|
||||||
const auto * hero = LOCPLINT->localState->getCurrentHero();
|
const auto * hero = LOCPLINT->localState->getCurrentHero();
|
||||||
@ -376,136 +229,8 @@ void CAdventureMapInterface::centerOnObject(const CGObjectInstance * obj)
|
|||||||
|
|
||||||
void CAdventureMapInterface::keyPressed(EShortcut key)
|
void CAdventureMapInterface::keyPressed(EShortcut key)
|
||||||
{
|
{
|
||||||
if (widget->getState() != EGameState::MAKING_TURN)
|
|
||||||
return;
|
|
||||||
|
|
||||||
//fake mouse use to trigger onTileHovered()
|
//fake mouse use to trigger onTileHovered()
|
||||||
GH.fakeMouseMove();
|
GH.fakeMouseMove();
|
||||||
|
|
||||||
const CGHeroInstance *h = LOCPLINT->localState->getCurrentHero(); //selected hero
|
|
||||||
const CGTownInstance *t = LOCPLINT->localState->getCurrentTown(); //selected town
|
|
||||||
|
|
||||||
switch(key)
|
|
||||||
{
|
|
||||||
case EShortcut::ADVENTURE_THIEVES_GUILD:
|
|
||||||
if(GH.topInt()->type & BLOCK_ADV_HOTKEYS)
|
|
||||||
return;
|
|
||||||
|
|
||||||
{
|
|
||||||
//find first town with tavern
|
|
||||||
auto itr = range::find_if(LOCPLINT->localState->getOwnedTowns(), [](const CGTownInstance * town)
|
|
||||||
{
|
|
||||||
return town->hasBuilt(BuildingID::TAVERN);
|
|
||||||
});
|
|
||||||
|
|
||||||
if(itr != LOCPLINT->localState->getOwnedTowns().end())
|
|
||||||
LOCPLINT->showThievesGuildWindow(*itr);
|
|
||||||
else
|
|
||||||
LOCPLINT->showInfoDialog(CGI->generaltexth->translate("vcmi.adventureMap.noTownWithTavern"));
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
case EShortcut::ADVENTURE_VIEW_SCENARIO:
|
|
||||||
if(isActive())
|
|
||||||
CAdventureOptions::showScenarioInfo();
|
|
||||||
return;
|
|
||||||
case EShortcut::GAME_SAVE_GAME:
|
|
||||||
if(isActive())
|
|
||||||
GH.pushIntT<CSavingScreen>();
|
|
||||||
return;
|
|
||||||
case EShortcut::GAME_LOAD_GAME:
|
|
||||||
if(isActive())
|
|
||||||
LOCPLINT->proposeLoadingGame();
|
|
||||||
return;
|
|
||||||
case EShortcut::ADVENTURE_DIG_GRAIL:
|
|
||||||
{
|
|
||||||
if(h && isActive() && LOCPLINT->makingTurn)
|
|
||||||
LOCPLINT->tryDiggging(h);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
case EShortcut::ADVENTURE_VIEW_PUZZLE:
|
|
||||||
if(isActive())
|
|
||||||
LOCPLINT->showPuzzleMap();
|
|
||||||
return;
|
|
||||||
case EShortcut::ADVENTURE_VIEW_WORLD:
|
|
||||||
if(isActive())
|
|
||||||
LOCPLINT->viewWorldMap();
|
|
||||||
return;
|
|
||||||
case EShortcut::GAME_RESTART_GAME:
|
|
||||||
if(isActive() && GH.isKeyboardCtrlDown())
|
|
||||||
{
|
|
||||||
LOCPLINT->showYesNoDialog(CGI->generaltexth->translate("vcmi.adventureMap.confirmRestartGame"),
|
|
||||||
[](){ GH.pushUserEvent(EUserEvent::RESTART_GAME); }, nullptr);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
case EShortcut::ADVENTURE_VISIT_OBJECT: //space - try to revisit current object with selected hero
|
|
||||||
{
|
|
||||||
if(!isActive())
|
|
||||||
return;
|
|
||||||
if(h)
|
|
||||||
{
|
|
||||||
LOCPLINT->cb->moveHero(h,h->pos);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
case EShortcut::ADVENTURE_VIEW_SELECTED:
|
|
||||||
{
|
|
||||||
if(!isActive() || !LOCPLINT->localState->getCurrentArmy())
|
|
||||||
return;
|
|
||||||
if(h)
|
|
||||||
LOCPLINT->openHeroWindow(h);
|
|
||||||
else if(t)
|
|
||||||
LOCPLINT->openTownWindow(t);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
case EShortcut::GLOBAL_CANCEL:
|
|
||||||
{
|
|
||||||
//FIXME: this case is never executed since AdvMapInt is disabled while in spellcasting mode
|
|
||||||
if(!isActive() || GH.topInt().get() != this || !spellBeingCasted)
|
|
||||||
return;
|
|
||||||
|
|
||||||
abortCastingMode();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
case EShortcut::GAME_OPEN_MARKETPLACE:
|
|
||||||
{
|
|
||||||
//act on key down if marketplace windows is not already opened
|
|
||||||
if(GH.topInt()->type & BLOCK_ADV_HOTKEYS)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if(GH.isKeyboardCtrlDown()) //CTRL + T => open marketplace
|
|
||||||
{
|
|
||||||
//check if we have any marketplace
|
|
||||||
const CGTownInstance *townWithMarket = nullptr;
|
|
||||||
for(const CGTownInstance *t : LOCPLINT->cb->getTownsInfo())
|
|
||||||
{
|
|
||||||
if(t->hasBuilt(BuildingID::MARKETPLACE))
|
|
||||||
{
|
|
||||||
townWithMarket = t;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if(townWithMarket) //if any town has marketplace, open window
|
|
||||||
GH.pushIntT<CMarketplaceWindow>(townWithMarket);
|
|
||||||
else //if not - complain
|
|
||||||
LOCPLINT->showInfoDialog(CGI->generaltexth->translate("vcmi.adventureMap.noTownWithMarket"));
|
|
||||||
}
|
|
||||||
case EShortcut::ADVENTURE_NEXT_TOWN:
|
|
||||||
if(isActive() && !GH.isKeyboardCtrlDown()) //no ctrl, advmapint is on the top => switch to town
|
|
||||||
{
|
|
||||||
widget->getTownList()->selectNext();
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
case EShortcut::ADVENTURE_MOVE_HERO_SW: return hotkeyMoveHeroDirectional({-1, +1});
|
|
||||||
case EShortcut::ADVENTURE_MOVE_HERO_SS: return hotkeyMoveHeroDirectional({ 0, +1});
|
|
||||||
case EShortcut::ADVENTURE_MOVE_HERO_SE: return hotkeyMoveHeroDirectional({+1, +1});
|
|
||||||
case EShortcut::ADVENTURE_MOVE_HERO_WW: return hotkeyMoveHeroDirectional({-1, 0});
|
|
||||||
case EShortcut::ADVENTURE_MOVE_HERO_EE: return hotkeyMoveHeroDirectional({+1, 0});
|
|
||||||
case EShortcut::ADVENTURE_MOVE_HERO_NW: return hotkeyMoveHeroDirectional({-1, -1});
|
|
||||||
case EShortcut::ADVENTURE_MOVE_HERO_NN: return hotkeyMoveHeroDirectional({ 0, -1});
|
|
||||||
case EShortcut::ADVENTURE_MOVE_HERO_NE: return hotkeyMoveHeroDirectional({+1, -1});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAdventureMapInterface::hotkeyMoveHeroDirectional(Point direction)
|
void CAdventureMapInterface::hotkeyMoveHeroDirectional(Point direction)
|
||||||
@ -690,11 +415,11 @@ void CAdventureMapInterface::onPlayerTurnStarted(PlayerColor playerID)
|
|||||||
if(CInfoWindow *iw = dynamic_cast<CInfoWindow *>(GH.topInt().get()))
|
if(CInfoWindow *iw = dynamic_cast<CInfoWindow *>(GH.topInt().get()))
|
||||||
iw->close();
|
iw->close();
|
||||||
|
|
||||||
endingTurn();
|
hotkeyEndingTurn();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAdventureMapInterface::endingTurn()
|
void CAdventureMapInterface::hotkeyEndingTurn()
|
||||||
{
|
{
|
||||||
if(settings["session"]["spectate"].Bool())
|
if(settings["session"]["spectate"].Bool())
|
||||||
return;
|
return;
|
||||||
@ -712,11 +437,6 @@ const CGObjectInstance* CAdventureMapInterface::getActiveObject(const int3 &mapP
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
||||||
return *boost::range::max_element(bobjs, &CMapHandler::compareObjectBlitOrder);
|
return *boost::range::max_element(bobjs, &CMapHandler::compareObjectBlitOrder);
|
||||||
/*
|
|
||||||
if (bobjs.back()->ID == Obj::HERO)
|
|
||||||
return bobjs.back();
|
|
||||||
else
|
|
||||||
return bobjs.front();*/
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAdventureMapInterface::onTileLeftClicked(const int3 &mapPos)
|
void CAdventureMapInterface::onTileLeftClicked(const int3 &mapPos)
|
||||||
@ -984,7 +704,7 @@ void CAdventureMapInterface::onTileRightClicked(const int3 &mapPos)
|
|||||||
|
|
||||||
if(spellBeingCasted)
|
if(spellBeingCasted)
|
||||||
{
|
{
|
||||||
abortCastingMode();
|
hotkeyAbortCastingMode();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1030,7 +750,7 @@ void CAdventureMapInterface::exitCastingMode()
|
|||||||
config->Bool() = false;
|
config->Bool() = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAdventureMapInterface::abortCastingMode()
|
void CAdventureMapInterface::hotkeyAbortCastingMode()
|
||||||
{
|
{
|
||||||
exitCastingMode();
|
exitCastingMode();
|
||||||
LOCPLINT->showInfoDialog(CGI->generaltexth->allTexts[731]); //Spell cancelled
|
LOCPLINT->showInfoDialog(CGI->generaltexth->allTexts[731]); //Spell cancelled
|
||||||
@ -1060,7 +780,7 @@ const IShipyard * CAdventureMapInterface::ourInaccessibleShipyard(const CGObject
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CAdventureMapInterface::exitWorldView()
|
void CAdventureMapInterface::hotkeyExitWorldView()
|
||||||
{
|
{
|
||||||
widget->setState(EGameState::MAKING_TURN);
|
widget->setState(EGameState::MAKING_TURN);
|
||||||
widget->getMapView()->onViewMapActivated();
|
widget->getMapView()->onViewMapActivated();
|
||||||
@ -1082,3 +802,13 @@ void CAdventureMapInterface::openWorldView(const std::vector<ObjectPosInfo>& obj
|
|||||||
openWorldView(11);
|
openWorldView(11);
|
||||||
widget->getMapView()->onViewSpellActivated(11, objectPositions, showTerrain);
|
widget->getMapView()->onViewSpellActivated(11, objectPositions, showTerrain);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CAdventureMapInterface::hotkeyNextTown()
|
||||||
|
{
|
||||||
|
widget->getTownList()->selectNext();
|
||||||
|
}
|
||||||
|
|
||||||
|
void CAdventureMapInterface::hotkeySwitchMapLevel()
|
||||||
|
{
|
||||||
|
widget->getMapView()->onMapLevelSwitched();
|
||||||
|
}
|
||||||
|
@ -30,8 +30,7 @@ class IImage;
|
|||||||
class CAnimImage;
|
class CAnimImage;
|
||||||
class CGStatusBar;
|
class CGStatusBar;
|
||||||
class CAdventureMapWidget;
|
class CAdventureMapWidget;
|
||||||
class CAdvMapPanel;
|
class AdventureMapShortcuts;
|
||||||
class CAdvMapWorldViewPanel;
|
|
||||||
class CAnimation;
|
class CAnimation;
|
||||||
class MapView;
|
class MapView;
|
||||||
class CResDataBar;
|
class CResDataBar;
|
||||||
@ -59,26 +58,9 @@ private:
|
|||||||
|
|
||||||
std::shared_ptr<MapAudioPlayer> mapAudio;
|
std::shared_ptr<MapAudioPlayer> mapAudio;
|
||||||
std::shared_ptr<CAdventureMapWidget> widget;
|
std::shared_ptr<CAdventureMapWidget> widget;
|
||||||
|
std::shared_ptr<AdventureMapShortcuts> shortcuts;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
//functions bound to buttons
|
|
||||||
void fshowOverview();
|
|
||||||
void fworldViewBack();
|
|
||||||
void fworldViewScale1x();
|
|
||||||
void fworldViewScale2x();
|
|
||||||
void fworldViewScale4x();
|
|
||||||
void fswitchLevel();
|
|
||||||
void fshowQuestlog();
|
|
||||||
void fsleepWake();
|
|
||||||
void fmoveHero();
|
|
||||||
void fshowSpellbok();
|
|
||||||
void fadventureOPtions();
|
|
||||||
void fsystemOptions();
|
|
||||||
void fnextHero();
|
|
||||||
void fendTurn();
|
|
||||||
|
|
||||||
void hotkeyMoveHeroDirectional(Point direction);
|
|
||||||
|
|
||||||
bool isActive();
|
bool isActive();
|
||||||
void adjustActiveness(bool aiTurnStart); //should be called every time at AI/human turn transition; blocks GUI during AI turn
|
void adjustActiveness(bool aiTurnStart); //should be called every time at AI/human turn transition; blocks GUI during AI turn
|
||||||
|
|
||||||
@ -93,15 +75,9 @@ private:
|
|||||||
|
|
||||||
const CGObjectInstance *getActiveObject(const int3 &tile);
|
const CGObjectInstance *getActiveObject(const int3 &tile);
|
||||||
|
|
||||||
std::optional<Point> keyToMoveDirection(EShortcut key);
|
|
||||||
|
|
||||||
void endingTurn();
|
|
||||||
|
|
||||||
/// exits currently opened world view mode and returns to normal map
|
/// exits currently opened world view mode and returns to normal map
|
||||||
void exitWorldView();
|
|
||||||
void exitCastingMode();
|
void exitCastingMode();
|
||||||
void performSpellcasting(const int3 & castTarget);
|
void performSpellcasting(const int3 & castTarget);
|
||||||
void abortCastingMode();
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
// CIntObject interface implementation
|
// CIntObject interface implementation
|
||||||
@ -117,6 +93,13 @@ protected:
|
|||||||
public:
|
public:
|
||||||
CAdventureMapInterface();
|
CAdventureMapInterface();
|
||||||
|
|
||||||
|
void hotkeyMoveHeroDirectional(Point direction);
|
||||||
|
void hotkeyAbortCastingMode();
|
||||||
|
void hotkeyExitWorldView();
|
||||||
|
void hotkeyEndingTurn();
|
||||||
|
void hotkeyNextTown();
|
||||||
|
void hotkeySwitchMapLevel();
|
||||||
|
|
||||||
/// Called by PlayerInterface when specified player is ready to start his turn
|
/// Called by PlayerInterface when specified player is ready to start his turn
|
||||||
void onHotseatWaitStarted(PlayerColor playerID);
|
void onHotseatWaitStarted(PlayerColor playerID);
|
||||||
|
|
||||||
|
@ -10,6 +10,7 @@
|
|||||||
#include "StdInc.h"
|
#include "StdInc.h"
|
||||||
#include "CAdventureMapWidget.h"
|
#include "CAdventureMapWidget.h"
|
||||||
|
|
||||||
|
#include "AdventureMapShortcuts.h"
|
||||||
#include "CInfoBar.h"
|
#include "CInfoBar.h"
|
||||||
#include "CList.h"
|
#include "CList.h"
|
||||||
#include "CMinimap.h"
|
#include "CMinimap.h"
|
||||||
@ -29,8 +30,9 @@
|
|||||||
#include "../../lib/StringConstants.h"
|
#include "../../lib/StringConstants.h"
|
||||||
#include "../../lib/filesystem/ResourceID.h"
|
#include "../../lib/filesystem/ResourceID.h"
|
||||||
|
|
||||||
CAdventureMapWidget::CAdventureMapWidget()
|
CAdventureMapWidget::CAdventureMapWidget( std::shared_ptr<AdventureMapShortcuts> shortcuts )
|
||||||
: state(EGameState::NOT_INITIALIZED)
|
: state(EGameState::NOT_INITIALIZED)
|
||||||
|
, shortcuts(shortcuts)
|
||||||
{
|
{
|
||||||
pos.x = pos.y = 0;
|
pos.x = pos.y = 0;
|
||||||
pos.w = GH.screenDimensions().x;
|
pos.w = GH.screenDimensions().x;
|
||||||
@ -48,6 +50,9 @@ CAdventureMapWidget::CAdventureMapWidget()
|
|||||||
REGISTER_BUILDER("adventureResourceDateBar", &CAdventureMapWidget::buildResourceDateBar );
|
REGISTER_BUILDER("adventureResourceDateBar", &CAdventureMapWidget::buildResourceDateBar );
|
||||||
REGISTER_BUILDER("adventureStatusBar", &CAdventureMapWidget::buildStatusBar );
|
REGISTER_BUILDER("adventureStatusBar", &CAdventureMapWidget::buildStatusBar );
|
||||||
|
|
||||||
|
for (const auto & entry : shortcuts->getFunctors())
|
||||||
|
addShortcut(entry.first, entry.second);
|
||||||
|
|
||||||
const JsonNode config(ResourceID("config/widgets/adventureMap.json"));
|
const JsonNode config(ResourceID("config/widgets/adventureMap.json"));
|
||||||
|
|
||||||
for(const auto & entry : config["options"]["imagesPlayerColored"].Vector())
|
for(const auto & entry : config["options"]["imagesPlayerColored"].Vector())
|
||||||
@ -57,6 +62,8 @@ CAdventureMapWidget::CAdventureMapWidget()
|
|||||||
}
|
}
|
||||||
|
|
||||||
build(config);
|
build(config);
|
||||||
|
|
||||||
|
addUsedEvents(KEYBOARD);
|
||||||
}
|
}
|
||||||
|
|
||||||
Rect CAdventureMapWidget::readSourceArea(const JsonNode & source, const JsonNode & sourceCommon)
|
Rect CAdventureMapWidget::readSourceArea(const JsonNode & source, const JsonNode & sourceCommon)
|
||||||
@ -151,7 +158,12 @@ std::shared_ptr<CIntObject> CAdventureMapWidget::buildMapButton(const JsonNode &
|
|||||||
auto position = readTargetArea(input["area"]);
|
auto position = readTargetArea(input["area"]);
|
||||||
auto image = input["image"].String();
|
auto image = input["image"].String();
|
||||||
auto help = readHintText(input["help"]);
|
auto help = readHintText(input["help"]);
|
||||||
return std::make_shared<CButton>(position.topLeft(), image, help);
|
|
||||||
|
auto button = std::make_shared<CButton>(position.topLeft(), image, help);
|
||||||
|
|
||||||
|
loadButtonHotkey(button, input["hotkey"]);
|
||||||
|
|
||||||
|
return button;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<CIntObject> CAdventureMapWidget::buildMapContainer(const JsonNode & input)
|
std::shared_ptr<CIntObject> CAdventureMapWidget::buildMapContainer(const JsonNode & input)
|
||||||
|
@ -17,6 +17,7 @@ class CMinimap;
|
|||||||
class MapView;
|
class MapView;
|
||||||
class CInfoBar;
|
class CInfoBar;
|
||||||
class IImage;
|
class IImage;
|
||||||
|
class AdventureMapShortcuts;
|
||||||
|
|
||||||
enum class EGameState
|
enum class EGameState
|
||||||
{
|
{
|
||||||
@ -49,6 +50,8 @@ class CAdventureMapWidget : public InterfaceObjectConfigurable
|
|||||||
std::shared_ptr<MapView> mapView;
|
std::shared_ptr<MapView> mapView;
|
||||||
std::shared_ptr<CInfoBar> infoBar;
|
std::shared_ptr<CInfoBar> infoBar;
|
||||||
|
|
||||||
|
std::shared_ptr<AdventureMapShortcuts> shortcuts;
|
||||||
|
|
||||||
Rect readTargetArea(const JsonNode & source);
|
Rect readTargetArea(const JsonNode & source);
|
||||||
Rect readSourceArea(const JsonNode & source, const JsonNode & sourceCommon);
|
Rect readSourceArea(const JsonNode & source, const JsonNode & sourceCommon);
|
||||||
Rect readArea(const JsonNode & source, const Rect & boundingBox);
|
Rect readArea(const JsonNode & source, const Rect & boundingBox);
|
||||||
@ -70,7 +73,7 @@ class CAdventureMapWidget : public InterfaceObjectConfigurable
|
|||||||
|
|
||||||
void setPlayerChildren(CIntObject * widget, const PlayerColor & player);
|
void setPlayerChildren(CIntObject * widget, const PlayerColor & player);
|
||||||
public:
|
public:
|
||||||
CAdventureMapWidget();
|
explicit CAdventureMapWidget( std::shared_ptr<AdventureMapShortcuts> shortcuts );
|
||||||
|
|
||||||
std::shared_ptr<CHeroList> getHeroList();
|
std::shared_ptr<CHeroList> getHeroList();
|
||||||
std::shared_ptr<CTownList> getTownList();
|
std::shared_ptr<CTownList> getTownList();
|
||||||
|
@ -289,15 +289,7 @@ std::shared_ptr<CToggleButton> InterfaceObjectConfigurable::buildToggleButton(co
|
|||||||
assert(imgOrder.size() >= 4);
|
assert(imgOrder.size() >= 4);
|
||||||
button->setImageOrder(imgOrder[0].Integer(), imgOrder[1].Integer(), imgOrder[2].Integer(), imgOrder[3].Integer());
|
button->setImageOrder(imgOrder[0].Integer(), imgOrder[1].Integer(), imgOrder[2].Integer(), imgOrder[3].Integer());
|
||||||
}
|
}
|
||||||
if(!config["callback"].isNull())
|
loadButtonCallback(button, config["callback"]);
|
||||||
{
|
|
||||||
std::string callbackName = config["callback"].String();
|
|
||||||
|
|
||||||
if (callbacks.count(callbackName))
|
|
||||||
button->addCallback(callbacks.at(callbackName));
|
|
||||||
else
|
|
||||||
logGlobal->error("Invalid callback '%s' in widget", callbackName );
|
|
||||||
}
|
|
||||||
return button;
|
return button;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -321,32 +313,46 @@ std::shared_ptr<CButton> InterfaceObjectConfigurable::buildButton(const JsonNode
|
|||||||
assert(imgOrder.size() >= 4);
|
assert(imgOrder.size() >= 4);
|
||||||
button->setImageOrder(imgOrder[0].Integer(), imgOrder[1].Integer(), imgOrder[2].Integer(), imgOrder[3].Integer());
|
button->setImageOrder(imgOrder[0].Integer(), imgOrder[1].Integer(), imgOrder[2].Integer(), imgOrder[3].Integer());
|
||||||
}
|
}
|
||||||
if(!config["callback"].isNull())
|
|
||||||
{
|
|
||||||
std::string callbackName = config["callback"].String();
|
|
||||||
|
|
||||||
if (callbacks.count(callbackName) > 0)
|
loadButtonCallback(button, config["callback"]);
|
||||||
button->addCallback(std::bind(callbacks.at(callbackName), 0));
|
loadButtonHotkey(button, config["hotkey"]);
|
||||||
else
|
|
||||||
logGlobal->error("Invalid callback '%s' in widget", callbackName );
|
|
||||||
}
|
|
||||||
if(!config["hotkey"].isNull())
|
|
||||||
{
|
|
||||||
if(config["hotkey"].getType() == JsonNode::JsonType::DATA_STRING)
|
|
||||||
{
|
|
||||||
button->assignedKey = readHotkey(config["hotkey"]);
|
|
||||||
|
|
||||||
auto target = shortcuts.find(button->assignedKey);
|
|
||||||
if (target != shortcuts.end())
|
|
||||||
{
|
|
||||||
button->addCallback(target->second.callback);
|
|
||||||
target->second.assignedToButton = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return button;
|
return button;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void InterfaceObjectConfigurable::loadButtonCallback(std::shared_ptr<CButton> button, const JsonNode & config) const
|
||||||
|
{
|
||||||
|
if(config.isNull())
|
||||||
|
return;
|
||||||
|
|
||||||
|
std::string callbackName = config.String();
|
||||||
|
|
||||||
|
if (callbacks.count(callbackName) > 0)
|
||||||
|
button->addCallback(std::bind(callbacks.at(callbackName), 0));
|
||||||
|
else
|
||||||
|
logGlobal->error("Invalid callback '%s' in widget", callbackName );
|
||||||
|
}
|
||||||
|
|
||||||
|
void InterfaceObjectConfigurable::loadButtonHotkey(std::shared_ptr<CButton> button, const JsonNode & config) const
|
||||||
|
{
|
||||||
|
if(config.isNull())
|
||||||
|
return;
|
||||||
|
|
||||||
|
if(config.getType() != JsonNode::JsonType::DATA_STRING)
|
||||||
|
{
|
||||||
|
logGlobal->error("Invalid shortcut format - string expected!");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
button->assignedKey = readHotkey(config);
|
||||||
|
|
||||||
|
auto target = shortcuts.find(button->assignedKey);
|
||||||
|
if (target == shortcuts.end())
|
||||||
|
return;
|
||||||
|
|
||||||
|
button->addCallback(target->second.callback);
|
||||||
|
target->second.assignedToButton = true;
|
||||||
|
}
|
||||||
|
|
||||||
std::shared_ptr<CLabelGroup> InterfaceObjectConfigurable::buildLabelGroup(const JsonNode & config) const
|
std::shared_ptr<CLabelGroup> InterfaceObjectConfigurable::buildLabelGroup(const JsonNode & config) const
|
||||||
{
|
{
|
||||||
logGlobal->debug("Building widget CLabelGroup");
|
logGlobal->debug("Building widget CLabelGroup");
|
||||||
|
@ -73,6 +73,9 @@ protected:
|
|||||||
std::pair<std::string, std::string> readHintText(const JsonNode &) const;
|
std::pair<std::string, std::string> readHintText(const JsonNode &) const;
|
||||||
EShortcut readHotkey(const JsonNode &) const;
|
EShortcut readHotkey(const JsonNode &) const;
|
||||||
|
|
||||||
|
void loadButtonCallback(std::shared_ptr<CButton> button, const JsonNode & config) const;
|
||||||
|
void loadButtonHotkey(std::shared_ptr<CButton> button, const JsonNode & config) const;
|
||||||
|
|
||||||
//basic widgets
|
//basic widgets
|
||||||
std::shared_ptr<CPicture> buildPicture(const JsonNode &) const;
|
std::shared_ptr<CPicture> buildPicture(const JsonNode &) const;
|
||||||
std::shared_ptr<CLabel> buildLabel(const JsonNode &) const;
|
std::shared_ptr<CLabel> buildLabel(const JsonNode &) const;
|
||||||
|
@ -81,7 +81,9 @@ enum class EShortcut
|
|||||||
// Adventure map screen
|
// Adventure map screen
|
||||||
ADVENTURE_GAME_OPTIONS, // 'o', Open CAdventureOptions window
|
ADVENTURE_GAME_OPTIONS, // 'o', Open CAdventureOptions window
|
||||||
ADVENTURE_TOGGLE_GRID, // F6, Toggles map grid
|
ADVENTURE_TOGGLE_GRID, // F6, Toggles map grid
|
||||||
ADVENTURE_TOGGLE_SLEEP, // z,w, Toggles hero sleep status
|
ADVENTURE_TOGGLE_SLEEP, // Toggles hero sleep status
|
||||||
|
ADVENTURE_SET_HERO_ASLEEP, // Moves hero to sleep state
|
||||||
|
ADVENTURE_SET_HERO_AWAKE, // Move hero to awake state
|
||||||
ADVENTURE_MOVE_HERO, // Moves hero alongside set path
|
ADVENTURE_MOVE_HERO, // Moves hero alongside set path
|
||||||
ADVENTURE_VISIT_OBJECT, // Revisits object hero is standing on
|
ADVENTURE_VISIT_OBJECT, // Revisits object hero is standing on
|
||||||
ADVENTURE_VIEW_SELECTED,// Open window with currently selected hero/town
|
ADVENTURE_VIEW_SELECTED,// Open window with currently selected hero/town
|
||||||
@ -98,7 +100,6 @@ enum class EShortcut
|
|||||||
ADVENTURE_KINGDOM_OVERVIEW,
|
ADVENTURE_KINGDOM_OVERVIEW,
|
||||||
ADVENTURE_QUEST_LOG,
|
ADVENTURE_QUEST_LOG,
|
||||||
ADVENTURE_CAST_SPELL,
|
ADVENTURE_CAST_SPELL,
|
||||||
ADVENTURE_END_TURN,
|
|
||||||
ADVENTURE_THIEVES_GUILD,
|
ADVENTURE_THIEVES_GUILD,
|
||||||
|
|
||||||
// Move hero one tile in specified direction. Bound to cursors & numpad buttons
|
// Move hero one tile in specified direction. Bound to cursors & numpad buttons
|
||||||
@ -153,4 +154,3 @@ enum class EShortcut
|
|||||||
|
|
||||||
AFTER_LAST
|
AFTER_LAST
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -79,8 +79,8 @@ std::vector<EShortcut> ShortcutHandler::translateKeycode(SDL_Keycode key) const
|
|||||||
{SDLK_TAB, EShortcut::GAME_ACTIVATE_CONSOLE },
|
{SDLK_TAB, EShortcut::GAME_ACTIVATE_CONSOLE },
|
||||||
{SDLK_o, EShortcut::ADVENTURE_GAME_OPTIONS },
|
{SDLK_o, EShortcut::ADVENTURE_GAME_OPTIONS },
|
||||||
{SDLK_F6, EShortcut::ADVENTURE_TOGGLE_GRID },
|
{SDLK_F6, EShortcut::ADVENTURE_TOGGLE_GRID },
|
||||||
{SDLK_z, EShortcut::ADVENTURE_TOGGLE_SLEEP },
|
{SDLK_z, EShortcut::ADVENTURE_SET_HERO_ASLEEP },
|
||||||
{SDLK_w, EShortcut::ADVENTURE_TOGGLE_SLEEP },
|
{SDLK_w, EShortcut::ADVENTURE_SET_HERO_AWAKE },
|
||||||
{SDLK_m, EShortcut::ADVENTURE_MOVE_HERO },
|
{SDLK_m, EShortcut::ADVENTURE_MOVE_HERO },
|
||||||
{SDLK_SPACE, EShortcut::ADVENTURE_VISIT_OBJECT },
|
{SDLK_SPACE, EShortcut::ADVENTURE_VISIT_OBJECT },
|
||||||
{SDLK_KP_1, EShortcut::ADVENTURE_MOVE_HERO_SW },
|
{SDLK_KP_1, EShortcut::ADVENTURE_MOVE_HERO_SW },
|
||||||
@ -110,7 +110,6 @@ std::vector<EShortcut> ShortcutHandler::translateKeycode(SDL_Keycode key) const
|
|||||||
{SDLK_k, EShortcut::ADVENTURE_KINGDOM_OVERVIEW},
|
{SDLK_k, EShortcut::ADVENTURE_KINGDOM_OVERVIEW},
|
||||||
{SDLK_q, EShortcut::ADVENTURE_QUEST_LOG },
|
{SDLK_q, EShortcut::ADVENTURE_QUEST_LOG },
|
||||||
{SDLK_c, EShortcut::ADVENTURE_CAST_SPELL },
|
{SDLK_c, EShortcut::ADVENTURE_CAST_SPELL },
|
||||||
{SDLK_e, EShortcut::ADVENTURE_END_TURN },
|
|
||||||
{SDLK_g, EShortcut::ADVENTURE_THIEVES_GUILD },
|
{SDLK_g, EShortcut::ADVENTURE_THIEVES_GUILD },
|
||||||
{SDLK_q, EShortcut::BATTLE_TOGGLE_QUEUE },
|
{SDLK_q, EShortcut::BATTLE_TOGGLE_QUEUE },
|
||||||
{SDLK_c, EShortcut::BATTLE_USE_CREATURE_SPELL },
|
{SDLK_c, EShortcut::BATTLE_USE_CREATURE_SPELL },
|
||||||
@ -218,6 +217,8 @@ EShortcut ShortcutHandler::findShortcut(const std::string & identifier ) const
|
|||||||
{"adventureGameOptions", EShortcut::ADVENTURE_GAME_OPTIONS },
|
{"adventureGameOptions", EShortcut::ADVENTURE_GAME_OPTIONS },
|
||||||
{"adventureToggleGrid", EShortcut::ADVENTURE_TOGGLE_GRID },
|
{"adventureToggleGrid", EShortcut::ADVENTURE_TOGGLE_GRID },
|
||||||
{"adventureToggleSleep", EShortcut::ADVENTURE_TOGGLE_SLEEP },
|
{"adventureToggleSleep", EShortcut::ADVENTURE_TOGGLE_SLEEP },
|
||||||
|
{"adventureSetHeroAsleep", EShortcut::ADVENTURE_SET_HERO_ASLEEP },
|
||||||
|
{"adventureSetHeroAwake", EShortcut::ADVENTURE_SET_HERO_AWAKE },
|
||||||
{"adventureMoveHero", EShortcut::ADVENTURE_MOVE_HERO },
|
{"adventureMoveHero", EShortcut::ADVENTURE_MOVE_HERO },
|
||||||
{"adventureVisitObject", EShortcut::ADVENTURE_VISIT_OBJECT },
|
{"adventureVisitObject", EShortcut::ADVENTURE_VISIT_OBJECT },
|
||||||
{"adventureMoveHeroSW", EShortcut::ADVENTURE_MOVE_HERO_SW },
|
{"adventureMoveHeroSW", EShortcut::ADVENTURE_MOVE_HERO_SW },
|
||||||
@ -242,7 +243,6 @@ EShortcut ShortcutHandler::findShortcut(const std::string & identifier ) const
|
|||||||
{"adventureKingdomOverview", EShortcut::ADVENTURE_KINGDOM_OVERVIEW},
|
{"adventureKingdomOverview", EShortcut::ADVENTURE_KINGDOM_OVERVIEW},
|
||||||
{"adventureQuestLog", EShortcut::ADVENTURE_QUEST_LOG },
|
{"adventureQuestLog", EShortcut::ADVENTURE_QUEST_LOG },
|
||||||
{"adventureCastSpell", EShortcut::ADVENTURE_CAST_SPELL },
|
{"adventureCastSpell", EShortcut::ADVENTURE_CAST_SPELL },
|
||||||
{"adventureEndTurn", EShortcut::ADVENTURE_END_TURN },
|
|
||||||
{"adventureThievesGuild", EShortcut::ADVENTURE_THIEVES_GUILD },
|
{"adventureThievesGuild", EShortcut::ADVENTURE_THIEVES_GUILD },
|
||||||
{"battleToggleQueue", EShortcut::BATTLE_TOGGLE_QUEUE },
|
{"battleToggleQueue", EShortcut::BATTLE_TOGGLE_QUEUE },
|
||||||
{"battleUseCreatureSpell", EShortcut::BATTLE_USE_CREATURE_SPELL },
|
{"battleUseCreatureSpell", EShortcut::BATTLE_USE_CREATURE_SPELL },
|
||||||
@ -278,85 +278,3 @@ EShortcut ShortcutHandler::findShortcut(const std::string & identifier ) const
|
|||||||
return shortcutNames.at(identifier);
|
return shortcutNames.at(identifier);
|
||||||
return EShortcut::NONE;
|
return EShortcut::NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -120,6 +120,7 @@
|
|||||||
"name" : "buttonKingdomOverview",
|
"name" : "buttonKingdomOverview",
|
||||||
"image" : "IAM002.DEF",
|
"image" : "IAM002.DEF",
|
||||||
"help" : "core.help.293",
|
"help" : "core.help.293",
|
||||||
|
"hotkey": "adventureKingdomOverview",
|
||||||
"area": { "top" : 0, "left": 0, "width" : 32, "height" : 32 }
|
"area": { "top" : 0, "left": 0, "width" : 32, "height" : 32 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -127,6 +128,7 @@
|
|||||||
"name": "buttonUnderground",
|
"name": "buttonUnderground",
|
||||||
"image" : "IAM010.DEF",
|
"image" : "IAM010.DEF",
|
||||||
"help" : "core.help.294",
|
"help" : "core.help.294",
|
||||||
|
"hotkey": "adventureToggleMapLevel",
|
||||||
"area": { "top" : 0, "left": 32, "width" : 32, "height" : 32 }
|
"area": { "top" : 0, "left": 32, "width" : 32, "height" : 32 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -134,6 +136,7 @@
|
|||||||
"name": "buttonSurface",
|
"name": "buttonSurface",
|
||||||
"image" : "IAM003.DEF",
|
"image" : "IAM003.DEF",
|
||||||
"help" : "core.help.294",
|
"help" : "core.help.294",
|
||||||
|
"hotkey": "adventureToggleMapLevel",
|
||||||
"area": { "top" : 0, "left": 32, "width" : 32, "height" : 32 }
|
"area": { "top" : 0, "left": 32, "width" : 32, "height" : 32 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -141,6 +144,7 @@
|
|||||||
"name": "buttonQuestLog",
|
"name": "buttonQuestLog",
|
||||||
"image" : "IAM004.DEF",
|
"image" : "IAM004.DEF",
|
||||||
"help" : "core.help.295",
|
"help" : "core.help.295",
|
||||||
|
"hotkey": "adventureQuestLog",
|
||||||
"area": { "top" : 32, "left": 0, "width" : 32, "height" : 32 }
|
"area": { "top" : 32, "left": 0, "width" : 32, "height" : 32 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -148,6 +152,7 @@
|
|||||||
"name": "buttonSleep",
|
"name": "buttonSleep",
|
||||||
"image" : "IAM005.DEF",
|
"image" : "IAM005.DEF",
|
||||||
"help" : "core.help.296",
|
"help" : "core.help.296",
|
||||||
|
"hotkey": "adventureSetHeroAsleep",
|
||||||
"area": { "top" : 32, "left": 32, "width" : 32, "height" : 32 }
|
"area": { "top" : 32, "left": 32, "width" : 32, "height" : 32 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -155,6 +160,7 @@
|
|||||||
"name": "buttonWake",
|
"name": "buttonWake",
|
||||||
"image" : "IAM011.DEF",
|
"image" : "IAM011.DEF",
|
||||||
"help" : "core.help.296",
|
"help" : "core.help.296",
|
||||||
|
"hotkey": "adventureSetHeroAwake",
|
||||||
"area": { "top" : 32, "left": 32, "width" : 32, "height" : 32 }
|
"area": { "top" : 32, "left": 32, "width" : 32, "height" : 32 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -162,6 +168,7 @@
|
|||||||
"name": "buttonMove",
|
"name": "buttonMove",
|
||||||
"image" : "IAM006.DEF",
|
"image" : "IAM006.DEF",
|
||||||
"help" : "core.help.297",
|
"help" : "core.help.297",
|
||||||
|
"hotkey": "adventureMoveHero",
|
||||||
"area": { "top" : 64, "left": 0, "width" : 32, "height" : 32 }
|
"area": { "top" : 64, "left": 0, "width" : 32, "height" : 32 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -169,6 +176,7 @@
|
|||||||
"name": "buttonCast",
|
"name": "buttonCast",
|
||||||
"image" : "IAM007.DEF",
|
"image" : "IAM007.DEF",
|
||||||
"help" : "core.help.298",
|
"help" : "core.help.298",
|
||||||
|
"hotkey": "adventureCastSpell",
|
||||||
"area": { "top" : 64, "left": 32, "width" : 32, "height" : 32 }
|
"area": { "top" : 64, "left": 32, "width" : 32, "height" : 32 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -176,6 +184,7 @@
|
|||||||
"name": "buttonAdventureOptions",
|
"name": "buttonAdventureOptions",
|
||||||
"image" : "IAM008.DEF",
|
"image" : "IAM008.DEF",
|
||||||
"help" : "core.help.299",
|
"help" : "core.help.299",
|
||||||
|
"hotkey": "adventureGameOptions",
|
||||||
"area": { "top" : 96, "left": 0, "width" : 32, "height" : 32 }
|
"area": { "top" : 96, "left": 0, "width" : 32, "height" : 32 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -183,6 +192,7 @@
|
|||||||
"name": "buttonSystemOptions",
|
"name": "buttonSystemOptions",
|
||||||
"image" : "IAM009.DEF",
|
"image" : "IAM009.DEF",
|
||||||
"help" : "core.help.300",
|
"help" : "core.help.300",
|
||||||
|
"hotkey": "globalOptions",
|
||||||
"area": { "top" : 96, "left": 32, "width" : 32, "height" : 32 }
|
"area": { "top" : 96, "left": 32, "width" : 32, "height" : 32 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
@ -190,12 +200,14 @@
|
|||||||
"name": "buttonNextHero",
|
"name": "buttonNextHero",
|
||||||
"image" : "IAM000.DEF",
|
"image" : "IAM000.DEF",
|
||||||
"help" : "core.help.301",
|
"help" : "core.help.301",
|
||||||
|
"hotkey": "adventureNextHero",
|
||||||
"area": { "top" : 128, "left": 0, "width" : 64, "height" : 32 }
|
"area": { "top" : 128, "left": 0, "width" : 64, "height" : 32 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "adventureMapButton",
|
"type": "adventureMapButton",
|
||||||
"name": "buttonEndTurn",
|
"name": "buttonEndTurn",
|
||||||
"image" : "IAM001.DEF",
|
"image" : "IAM001.DEF",
|
||||||
|
"hotkey": "adventureEndTurn",
|
||||||
"help" : "core.help.302",
|
"help" : "core.help.302",
|
||||||
"area": { "top" : 160, "left": 0, "width" : 64, "height" : 32 }
|
"area": { "top" : 160, "left": 0, "width" : 64, "height" : 32 }
|
||||||
}
|
}
|
||||||
@ -287,7 +299,7 @@
|
|||||||
"type": "adventureMapImage",
|
"type": "adventureMapImage",
|
||||||
"name": "emptyAreaFillSmallImage",
|
"name": "emptyAreaFillSmallImage",
|
||||||
"image" : "DiBoxBck.pcx",
|
"image" : "DiBoxBck.pcx",
|
||||||
"area": { "top": 0, "bottom" : 0, "left" : 0, "right" : 0 }
|
"area": { "top": 0, "bottom" : 0, "left" : 0, "right" : 0 },
|
||||||
"sourceArea": { "left" : 0, "top" : 0, "width" : 256, "height" : 256 }
|
"sourceArea": { "left" : 0, "top" : 0, "width" : 256, "height" : 256 }
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
@ -303,21 +315,21 @@
|
|||||||
"type": "adventureMapImage",
|
"type": "adventureMapImage",
|
||||||
"name": "backgroundHeroListBorderRight",
|
"name": "backgroundHeroListBorderRight",
|
||||||
"image" : "AdvMap.pcx",
|
"image" : "AdvMap.pcx",
|
||||||
"area": { "top": 0, "bottom" : 0, "right" : 121, "width" : 6 }
|
"area": { "top": 0, "bottom" : 0, "right" : 121, "width" : 6 },
|
||||||
"sourceArea": { "top": 196, "bottom" : 211, "right" : 121, "width" : 6 }
|
"sourceArea": { "top": 196, "bottom" : 211, "right" : 121, "width" : 6 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "adventureMapImage",
|
"type": "adventureMapImage",
|
||||||
"name": "backgroundTownListBorderLeft",
|
"name": "backgroundTownListBorderLeft",
|
||||||
"image" : "AdvMap.pcx",
|
"image" : "AdvMap.pcx",
|
||||||
"area": { "top": 0, "bottom" : 0, "right" : 53, "width" : 4 }
|
"area": { "top": 0, "bottom" : 0, "right" : 53, "width" : 4 },
|
||||||
"sourceArea": { "top": 196, "bottom" : 211, "right" : 53, "width" : 4 }
|
"sourceArea": { "top": 196, "bottom" : 211, "right" : 53, "width" : 4 }
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "adventureMapImage",
|
"type": "adventureMapImage",
|
||||||
"name" : "backgroundBelowHeroTownList",
|
"name" : "backgroundBelowHeroTownList",
|
||||||
"image" : "AdvMap.pcx",
|
"image" : "AdvMap.pcx",
|
||||||
"area" : { "right": 0, "left" : 0, "bottom" : 0, "height" : 3 }
|
"area" : { "right": 0, "left" : 0, "bottom" : 0, "height" : 3 },
|
||||||
"sourceArea": { "bottom" : 208, "height" : 3, "right" : 0, "width" : 193 }
|
"sourceArea": { "bottom" : 208, "height" : 3, "right" : 0, "width" : 193 }
|
||||||
},
|
},
|
||||||
// Hero List
|
// Hero List
|
||||||
@ -351,13 +363,13 @@
|
|||||||
"item" : { "top" : 16, "left": 0, "width" : 48, "height" : 32 },
|
"item" : { "top" : 16, "left": 0, "width" : 48, "height" : 32 },
|
||||||
"itemsOffset" : { "x" : 0, "y" : 32 },
|
"itemsOffset" : { "x" : 0, "y" : 32 },
|
||||||
"itemsCount" : 7
|
"itemsCount" : 7
|
||||||
}
|
},
|
||||||
// Fill empty area below buttons
|
// Fill empty area below buttons
|
||||||
{
|
{
|
||||||
"type": "adventureMapImage",
|
"type": "adventureMapImage",
|
||||||
"name" : "backgroundBelowButtons",
|
"name" : "backgroundBelowButtons",
|
||||||
"image" : "DiBoxBck.pcx",
|
"image" : "DiBoxBck.pcx",
|
||||||
"area": { "top": 192, "bottom" : 3, "right" : 57, "width" : 64 }
|
"area": { "top": 192, "bottom" : 3, "right" : 57, "width" : 64 },
|
||||||
"sourceArea": { "left" : 0, "top" : 0, "width" : 256, "height" : 256 }
|
"sourceArea": { "left" : 0, "top" : 0, "width" : 256, "height" : 256 }
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
@ -372,7 +384,7 @@
|
|||||||
"type": "adventureMapImage",
|
"type": "adventureMapImage",
|
||||||
"name": "emptyAreaFillLargeImage",
|
"name": "emptyAreaFillLargeImage",
|
||||||
"image" : "DiBoxBck.pcx",
|
"image" : "DiBoxBck.pcx",
|
||||||
"area": { "top": 0, "bottom" : 0, "left" : 0, "right" : 0 }
|
"area": { "top": 0, "bottom" : 0, "left" : 0, "right" : 0 },
|
||||||
"sourceArea": { "left" : 0, "top" : 0, "width" : 256, "height" : 256 }
|
"sourceArea": { "left" : 0, "top" : 0, "width" : 256, "height" : 256 }
|
||||||
},
|
},
|
||||||
]
|
]
|
||||||
|
Loading…
Reference in New Issue
Block a user