1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-27 22:49:25 +02:00

Merge pull request #3821 from SoundSSGood/CWindowWithArtifacts-refactoring

CWindowWithArtifacts refactoring
This commit is contained in:
Ivan Savenko
2024-04-26 11:58:38 +03:00
committed by GitHub
25 changed files with 187 additions and 281 deletions

View File

@@ -104,7 +104,7 @@ set(client_SRCS
globalLobby/GlobalLobbyWindow.cpp globalLobby/GlobalLobbyWindow.cpp
widgets/Buttons.cpp widgets/Buttons.cpp
widgets/CArtifactHolder.cpp widgets/CArtPlace.cpp
widgets/CComponent.cpp widgets/CComponent.cpp
widgets/CExchangeController.cpp widgets/CExchangeController.cpp
widgets/CGarrisonInt.cpp widgets/CGarrisonInt.cpp
@@ -123,7 +123,6 @@ set(client_SRCS
widgets/CArtifactsOfHeroAltar.cpp widgets/CArtifactsOfHeroAltar.cpp
widgets/CArtifactsOfHeroMarket.cpp widgets/CArtifactsOfHeroMarket.cpp
widgets/CArtifactsOfHeroBackpack.cpp widgets/CArtifactsOfHeroBackpack.cpp
widgets/CWindowWithArtifacts.cpp
widgets/RadialMenu.cpp widgets/RadialMenu.cpp
widgets/markets/CAltarArtifacts.cpp widgets/markets/CAltarArtifacts.cpp
widgets/markets/CAltarCreatures.cpp widgets/markets/CAltarCreatures.cpp
@@ -153,6 +152,7 @@ set(client_SRCS
windows/InfoWindows.cpp windows/InfoWindows.cpp
windows/QuickRecruitmentWindow.cpp windows/QuickRecruitmentWindow.cpp
windows/CHeroBackpackWindow.cpp windows/CHeroBackpackWindow.cpp
windows/CWindowWithArtifacts.cpp
windows/settings/GeneralOptionsTab.cpp windows/settings/GeneralOptionsTab.cpp
windows/settings/OtherOptionsTab.cpp windows/settings/OtherOptionsTab.cpp
windows/settings/SettingsMainWindow.cpp windows/settings/SettingsMainWindow.cpp
@@ -295,7 +295,7 @@ set(client_HEADERS
globalLobby/GlobalLobbyWindow.h globalLobby/GlobalLobbyWindow.h
widgets/Buttons.h widgets/Buttons.h
widgets/CArtifactHolder.h widgets/CArtPlace.h
widgets/CComponent.h widgets/CComponent.h
widgets/CExchangeController.h widgets/CExchangeController.h
widgets/CGarrisonInt.h widgets/CGarrisonInt.h
@@ -314,7 +314,6 @@ set(client_HEADERS
widgets/CArtifactsOfHeroAltar.h widgets/CArtifactsOfHeroAltar.h
widgets/CArtifactsOfHeroMarket.h widgets/CArtifactsOfHeroMarket.h
widgets/CArtifactsOfHeroBackpack.h widgets/CArtifactsOfHeroBackpack.h
widgets/CWindowWithArtifacts.h
widgets/RadialMenu.h widgets/RadialMenu.h
widgets/markets/CAltarArtifacts.h widgets/markets/CAltarArtifacts.h
widgets/markets/CAltarCreatures.h widgets/markets/CAltarCreatures.h
@@ -344,6 +343,7 @@ set(client_HEADERS
windows/InfoWindows.h windows/InfoWindows.h
windows/QuickRecruitmentWindow.h windows/QuickRecruitmentWindow.h
windows/CHeroBackpackWindow.h windows/CHeroBackpackWindow.h
windows/CWindowWithArtifacts.h
windows/settings/GeneralOptionsTab.h windows/settings/GeneralOptionsTab.h
windows/settings/OtherOptionsTab.h windows/settings/OtherOptionsTab.h
windows/settings/SettingsMainWindow.h windows/settings/SettingsMainWindow.h

View File

@@ -1745,7 +1745,7 @@ void CPlayerInterface::artifactRemoved(const ArtifactLocation &al)
EVENT_HANDLER_CALLED_BY_CLIENT; EVENT_HANDLER_CALLED_BY_CLIENT;
adventureInt->onHeroChanged(cb->getHero(al.artHolder)); adventureInt->onHeroChanged(cb->getHero(al.artHolder));
for(auto artWin : GH.windows().findWindows<CArtifactHolder>()) for(auto artWin : GH.windows().findWindows<CWindowWithArtifacts>())
artWin->artifactRemoved(al); artWin->artifactRemoved(al);
waitWhileDialog(); waitWhileDialog();
@@ -1765,7 +1765,7 @@ void CPlayerInterface::artifactMoved(const ArtifactLocation &src, const Artifact
redraw = false; redraw = false;
} }
for(auto artWin : GH.windows().findWindows<CArtifactHolder>()) for(auto artWin : GH.windows().findWindows<CWindowWithArtifacts>())
artWin->artifactMoved(src, dst, redraw); artWin->artifactMoved(src, dst, redraw);
waitWhileDialog(); waitWhileDialog();
@@ -1781,7 +1781,7 @@ void CPlayerInterface::artifactAssembled(const ArtifactLocation &al)
EVENT_HANDLER_CALLED_BY_CLIENT; EVENT_HANDLER_CALLED_BY_CLIENT;
adventureInt->onHeroChanged(cb->getHero(al.artHolder)); adventureInt->onHeroChanged(cb->getHero(al.artHolder));
for(auto artWin : GH.windows().findWindows<CArtifactHolder>()) for(auto artWin : GH.windows().findWindows<CWindowWithArtifacts>())
artWin->artifactAssembled(al); artWin->artifactAssembled(al);
} }
@@ -1790,7 +1790,7 @@ void CPlayerInterface::artifactDisassembled(const ArtifactLocation &al)
EVENT_HANDLER_CALLED_BY_CLIENT; EVENT_HANDLER_CALLED_BY_CLIENT;
adventureInt->onHeroChanged(cb->getHero(al.artHolder)); adventureInt->onHeroChanged(cb->getHero(al.artHolder));
for(auto artWin : GH.windows().findWindows<CArtifactHolder>()) for(auto artWin : GH.windows().findWindows<CWindowWithArtifacts>())
artWin->artifactDisassembled(al); artWin->artifactDisassembled(al);
} }

View File

@@ -1,5 +1,5 @@
/* /*
* CArtifactHolder.cpp, part of VCMI engine * CArtPlace.cpp, part of VCMI engine
* *
* Authors: listed in file AUTHORS in main folder * Authors: listed in file AUTHORS in main folder
* *
@@ -8,7 +8,7 @@
* *
*/ */
#include "StdInc.h" #include "StdInc.h"
#include "CArtifactHolder.h" #include "CArtPlace.h"
#include "../gui/CGuiHandler.h" #include "../gui/CGuiHandler.h"
#include "../gui/Shortcut.h" #include "../gui/Shortcut.h"
@@ -92,7 +92,7 @@ CArtPlace::CArtPlace(Point position, const CArtifactInstance * art)
image->disable(); image->disable();
} }
const CArtifactInstance * CArtPlace::getArt() const CArtifactInstance * CArtPlace::getArt() const
{ {
return ourArt; return ourArt;
} }
@@ -108,7 +108,7 @@ CCommanderArtPlace::CCommanderArtPlace(Point position, const CGHeroInstance * co
void CCommanderArtPlace::returnArtToHeroCallback() void CCommanderArtPlace::returnArtToHeroCallback()
{ {
ArtifactPosition artifactPos = commanderSlotID; ArtifactPosition artifactPos = commanderSlotID;
ArtifactPosition freeSlot = ArtifactUtils::getArtBackpackPosition(commanderOwner, ourArt->getTypeId()); ArtifactPosition freeSlot = ArtifactUtils::getArtBackpackPosition(commanderOwner, getArt()->getTypeId());
if(freeSlot == ArtifactPosition::PRE_FIRST) if(freeSlot == ArtifactPosition::PRE_FIRST)
{ {
LOCPLINT->showInfoDialog(CGI->generaltexth->translate("core.genrltxt.152")); LOCPLINT->showInfoDialog(CGI->generaltexth->translate("core.genrltxt.152"));
@@ -119,7 +119,7 @@ void CCommanderArtPlace::returnArtToHeroCallback()
src.creature = SlotID::COMMANDER_SLOT_PLACEHOLDER; src.creature = SlotID::COMMANDER_SLOT_PLACEHOLDER;
ArtifactLocation dst(commanderOwner->id, freeSlot); ArtifactLocation dst(commanderOwner->id, freeSlot);
if(ourArt->canBePutAt(commanderOwner, freeSlot, true)) if(getArt()->canBePutAt(commanderOwner, freeSlot, true))
{ {
LOCPLINT->cb->swapArtifacts(src, dst); LOCPLINT->cb->swapArtifacts(src, dst);
setArtifact(nullptr); setArtifact(nullptr);
@@ -130,13 +130,13 @@ void CCommanderArtPlace::returnArtToHeroCallback()
void CCommanderArtPlace::clickPressed(const Point & cursorPosition) void CCommanderArtPlace::clickPressed(const Point & cursorPosition)
{ {
if(ourArt && text.size()) if(getArt() && text.size())
LOCPLINT->showYesNoDialog(CGI->generaltexth->translate("vcmi.commanderWindow.artifactMessage"), [this]() { returnArtToHeroCallback(); }, []() {}); LOCPLINT->showYesNoDialog(CGI->generaltexth->translate("vcmi.commanderWindow.artifactMessage"), [this]() { returnArtToHeroCallback(); }, []() {});
} }
void CCommanderArtPlace::showPopupWindow(const Point& cursorPosition) void CCommanderArtPlace::showPopupWindow(const Point & cursorPosition)
{ {
if(ourArt && text.size()) if(getArt() && text.size())
CArtPlace::showPopupWindow(cursorPosition); CArtPlace::showPopupWindow(cursorPosition);
} }
@@ -204,22 +204,22 @@ void CArtPlace::setArtifact(const CArtifactInstance * art)
} }
} }
void CArtPlace::setClickPressedCallback(ClickFunctor callback) void CArtPlace::setClickPressedCallback(const ClickFunctor & callback)
{ {
clickPressedCallback = callback; clickPressedCallback = callback;
} }
void CArtPlace::setShowPopupCallback(ClickFunctor callback) void CArtPlace::setShowPopupCallback(const ClickFunctor & callback)
{ {
showPopupCallback = callback; showPopupCallback = callback;
} }
void CArtPlace::setGestureCallback(ClickFunctor callback) void CArtPlace::setGestureCallback(const ClickFunctor & callback)
{ {
gestureCallback = callback; gestureCallback = callback;
} }
void CHeroArtPlace::addCombinedArtInfo(std::map<const CArtifact*, int> & arts) void CHeroArtPlace::addCombinedArtInfo(const std::map<const CArtifact*, int> & arts)
{ {
for(const auto & combinedArt : arts) for(const auto & combinedArt : arts)
{ {

View File

@@ -1,5 +1,5 @@
/* /*
* CArtifactHolder.h, part of VCMI engine * CArtPlace.h, part of VCMI engine
* *
* Authors: listed in file AUTHORS in main folder * Authors: listed in file AUTHORS in main folder
* *
@@ -11,58 +11,43 @@
#include "MiscWidgets.h" #include "MiscWidgets.h"
VCMI_LIB_NAMESPACE_BEGIN
struct ArtifactLocation;
class CArtifactSet;
VCMI_LIB_NAMESPACE_END
class CAnimImage; class CAnimImage;
class CArtifactHolder
{
public:
virtual void artifactRemoved(const ArtifactLocation & artLoc)=0;
virtual void artifactMoved(const ArtifactLocation & artLoc, const ArtifactLocation & destLoc, bool withRedraw)=0;
virtual void artifactDisassembled(const ArtifactLocation & artLoc)=0;
virtual void artifactAssembled(const ArtifactLocation & artLoc)=0;
};
class CArtPlace : public SelectableSlot class CArtPlace : public SelectableSlot
{ {
public: public:
using ClickFunctor = std::function<void(CArtPlace&, const Point&)>; using ClickFunctor = std::function<void(CArtPlace&, const Point&)>;
ArtifactPosition slot; ArtifactPosition slot;
CArtPlace(Point position, const CArtifactInstance * art = nullptr); CArtPlace(Point position, const CArtifactInstance * art = nullptr);
const CArtifactInstance * getArt(); const CArtifactInstance * getArt() const;
void lockSlot(bool on); void lockSlot(bool on);
bool isLocked() const; bool isLocked() const;
void setArtifact(const CArtifactInstance * art); void setArtifact(const CArtifactInstance * art);
void setClickPressedCallback(ClickFunctor callback); void setClickPressedCallback(const ClickFunctor & callback);
void setShowPopupCallback(ClickFunctor callback); void setShowPopupCallback(const ClickFunctor & callback);
void setGestureCallback(ClickFunctor callback); void setGestureCallback(const ClickFunctor & callback);
void clickPressed(const Point & cursorPosition) override; void clickPressed(const Point & cursorPosition) override;
void showPopupWindow(const Point & cursorPosition) override; void showPopupWindow(const Point & cursorPosition) override;
void gesture(bool on, const Point & initialPosition, const Point & finalPosition) override; void gesture(bool on, const Point & initialPosition, const Point & finalPosition) override;
protected: private:
std::shared_ptr<CAnimImage> image;
const CArtifactInstance * ourArt; const CArtifactInstance * ourArt;
int imageIndex;
bool locked; bool locked;
int imageIndex;
std::shared_ptr<CAnimImage> image;
ClickFunctor clickPressedCallback; ClickFunctor clickPressedCallback;
ClickFunctor showPopupCallback; ClickFunctor showPopupCallback;
ClickFunctor gestureCallback; ClickFunctor gestureCallback;
protected:
void setInternals(const CArtifactInstance * artInst); void setInternals(const CArtifactInstance * artInst);
}; };
class CCommanderArtPlace : public CArtPlace class CCommanderArtPlace : public CArtPlace
{ {
protected: private:
const CGHeroInstance * commanderOwner; const CGHeroInstance * commanderOwner;
ArtifactPosition commanderSlotID; ArtifactPosition commanderSlotID;
@@ -78,7 +63,7 @@ class CHeroArtPlace: public CArtPlace
{ {
public: public:
CHeroArtPlace(Point position, const CArtifactInstance * art = nullptr); CHeroArtPlace(Point position, const CArtifactInstance * art = nullptr);
void addCombinedArtInfo(std::map<const CArtifact*, int> & arts); void addCombinedArtInfo(const std::map<const CArtifact*, int> & arts);
}; };
namespace ArtifactUtilsClient namespace ArtifactUtilsClient

View File

@@ -9,7 +9,7 @@
*/ */
#pragma once #pragma once
#include "CArtifactHolder.h" #include "CArtPlace.h"
class CButton; class CButton;

View File

@@ -10,7 +10,6 @@
#include "StdInc.h" #include "StdInc.h"
#include "CComponent.h" #include "CComponent.h"
#include "CArtifactHolder.h"
#include "Images.h" #include "Images.h"
#include <vcmi/spells/Service.h> #include <vcmi/spells/Service.h>

View File

@@ -9,8 +9,7 @@
*/ */
#pragma once #pragma once
#include "../windows/CWindowObject.h" #include "../lib/mapObjects/CGHeroInstance.h"
#include "CWindowWithArtifacts.h"
class CCallback; class CCallback;

View File

@@ -1,56 +0,0 @@
/*
* CWindowWithArtifacts.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
#include "CArtifactHolder.h"
#include "CArtifactsOfHeroMain.h"
#include "CArtifactsOfHeroKingdom.h"
#include "CArtifactsOfHeroAltar.h"
#include "CArtifactsOfHeroMarket.h"
#include "CArtifactsOfHeroBackpack.h"
class CWindowWithArtifacts : public CArtifactHolder
{
public:
using CArtifactsOfHeroPtr = std::variant<
std::weak_ptr<CArtifactsOfHeroMarket>,
std::weak_ptr<CArtifactsOfHeroAltar>,
std::weak_ptr<CArtifactsOfHeroKingdom>,
std::weak_ptr<CArtifactsOfHeroMain>,
std::weak_ptr<CArtifactsOfHeroBackpack>,
std::weak_ptr<CArtifactsOfHeroQuickBackpack>>;
using CloseCallback = std::function<void()>;
explicit CWindowWithArtifacts(const std::vector<CArtifactsOfHeroPtr> * artSets = nullptr);
void addSet(CArtifactsOfHeroPtr artSet);
void addSetAndCallbacks(CArtifactsOfHeroPtr artSet);
void addCloseCallback(CloseCallback callback);
const CGHeroInstance * getHeroPickedArtifact();
const CArtifactInstance * getPickedArtifact();
void clickPressedArtPlaceHero(CArtifactsOfHeroBase & artsInst, CArtPlace & artPlace, const Point & cursorPosition);
void showPopupArtPlaceHero(CArtifactsOfHeroBase & artsInst, CArtPlace & artPlace, const Point & cursorPosition);
void gestureArtPlaceHero(CArtifactsOfHeroBase & artsInst, CArtPlace & artPlace, const Point & cursorPosition);
void artifactRemoved(const ArtifactLocation & artLoc) override;
void artifactMoved(const ArtifactLocation & srcLoc, const ArtifactLocation & destLoc, bool withRedraw) override;
void artifactDisassembled(const ArtifactLocation & artLoc) override;
void artifactAssembled(const ArtifactLocation & artLoc) override;
protected:
std::vector<CArtifactsOfHeroPtr> artSets;
CloseCallback closeCallback;
void updateSlots();
std::optional<std::tuple<const CGHeroInstance*, const CArtifactInstance*>> getState();
std::optional<CArtifactsOfHeroPtr> findAOHbyRef(CArtifactsOfHeroBase & artsInst);
void markPossibleSlots();
bool checkSpecialArts(const CArtifactInstance & artInst, const CGHeroInstance * hero, bool isTrade);
void setCursorAnimation(const CArtifactInstance & artInst);
};

View File

@@ -1183,7 +1183,7 @@ void CTownInfo::showPopupWindow(const Point & cursorPosition)
} }
CCastleInterface::CCastleInterface(const CGTownInstance * Town, const CGTownInstance * from): CCastleInterface::CCastleInterface(const CGTownInstance * Town, const CGTownInstance * from):
CStatusbarWindow(PLAYER_COLORED | BORDERED), CWindowObject(PLAYER_COLORED | BORDERED),
town(Town) town(Town)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
@@ -1459,7 +1459,7 @@ void CHallInterface::CBuildingBox::showPopupWindow(const Point & cursorPosition)
} }
CHallInterface::CHallInterface(const CGTownInstance * Town): CHallInterface::CHallInterface(const CGTownInstance * Town):
CStatusbarWindow(PLAYER_COLORED | BORDERED, Town->town->clientInfo.hallBackground), CWindowObject(PLAYER_COLORED | BORDERED, Town->town->clientInfo.hallBackground),
town(Town) town(Town)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
@@ -1507,7 +1507,7 @@ CHallInterface::CHallInterface(const CGTownInstance * Town):
} }
CBuildWindow::CBuildWindow(const CGTownInstance *Town, const CBuilding * Building, EBuildingState state, bool rightClick): CBuildWindow::CBuildWindow(const CGTownInstance *Town, const CBuilding * Building, EBuildingState state, bool rightClick):
CStatusbarWindow(PLAYER_COLORED | (rightClick ? RCLICK_POPUP : 0), ImagePath::builtin("TPUBUILD")), CWindowObject(PLAYER_COLORED | (rightClick ? RCLICK_POPUP : 0), ImagePath::builtin("TPUBUILD")),
town(Town), town(Town),
building(Building) building(Building)
{ {
@@ -1660,7 +1660,7 @@ void LabeledValue::hover(bool on)
} }
CFortScreen::CFortScreen(const CGTownInstance * town): CFortScreen::CFortScreen(const CGTownInstance * town):
CStatusbarWindow(PLAYER_COLORED | BORDERED, getBgName(town)) CWindowObject(PLAYER_COLORED | BORDERED, getBgName(town))
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
ui32 fortSize = static_cast<ui32>(town->creatures.size()); ui32 fortSize = static_cast<ui32>(town->creatures.size());
@@ -1849,7 +1849,7 @@ void CFortScreen::RecruitArea::showPopupWindow(const Point & cursorPosition)
} }
CMageGuildScreen::CMageGuildScreen(CCastleInterface * owner, const ImagePath & imagename) CMageGuildScreen::CMageGuildScreen(CCastleInterface * owner, const ImagePath & imagename)
: CStatusbarWindow(BORDERED, imagename) : CWindowObject(BORDERED, imagename)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
@@ -1918,7 +1918,7 @@ void CMageGuildScreen::Scroll::hover(bool on)
} }
CBlacksmithDialog::CBlacksmithDialog(bool possible, CreatureID creMachineID, ArtifactID aid, ObjectInstanceID hid): CBlacksmithDialog::CBlacksmithDialog(bool possible, CreatureID creMachineID, ArtifactID aid, ObjectInstanceID hid):
CStatusbarWindow(PLAYER_COLORED, ImagePath::builtin("TPSMITH")) CWindowObject(PLAYER_COLORED, ImagePath::builtin("TPSMITH"))
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);

View File

@@ -17,7 +17,7 @@
#include "../CPlayerInterface.h" #include "../CPlayerInterface.h"
#include "../render/Canvas.h" #include "../render/Canvas.h"
#include "../widgets/Buttons.h" #include "../widgets/Buttons.h"
#include "../widgets/CArtifactHolder.h" #include "../widgets/CArtPlace.h"
#include "../widgets/CComponent.h" #include "../widgets/CComponent.h"
#include "../widgets/Images.h" #include "../widgets/Images.h"
#include "../widgets/TextControls.h" #include "../widgets/TextControls.h"

View File

@@ -21,8 +21,7 @@
#include "CPlayerInterface.h" #include "CPlayerInterface.h"
CHeroBackpackWindow::CHeroBackpackWindow(const CGHeroInstance * hero, const std::vector<CArtifactsOfHeroPtr> & artsSets) CHeroBackpackWindow::CHeroBackpackWindow(const CGHeroInstance * hero, const std::vector<CArtifactsOfHeroPtr> & artsSets)
: CStatusbarWindow(0) : CWindowWithArtifacts(&artsSets)
, CWindowWithArtifacts(&artsSets)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255 - DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255 - DISPOSE);
@@ -49,15 +48,7 @@ void CHeroBackpackWindow::showAll(Canvas & to)
CMessage::drawBorder(PlayerColor(LOCPLINT->playerID), to, pos.w+28, pos.h+29, pos.x-14, pos.y-15); CMessage::drawBorder(PlayerColor(LOCPLINT->playerID), to, pos.w+28, pos.h+29, pos.x-14, pos.y-15);
} }
void CHeroBackpackWindow::activate()
{
if(const auto art = getPickedArtifact())
setCursorAnimation(*art);
CIntObject::activate();
}
CHeroQuickBackpackWindow::CHeroQuickBackpackWindow(const CGHeroInstance * hero, ArtifactPosition targetSlot) CHeroQuickBackpackWindow::CHeroQuickBackpackWindow(const CGHeroInstance * hero, ArtifactPosition targetSlot)
: CWindowObject(0)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255 - DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255 - DISPOSE);

View File

@@ -9,8 +9,7 @@
*/ */
#pragma once #pragma once
#include "../widgets/CWindowWithArtifacts.h" #include "CWindowWithArtifacts.h"
#include "CWindowObject.h"
class CFilledTexture; class CFilledTexture;
@@ -26,10 +25,9 @@ protected:
const int windowMargin = 5; const int windowMargin = 5;
void showAll(Canvas & to) override; void showAll(Canvas & to) override;
void activate() override;
}; };
class CHeroQuickBackpackWindow : public CWindowObject, public CWindowWithArtifacts class CHeroQuickBackpackWindow : public CWindowWithArtifacts
{ {
public: public:
CHeroQuickBackpackWindow(const CGHeroInstance * hero, ArtifactPosition targetSlot); CHeroQuickBackpackWindow(const CGHeroInstance * hero, ArtifactPosition targetSlot);

View File

@@ -19,7 +19,6 @@
#include "../CPlayerInterface.h" #include "../CPlayerInterface.h"
#include "../gui/CGuiHandler.h" #include "../gui/CGuiHandler.h"
#include "../gui/CursorHandler.h"
#include "../gui/TextAlignment.h" #include "../gui/TextAlignment.h"
#include "../gui/Shortcut.h" #include "../gui/Shortcut.h"
#include "../gui/WindowHandler.h" #include "../gui/WindowHandler.h"
@@ -71,7 +70,7 @@ CHeroSwitcher::CHeroSwitcher(CHeroWindow * owner_, Point pos_, const CGHeroInsta
} }
CHeroWindow::CHeroWindow(const CGHeroInstance * hero) CHeroWindow::CHeroWindow(const CGHeroInstance * hero)
: CStatusbarWindow(PLAYER_COLORED, ImagePath::builtin("HeroScr4")) : CWindowObject(PLAYER_COLORED, ImagePath::builtin("HeroScr4"))
{ {
auto & heroscrn = CGI->generaltexth->heroscrn; auto & heroscrn = CGI->generaltexth->heroscrn;
@@ -360,9 +359,3 @@ bool CHeroWindow::holdsGarrison(const CArmedInstance * army)
{ {
return army == curHero; return army == curHero;
} }
void CHeroWindow::deactivate()
{
CCS->curh->dragAndDropCursor(nullptr);
CIntObject::deactivate();
}

View File

@@ -9,8 +9,7 @@
*/ */
#pragma once #pragma once
#include "../widgets/CWindowWithArtifacts.h" #include "CWindowWithArtifacts.h"
#include "CWindowObject.h"
#include "../../lib/bonuses/IBonusBearer.h" #include "../../lib/bonuses/IBonusBearer.h"
@@ -108,7 +107,6 @@ public:
void switchHero(); //changes displayed hero void switchHero(); //changes displayed hero
void updateGarrisons() override; void updateGarrisons() override;
bool holdsGarrison(const CArmedInstance * army) override; bool holdsGarrison(const CArmedInstance * army) override;
void deactivate() override;
void createBackpackWindow(); void createBackpackWindow();
//friends //friends

View File

@@ -19,7 +19,6 @@
#include "../PlayerLocalState.h" #include "../PlayerLocalState.h"
#include "../adventureMap/CResDataBar.h" #include "../adventureMap/CResDataBar.h"
#include "../gui/CGuiHandler.h" #include "../gui/CGuiHandler.h"
#include "../gui/CursorHandler.h"
#include "../gui/Shortcut.h" #include "../gui/Shortcut.h"
#include "../gui/WindowHandler.h" #include "../gui/WindowHandler.h"
#include "../widgets/CComponent.h" #include "../widgets/CComponent.h"
@@ -549,7 +548,10 @@ std::shared_ptr<CIntObject> CKingdomInterface::createMainTab(size_t index)
switch(index) switch(index)
{ {
case 0: case 0:
return std::make_shared<CKingdHeroList>(size); return std::make_shared<CKingdHeroList>(size, [this](const CWindowWithArtifacts::CArtifactsOfHeroPtr & newHeroSet)
{
addSetAndCallbacks(newHeroSet);
});
case 1: case 1:
return std::make_shared<CKingdTownList>(size); return std::make_shared<CKingdTownList>(size);
default: default:
@@ -674,31 +676,7 @@ bool CKingdomInterface::holdsGarrison(const CArmedInstance * army)
return army->getOwner() == LOCPLINT->playerID; return army->getOwner() == LOCPLINT->playerID;
} }
void CKingdomInterface::artifactAssembled(const ArtifactLocation& artLoc) CKingdHeroList::CKingdHeroList(size_t maxSize, const CreateHeroItemFunctor & onCreateHeroItemCallback)
{
if(auto arts = std::dynamic_pointer_cast<CArtifactHolder>(tabArea->getItem()))
arts->artifactAssembled(artLoc);
}
void CKingdomInterface::artifactDisassembled(const ArtifactLocation& artLoc)
{
if(auto arts = std::dynamic_pointer_cast<CArtifactHolder>(tabArea->getItem()))
arts->artifactDisassembled(artLoc);
}
void CKingdomInterface::artifactMoved(const ArtifactLocation& artLoc, const ArtifactLocation& destLoc, bool withRedraw)
{
if(auto arts = std::dynamic_pointer_cast<CArtifactHolder>(tabArea->getItem()))
arts->artifactMoved(artLoc, destLoc, withRedraw);
}
void CKingdomInterface::artifactRemoved(const ArtifactLocation& artLoc)
{
if(auto arts = std::dynamic_pointer_cast<CArtifactHolder>(tabArea->getItem()))
arts->artifactRemoved(artLoc);
}
CKingdHeroList::CKingdHeroList(size_t maxSize)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
title = std::make_shared<CPicture>(ImagePath::builtin("OVTITLE"),16,0); title = std::make_shared<CPicture>(ImagePath::builtin("OVTITLE"),16,0);
@@ -708,8 +686,20 @@ CKingdHeroList::CKingdHeroList(size_t maxSize)
ui32 townCount = LOCPLINT->cb->howManyHeroes(false); ui32 townCount = LOCPLINT->cb->howManyHeroes(false);
ui32 size = OVERVIEW_SIZE*116 + 19; ui32 size = OVERVIEW_SIZE*116 + 19;
heroes = std::make_shared<CListBox>(std::bind(&CKingdHeroList::createHeroItem, this, _1), heroes = std::make_shared<CListBox>([onCreateHeroItemCallback](size_t idx) -> std::shared_ptr<CIntObject>
Point(19,21), Point(0,116), maxSize, townCount, 0, 1, Rect(-19, -21, size, size)); {
auto heroesList = LOCPLINT->localState->getWanderingHeroes();
if(idx < heroesList.size())
{
auto hero = std::make_shared<CHeroItem>(heroesList[idx]);
onCreateHeroItemCallback(hero->heroArts);
return hero;
}
else
{
return std::make_shared<CAnimImage>(AnimationPath::builtin("OVSLOT"), (idx - 2) % GameConstants::KINGDOM_WINDOW_HEROES_SLOTS);
}
}, Point(19,21), Point(0,116), maxSize, townCount, 0, 1, Rect(-19, -21, size, size));
} }
void CKingdHeroList::updateGarrisons() void CKingdHeroList::updateGarrisons()
@@ -730,30 +720,6 @@ bool CKingdHeroList::holdsGarrison(const CArmedInstance * army)
return false; return false;
} }
void CKingdHeroList::deactivate()
{
CCS->curh->dragAndDropCursor(nullptr);
CIntObject::deactivate();
}
std::shared_ptr<CIntObject> CKingdHeroList::createHeroItem(size_t index)
{
ui32 picCount = 4; // OVSLOT contains 4 images
auto heroesList = LOCPLINT->localState->getWanderingHeroes();
if(index < heroesList.size())
{
auto hero = std::make_shared<CHeroItem>(heroesList[index]);
addSetAndCallbacks(hero->heroArts);
return hero;
}
else
{
return std::make_shared<CAnimImage>(AnimationPath::builtin("OVSLOT"), (index-2) % picCount );
}
}
CKingdTownList::CKingdTownList(size_t maxSize) CKingdTownList::CKingdTownList(size_t maxSize)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);

View File

@@ -9,8 +9,7 @@
*/ */
#pragma once #pragma once
#include "../widgets/CWindowWithArtifacts.h" #include "CWindowWithArtifacts.h"
#include "CWindowObject.h"
VCMI_LIB_NAMESPACE_BEGIN VCMI_LIB_NAMESPACE_BEGIN
class CGObjectInstance; class CGObjectInstance;
@@ -200,7 +199,7 @@ public:
}; };
/// Class which holds all parts of kingdom overview window /// Class which holds all parts of kingdom overview window
class CKingdomInterface : public CWindowObject, public IGarrisonHolder, public CArtifactHolder, public ITownHolder class CKingdomInterface : public IGarrisonHolder, public CWindowWithArtifacts, public ITownHolder
{ {
private: private:
struct OwnedObjectInfo struct OwnedObjectInfo
@@ -254,10 +253,6 @@ public:
void heroRemoved(); void heroRemoved();
void updateGarrisons() override; void updateGarrisons() override;
bool holdsGarrison(const CArmedInstance * army) override; bool holdsGarrison(const CArmedInstance * army) override;
void artifactRemoved(const ArtifactLocation &artLoc) override;
void artifactMoved(const ArtifactLocation &artLoc, const ArtifactLocation &destLoc, bool withRedraw) override;
void artifactDisassembled(const ArtifactLocation &artLoc) override;
void artifactAssembled(const ArtifactLocation &artLoc) override;
void buildChanged() override; void buildChanged() override;
}; };
@@ -330,7 +325,7 @@ public:
}; };
/// Tab with all hero-specific data /// Tab with all hero-specific data
class CKingdHeroList : public CIntObject, public IGarrisonHolder, public CWindowWithArtifacts class CKingdHeroList : public CIntObject, public IGarrisonHolder
{ {
private: private:
std::shared_ptr<CListBox> heroes; std::shared_ptr<CListBox> heroes;
@@ -338,13 +333,12 @@ private:
std::shared_ptr<CLabel> heroLabel; std::shared_ptr<CLabel> heroLabel;
std::shared_ptr<CLabel> skillsLabel; std::shared_ptr<CLabel> skillsLabel;
std::shared_ptr<CIntObject> createHeroItem(size_t index);
public: public:
CKingdHeroList(size_t maxSize); using CreateHeroItemFunctor = std::function<void(const CWindowWithArtifacts::CArtifactsOfHeroPtr)>;
CKingdHeroList(size_t maxSize, const CreateHeroItemFunctor & onCreateHeroItemCallback);
void updateGarrisons() override; void updateGarrisons() override;
bool holdsGarrison(const CArmedInstance * army) override; bool holdsGarrison(const CArmedInstance * army) override;
void deactivate() override;
}; };
/// Tab with all town-specific data /// Tab with all town-specific data

