mirror of
https://github.com/vcmi/vcmi.git
synced 2025-03-03 14:52:11 +02:00
Partial encapsulation of AdvMapInt
This commit is contained in:
parent
e15c7dcd33
commit
91b17bed79
@ -203,7 +203,6 @@ void CPlayerInterface::yourTurn()
|
||||
autosaveCount %= 5;
|
||||
}
|
||||
|
||||
if (adventureInt->player != playerID)
|
||||
adventureInt->setPlayer(playerID);
|
||||
|
||||
if (CSH->howManyPlayerInterfaces() > 1) //hot seat message
|
||||
@ -360,7 +359,7 @@ void CPlayerInterface::heroMoved(const TryMoveHero & details, bool verbose)
|
||||
#ifndef VCMI_ANDROID
|
||||
// currently android doesn't seem to be able to handle all these full redraws here, so let's disable it so at least it looks less choppy;
|
||||
// most likely this is connected with the way that this manual animation+framerate handling is solved
|
||||
adventureInt->updateScreen = true;
|
||||
adventureInt->requestRedrawMapOnNextFrame();
|
||||
#endif
|
||||
|
||||
//evil returns here ...
|
||||
@ -1582,22 +1581,12 @@ void CPlayerInterface::update()
|
||||
dialogs.pop_front();
|
||||
}
|
||||
|
||||
//in some conditions we may receive calls before selection is initialized - we must ignore them
|
||||
if(adventureInt && GH.topInt() == adventureInt
|
||||
&& (!adventureInt->selection && !settings["session"]["spectate"].Bool()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
assert(adventureInt);
|
||||
assert(adventureInt->selection);
|
||||
|
||||
// Handles mouse and key input
|
||||
GH.updateTime();
|
||||
GH.handleEvents();
|
||||
|
||||
if (!adventureInt || adventureInt->isActive())
|
||||
GH.simpleRedraw();
|
||||
else if((adventureInt->swipeEnabled && adventureInt->swipeMovementRequested) || (adventureInt->scrollingDir && GH.isKeyboardCtrlDown()))
|
||||
GH.totalRedraw(); //player forces map scrolling though interface is disabled
|
||||
else
|
||||
GH.simpleRedraw();
|
||||
}
|
||||
|
||||
@ -1858,7 +1847,7 @@ void CPlayerInterface::showPuzzleMap()
|
||||
|
||||
void CPlayerInterface::viewWorldMap()
|
||||
{
|
||||
adventureInt->changeMode(EAdvMapMode::WORLD_VIEW);
|
||||
adventureInt->changeMode(EAdvMapMode::WORLD_VIEW, 0.36F);
|
||||
}
|
||||
|
||||
void CPlayerInterface::advmapSpellCast(const CGHeroInstance * caster, int spellID)
|
||||
@ -1935,10 +1924,8 @@ CGPath * CPlayerInterface::getAndVerifyPath(const CGHeroInstance * h)
|
||||
|
||||
void CPlayerInterface::acceptTurn()
|
||||
{
|
||||
bool centerView = true;
|
||||
if (settings["session"]["autoSkip"].Bool())
|
||||
{
|
||||
centerView = false;
|
||||
while(CInfoWindow *iw = dynamic_cast<CInfoWindow *>(GH.topInt().get()))
|
||||
iw->close();
|
||||
}
|
||||
@ -1950,44 +1937,7 @@ void CPlayerInterface::acceptTurn()
|
||||
adventureInt->startTurn();
|
||||
}
|
||||
|
||||
adventureInt->heroList->update();
|
||||
adventureInt->townList->update();
|
||||
|
||||
const CGHeroInstance * heroToSelect = nullptr;
|
||||
|
||||
// find first non-sleeping hero
|
||||
for (auto hero : wanderingHeroes)
|
||||
{
|
||||
if (boost::range::find(sleepingHeroes, hero) == sleepingHeroes.end())
|
||||
{
|
||||
heroToSelect = hero;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//select first hero if available.
|
||||
if (heroToSelect != nullptr)
|
||||
{
|
||||
adventureInt->select(heroToSelect, centerView);
|
||||
}
|
||||
else if (towns.size())
|
||||
adventureInt->select(towns.front(), centerView);
|
||||
else
|
||||
adventureInt->select(wanderingHeroes.front());
|
||||
|
||||
//show new day animation and sound on infobar
|
||||
adventureInt->infoBar->showDate();
|
||||
|
||||
adventureInt->updateNextHero(nullptr);
|
||||
adventureInt->showAll(screen);
|
||||
|
||||
if(settings["session"]["autoSkip"].Bool() && !GH.isKeyboardShiftDown())
|
||||
{
|
||||
if(CInfoWindow *iw = dynamic_cast<CInfoWindow *>(GH.topInt().get()))
|
||||
iw->close();
|
||||
|
||||
adventureInt->fendTurn();
|
||||
}
|
||||
adventureInt->initializeNewTurn();
|
||||
|
||||
// warn player if he has no town
|
||||
if (cb->howManyTowns() == 0)
|
||||
|
@ -115,25 +115,6 @@ void ClientCommandManager::processCommand(const std::string &message, bool calle
|
||||
{
|
||||
exit(EXIT_SUCCESS);
|
||||
}
|
||||
else if(commandName == std::string("activate"))
|
||||
{
|
||||
int what;
|
||||
singleWordBuffer >> what;
|
||||
switch (what)
|
||||
{
|
||||
case 0:
|
||||
GH.topInt()->activate();
|
||||
break;
|
||||
case 1:
|
||||
adventureInt->activate();
|
||||
break;
|
||||
case 2:
|
||||
LOCPLINT->castleInt->activate();
|
||||
break;
|
||||
default:
|
||||
printCommandMessage("Wrong argument specified!", ELogLevel::ERROR);
|
||||
}
|
||||
}
|
||||
else if(commandName == "redraw")
|
||||
{
|
||||
GH.totalRedraw();
|
||||
@ -274,7 +255,7 @@ void ClientCommandManager::processCommand(const std::string &message, bool calle
|
||||
}
|
||||
else if(commandName == "mp" && adventureInt)
|
||||
{
|
||||
if(const CGHeroInstance *h = dynamic_cast<const CGHeroInstance *>(adventureInt->selection))
|
||||
if(const CGHeroInstance *h = adventureInt->curHero())
|
||||
printCommandMessage(std::to_string(h->movement) + "; max: " + std::to_string(h->maxMovePoints(true)) + "/" + std::to_string(h->maxMovePoints(false)) + "\n");
|
||||
}
|
||||
else if(commandName == "bonuses")
|
||||
@ -288,12 +269,12 @@ void ClientCommandManager::processCommand(const std::string &message, bool calle
|
||||
ss << b;
|
||||
return ss.str();
|
||||
};
|
||||
printCommandMessage("Bonuses of " + adventureInt->selection->getObjectName() + "\n");
|
||||
printCommandMessage(format(adventureInt->selection->getBonusList()) + "\n");
|
||||
printCommandMessage("Bonuses of " + adventureInt->curArmy()->getObjectName() + "\n");
|
||||
printCommandMessage(format(adventureInt->curArmy()->getBonusList()) + "\n");
|
||||
|
||||
printCommandMessage("\nInherited bonuses:\n");
|
||||
TCNodes parents;
|
||||
adventureInt->selection->getParents(parents);
|
||||
adventureInt->curArmy()->getParents(parents);
|
||||
for(const CBonusSystemNode *parent : parents)
|
||||
{
|
||||
printCommandMessage(std::string("\nBonuses from ") + typeid(*parent).name() + "\n" + format(*parent->getAllBonuses(Selector::all, Selector::all)) + "\n");
|
||||
|
@ -52,7 +52,7 @@
|
||||
|
||||
std::shared_ptr<CAdvMapInt> adventureInt;
|
||||
|
||||
static void setScrollingCursor(ui8 direction)
|
||||
void CAdvMapInt::setScrollingCursor(ui8 direction) const
|
||||
{
|
||||
if(direction & CAdvMapInt::RIGHT)
|
||||
{
|
||||
@ -90,7 +90,7 @@ CAdvMapInt::CAdvMapInt():
|
||||
terrain(new CTerrainRect),
|
||||
state(NA),
|
||||
spellBeingCasted(nullptr), position(int3(0, 0, 0)), selection(nullptr),
|
||||
updateScreen(false), anim(0), animValHitCount(0), heroAnim(0), heroAnimValHitCount(0),
|
||||
redrawOnNextFrame(false), anim(0), animValHitCount(0), heroAnim(0), heroAnimValHitCount(0),
|
||||
activeMapPanel(nullptr), duringAITurn(false), scrollingDir(0), scrollingState(false),
|
||||
swipeEnabled(settings["general"]["swipe"].Bool()), swipeMovementRequested(false),
|
||||
swipeTargetPosition(int3(-1, -1, -1))
|
||||
@ -237,7 +237,7 @@ CAdvMapInt::CAdvMapInt():
|
||||
|
||||
activeMapPanel = panelMain;
|
||||
|
||||
changeMode(EAdvMapMode::NORMAL);
|
||||
changeMode(EAdvMapMode::NORMAL, 0.36F);
|
||||
|
||||
underground->block(!CGI->mh->map->twoLevel);
|
||||
questlog->block(!CGI->mh->map->quests.size());
|
||||
@ -253,7 +253,7 @@ void CAdvMapInt::fshowOverview()
|
||||
|
||||
void CAdvMapInt::fworldViewBack()
|
||||
{
|
||||
changeMode(EAdvMapMode::NORMAL);
|
||||
changeMode(EAdvMapMode::NORMAL, 0.36F);
|
||||
CGI->mh->discardWorldViewCache();
|
||||
|
||||
auto hero = curHero();
|
||||
@ -292,7 +292,7 @@ void CAdvMapInt::fswitchLevel()
|
||||
worldViewUnderground->setIndex(position.z, true);
|
||||
worldViewUnderground->redraw();
|
||||
|
||||
updateScreen = true;
|
||||
redrawOnNextFrame = true;
|
||||
minimap->setLevel(position.z);
|
||||
|
||||
if (mode == EAdvMapMode::WORLD_VIEW)
|
||||
@ -525,7 +525,7 @@ void CAdvMapInt::showAll(SDL_Surface * to)
|
||||
}
|
||||
activeMapPanel->showAll(to);
|
||||
|
||||
updateScreen = true;
|
||||
redrawOnNextFrame = true;
|
||||
minimap->showAll(to);
|
||||
show(to);
|
||||
|
||||
@ -570,7 +570,7 @@ void CAdvMapInt::show(SDL_Surface * to)
|
||||
CGI->mh->updateWater();
|
||||
animValHitCount = 0;
|
||||
++anim;
|
||||
updateScreen = true;
|
||||
redrawOnNextFrame = true;
|
||||
}
|
||||
|
||||
if(swipeEnabled)
|
||||
@ -591,7 +591,7 @@ void CAdvMapInt::show(SDL_Surface * to)
|
||||
else
|
||||
gems[i]->setFrame(LOCPLINT->playerID.getNum());
|
||||
}
|
||||
if(updateScreen)
|
||||
if(redrawOnNextFrame)
|
||||
{
|
||||
int3 betterPos = LOCPLINT->repairScreenPos(position);
|
||||
if (betterPos != position)
|
||||
@ -603,7 +603,7 @@ void CAdvMapInt::show(SDL_Surface * to)
|
||||
terrain->show(to);
|
||||
for(int i = 0; i < 4; i++)
|
||||
gems[i]->showAll(to);
|
||||
updateScreen=false;
|
||||
redrawOnNextFrame=false;
|
||||
LOCPLINT->cingconsole->show(to);
|
||||
}
|
||||
else
|
||||
@ -621,8 +621,7 @@ void CAdvMapInt::handleMapScrollingUpdate()
|
||||
{
|
||||
int scrollSpeed = static_cast<int>(settings["adventure"]["scrollSpeed"].Float());
|
||||
//if advmap needs updating AND (no dialog is shown OR ctrl is pressed)
|
||||
if((animValHitCount % (4 / scrollSpeed)) == 0
|
||||
&& GH.isKeyboardCtrlDown())
|
||||
if((animValHitCount % (4 / scrollSpeed)) == 0)
|
||||
{
|
||||
if((scrollingDir & LEFT) && (position.x > -CGI->mh->frameW))
|
||||
position.x--;
|
||||
@ -640,7 +639,7 @@ void CAdvMapInt::handleMapScrollingUpdate()
|
||||
{
|
||||
setScrollingCursor(scrollingDir);
|
||||
scrollingState = true;
|
||||
updateScreen = true;
|
||||
redrawOnNextFrame = true;
|
||||
minimap->redraw();
|
||||
if(mode == EAdvMapMode::WORLD_VIEW)
|
||||
terrain->redraw();
|
||||
@ -661,7 +660,7 @@ void CAdvMapInt::handleSwipeUpdate()
|
||||
position.x = fixedPos.x;
|
||||
position.y = fixedPos.y;
|
||||
CCS->curh->set(Cursor::Map::POINTER);
|
||||
updateScreen = true;
|
||||
redrawOnNextFrame = true;
|
||||
minimap->redraw();
|
||||
swipeMovementRequested = false;
|
||||
}
|
||||
@ -700,7 +699,7 @@ void CAdvMapInt::centerOn(int3 on, bool fade)
|
||||
on = LOCPLINT->repairScreenPos(on);
|
||||
|
||||
position = on;
|
||||
updateScreen=true;
|
||||
redrawOnNextFrame=true;
|
||||
underground->setIndex(on.z,true); //change underground switch button image
|
||||
underground->redraw();
|
||||
worldViewUnderground->setIndex(on.z, true);
|
||||
@ -877,11 +876,14 @@ void CAdvMapInt::keyPressed(const SDL_Keycode & key)
|
||||
(direction->y<0 ? UP : 0) |
|
||||
(direction->y>0 ? DOWN : 0) ;
|
||||
|
||||
scrollingDir |= Dir;
|
||||
|
||||
|
||||
//ctrl makes arrow move screen, not hero
|
||||
if(GH.isKeyboardCtrlDown())
|
||||
{
|
||||
scrollingDir |= Dir;
|
||||
return;
|
||||
}
|
||||
|
||||
if(!h || !isActive())
|
||||
return;
|
||||
@ -1057,13 +1059,16 @@ void CAdvMapInt::startHotSeatWait(PlayerColor Player)
|
||||
|
||||
void CAdvMapInt::setPlayer(PlayerColor Player)
|
||||
{
|
||||
if (Player == player)
|
||||
return;
|
||||
|
||||
player = Player;
|
||||
bg->playerColored(player);
|
||||
|
||||
panelMain->setPlayerColor(player);
|
||||
panelWorldView->setPlayerColor(player);
|
||||
panelWorldView->recolorIcons(player, player.getNum() * 19);
|
||||
resdatabar->background->colorize(player);
|
||||
resdatabar->colorize(player);
|
||||
}
|
||||
|
||||
void CAdvMapInt::startTurn()
|
||||
@ -1077,6 +1082,50 @@ void CAdvMapInt::startTurn()
|
||||
}
|
||||
}
|
||||
|
||||
void CAdvMapInt::initializeNewTurn()
|
||||
{
|
||||
heroList->update();
|
||||
townList->update();
|
||||
|
||||
const CGHeroInstance * heroToSelect = nullptr;
|
||||
|
||||
// find first non-sleeping hero
|
||||
for (auto hero : LOCPLINT->wanderingHeroes)
|
||||
{
|
||||
if (boost::range::find(LOCPLINT->sleepingHeroes, hero) == LOCPLINT->sleepingHeroes.end())
|
||||
{
|
||||
heroToSelect = hero;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
bool centerView = !settings["session"]["autoSkip"].Bool();
|
||||
|
||||
//select first hero if available.
|
||||
if (heroToSelect != nullptr)
|
||||
{
|
||||
select(heroToSelect, centerView);
|
||||
}
|
||||
else if (LOCPLINT->towns.size())
|
||||
select(LOCPLINT->towns.front(), centerView);
|
||||
else
|
||||
select(LOCPLINT->wanderingHeroes.front());
|
||||
|
||||
//show new day animation and sound on infobar
|
||||
infoBar->showDate();
|
||||
|
||||
updateNextHero(nullptr);
|
||||
showAll(screen);
|
||||
|
||||
if(settings["session"]["autoSkip"].Bool() && !GH.isKeyboardShiftDown())
|
||||
{
|
||||
if(CInfoWindow *iw = dynamic_cast<CInfoWindow *>(GH.topInt().get()))
|
||||
iw->close();
|
||||
|
||||
endingTurn();
|
||||
}
|
||||
}
|
||||
|
||||
void CAdvMapInt::endingTurn()
|
||||
{
|
||||
if(settings["session"]["spectate"].Bool())
|
||||
@ -1415,7 +1464,7 @@ void CAdvMapInt::leaveCastingMode(bool cast, int3 dest)
|
||||
const CGHeroInstance * CAdvMapInt::curHero() const
|
||||
{
|
||||
if(selection && selection->ID == Obj::HERO)
|
||||
return static_cast<const CGHeroInstance *>(selection);
|
||||
return dynamic_cast<const CGHeroInstance *>(selection);
|
||||
else
|
||||
return nullptr;
|
||||
}
|
||||
@ -1423,11 +1472,29 @@ const CGHeroInstance * CAdvMapInt::curHero() const
|
||||
const CGTownInstance * CAdvMapInt::curTown() const
|
||||
{
|
||||
if(selection && selection->ID == Obj::TOWN)
|
||||
return static_cast<const CGTownInstance *>(selection);
|
||||
return dynamic_cast<const CGTownInstance *>(selection);
|
||||
else
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
const CArmedInstance * CAdvMapInt::curArmy() const
|
||||
{
|
||||
if (selection)
|
||||
return dynamic_cast<const CArmedInstance *>(selection);
|
||||
else
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
Rect CAdvMapInt::terrainAreaPixels() const
|
||||
{
|
||||
return terrain->pos;
|
||||
}
|
||||
|
||||
Rect CAdvMapInt::terrainAreaTiles() const
|
||||
{
|
||||
return terrain->visibleTilesArea();
|
||||
}
|
||||
|
||||
const IShipyard * CAdvMapInt::ourInaccessibleShipyard(const CGObjectInstance *obj) const
|
||||
{
|
||||
const IShipyard *ret = IShipyard::castFrom(obj);
|
||||
@ -1537,3 +1604,7 @@ void CAdvMapInt::WorldViewOptions::adjustDrawingInfo(MapDrawingInfo& info)
|
||||
info.additionalIcons = &iconPositions;
|
||||
}
|
||||
|
||||
void CAdvMapInt::requestRedrawMapOnNextFrame()
|
||||
{
|
||||
redrawOnNextFrame = true;
|
||||
}
|
||||
|
@ -53,74 +53,77 @@ enum class EAdvMapMode
|
||||
/// can get to the towns and heroes.
|
||||
class CAdvMapInt : public CIntObject
|
||||
{
|
||||
//Return object that must be active at this tile (=clickable)
|
||||
const CGObjectInstance *getActiveObject(const int3 &tile);
|
||||
//TODO: remove
|
||||
friend class CPlayerInterface;
|
||||
friend class CTerrainRect;
|
||||
|
||||
boost::optional<Point> keyToMoveDirection(const SDL_Keycode & key);
|
||||
|
||||
public:
|
||||
CAdvMapInt();
|
||||
|
||||
int3 position; //top left corner of visible map part
|
||||
PlayerColor player;
|
||||
|
||||
bool duringAITurn;
|
||||
|
||||
enum{LEFT=1, RIGHT=2, UP=4, DOWN=8};
|
||||
ui8 scrollingDir; //uses enum: LEFT RIGHT, UP, DOWN
|
||||
bool scrollingState;
|
||||
bool swipeEnabled;
|
||||
bool swipeMovementRequested;
|
||||
int3 swipeTargetPosition;
|
||||
|
||||
enum{NA, INGAME, WAITING} state;
|
||||
|
||||
bool updateScreen;
|
||||
ui8 anim, animValHitCount; //animation frame
|
||||
ui8 heroAnim, heroAnimValHitCount; //animation frame
|
||||
|
||||
EAdvMapMode mode;
|
||||
float worldViewScale;
|
||||
private:
|
||||
enum EDirections {LEFT=1, RIGHT=2, UP=4, DOWN=8};
|
||||
enum EGameStates {NA, INGAME, WAITING};
|
||||
|
||||
struct WorldViewOptions
|
||||
{
|
||||
bool showAllTerrain; //for expert viewEarth
|
||||
|
||||
std::vector<ObjectPosInfo> iconPositions;
|
||||
|
||||
WorldViewOptions();
|
||||
|
||||
void clear();
|
||||
|
||||
void adjustDrawingInfo(MapDrawingInfo & info);
|
||||
};
|
||||
|
||||
bool swipeEnabled;
|
||||
bool swipeMovementRequested;
|
||||
int3 swipeTargetPosition;
|
||||
|
||||
EGameStates state;
|
||||
|
||||
ui8 anim, animValHitCount; //animation frame
|
||||
ui8 heroAnim, heroAnimValHitCount; //animation frame
|
||||
|
||||
/// top left corner of visible map part
|
||||
int3 position;
|
||||
|
||||
EAdvMapMode mode;
|
||||
float worldViewScale;
|
||||
|
||||
WorldViewOptions worldViewOptions;
|
||||
|
||||
/// Currently selected object, can be town, hero or null
|
||||
const CArmedInstance *selection;
|
||||
|
||||
/// currently acting player
|
||||
PlayerColor player;
|
||||
|
||||
bool duringAITurn;
|
||||
|
||||
/// uses EDirections enum
|
||||
ui8 scrollingDir;
|
||||
bool scrollingState;
|
||||
|
||||
const CSpell *spellBeingCasted; //nullptr if none
|
||||
|
||||
std::vector<std::shared_ptr<CAnimImage>> gems;
|
||||
|
||||
std::shared_ptr<IImage> bg;
|
||||
std::shared_ptr<IImage> bgWorldView;
|
||||
std::vector<std::shared_ptr<CAnimImage>> gems;
|
||||
std::shared_ptr<CMinimap> minimap;
|
||||
std::shared_ptr<CGStatusBar> statusbar;
|
||||
|
||||
std::shared_ptr<CButton> kingOverview;
|
||||
std::shared_ptr<CButton> sleepWake;
|
||||
std::shared_ptr<CButton> underground;
|
||||
std::shared_ptr<CButton> questlog;
|
||||
std::shared_ptr<CButton> sleepWake;
|
||||
std::shared_ptr<CButton> moveHero;
|
||||
std::shared_ptr<CButton> spellbook;
|
||||
std::shared_ptr<CButton> advOptions;
|
||||
std::shared_ptr<CButton> sysOptions;
|
||||
std::shared_ptr<CButton> nextHero;
|
||||
std::shared_ptr<CButton> endTurn;
|
||||
|
||||
std::shared_ptr<CButton> worldViewUnderground;
|
||||
|
||||
std::shared_ptr<CTerrainRect> terrain; //visible terrain
|
||||
std::shared_ptr<CResDataBar> resdatabar;
|
||||
std::shared_ptr<CTerrainRect> terrain;
|
||||
std::shared_ptr<CMinimap> minimap;
|
||||
std::shared_ptr<CHeroList> heroList;
|
||||
std::shared_ptr<CTownList> townList;
|
||||
std::shared_ptr<CInfoBar> infoBar;
|
||||
std::shared_ptr<CGStatusBar> statusbar;
|
||||
std::shared_ptr<CResDataBar> resdatabar;
|
||||
|
||||
std::shared_ptr<CAdvMapPanel> panelMain; // panel that holds all right-side buttons in normal view
|
||||
std::shared_ptr<CAdvMapWorldViewPanel> panelWorldView; // panel that holds all buttons and other ui in world view
|
||||
@ -128,10 +131,7 @@ public:
|
||||
|
||||
std::shared_ptr<CAnimation> worldViewIcons;// images for world view overlay
|
||||
|
||||
const CSpell *spellBeingCasted; //nullptr if none
|
||||
|
||||
const CArmedInstance *selection; //currently selected town/hero
|
||||
|
||||
private:
|
||||
//functions bound to buttons
|
||||
void fshowOverview();
|
||||
void fworldViewBack();
|
||||
@ -148,21 +148,49 @@ public:
|
||||
void fnextHero();
|
||||
void fendTurn();
|
||||
|
||||
void setScrollingCursor(ui8 direction) const;
|
||||
void selectionChanged();
|
||||
bool isActive();
|
||||
void adjustActiveness(bool aiTurnStart); //should be called every time at AI/human turn transition; blocks GUI during AI turn
|
||||
|
||||
const IShipyard * ourInaccessibleShipyard(const CGObjectInstance *obj) const; //checks if obj is our ashipyard and cursor is 0,0 -> returns shipyard or nullptr else
|
||||
//button updates
|
||||
void updateSleepWake(const CGHeroInstance *h);
|
||||
void updateSpellbook(const CGHeroInstance *h);
|
||||
|
||||
void handleMapScrollingUpdate();
|
||||
void handleSwipeUpdate();
|
||||
|
||||
void showMoveDetailsInStatusbar(const CGHeroInstance & hero, const CGPathNode & pathNode);
|
||||
|
||||
const CGObjectInstance *getActiveObject(const int3 &tile);
|
||||
|
||||
boost::optional<Point> keyToMoveDirection(const SDL_Keycode & key);
|
||||
|
||||
bool redrawOnNextFrame;
|
||||
public:
|
||||
CAdvMapInt();
|
||||
|
||||
// CIntObject interface implementation
|
||||
|
||||
void activate() override;
|
||||
void deactivate() override;
|
||||
|
||||
void show(SDL_Surface * to) override; //redraws terrain
|
||||
void showAll(SDL_Surface * to) override; //shows and activates adv. map interface
|
||||
void show(SDL_Surface * to) override;
|
||||
void showAll(SDL_Surface * to) override;
|
||||
|
||||
void select(const CArmedInstance *sel, bool centerView = true);
|
||||
void selectionChanged();
|
||||
void centerOn(int3 on, bool fade = false);
|
||||
void centerOn(const CGObjectInstance *obj, bool fade = false);
|
||||
int3 verifyPos(int3 ver);
|
||||
void keyPressed(const SDL_Keycode & key) override;
|
||||
void keyReleased(const SDL_Keycode & key) override;
|
||||
void mouseMoved (const Point & cursorPosition) override;
|
||||
bool isActive();
|
||||
|
||||
// public interface
|
||||
|
||||
void requestRedrawMapOnNextFrame();
|
||||
|
||||
void select(const CArmedInstance *sel, bool centerView = true);
|
||||
void centerOn(int3 on, bool fade = false);
|
||||
void centerOn(const CGObjectInstance *obj, bool fade = false);
|
||||
int3 verifyPos(int3 ver);
|
||||
|
||||
bool isHeroSleeping(const CGHeroInstance *hero);
|
||||
void setHeroSleeping(const CGHeroInstance *hero, bool sleep);
|
||||
@ -171,34 +199,34 @@ public:
|
||||
void setPlayer(PlayerColor Player);
|
||||
void startHotSeatWait(PlayerColor Player);
|
||||
void startTurn();
|
||||
void initializeNewTurn();
|
||||
void endingTurn();
|
||||
void aiTurnStarted();
|
||||
|
||||
void adjustActiveness(bool aiTurnStart); //should be called every time at AI/human turn transition; blocks GUI during AI turn
|
||||
void quickCombatLock(); //should be called when quick battle started
|
||||
void quickCombatUnlock();
|
||||
|
||||
void tileLClicked(const int3 &mapPos);
|
||||
void tileHovered(const int3 &mapPos);
|
||||
void tileRClicked(const int3 &mapPos);
|
||||
|
||||
void enterCastingMode(const CSpell * sp);
|
||||
void leaveCastingMode(bool cast = false, int3 dest = int3(-1, -1, -1));
|
||||
const CGHeroInstance * curHero() const;
|
||||
const CGTownInstance * curTown() const;
|
||||
const IShipyard * ourInaccessibleShipyard(const CGObjectInstance *obj) const; //checks if obj is our ashipyard and cursor is 0,0 -> returns shipyard or nullptr else
|
||||
//button updates
|
||||
void updateSleepWake(const CGHeroInstance *h);
|
||||
const CArmedInstance * curArmy() const;
|
||||
|
||||
void updateMoveHero(const CGHeroInstance *h, tribool hasPath = boost::logic::indeterminate);
|
||||
void updateSpellbook(const CGHeroInstance *h);
|
||||
void updateNextHero(const CGHeroInstance *h);
|
||||
|
||||
/// returns area of screen covered by terrain (main game area)
|
||||
Rect terrainAreaPixels() const;
|
||||
|
||||
/// returs visible section of game map, in tiles
|
||||
Rect terrainAreaTiles() const;
|
||||
|
||||
/// changes current adventure map mode; used to switch between default view and world view; scale is ignored if EAdvMapMode == NORMAL
|
||||
void changeMode(EAdvMapMode newMode, float newScale = 0.36f);
|
||||
|
||||
void handleMapScrollingUpdate();
|
||||
void handleSwipeUpdate();
|
||||
|
||||
private:
|
||||
void showMoveDetailsInStatusbar(const CGHeroInstance & hero, const CGPathNode & pathNode);
|
||||
void changeMode(EAdvMapMode newMode, float newScale);
|
||||
};
|
||||
|
||||
extern std::shared_ptr<CAdvMapInt> adventureInt;
|
||||
|
@ -74,8 +74,6 @@ CAdvMapWorldViewPanel::CAdvMapWorldViewPanel(std::shared_ptr<CAnimation> _icons,
|
||||
}
|
||||
}
|
||||
|
||||
CAdvMapWorldViewPanel::~CAdvMapWorldViewPanel() = default;
|
||||
|
||||
void CAdvMapWorldViewPanel::recolorIcons(const PlayerColor & color, int indexOffset)
|
||||
{
|
||||
assert(iconsData.size() == currentIcons.size());
|
||||
|
@ -51,9 +51,9 @@ class CAdvMapWorldViewPanel : public CAdvMapPanel
|
||||
std::shared_ptr<CAnimation> icons;
|
||||
public:
|
||||
CAdvMapWorldViewPanel(std::shared_ptr<CAnimation> _icons, std::shared_ptr<IImage> bg, Point position, int spaceBottom, const PlayerColor &color);
|
||||
virtual ~CAdvMapWorldViewPanel();
|
||||
|
||||
void addChildIcon(std::pair<int, Point> data, int indexOffset);
|
||||
|
||||
/// recreates all pictures from given def to recolor them according to current player color
|
||||
void recolorIcons(const PlayerColor & color, int indexOffset);
|
||||
};
|
||||
|
@ -16,7 +16,6 @@ class CButton;
|
||||
/// Adventure options dialog where you can view the world, dig, play the replay of the last turn,...
|
||||
class CAdventureOptions : public CWindowObject
|
||||
{
|
||||
public:
|
||||
std::shared_ptr<CButton> exit;
|
||||
std::shared_ptr<CButton> viewWorld;
|
||||
std::shared_ptr<CButton> puzzle;
|
||||
@ -24,7 +23,9 @@ public:
|
||||
std::shared_ptr<CButton> scenInfo;
|
||||
/*std::shared_ptr<CButton> replay*/
|
||||
|
||||
public:
|
||||
CAdventureOptions();
|
||||
|
||||
static void showScenarioInfo();
|
||||
};
|
||||
|
||||
|
@ -22,12 +22,13 @@ private:
|
||||
int maxDisplayedTexts; //hiw many texts can be displayed simultaneously
|
||||
|
||||
std::weak_ptr<IStatusBar> currentStatusBar;
|
||||
public:
|
||||
std::string enteredText;
|
||||
void show(SDL_Surface * to) override;
|
||||
void print(const std::string &txt);
|
||||
void keyPressed(const SDL_Keycode & key) override;
|
||||
|
||||
public:
|
||||
void print(const std::string &txt);
|
||||
|
||||
void show(SDL_Surface * to) override;
|
||||
void keyPressed(const SDL_Keycode & key) override;
|
||||
void textInputed(const std::string & enteredText) override;
|
||||
void textEdited(const std::string & enteredText) override;
|
||||
|
||||
|
@ -197,19 +197,18 @@ void CInfoBar::reset()
|
||||
void CInfoBar::showSelection()
|
||||
{
|
||||
OBJECT_CONSTRUCTION_CUSTOM_CAPTURING(255-DISPOSE);
|
||||
if(adventureInt->selection)
|
||||
if(adventureInt->curHero())
|
||||
{
|
||||
if(auto hero = dynamic_cast<const CGHeroInstance *>(adventureInt->selection))
|
||||
{
|
||||
showHeroSelection(hero);
|
||||
showHeroSelection(adventureInt->curHero());
|
||||
return;
|
||||
}
|
||||
else if(auto town = dynamic_cast<const CGTownInstance *>(adventureInt->selection))
|
||||
|
||||
if(adventureInt->curTown())
|
||||
{
|
||||
showTownSelection(town);
|
||||
showTownSelection(adventureInt->curTown());
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
showGameStatus();//FIXME: may be incorrect but shouldn't happen in general
|
||||
}
|
||||
|
||||
|
@ -202,7 +202,7 @@ std::shared_ptr<CIntObject> CHeroList::CHeroItem::genSelection()
|
||||
|
||||
void CHeroList::CHeroItem::select(bool on)
|
||||
{
|
||||
if(on && adventureInt->selection != hero)
|
||||
if(on && adventureInt->curHero() != hero)
|
||||
adventureInt->select(hero);
|
||||
}
|
||||
|
||||
@ -253,12 +253,9 @@ void CHeroList::update(const CGHeroInstance * hero)
|
||||
//simplest solution for now: reset list and restore selection
|
||||
|
||||
listBox->resize(LOCPLINT->wanderingHeroes.size());
|
||||
if (adventureInt->selection)
|
||||
{
|
||||
auto selectedHero = dynamic_cast<const CGHeroInstance *>(adventureInt->selection);
|
||||
if (selectedHero)
|
||||
select(selectedHero);
|
||||
}
|
||||
if (adventureInt->curHero())
|
||||
select(adventureInt->curHero());
|
||||
|
||||
CList::update();
|
||||
}
|
||||
|
||||
@ -294,7 +291,7 @@ void CTownList::CTownItem::update()
|
||||
|
||||
void CTownList::CTownItem::select(bool on)
|
||||
{
|
||||
if (on && adventureInt->selection != town)
|
||||
if (on && adventureInt->curTown() != town)
|
||||
adventureInt->select(town);
|
||||
}
|
||||
|
||||
@ -328,12 +325,9 @@ void CTownList::update(const CGTownInstance *)
|
||||
//simplest solution for now: reset list and restore selection
|
||||
|
||||
listBox->resize(LOCPLINT->towns.size());
|
||||
if (adventureInt->selection)
|
||||
{
|
||||
auto town = dynamic_cast<const CGTownInstance *>(adventureInt->selection);
|
||||
if (town)
|
||||
select(town);
|
||||
}
|
||||
if (adventureInt->curTown())
|
||||
select(adventureInt->curTown());
|
||||
|
||||
CList::update();
|
||||
}
|
||||
|
||||
|
@ -168,15 +168,15 @@ void CMinimap::showAll(SDL_Surface * to)
|
||||
Canvas target(to);
|
||||
|
||||
int3 mapSizes = LOCPLINT->cb->getMapSize();
|
||||
int3 tileCountOnScreen = adventureInt->terrain->tileCountOnScreen();
|
||||
Rect screenArea = adventureInt->terrainAreaTiles();
|
||||
|
||||
//draw radar
|
||||
Rect radar =
|
||||
{
|
||||
adventureInt->position.x * pos.w / mapSizes.x,
|
||||
adventureInt->position.y * pos.h / mapSizes.y,
|
||||
tileCountOnScreen.x * pos.w / mapSizes.x - 1,
|
||||
tileCountOnScreen.y * pos.h / mapSizes.y - 1
|
||||
screenArea.x * pos.w / mapSizes.x,
|
||||
screenArea.y * pos.h / mapSizes.y,
|
||||
screenArea.w * pos.w / mapSizes.x - 1,
|
||||
screenArea.h * pos.h / mapSizes.y - 1
|
||||
};
|
||||
|
||||
Canvas clippedTarget(target, pos);
|
||||
|
@ -13,7 +13,6 @@
|
||||
#include "../CGameInfo.h"
|
||||
#include "../CPlayerInterface.h"
|
||||
#include "../render/Colors.h"
|
||||
#include "../renderSDL/SDL_Extensions.h"
|
||||
#include "../gui/CGuiHandler.h"
|
||||
#include "../widgets/Images.h"
|
||||
|
||||
@ -23,10 +22,6 @@
|
||||
|
||||
#define ADVOPT (conf.go()->ac)
|
||||
|
||||
void CResDataBar::clickRight(tribool down, bool previousState)
|
||||
{
|
||||
}
|
||||
|
||||
CResDataBar::CResDataBar(const std::string & defname, int x, int y, int offx, int offy, int resdist, int datedist)
|
||||
{
|
||||
pos.x += x;
|
||||
@ -70,8 +65,6 @@ CResDataBar::CResDataBar()
|
||||
|
||||
}
|
||||
|
||||
CResDataBar::~CResDataBar() = default;
|
||||
|
||||
std::string CResDataBar::buildDateString()
|
||||
{
|
||||
std::string pattern = "%s: %d, %s: %d, %s: %d";
|
||||
@ -96,14 +89,13 @@ void CResDataBar::draw(SDL_Surface * to)
|
||||
graphics->fonts[FONT_SMALL]->renderTextLeft(to, buildDateString(), Colors::WHITE, Point(txtpos[7].first, txtpos[7].second));
|
||||
}
|
||||
|
||||
void CResDataBar::show(SDL_Surface * to)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void CResDataBar::showAll(SDL_Surface * to)
|
||||
{
|
||||
CIntObject::showAll(to);
|
||||
draw(to);
|
||||
}
|
||||
|
||||
void CResDataBar::colorize(PlayerColor player)
|
||||
{
|
||||
background->colorize(player);
|
||||
}
|
||||
|
@ -17,18 +17,17 @@ class CResDataBar : public CIntObject
|
||||
{
|
||||
std::string buildDateString();
|
||||
|
||||
public:
|
||||
std::shared_ptr<CPicture> background;
|
||||
|
||||
std::vector<std::pair<int,int> > txtpos;
|
||||
|
||||
void clickRight(tribool down, bool previousState) override;
|
||||
CResDataBar();
|
||||
CResDataBar(const std::string &defname, int x, int y, int offx, int offy, int resdist, int datedist);
|
||||
~CResDataBar();
|
||||
|
||||
void draw(SDL_Surface * to);
|
||||
void show(SDL_Surface * to) override;
|
||||
public:
|
||||
CResDataBar();
|
||||
CResDataBar(const std::string &defname, int x, int y, int offx, int offy, int resdist, int datedist);
|
||||
|
||||
void colorize(PlayerColor player);
|
||||
void showAll(SDL_Surface * to) override;
|
||||
};
|
||||
|
||||
|
@ -189,7 +189,7 @@ void CTerrainRect::hover(bool on)
|
||||
{
|
||||
if (!on)
|
||||
{
|
||||
adventureInt->statusbar->clear();
|
||||
GH.statusbar->clear();
|
||||
CCS->curh->set(Cursor::Map::POINTER);
|
||||
}
|
||||
//Hoverable::hover(on);
|
||||
@ -381,17 +381,17 @@ int3 CTerrainRect::whichTileIsIt()
|
||||
return whichTileIsIt(GH.getCursorPosition().x, GH.getCursorPosition().y);
|
||||
}
|
||||
|
||||
int3 CTerrainRect::tileCountOnScreen()
|
||||
Rect CTerrainRect::visibleTilesArea()
|
||||
{
|
||||
switch (adventureInt->mode)
|
||||
{
|
||||
default:
|
||||
logGlobal->error("Unknown map mode %d", (int)adventureInt->mode);
|
||||
return int3();
|
||||
return Rect();
|
||||
case EAdvMapMode::NORMAL:
|
||||
return int3(tilesw, tilesh, 1);
|
||||
return Rect(adventureInt->position.x, adventureInt->position.y, tilesw, tilesh);
|
||||
case EAdvMapMode::WORLD_VIEW:
|
||||
return int3((si32)(tilesw / adventureInt->worldViewScale), (si32)(tilesh / adventureInt->worldViewScale), 1);
|
||||
return Rect(adventureInt->position.x, adventureInt->position.y, tilesw / adventureInt->worldViewScale, tilesh / adventureInt->worldViewScale);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -63,7 +63,7 @@ public:
|
||||
void showAnim(SDL_Surface * to);
|
||||
|
||||
/// @returns number of visible tiles on screen respecting current map scaling
|
||||
int3 tileCountOnScreen();
|
||||
Rect visibleTilesArea();
|
||||
|
||||
/// animates view by caching current surface and crossfading it with normal screen
|
||||
void fadeFromCurrentView();
|
||||
|
@ -132,10 +132,10 @@ BattleInterface::~BattleInterface()
|
||||
CPlayerInterface::battleInt = nullptr;
|
||||
givenCommand.cond.notify_all(); //that two lines should make any stacksController->getActiveStack() waiting thread to finish
|
||||
|
||||
if (adventureInt && adventureInt->selection)
|
||||
if (adventureInt && adventureInt->curArmy())
|
||||
{
|
||||
//FIXME: this should be moved to adventureInt which should restore correct track based on selection/active player
|
||||
const auto * terrain = LOCPLINT->cb->getTile(adventureInt->selection->visitablePos())->terType;
|
||||
const auto * terrain = LOCPLINT->cb->getTile(adventureInt->curArmy()->visitablePos())->terType;
|
||||
CCS->musich->playMusicFromSet("terrain", terrain->getJsonKey(), true, false);
|
||||
}
|
||||
|
||||
|
@ -365,8 +365,10 @@ CRClickPopupInt::~CRClickPopupInt()
|
||||
|
||||
Point CInfoBoxPopup::toScreen(Point p)
|
||||
{
|
||||
vstd::abetween(p.x, adventureInt->terrain->pos.x + 100, adventureInt->terrain->pos.x + adventureInt->terrain->pos.w - 100);
|
||||
vstd::abetween(p.y, adventureInt->terrain->pos.y + 100, adventureInt->terrain->pos.y + adventureInt->terrain->pos.h - 100);
|
||||
auto bounds = adventureInt->terrainAreaPixels();
|
||||
|
||||
vstd::abetween(p.x, bounds.top() + 100, bounds.bottom() - 100);
|
||||
vstd::abetween(p.y, bounds.left() + 100, bounds.right() - 100);
|
||||
|
||||
return p;
|
||||
}
|
||||
@ -375,7 +377,7 @@ CInfoBoxPopup::CInfoBoxPopup(Point position, const CGTownInstance * town)
|
||||
: CWindowObject(RCLICK_POPUP | PLAYER_COLORED, "TOWNQVBK", toScreen(position))
|
||||
{
|
||||
InfoAboutTown iah;
|
||||
LOCPLINT->cb->getTownInfo(town, iah, adventureInt->selection); //todo: should this be nearest hero?
|
||||
LOCPLINT->cb->getTownInfo(town, iah, adventureInt->curTown()); //todo: should this be nearest hero?
|
||||
|
||||
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
|
||||
tooltip = std::make_shared<CTownTooltip>(Point(9, 10), iah);
|
||||
@ -385,7 +387,7 @@ CInfoBoxPopup::CInfoBoxPopup(Point position, const CGHeroInstance * hero)
|
||||
: CWindowObject(RCLICK_POPUP | PLAYER_COLORED, "HEROQVBK", toScreen(position))
|
||||
{
|
||||
InfoAboutHero iah;
|
||||
LOCPLINT->cb->getHeroInfo(hero, iah, adventureInt->selection);//todo: should this be nearest hero?
|
||||
LOCPLINT->cb->getHeroInfo(hero, iah, adventureInt->curHero());//todo: should this be nearest hero?
|
||||
|
||||
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
|
||||
tooltip = std::make_shared<CHeroTooltip>(Point(9, 10), iah);
|
||||
@ -404,7 +406,7 @@ CInfoBoxPopup::CInfoBoxPopup(Point position, const CGGarrison * garr)
|
||||
std::shared_ptr<WindowBase> CRClickPopup::createInfoWin(Point position, const CGObjectInstance * specific) //specific=0 => draws info about selected town/hero
|
||||
{
|
||||
if(nullptr == specific)
|
||||
specific = adventureInt->selection;
|
||||
specific = adventureInt->curArmy();
|
||||
|
||||
if(nullptr == specific)
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user