View File

@@ -12,7 +12,6 @@
#include "CMarketWindow.h" #include "CMarketWindow.h"
#include "../gui/CGuiHandler.h" #include "../gui/CGuiHandler.h"
#include "../gui/CursorHandler.h"
#include "../gui/Shortcut.h" #include "../gui/Shortcut.h"
#include "../widgets/Buttons.h" #include "../widgets/Buttons.h"
@@ -34,7 +33,7 @@
#include "../../lib/mapObjects/CGHeroInstance.h" #include "../../lib/mapObjects/CGHeroInstance.h"
CMarketWindow::CMarketWindow(const IMarket * market, const CGHeroInstance * hero, const std::function<void()> & onWindowClosed, EMarketMode mode) CMarketWindow::CMarketWindow(const IMarket * market, const CGHeroInstance * hero, const std::function<void()> & onWindowClosed, EMarketMode mode)
: CStatusbarWindow(PLAYER_COLORED) : CWindowObject(PLAYER_COLORED)
, windowClosedCallback(onWindowClosed) , windowClosedCallback(onWindowClosed)
{ {
assert(mode == EMarketMode::RESOURCE_RESOURCE || mode == EMarketMode::RESOURCE_PLAYER || mode == EMarketMode::CREATURE_RESOURCE || assert(mode == EMarketMode::RESOURCE_RESOURCE || mode == EMarketMode::RESOURCE_PLAYER || mode == EMarketMode::CREATURE_RESOURCE ||
@@ -262,9 +261,3 @@ void CMarketWindow::createAltarCreatures(const IMarket * market, const CGHeroIns
initWidgetInternals(EMarketMode::CREATURE_EXP, CGI->generaltexth->zelp[568]); initWidgetInternals(EMarketMode::CREATURE_EXP, CGI->generaltexth->zelp[568]);
updateHero(); updateHero();
} }
void CMarketWindow::deactivate()
{
CCS->curh->dragAndDropCursor(nullptr);
CIntObject::deactivate();
}

View File

@@ -10,8 +10,7 @@
#pragma once #pragma once
#include "../widgets/markets/CMarketBase.h" #include "../widgets/markets/CMarketBase.h"
#include "../widgets/CWindowWithArtifacts.h" #include "CWindowWithArtifacts.h"
#include "CWindowObject.h"
class CMarketWindow : public CStatusbarWindow, public CWindowWithArtifacts, public IGarrisonHolder class CMarketWindow : public CStatusbarWindow, public CWindowWithArtifacts, public IGarrisonHolder
{ {
@@ -25,7 +24,6 @@ public:
bool holdsGarrison(const CArmedInstance * army) override; bool holdsGarrison(const CArmedInstance * army) override;
void artifactRemoved(const ArtifactLocation & artLoc) override; void artifactRemoved(const ArtifactLocation & artLoc) override;
void artifactMoved(const ArtifactLocation & srcLoc, const ArtifactLocation & destLoc, bool withRedraw) override; void artifactMoved(const ArtifactLocation & srcLoc, const ArtifactLocation & destLoc, bool withRedraw) override;
void deactivate() override;
private: private:
void createChangeModeButtons(EMarketMode currentMode, const IMarket * market, const CGHeroInstance * hero); void createChangeModeButtons(EMarketMode currentMode, const IMarket * market, const CGHeroInstance * hero);

View File

@@ -239,11 +239,3 @@ bool CWindowObject::isPopupWindow() const
{ {
return options & RCLICK_POPUP; return options & RCLICK_POPUP;
} }
CStatusbarWindow::CStatusbarWindow(int options, const ImagePath & imageName, Point centerAt) : CWindowObject(options, imageName, centerAt)
{
}
CStatusbarWindow::CStatusbarWindow(int options, const ImagePath & imageName) : CWindowObject(options, imageName)
{
}

View File

@@ -47,17 +47,14 @@ public:
* centerAt - position of window center. Default - center of the screen * centerAt - position of window center. Default - center of the screen
*/ */
CWindowObject(int options, const ImagePath & imageName, Point centerAt); CWindowObject(int options, const ImagePath & imageName, Point centerAt);
CWindowObject(int options, const ImagePath & imageName = {}); CWindowObject(int options = 0, const ImagePath & imageName = {});
~CWindowObject(); ~CWindowObject();
void showAll(Canvas & to) override; void showAll(Canvas & to) override;
}; };
class CStatusbarWindow : public CWindowObject class CStatusbarWindow : virtual public CWindowObject
{ {
public:
CStatusbarWindow(int options, const ImagePath & imageName, Point centerAt);
CStatusbarWindow(int options, const ImagePath & imageName = {});
protected: protected:
std::shared_ptr<CGStatusBar> statusbar; std::shared_ptr<CGStatusBar> statusbar;
}; };

View File

@@ -18,7 +18,7 @@
#include "../render/CAnimation.h" #include "../render/CAnimation.h"
#include "../render/IImage.h" #include "../render/IImage.h"
#include "CComponent.h" #include "../widgets/CComponent.h"
#include "../windows/CHeroWindow.h" #include "../windows/CHeroWindow.h"
#include "../windows/CSpellWindow.h" #include "../windows/CSpellWindow.h"
@@ -41,24 +41,24 @@ CWindowWithArtifacts::CWindowWithArtifacts(const std::vector<CArtifactsOfHeroPtr
this->artSets.insert(this->artSets.end(), artSets->begin(), artSets->end()); this->artSets.insert(this->artSets.end(), artSets->begin(), artSets->end());
} }
void CWindowWithArtifacts::addSet(CArtifactsOfHeroPtr artSet) void CWindowWithArtifacts::addSet(CArtifactsOfHeroPtr newArtSet)
{ {
artSets.emplace_back(artSet); artSets.emplace_back(newArtSet);
} }
void CWindowWithArtifacts::addSetAndCallbacks(CArtifactsOfHeroPtr artSet) void CWindowWithArtifacts::addSetAndCallbacks(CArtifactsOfHeroPtr newArtSet)
{ {
addSet(artSet); addSet(newArtSet);
std::visit([this](auto artSetWeak) std::visit([this](auto artSetWeak)
{ {
auto artSet = artSetWeak.lock(); auto artSet = artSetWeak.lock();
artSet->clickPressedCallback = std::bind(&CWindowWithArtifacts::clickPressedArtPlaceHero, this, _1, _2, _3); artSet->clickPressedCallback = std::bind(&CWindowWithArtifacts::clickPressedArtPlaceHero, this, _1, _2, _3);
artSet->showPopupCallback = std::bind(&CWindowWithArtifacts::showPopupArtPlaceHero, this, _1, _2, _3); artSet->showPopupCallback = std::bind(&CWindowWithArtifacts::showPopupArtPlaceHero, this, _1, _2, _3);
artSet->gestureCallback = std::bind(&CWindowWithArtifacts::gestureArtPlaceHero, this, _1, _2, _3); artSet->gestureCallback = std::bind(&CWindowWithArtifacts::gestureArtPlaceHero, this, _1, _2, _3);
}, artSet); }, newArtSet);
} }
void CWindowWithArtifacts::addCloseCallback(CloseCallback callback) void CWindowWithArtifacts::addCloseCallback(const CloseCallback & callback)
{ {
closeCallback = callback; closeCallback = callback;
} }
@@ -81,10 +81,10 @@ const CArtifactInstance * CWindowWithArtifacts::getPickedArtifact()
return nullptr; return nullptr;
} }
void CWindowWithArtifacts::clickPressedArtPlaceHero(CArtifactsOfHeroBase & artsInst, CArtPlace & artPlace, const Point & cursorPosition) void CWindowWithArtifacts::clickPressedArtPlaceHero(const CArtifactsOfHeroBase & artsInst, CArtPlace & artPlace, const Point & cursorPosition)
{ {
const auto artSet = findAOHbyRef(artsInst); const auto currentArtSet = findAOHbyRef(artsInst);
assert(artSet.has_value()); assert(currentArtSet.has_value());
if(artPlace.isLocked()) if(artPlace.isLocked())
return; return;
@@ -222,11 +222,8 @@ void CWindowWithArtifacts::clickPressedArtPlaceHero(CArtifactsOfHeroBase & artsI
if constexpr(std::is_same_v<decltype(artSetWeak), std::weak_ptr<CArtifactsOfHeroBackpack>>) if constexpr(std::is_same_v<decltype(artSetWeak), std::weak_ptr<CArtifactsOfHeroBackpack>>)
{ {
if(!isTransferAllowed && artPlace.getArt()) if(!isTransferAllowed && artPlace.getArt() && closeCallback)
{ closeCallback();
if(closeCallback)
closeCallback();
}
} }
else else
{ {
@@ -259,13 +256,13 @@ void CWindowWithArtifacts::clickPressedArtPlaceHero(CArtifactsOfHeroBase & artsI
if(closeCallback) if(closeCallback)
closeCallback(); closeCallback();
} }
}, artSet.value()); }, currentArtSet.value());
} }
void CWindowWithArtifacts::showPopupArtPlaceHero(CArtifactsOfHeroBase & artsInst, CArtPlace & artPlace, const Point & cursorPosition) void CWindowWithArtifacts::showPopupArtPlaceHero(const CArtifactsOfHeroBase & artsInst, CArtPlace & artPlace, const Point & cursorPosition)
{ {
const auto artSetWeak = findAOHbyRef(artsInst); const auto currentArtSet = findAOHbyRef(artsInst);
assert(artSetWeak.has_value()); assert(currentArtSet.has_value());
if(artPlace.isLocked()) if(artPlace.isLocked())
return; return;
@@ -304,13 +301,13 @@ void CWindowWithArtifacts::showPopupArtPlaceHero(CArtifactsOfHeroBase & artsInst
if(artPlace.getArt() && artPlace.text.size()) if(artPlace.getArt() && artPlace.text.size())
artPlace.LRClickableAreaWTextComp::showPopupWindow(cursorPosition); artPlace.LRClickableAreaWTextComp::showPopupWindow(cursorPosition);
} }
}, artSetWeak.value()); }, currentArtSet.value());
} }
void CWindowWithArtifacts::gestureArtPlaceHero(CArtifactsOfHeroBase & artsInst, CArtPlace & artPlace, const Point & cursorPosition) void CWindowWithArtifacts::gestureArtPlaceHero(const CArtifactsOfHeroBase & artsInst, CArtPlace & artPlace, const Point & cursorPosition)
{ {
const auto artSetWeak = findAOHbyRef(artsInst); const auto currentArtSet = findAOHbyRef(artsInst);
assert(artSetWeak.has_value()); assert(currentArtSet.has_value());
if(artPlace.isLocked()) if(artPlace.isLocked())
return; return;
@@ -330,12 +327,25 @@ void CWindowWithArtifacts::gestureArtPlaceHero(CArtifactsOfHeroBase & artsInst,
backpackWindow->moveTo(cursorPosition - Point(1, 1)); backpackWindow->moveTo(cursorPosition - Point(1, 1));
backpackWindow->fitToScreen(15); backpackWindow->fitToScreen(15);
} }
}, artSetWeak.value()); }, currentArtSet.value());
}
void CWindowWithArtifacts::activate()
{
if(const auto art = getPickedArtifact())
setCursorAnimation(*art);
CWindowObject::activate();
}
void CWindowWithArtifacts::deactivate()
{
CCS->curh->dragAndDropCursor(nullptr);
CWindowObject::deactivate();
} }
void CWindowWithArtifacts::artifactRemoved(const ArtifactLocation & artLoc) void CWindowWithArtifacts::artifactRemoved(const ArtifactLocation & artLoc)
{ {
updateSlots(); update();
} }
void CWindowWithArtifacts::artifactMoved(const ArtifactLocation & srcLoc, const ArtifactLocation & destLoc, bool withRedraw) void CWindowWithArtifacts::artifactMoved(const ArtifactLocation & srcLoc, const ArtifactLocation & destLoc, bool withRedraw)
@@ -394,16 +404,16 @@ void CWindowWithArtifacts::artifactMoved(const ArtifactLocation & srcLoc, const
void CWindowWithArtifacts::artifactDisassembled(const ArtifactLocation & artLoc) void CWindowWithArtifacts::artifactDisassembled(const ArtifactLocation & artLoc)
{ {
updateSlots(); update();
} }
void CWindowWithArtifacts::artifactAssembled(const ArtifactLocation & artLoc) void CWindowWithArtifacts::artifactAssembled(const ArtifactLocation & artLoc)
{ {
markPossibleSlots(); markPossibleSlots();
updateSlots(); update();
} }
void CWindowWithArtifacts::updateSlots() void CWindowWithArtifacts::update() const
{ {
auto updateSlotBody = [](auto artSetWeak) -> void auto updateSlotBody = [](auto artSetWeak) -> void
{ {
@@ -455,7 +465,7 @@ std::optional<std::tuple<const CGHeroInstance*, const CArtifactInstance*>> CWind
return std::make_tuple(pickedCnt.begin()->first, artInst); return std::make_tuple(pickedCnt.begin()->first, artInst);
} }
std::optional<CWindowWithArtifacts::CArtifactsOfHeroPtr> CWindowWithArtifacts::findAOHbyRef(CArtifactsOfHeroBase & artsInst) std::optional<CWindowWithArtifacts::CArtifactsOfHeroPtr> CWindowWithArtifacts::findAOHbyRef(const CArtifactsOfHeroBase & artsInst)
{ {
std::optional<CArtifactsOfHeroPtr> res; std::optional<CArtifactsOfHeroPtr> res;
@@ -497,7 +507,7 @@ void CWindowWithArtifacts::markPossibleSlots()
} }
} }
bool CWindowWithArtifacts::checkSpecialArts(const CArtifactInstance & artInst, const CGHeroInstance * hero, bool isTrade) bool CWindowWithArtifacts::checkSpecialArts(const CArtifactInstance & artInst, const CGHeroInstance * hero, bool isTrade) const
{ {
const auto artId = artInst.getTypeId(); const auto artId = artInst.getTypeId();
@@ -513,14 +523,11 @@ bool CWindowWithArtifacts::checkSpecialArts(const CArtifactInstance & artInst, c
std::vector<std::shared_ptr<CComponent>>(1, std::make_shared<CComponent>(ComponentType::ARTIFACT, ArtifactID(ArtifactID::CATAPULT)))); std::vector<std::shared_ptr<CComponent>>(1, std::make_shared<CComponent>(ComponentType::ARTIFACT, ArtifactID(ArtifactID::CATAPULT))));
return false; return false;
} }
if(isTrade) if(isTrade && !artInst.artType->isTradable())
{ {
if(!artInst.artType->isTradable()) LOCPLINT->showInfoDialog(CGI->generaltexth->allTexts[21],
{ std::vector<std::shared_ptr<CComponent>>(1, std::make_shared<CComponent>(ComponentType::ARTIFACT, artId)));
LOCPLINT->showInfoDialog(CGI->generaltexth->allTexts[21], return false;
std::vector<std::shared_ptr<CComponent>>(1, std::make_shared<CComponent>(ComponentType::ARTIFACT, artId)));
return false;
}
} }
return true; return true;
} }

View File

@@ -0,0 +1,58 @@
/*
* CWindowWithArtifacts.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
#include "../widgets/CArtifactsOfHeroMain.h"
#include "../widgets/CArtifactsOfHeroKingdom.h"
#include "../widgets/CArtifactsOfHeroAltar.h"
#include "../widgets/CArtifactsOfHeroMarket.h"
#include "../widgets/CArtifactsOfHeroBackpack.h"
#include "CWindowObject.h"
class CWindowWithArtifacts : virtual public CWindowObject
{
public:
using CArtifactsOfHeroPtr = std::variant<
std::weak_ptr<CArtifactsOfHeroMarket>,
std::weak_ptr<CArtifactsOfHeroAltar>,
std::weak_ptr<CArtifactsOfHeroKingdom>,
std::weak_ptr<CArtifactsOfHeroMain>,
std::weak_ptr<CArtifactsOfHeroBackpack>,
std::weak_ptr<CArtifactsOfHeroQuickBackpack>>;
using CloseCallback = std::function<void()>;
std::vector<CArtifactsOfHeroPtr> artSets;
CloseCallback closeCallback;
explicit CWindowWithArtifacts(const std::vector<CArtifactsOfHeroPtr> * artSets = nullptr);
void addSet(CArtifactsOfHeroPtr newArtSet);
void addSetAndCallbacks(CArtifactsOfHeroPtr newArtSet);
void addCloseCallback(const CloseCallback & callback);
const CGHeroInstance * getHeroPickedArtifact();
const CArtifactInstance * getPickedArtifact();
void clickPressedArtPlaceHero(const CArtifactsOfHeroBase & artsInst, CArtPlace & artPlace, const Point & cursorPosition);
void showPopupArtPlaceHero(const CArtifactsOfHeroBase & artsInst, CArtPlace & artPlace, const Point & cursorPosition);
void gestureArtPlaceHero(const CArtifactsOfHeroBase & artsInst, CArtPlace & artPlace, const Point & cursorPosition);
void activate() override;
void deactivate() override;
virtual void artifactRemoved(const ArtifactLocation & artLoc);
virtual void artifactMoved(const ArtifactLocation & srcLoc, const ArtifactLocation & destLoc, bool withRedraw);
virtual void artifactDisassembled(const ArtifactLocation & artLoc);
virtual void artifactAssembled(const ArtifactLocation & artLoc);
protected:
void update() const;
std::optional<std::tuple<const CGHeroInstance*, const CArtifactInstance*>> getState();
std::optional<CArtifactsOfHeroPtr> findAOHbyRef(const CArtifactsOfHeroBase & artsInst);
void markPossibleSlots();
bool checkSpecialArts(const CArtifactInstance & artInst, const CGHeroInstance * hero, bool isTrade) const;
void setCursorAnimation(const CArtifactInstance & artInst);
};

View File

@@ -204,7 +204,7 @@ void CRecruitmentWindow::showAll(Canvas & to)
} }
CRecruitmentWindow::CRecruitmentWindow(const CGDwelling * Dwelling, int Level, const CArmedInstance * Dst, const std::function<void(CreatureID,int)> & Recruit, const std::function<void()> & onClose, int y_offset): CRecruitmentWindow::CRecruitmentWindow(const CGDwelling * Dwelling, int Level, const CArmedInstance * Dst, const std::function<void(CreatureID,int)> & Recruit, const std::function<void()> & onClose, int y_offset):
CStatusbarWindow(PLAYER_COLORED, ImagePath::builtin("TPRCRT")), CWindowObject(PLAYER_COLORED, ImagePath::builtin("TPRCRT")),
onRecruit(Recruit), onRecruit(Recruit),
onClose(onClose), onClose(onClose),
level(Level), level(Level),
@@ -445,7 +445,7 @@ CLevelWindow::~CLevelWindow()
} }
CTavernWindow::CTavernWindow(const CGObjectInstance * TavernObj, const std::function<void()> & onWindowClosed) CTavernWindow::CTavernWindow(const CGObjectInstance * TavernObj, const std::function<void()> & onWindowClosed)
: CStatusbarWindow(PLAYER_COLORED, ImagePath::builtin("TPTAVERN")), : CWindowObject(PLAYER_COLORED, ImagePath::builtin("TPTAVERN")),
onWindowClosed(onWindowClosed), onWindowClosed(onWindowClosed),
tavernObj(TavernObj), tavernObj(TavernObj),
heroToInvite(nullptr) heroToInvite(nullptr)
@@ -692,7 +692,7 @@ static bool isQuickExchangeLayoutAvailable()
} }
CExchangeWindow::CExchangeWindow(ObjectInstanceID hero1, ObjectInstanceID hero2, QueryID queryID) CExchangeWindow::CExchangeWindow(ObjectInstanceID hero1, ObjectInstanceID hero2, QueryID queryID)
: CStatusbarWindow(PLAYER_COLORED | BORDERED, ImagePath::builtin(isQuickExchangeLayoutAvailable() ? QUICK_EXCHANGE_BG : "TRADE2")), : CWindowObject(PLAYER_COLORED | BORDERED, ImagePath::builtin(isQuickExchangeLayoutAvailable() ? QUICK_EXCHANGE_BG : "TRADE2")),
controller(hero1, hero2), controller(hero1, hero2),
moveStackLeftButtons(), moveStackLeftButtons(),
moveStackRightButtons() moveStackRightButtons()
@@ -934,12 +934,6 @@ bool CExchangeWindow::holdsGarrison(const CArmedInstance * army)
return garr->upperArmy() == army || garr->lowerArmy() == army; return garr->upperArmy() == army || garr->lowerArmy() == army;
} }
void CExchangeWindow::deactivate()
{
CCS->curh->dragAndDropCursor(nullptr);
CIntObject::deactivate();
}
void CExchangeWindow::questlog(int whichHero) void CExchangeWindow::questlog(int whichHero)
{ {
CCS->curh->dragAndDropCursor(nullptr); CCS->curh->dragAndDropCursor(nullptr);
@@ -975,7 +969,7 @@ void CExchangeWindow::updateWidgets()
} }
CShipyardWindow::CShipyardWindow(const TResources & cost, int state, BoatId boatType, const std::function<void()> & onBuy) CShipyardWindow::CShipyardWindow(const TResources & cost, int state, BoatId boatType, const std::function<void()> & onBuy)
: CStatusbarWindow(PLAYER_COLORED, ImagePath::builtin("TPSHIP")) : CWindowObject(PLAYER_COLORED, ImagePath::builtin("TPSHIP"))
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
@@ -1093,7 +1087,7 @@ bool CTransformerWindow::holdsGarrison(const CArmedInstance * army)
} }
CTransformerWindow::CTransformerWindow(const IMarket * _market, const CGHeroInstance * _hero, const std::function<void()> & onWindowClosed) CTransformerWindow::CTransformerWindow(const IMarket * _market, const CGHeroInstance * _hero, const std::function<void()> & onWindowClosed)
: CStatusbarWindow(PLAYER_COLORED, ImagePath::builtin("SKTRNBK")), : CWindowObject(PLAYER_COLORED, ImagePath::builtin("SKTRNBK")),
hero(_hero), hero(_hero),
onWindowClosed(onWindowClosed), onWindowClosed(onWindowClosed),
market(_market) market(_market)
@@ -1192,7 +1186,7 @@ void CUniversityWindow::CItem::showAll(Canvas & to)
} }
CUniversityWindow::CUniversityWindow(const CGHeroInstance * _hero, const IMarket * _market, const std::function<void()> & onWindowClosed) CUniversityWindow::CUniversityWindow(const CGHeroInstance * _hero, const IMarket * _market, const std::function<void()> & onWindowClosed)
: CStatusbarWindow(PLAYER_COLORED, ImagePath::builtin("UNIVERS1")), : CWindowObject(PLAYER_COLORED, ImagePath::builtin("UNIVERS1")),
hero(_hero), hero(_hero),
onWindowClosed(onWindowClosed), onWindowClosed(onWindowClosed),
market(_market) market(_market)
@@ -1254,7 +1248,7 @@ void CUniversityWindow::makeDeal(SecondarySkill skill)
CUnivConfirmWindow::CUnivConfirmWindow(CUniversityWindow * owner_, SecondarySkill SKILL, bool available) CUnivConfirmWindow::CUnivConfirmWindow(CUniversityWindow * owner_, SecondarySkill SKILL, bool available)
: CStatusbarWindow(PLAYER_COLORED, ImagePath::builtin("UNIVERS2.PCX")), : CWindowObject(PLAYER_COLORED, ImagePath::builtin("UNIVERS2.PCX")),
owner(owner_) owner(owner_)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);
@@ -1341,7 +1335,7 @@ bool CGarrisonWindow::holdsGarrison(const CArmedInstance * army)
} }
CHillFortWindow::CHillFortWindow(const CGHeroInstance * visitor, const CGObjectInstance * object) CHillFortWindow::CHillFortWindow(const CGHeroInstance * visitor, const CGObjectInstance * object)
: CStatusbarWindow(PLAYER_COLORED, ImagePath::builtin("APHLFTBK")), : CWindowObject(PLAYER_COLORED, ImagePath::builtin("APHLFTBK")),
fort(object), fort(object),
hero(visitor) hero(visitor)
{ {
@@ -1545,7 +1539,7 @@ int CHillFortWindow::getState(SlotID slot)
} }
CThievesGuildWindow::CThievesGuildWindow(const CGObjectInstance * _owner): CThievesGuildWindow::CThievesGuildWindow(const CGObjectInstance * _owner):
CStatusbarWindow(PLAYER_COLORED | BORDERED, ImagePath::builtin("TpRank")), CWindowObject(PLAYER_COLORED | BORDERED, ImagePath::builtin("TpRank")),
owner(_owner) owner(_owner)
{ {
OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE); OBJECT_CONSTRUCTION_CAPTURING(255-DISPOSE);

View File

@@ -11,8 +11,8 @@
#include "../lib/ResourceSet.h" #include "../lib/ResourceSet.h"
#include "../widgets/CExchangeController.h" #include "../widgets/CExchangeController.h"
#include "../widgets/CWindowWithArtifacts.h"
#include "../widgets/Images.h" #include "../widgets/Images.h"
#include "CWindowWithArtifacts.h"
VCMI_LIB_NAMESPACE_BEGIN VCMI_LIB_NAMESPACE_BEGIN
@@ -325,7 +325,6 @@ public:
void updateGarrisons() override; void updateGarrisons() override;
bool holdsGarrison(const CArmedInstance * army) override; bool holdsGarrison(const CArmedInstance * army) override;
void deactivate() override;
void questlog(int whichHero); //questlog button callback; whichHero: 0 - left, 1 - right void questlog(int whichHero); //questlog button callback; whichHero: 0 - left, 1 - right

View File

@@ -53,6 +53,7 @@ namespace GameConstants
constexpr int64_t PLAYER_RESOURCES_CAP = 1000 * 1000 * 1000; constexpr int64_t PLAYER_RESOURCES_CAP = 1000 * 1000 * 1000;
constexpr int ALTAR_ARTIFACTS_SLOTS = 22; constexpr int ALTAR_ARTIFACTS_SLOTS = 22;
constexpr int TOURNAMENT_RULES_DD_MAP_TILES_THRESHOLD = 144*144*2; //map tiles count threshold for 2 dimension door casts with tournament rules constexpr int TOURNAMENT_RULES_DD_MAP_TILES_THRESHOLD = 144*144*2; //map tiles count threshold for 2 dimension door casts with tournament rules
constexpr int KINGDOM_WINDOW_HEROES_SLOTS = 4;
} }
VCMI_LIB_NAMESPACE_END VCMI_LIB_NAMESPACE_END