From 2ef964d85939b83b42324c48c19d0d82fc1425fd Mon Sep 17 00:00:00 2001 From: MichalZr6 Date: Sun, 18 May 2025 00:44:08 +0200 Subject: [PATCH 01/10] Fix crash on copy-pasting objects --- mapeditor/mapcontroller.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mapeditor/mapcontroller.cpp b/mapeditor/mapcontroller.cpp index 70f6d5448..39931eda9 100644 --- a/mapeditor/mapcontroller.cpp +++ b/mapeditor/mapcontroller.cpp @@ -381,7 +381,8 @@ void MapController::pasteFromClipboard(int level) if(_map->isInTheMap(newPos)) obj->pos = newPos; obj->pos.z = level; - + + obj->id = {}; Initializer init(*this, obj.get(), defaultPlayer); _map->getEditManager()->insertObject(obj); _scenes[level]->selectionObjectsView.selectObject(obj.get()); From 507c305a5a93b3556f6f71c0684c1acd576b80f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Zaremba?= Date: Wed, 21 May 2025 10:28:21 +0200 Subject: [PATCH 02/10] Fix crash on getAverageExperience when stack count was 0 --- mapeditor/inspector/inspector.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/mapeditor/inspector/inspector.cpp b/mapeditor/inspector/inspector.cpp index 9e2870260..3960016fe 100644 --- a/mapeditor/inspector/inspector.cpp +++ b/mapeditor/inspector/inspector.cpp @@ -74,10 +74,10 @@ void Initializer::initialize(CGSignBottle * o) void Initializer::initialize(CGCreature * o) { if(!o) return; - + o->character = CGCreature::Character::HOSTILE; if(!o->hasStackAtSlot(SlotID(0))) - o->putStack(SlotID(0), std::make_unique(o->cb, CreatureID(o->subID), 0, false)); + o->putStack(SlotID(0), std::make_unique(nullptr, CreatureID(o->subID), 1, false)); } void Initializer::initialize(CGDwelling * o) From b2e51a5fb1977a56662f3f35385b56d9cbc16bcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Zaremba?= Date: Mon, 26 May 2025 22:52:34 +0200 Subject: [PATCH 03/10] Add MapInfoCallback and EditorCallback --- lib/CMakeLists.txt | 6 +- lib/callback/CGameInfoCallback.cpp | 89 +------------- lib/callback/CGameInfoCallback.h | 18 +-- lib/callback/IGameInfoCallback.h | 12 +- lib/callback/MapInfoCallback.cpp | 120 ++++++++++++++++++ lib/callback/MapInfoCallback.h | 43 +++++++ mapeditor/CMakeLists.txt | 2 + mapeditor/EditorCallback.cpp | 189 +++++++++++++++++++++++++++++ mapeditor/EditorCallback.h | 74 +++++++++++ mapeditor/helper.cpp | 9 +- 10 files changed, 456 insertions(+), 106 deletions(-) create mode 100644 lib/callback/MapInfoCallback.cpp create mode 100644 lib/callback/MapInfoCallback.h create mode 100644 mapeditor/EditorCallback.cpp create mode 100644 mapeditor/EditorCallback.h diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index ec6a0f57e..9405dfe8d 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -85,6 +85,8 @@ set(lib_MAIN_SRCS callback/CNonConstInfoCallback.cpp callback/CPlayerSpecificInfoCallback.cpp callback/GameRandomizer.cpp + callback/MapInfoCallback.cpp + callback/EditorCallback.cpp campaign/CampaignBonus.cpp campaign/CampaignHandler.cpp @@ -482,7 +484,9 @@ set(lib_MAIN_HEADERS callback/IGameInfoCallback.h callback/IGameRandomizer.h callback/GameRandomizer.h - + callback/MapInfoCallback.h + callback/EditorCallback.h + campaign/CampaignBonus.h campaign/CampaignConstants.h campaign/CampaignHandler.h diff --git a/lib/callback/CGameInfoCallback.cpp b/lib/callback/CGameInfoCallback.cpp index fce7d3c38..2da943329 100644 --- a/lib/callback/CGameInfoCallback.cpp +++ b/lib/callback/CGameInfoCallback.cpp @@ -34,11 +34,10 @@ VCMI_LIB_NAMESPACE_BEGIN #define ERROR_RET_IF(cond, txt) do {if(cond){logGlobal->error("%s: %s", BOOST_CURRENT_FUNCTION, txt); return;}} while(0) #define ERROR_RET_VAL_IF(cond, txt, retVal) do {if(cond){logGlobal->error("%s: %s", BOOST_CURRENT_FUNCTION, txt); return retVal;}} while(0) -PlayerColor CGameInfoCallback::getOwner(ObjectInstanceID heroID) const +const IMarket * CGameInfoCallback::getMarket(ObjectInstanceID objid) const { - const CGObjectInstance *obj = getObj(heroID); - ERROR_RET_VAL_IF(!obj, "No such object!", PlayerColor::CANNOT_DETERMINE); - return obj->tempOwner; + const CGObjectInstance * obj = getObj(objid, false); + return dynamic_cast(obj); } int CGameInfoCallback::getResource(PlayerColor Player, GameResID which) const @@ -54,21 +53,6 @@ const PlayerSettings * CGameInfoCallback::getPlayerSettings(PlayerColor color) c return &gameState().getStartInfo()->getIthPlayersSettings(color); } -bool CGameInfoCallback::isAllowed(SpellID id) const -{ - return gameState().getMap().allowedSpells.count(id) != 0; -} - -bool CGameInfoCallback::isAllowed(ArtifactID id) const -{ - return gameState().getMap().allowedArtifact.count(id) != 0; -} - -bool CGameInfoCallback::isAllowed(SecondarySkill id) const -{ - return gameState().getMap().allowedAbilities.count(id) != 0; -} - std::optional CGameInfoCallback::getPlayerID() const { return std::nullopt; @@ -129,20 +113,10 @@ TurnTimerInfo CGameInfoCallback::getPlayerTurnTime(PlayerColor color) const const CGObjectInstance* CGameInfoCallback::getObj(ObjectInstanceID objid, bool verbose) const { - if (!objid.hasValue()) - { - if(verbose) - logGlobal->error("Cannot get object with id %d. No such object", objid.getNum()); - return nullptr; - } + const CGObjectInstance * ret = MapInfoCallback::getObj(objid, verbose); - const CGObjectInstance *ret = gameState().getMap().getObject(objid); if(!ret) - { - if(verbose) - logGlobal->error("Cannot get object with id %d. Object was removed", objid.getNum()); return nullptr; - } if(getPlayerID().has_value() && !isVisibleFor(ret, *getPlayerID()) && ret->tempOwner != getPlayerID()) { @@ -154,32 +128,6 @@ const CGObjectInstance* CGameInfoCallback::getObj(ObjectInstanceID objid, bool v return ret; } -const CGHeroInstance* CGameInfoCallback::getHero(ObjectInstanceID objid) const -{ - const CGObjectInstance *obj = getObj(objid, false); - if(obj) - return dynamic_cast(obj); - else - return nullptr; -} -const CGTownInstance* CGameInfoCallback::getTown(ObjectInstanceID objid) const -{ - const CGObjectInstance *obj = getObj(objid, false); - if(obj) - return dynamic_cast(obj); - else - return nullptr; -} - -const IMarket * CGameInfoCallback::getMarket(ObjectInstanceID objid) const -{ - const CGObjectInstance * obj = getObj(objid, false); - if(obj) - return dynamic_cast(obj); - else - return nullptr; -} - void CGameInfoCallback::fillUpgradeInfo(const CArmedInstance *obj, SlotID stackPos, UpgradeInfo & out) const { ERROR_RET_IF(!canGetFullInfo(obj), "Cannot get info about not owned object!"); @@ -295,11 +243,6 @@ bool CGameInfoCallback::getTownInfo(const CGObjectInstance * town, InfoAboutTown return true; } -const IGameSettings & CGameInfoCallback::getSettings() const -{ - return gameState().getSettings(); -} - int3 CGameInfoCallback::guardingCreaturePosition (int3 pos) const { ERROR_RET_VAL_IF(!isVisible(pos), "Tile is not visible!", int3(-1,-1,-1)); @@ -506,7 +449,7 @@ std::vector CGameInfoCallback::getAllVisitableObjs() c return ret; } -const CGObjectInstance * CGameInfoCallback::getTopObj (int3 pos) const +const CGObjectInstance * CGameInfoCallback::getTopObj(int3 pos) const { return vstd::backOrNull(getVisitableObjs(pos)); } @@ -525,11 +468,6 @@ std::vector CGameInfoCallback::getFlaggableObjects(in return ret; } -int3 CGameInfoCallback::getMapSize() const -{ - return int3(gameState().getMap().width, gameState().getMap().height, gameState().getMap().twoLevel ? 2 : 1); -} - std::vector CGameInfoCallback::getAvailableHeroes(const CGObjectInstance * townOrTavern) const { ASSERT_IF_CALLED_WITH_PLAYER @@ -643,7 +581,7 @@ EBuildingState CGameInfoCallback::canBuildStructure( const CGTownInstance *t, Bu return EBuildingState::ALLOWED; } -const CMapHeader * CGameInfoCallback::getMapHeader() const +const CMap * CGameInfoCallback::getMapConstPtr() const { return &gameState().getMap(); } @@ -778,11 +716,6 @@ const TeamState * CGameInfoCallback::getPlayerTeam( PlayerColor color ) const } } -bool CGameInfoCallback::isInTheMap(const int3 &pos) const -{ - return gameState().getMap().isInTheMap(pos); -} - void CGameInfoCallback::getVisibleTilesInRange(std::unordered_set &tiles, int3 pos, int radious, int3::EDistanceFormula distanceFormula) const { gameState().getTilesInRange(tiles, pos, radious, ETileVisibility::REVEALED, *getPlayerID(), distanceFormula); @@ -793,16 +726,6 @@ void CGameInfoCallback::calculatePaths(const std::shared_ptr & gameState().calculatePaths(config); } -const CArtifactInstance * CGameInfoCallback::getArtInstance( ArtifactInstanceID aid ) const -{ - return gameState().getMap().getArtifactInstance(aid); -} - -const CGObjectInstance * CGameInfoCallback::getObjInstance( ObjectInstanceID oid ) const -{ - return gameState().getMap().getObject((oid)); -} - const CArtifactSet * CGameInfoCallback::getArtSet(const ArtifactLocation & loc) const { auto & gs = const_cast(gameState()); diff --git a/lib/callback/CGameInfoCallback.h b/lib/callback/CGameInfoCallback.h index 0097107b9..87a27209e 100644 --- a/lib/callback/CGameInfoCallback.h +++ b/lib/callback/CGameInfoCallback.h @@ -9,16 +9,18 @@ */ #pragma once -#include "IGameInfoCallback.h" +#include "MapInfoCallback.h" VCMI_LIB_NAMESPACE_BEGIN struct SThievesGuildInfo; class Player; -class DLL_LINKAGE CGameInfoCallback : public IGameInfoCallback +class DLL_LINKAGE CGameInfoCallback : public MapInfoCallback { protected: + const CMap * getMapConstPtr() const override; + bool hasAccess(std::optional playerId) const; bool canGetFullInfo(const CGObjectInstance *obj) const; //true we player owns obj or ally owns obj or privileged mode @@ -28,10 +30,6 @@ public: int getDate(Date mode=Date::DAY)const override; //mode=0 - total days in game, mode=1 - day of week, mode=2 - current week, mode=3 - current month const StartInfo * getStartInfo() const override; const StartInfo * getInitialStartInfo() const; - bool isAllowed(SpellID id) const override; - bool isAllowed(ArtifactID id) const override; - bool isAllowed(SecondarySkill id) const override; - const IGameSettings & getSettings() const override; //player virtual std::optional getPlayerID() const; @@ -55,14 +53,11 @@ public: void fillUpgradeInfo(const CArmedInstance *obj, SlotID stackPos, UpgradeInfo &out) const; //hero - const CGHeroInstance * getHero(ObjectInstanceID objid) const override; int getHeroCount(PlayerColor player, bool includeGarrisoned) const override; std::vector getHeroes(PlayerColor player) const; bool getHeroInfo(const CGObjectInstance * hero, InfoAboutHero & dest, const CGObjectInstance * selectedObject = nullptr) const; int32_t getSpellCost(const spells::Spell * sp, const CGHeroInstance * caster) const; int64_t estimateSpellDamage(const CSpell * sp, const CGHeroInstance * hero) const; - const CArtifactInstance * getArtInstance(ArtifactInstanceID aid) const override; - const CGObjectInstance * getObjInstance(ObjectInstanceID oid) const override; const CArtifactSet * getArtSet(const ArtifactLocation & loc) const; //objects @@ -72,25 +67,20 @@ public: std::vector getAllVisitableObjs() const; std::vector getFlaggableObjects(int3 pos) const; const CGObjectInstance * getTopObj(int3 pos) const override; - PlayerColor getOwner(ObjectInstanceID heroID) const; const IMarket * getMarket(ObjectInstanceID objid) const; //map int3 guardingCreaturePosition (int3 pos) const override; std::vector getGuardingCreatures (int3 pos) const override; bool isTileGuardedUnchecked(int3 tile) const; - const CMapHeader * getMapHeader()const override; - int3 getMapSize() const override; const TerrainTile * getTile(int3 tile, bool verbose = true) const override; const TerrainTile * getTileUnchecked(int3 tile) const override; - bool isInTheMap(const int3 &pos) const override; void getVisibleTilesInRange(std::unordered_set &tiles, int3 pos, int radious, int3::EDistanceFormula distanceFormula = int3::DIST_2D) const; void calculatePaths(const std::shared_ptr & config) const override; EDiggingStatus getTileDigStatus(int3 tile, bool verbose = true) const override; bool checkForVisitableDir(const int3 & src, const int3 & dst) const override; //town - const CGTownInstance* getTown(ObjectInstanceID objid) const override; int howManyTowns(PlayerColor Player) const; std::vector getAvailableHeroes(const CGObjectInstance * townOrTavern) const; std::string getTavernRumor(const CGObjectInstance * townOrTavern) const; diff --git a/lib/callback/IGameInfoCallback.h b/lib/callback/IGameInfoCallback.h index 8154e6b25..b4021c375 100644 --- a/lib/callback/IGameInfoCallback.h +++ b/lib/callback/IGameInfoCallback.h @@ -73,10 +73,10 @@ public: /// WEEK - number of week within month (1..4) /// MONTH - current month (1..inf) /// DAY_OF_MONTH - number of day within current month, (1..28) - virtual int getDate(Date mode=Date::DAY)const = 0; + virtual int getDate(Date mode=Date::DAY) const = 0; /// Return pointer to static map header for current map - virtual const CMapHeader * getMapHeader()const = 0; + virtual const CMapHeader * getMapHeader() const = 0; /// Returns post-randomized startin information on current game virtual const StartInfo * getStartInfo() const = 0; @@ -103,9 +103,9 @@ public: virtual bool isInTheMap(const int3 &pos) const = 0; /// Returns pointer to specified team. Team must be valid - virtual const TeamState *getTeam(TeamID teamID) const = 0; + virtual const TeamState * getTeam(TeamID teamID) const = 0; /// Returns pointer to specified team. Player must be valid. Players without belong to a team with single member - virtual const TeamState *getPlayerTeam(PlayerColor color) const = 0; + virtual const TeamState * getPlayerTeam(PlayerColor color) const = 0; /// Returns current state of a specific player. Player must be valid virtual const PlayerState * getPlayerState(PlayerColor color, bool verbose = true) const = 0; /// Returns starting settings of a specified player. Player must be valid @@ -122,7 +122,7 @@ public: /// Returns pointer to hero using provided object ID. Returns null on failure virtual const CGHeroInstance * getHero(ObjectInstanceID objid) const = 0; /// Returns pointer to town using provided object ID. Returns null on failure - virtual const CGTownInstance* getTown(ObjectInstanceID objid) const = 0; + virtual const CGTownInstance * getTown(ObjectInstanceID objid) const = 0; /// Returns pointer to object using provided object ID. Returns null on failure virtual const CGObjectInstance * getObj(ObjectInstanceID objid, bool verbose = true) const = 0; /// Returns pointer to object using provided object ID. Returns null on failure @@ -146,7 +146,7 @@ public: /// Return true if src tile is visitable from dst tile virtual bool checkForVisitableDir(const int3 & src, const int3 & dst) const = 0; /// Returns all wandering monsters that guard specified tile - virtual std::vector getGuardingCreatures (int3 pos) const = 0; + virtual std::vector getGuardingCreatures (int3 pos) const = 0; /// Returns all tiles within specified range with specific tile visibility mode virtual void getTilesInRange(std::unordered_set & tiles, const int3 & pos, int radius, ETileVisibility mode, std::optional player = std::optional(), int3::EDistanceFormula formula = int3::DIST_2D) const = 0; diff --git a/lib/callback/MapInfoCallback.cpp b/lib/callback/MapInfoCallback.cpp new file mode 100644 index 000000000..99c6a4df0 --- /dev/null +++ b/lib/callback/MapInfoCallback.cpp @@ -0,0 +1,120 @@ +#include "StdInc.h" +#include "MapInfoCallback.h" +#include "../constants/EntityIdentifiers.h" +#include "../mapObjects/CGObjectInstance.h" +#include "../mapObjects/CGHeroInstance.h" +#include "../mapObjects/CGTownInstance.h" +#include "../mapObjects/MiscObjects.h" +#include "../StartInfo.h" +#include "../mapping/CMap.h" +#include "../spells/CSpellHandler.h" + +VCMI_LIB_NAMESPACE_BEGIN + +MapInfoCallback::~MapInfoCallback() = default; + +const CGObjectInstance * MapInfoCallback::getObj(ObjectInstanceID objid, bool verbose) const +{ + if(!objid.hasValue()) + { + if(verbose) + logGlobal->error("Cannot get object with id %d. No such object", objid.getNum()); + return nullptr; + } + + const CGObjectInstance * ret = getMapConstPtr()->getObject(objid); + if(!ret && verbose) + { + logGlobal->error("Cannot get object with id %d. Object was removed", objid.getNum()); + return nullptr; + } + + return ret; +} + +const CGHeroInstance * MapInfoCallback::getHero(ObjectInstanceID objid) const +{ + const CGObjectInstance * obj = getObj(objid, false); + return dynamic_cast(obj); +} + +const CGTownInstance * MapInfoCallback::getTown(ObjectInstanceID objid) const +{ + const CGObjectInstance * obj = getObj(objid, false); + return dynamic_cast(obj); +} + +PlayerColor MapInfoCallback::getOwner(ObjectInstanceID heroID) const +{ + const CGObjectInstance * obj = getObj(heroID); + if(!obj) + { + logGlobal->error("MapInfoCallback::getOwner(heroID): No such object for heroID: %d", heroID.num); + return PlayerColor::CANNOT_DETERMINE; + } + + return obj->tempOwner; +} + +const CArtifactInstance * MapInfoCallback::getArtInstance(ArtifactInstanceID aid) const +{ + return getMapConstPtr()->getArtifactInstance(aid); +} + +const CGObjectInstance * MapInfoCallback::getObjInstance(ObjectInstanceID oid) const +{ + return getMapConstPtr()->getObject((oid)); +} + +bool MapInfoCallback::isInTheMap(const int3 & pos) const +{ + return getMapConstPtr()->isInTheMap(pos); +} + +bool MapInfoCallback::isAllowed(SpellID id) const +{ + return getMapConstPtr()->allowedSpells.count(id) != 0; +} + +bool MapInfoCallback::isAllowed(ArtifactID id) const +{ + return getMapConstPtr()->allowedArtifact.count(id) != 0; +} + +bool MapInfoCallback::isAllowed(SecondarySkill id) const +{ + return getMapConstPtr()->allowedAbilities.count(id) != 0; +} + +int3 MapInfoCallback::getMapSize() const +{ + return int3(getMapConstPtr()->width, getMapConstPtr()->height, getMapConstPtr()->twoLevel ? 2 : 1); +} + +void MapInfoCallback::getAllowedSpells(std::vector & out, std::optional level) +{ + for (auto const & spellID : getMapConstPtr()->allowedSpells) + { + const auto * spell = spellID.toEntity(LIBRARY); + + if (!isAllowed(spellID)) + continue; + + if (level.has_value() && spell->getLevel() != level) + continue; + + out.push_back(spellID); + } +} + +const IGameSettings & MapInfoCallback::getSettings() const +{ + return getMapConstPtr()->getSettings(); +} + +const CMapHeader * MapInfoCallback::getMapHeader() const +{ + return getMapConstPtr(); +} + +VCMI_LIB_NAMESPACE_END diff --git a/lib/callback/MapInfoCallback.h b/lib/callback/MapInfoCallback.h new file mode 100644 index 000000000..a52a67687 --- /dev/null +++ b/lib/callback/MapInfoCallback.h @@ -0,0 +1,43 @@ +/* + * MapInfoCallback.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 "IGameInfoCallback.h" + +VCMI_LIB_NAMESPACE_BEGIN + +class CMap; + +class DLL_LINKAGE MapInfoCallback : public IGameInfoCallback +{ +public: + virtual ~MapInfoCallback(); + virtual const CMap * getMapConstPtr() const = 0; + + const CGObjectInstance * getObj(ObjectInstanceID objid, bool verbose = true) const override; + const CGObjectInstance * getObjInstance(ObjectInstanceID oid) const override; + const CArtifactInstance * getArtInstance(ArtifactInstanceID aid) const override; + const CGHeroInstance * getHero(ObjectInstanceID objid) const override; + const CGTownInstance * getTown(ObjectInstanceID objid) const override; + PlayerColor getOwner(ObjectInstanceID heroID) const; + + bool isInTheMap(const int3 & pos) const override; + bool isAllowed(SpellID id) const override; + bool isAllowed(ArtifactID id) const override; + bool isAllowed(SecondarySkill id) const override; + int3 getMapSize() const override; + void getAllowedSpells(std::vector & out, std::optional level); + + const IGameSettings & getSettings() const override; + const CMapHeader * getMapHeader() const override; + +}; + +VCMI_LIB_NAMESPACE_END diff --git a/mapeditor/CMakeLists.txt b/mapeditor/CMakeLists.txt index fcbd0d382..b514cb6d3 100644 --- a/mapeditor/CMakeLists.txt +++ b/mapeditor/CMakeLists.txt @@ -48,6 +48,7 @@ set(editor_SRCS campaigneditor/scenarioproperties.cpp campaigneditor/startingbonus.cpp campaigneditor/campaignview.cpp + EditorCallback.cpp ) set(editor_HEADERS @@ -101,6 +102,7 @@ set(editor_HEADERS campaigneditor/scenarioproperties.h campaigneditor/startingbonus.h campaigneditor/campaignview.h + EditorCallback.h ) set(editor_FORMS diff --git a/mapeditor/EditorCallback.cpp b/mapeditor/EditorCallback.cpp new file mode 100644 index 000000000..7ea8d419c --- /dev/null +++ b/mapeditor/EditorCallback.cpp @@ -0,0 +1,189 @@ +#include "StdInc.h" +#include "EditorCallback.h" +#include "../lib/mapping/CMap.h" + +#define THROW_EDITOR_UNSUPPORTED \ + throw std::runtime_error(std::string("EditorCallback: ") + __func__ + " is not available in map editor") + +const CMap * EditorCallback::getMapConstPtr() const +{ + if(!map) + throw std::runtime_error("EditorCallback: map pointer is null"); + return map; +} + +EditorCallback::EditorCallback(const CMap * map) + : map(map) +{} + +void EditorCallback::setMap(const CMap * map) +{ + this->map = map; +} + +CGameState & EditorCallback::gameState() +{ + THROW_EDITOR_UNSUPPORTED; +} + +const CGameState & EditorCallback::gameState() const +{ + THROW_EDITOR_UNSUPPORTED; +} + +const StartInfo * EditorCallback::getStartInfo() const +{ + THROW_EDITOR_UNSUPPORTED; +} + +int EditorCallback::getDate(Date mode) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +const TerrainTile * EditorCallback::getTile(int3, bool) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +const TerrainTile * EditorCallback::getTileUnchecked(int3) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +const CGObjectInstance * EditorCallback::getTopObj(int3) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +EDiggingStatus EditorCallback::getTileDigStatus(int3, bool) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +void EditorCallback::calculatePaths(const std::shared_ptr &) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +int3 EditorCallback::guardingCreaturePosition(int3) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +bool EditorCallback::checkForVisitableDir(const int3 &, const int3 &) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +std::vector EditorCallback::getGuardingCreatures(int3) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +void EditorCallback::getTilesInRange(std::unordered_set &, const int3 &, int, ETileVisibility, std::optional, int3::EDistanceFormula) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +void EditorCallback::getAllTiles(std::unordered_set &, std::optional, int, std::function) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +std::vector EditorCallback::getVisibleTeleportObjects(std::vector, PlayerColor) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +std::vector EditorCallback::getTeleportChannelEntrances(TeleportChannelID, PlayerColor) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +std::vector EditorCallback::getTeleportChannelExits(TeleportChannelID, PlayerColor) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +bool EditorCallback::isTeleportChannelImpassable(TeleportChannelID, PlayerColor) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +bool EditorCallback::isTeleportChannelBidirectional(TeleportChannelID, PlayerColor) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +bool EditorCallback::isTeleportChannelUnidirectional(TeleportChannelID, PlayerColor) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +bool EditorCallback::isTeleportEntrancePassable(const CGTeleport *, PlayerColor) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +bool EditorCallback::isVisibleFor(int3 pos, PlayerColor player) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +bool EditorCallback::isVisibleFor(const CGObjectInstance *obj, PlayerColor player) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +void EditorCallback::pickAllowedArtsSet(std::vector &, vstd::RNG &) +{ + THROW_EDITOR_UNSUPPORTED; +} + +#if SCRIPTING_ENABLED +scripting::Pool * EditorCallback::getGlobalContextPool() const +{ + THROW_EDITOR_UNSUPPORTED; +} +#endif + +const TeamState * EditorCallback::getTeam(TeamID) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +const TeamState * EditorCallback::getPlayerTeam(PlayerColor) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +const PlayerState * EditorCallback::getPlayerState(PlayerColor, bool) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +const PlayerSettings * EditorCallback::getPlayerSettings(PlayerColor) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +PlayerRelations EditorCallback::getPlayerRelations(PlayerColor, PlayerColor) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +int EditorCallback::getHeroCount(PlayerColor, bool) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +EPlayerStatus EditorCallback::getPlayerStatus(PlayerColor, bool) const +{ + THROW_EDITOR_UNSUPPORTED; +} + +int EditorCallback::getResource(PlayerColor, GameResID) const +{ + THROW_EDITOR_UNSUPPORTED; +} diff --git a/mapeditor/EditorCallback.h b/mapeditor/EditorCallback.h new file mode 100644 index 000000000..724019ae4 --- /dev/null +++ b/mapeditor/EditorCallback.h @@ -0,0 +1,74 @@ +/* + * EditorCallback.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 "../lib/callback/MapInfoCallback.h" + +class EditorCallback : public MapInfoCallback +{ +protected: + const CMap * getMapConstPtr() const override; + +public: + explicit EditorCallback(const CMap * map); + + void setMap(const CMap * map); + + // Access to full game state — not available in editor + CGameState & gameState() override; + const CGameState & gameState() const override; + + // Unused in editor — return null or dummy + const StartInfo * getStartInfo() const override; + int getDate(Date mode) const override; + + const TerrainTile * getTile(int3 tile, bool verbose) const override; + const TerrainTile * getTileUnchecked(int3 tile) const override; + const CGObjectInstance * getTopObj(int3 pos) const override; + EDiggingStatus getTileDigStatus(int3 tile, bool verbose) const override; + void calculatePaths(const std::shared_ptr & config) const override; + int3 guardingCreaturePosition(int3 pos) const override; + bool checkForVisitableDir(const int3 & src, const int3 & dst) const override; + std::vector getGuardingCreatures(int3 pos) const override; + + void getTilesInRange(std::unordered_set & tiles, const int3 & pos, int radius, ETileVisibility mode, std::optional player, int3::EDistanceFormula formula) const override; + void getAllTiles(std::unordered_set &tiles, std::optional player, int level, std::function filter) const override; + + std::vector getVisibleTeleportObjects(std::vector ids, PlayerColor player) const override; + std::vector getTeleportChannelEntrances(TeleportChannelID id, PlayerColor player) const override; + std::vector getTeleportChannelExits(TeleportChannelID id, PlayerColor player) const override; + bool isTeleportChannelImpassable(TeleportChannelID id, PlayerColor player) const override; + bool isTeleportChannelBidirectional(TeleportChannelID id, PlayerColor player) const override; + bool isTeleportChannelUnidirectional(TeleportChannelID id, PlayerColor player) const override; + bool isTeleportEntrancePassable(const CGTeleport * obj, PlayerColor player) const override; + + bool isVisibleFor(int3 pos, PlayerColor player) const; + bool isVisibleFor(const CGObjectInstance * obj, PlayerColor player) const; + + void pickAllowedArtsSet(std::vector & out, vstd::RNG & rand) override; + +// Optional scripting +#if SCRIPTING_ENABLED + scripting::Pool * getGlobalContextPool() const override; +#endif + + // Player-related (stub or throw) + const TeamState * getTeam(TeamID teamID) const override; + const TeamState * getPlayerTeam(PlayerColor color) const override; + const PlayerState * getPlayerState(PlayerColor color, bool verbose) const override; + const PlayerSettings * getPlayerSettings(PlayerColor color) const override; + PlayerRelations getPlayerRelations(PlayerColor color1, PlayerColor color2) const override; + int getHeroCount(PlayerColor player, bool includeGarrisoned) const override; + EPlayerStatus getPlayerStatus(PlayerColor player, bool verbose) const override; + int getResource(PlayerColor player, GameResID which) const override; + +private: + const CMap * map; +}; diff --git a/mapeditor/helper.cpp b/mapeditor/helper.cpp index 62982c4ba..759e53106 100644 --- a/mapeditor/helper.cpp +++ b/mapeditor/helper.cpp @@ -11,6 +11,7 @@ #include "StdInc.h" #include "helper.h" #include "mapcontroller.h" +#include "EditorCallback.h" #include "../lib/filesystem/Filesystem.h" #include "../lib/filesystem/CMemoryBuffer.h" @@ -49,8 +50,12 @@ std::unique_ptr Helper::openMapInternal(const QString & filenameSelect) if(!modList.empty()) throw ModIncompatibility(modList); - - return mapService.loadMap(resId, nullptr); + + auto cb = std::make_shared(nullptr); + + std::unique_ptr map = mapService.loadMap(resId, cb.get()); + cb->setMap(map.get()); + return map; } else throw std::runtime_error("Corrupted map"); From ebe746d0cfb25bed27b132dc07c8389ad2035ecf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Zaremba?= Date: Mon, 2 Jun 2025 15:30:08 +0200 Subject: [PATCH 04/10] Integrate EditorCallback into mapeditor EditorCallback being set up with std::unique_ptr stored in MapController. --- lib/CMakeLists.txt | 4 ++ .../callback}/EditorCallback.cpp | 18 +++++--- {mapeditor => lib/callback}/EditorCallback.h | 14 +++--- lib/callback/MapInfoCallback.cpp | 9 ++++ lib/entities/artifact/ArtSlotInfo.h | 1 + .../CDefaultObjectTypeHandler.h | 4 ++ mapeditor/CMakeLists.txt | 2 - mapeditor/helper.cpp | 11 ++--- mapeditor/helper.h | 5 ++- mapeditor/inspector/artifactwidget.cpp | 7 ++- mapeditor/inspector/heroartifactswidget.cpp | 29 +++++++++--- mapeditor/inspector/heroartifactswidget.h | 4 ++ mapeditor/inspector/heroartifactswidget.ui | 45 ++++++++++++++++--- mapeditor/inspector/inspector.cpp | 14 ++++-- mapeditor/mainwindow.cpp | 7 +-- mapeditor/mapcontroller.cpp | 15 +++++++ mapeditor/mapcontroller.h | 4 ++ mapeditor/mapview.cpp | 2 +- mapeditor/windownewmap.cpp | 2 +- 19 files changed, 151 insertions(+), 46 deletions(-) rename {mapeditor => lib/callback}/EditorCallback.cpp (93%) rename {mapeditor => lib/callback}/EditorCallback.h (93%) diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 9405dfe8d..24c0e843e 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -486,8 +486,12 @@ set(lib_MAIN_HEADERS callback/GameRandomizer.h callback/MapInfoCallback.h callback/EditorCallback.h +<<<<<<< HEAD campaign/CampaignBonus.h +======= + +>>>>>>> eeff61da6 (Integrate EditorCallback into mapeditor) campaign/CampaignConstants.h campaign/CampaignHandler.h campaign/CampaignRegions.h diff --git a/mapeditor/EditorCallback.cpp b/lib/callback/EditorCallback.cpp similarity index 93% rename from mapeditor/EditorCallback.cpp rename to lib/callback/EditorCallback.cpp index 7ea8d419c..1fc40ec9b 100644 --- a/mapeditor/EditorCallback.cpp +++ b/lib/callback/EditorCallback.cpp @@ -1,3 +1,12 @@ +/* + * EditorCallback.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 "EditorCallback.h" #include "../lib/mapping/CMap.h" @@ -5,6 +14,8 @@ #define THROW_EDITOR_UNSUPPORTED \ throw std::runtime_error(std::string("EditorCallback: ") + __func__ + " is not available in map editor") +VCMI_LIB_NAMESPACE_BEGIN + const CMap * EditorCallback::getMapConstPtr() const { if(!map) @@ -136,11 +147,6 @@ bool EditorCallback::isVisibleFor(const CGObjectInstance *obj, PlayerColor playe THROW_EDITOR_UNSUPPORTED; } -void EditorCallback::pickAllowedArtsSet(std::vector &, vstd::RNG &) -{ - THROW_EDITOR_UNSUPPORTED; -} - #if SCRIPTING_ENABLED scripting::Pool * EditorCallback::getGlobalContextPool() const { @@ -187,3 +193,5 @@ int EditorCallback::getResource(PlayerColor, GameResID) const { THROW_EDITOR_UNSUPPORTED; } + +VCMI_LIB_NAMESPACE_END diff --git a/mapeditor/EditorCallback.h b/lib/callback/EditorCallback.h similarity index 93% rename from mapeditor/EditorCallback.h rename to lib/callback/EditorCallback.h index 724019ae4..975706979 100644 --- a/mapeditor/EditorCallback.h +++ b/lib/callback/EditorCallback.h @@ -11,7 +11,9 @@ #include "../lib/callback/MapInfoCallback.h" -class EditorCallback : public MapInfoCallback +VCMI_LIB_NAMESPACE_BEGIN + +class DLL_LINKAGE EditorCallback : public MapInfoCallback { protected: const CMap * getMapConstPtr() const override; @@ -49,10 +51,8 @@ public: bool isTeleportChannelUnidirectional(TeleportChannelID id, PlayerColor player) const override; bool isTeleportEntrancePassable(const CGTeleport * obj, PlayerColor player) const override; - bool isVisibleFor(int3 pos, PlayerColor player) const; - bool isVisibleFor(const CGObjectInstance * obj, PlayerColor player) const; - - void pickAllowedArtsSet(std::vector & out, vstd::RNG & rand) override; + bool isVisibleFor(int3 pos, PlayerColor player) const override; + bool isVisibleFor(const CGObjectInstance * obj, PlayerColor player) const override; // Optional scripting #if SCRIPTING_ENABLED @@ -69,6 +69,10 @@ public: EPlayerStatus getPlayerStatus(PlayerColor player, bool verbose) const override; int getResource(PlayerColor player, GameResID which) const override; + virtual ~EditorCallback() = default; + private: const CMap * map; }; + +VCMI_LIB_NAMESPACE_END diff --git a/lib/callback/MapInfoCallback.cpp b/lib/callback/MapInfoCallback.cpp index 99c6a4df0..1296fd48c 100644 --- a/lib/callback/MapInfoCallback.cpp +++ b/lib/callback/MapInfoCallback.cpp @@ -1,3 +1,12 @@ +/* + * MapInfoCallback.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 "MapInfoCallback.h" #include "../constants/EntityIdentifiers.h" diff --git a/lib/entities/artifact/ArtSlotInfo.h b/lib/entities/artifact/ArtSlotInfo.h index 0ca8adb1f..f65dc9072 100644 --- a/lib/entities/artifact/ArtSlotInfo.h +++ b/lib/entities/artifact/ArtSlotInfo.h @@ -21,6 +21,7 @@ struct DLL_LINKAGE ArtSlotInfo : public GameCallbackHolder ArtifactInstanceID artifactID; bool locked = false; //if locked, then artifact points to the combined artifact + ArtSlotInfo() = delete; explicit ArtSlotInfo(IGameInfoCallback * cb); ArtSlotInfo(const CArtifactInstance * artifact, bool locked); diff --git a/lib/mapObjectConstructors/CDefaultObjectTypeHandler.h b/lib/mapObjectConstructors/CDefaultObjectTypeHandler.h index 9f0e09ca3..a2213c402 100644 --- a/lib/mapObjectConstructors/CDefaultObjectTypeHandler.h +++ b/lib/mapObjectConstructors/CDefaultObjectTypeHandler.h @@ -29,6 +29,8 @@ class CDefaultObjectTypeHandler : public AObjectTypeHandler std::shared_ptr create(IGameInfoCallback * cb, std::shared_ptr tmpl) const final { + assert(cb); + auto result = createObject(cb); preInitObject(result.get()); @@ -46,6 +48,8 @@ protected: virtual void randomizeObject(ObjectType * object, IGameRandomizer & gameRandomizer) const {} virtual std::shared_ptr createObject(IGameInfoCallback * cb) const { + assert(cb); + return std::make_shared(cb); } }; diff --git a/mapeditor/CMakeLists.txt b/mapeditor/CMakeLists.txt index b514cb6d3..fcbd0d382 100644 --- a/mapeditor/CMakeLists.txt +++ b/mapeditor/CMakeLists.txt @@ -48,7 +48,6 @@ set(editor_SRCS campaigneditor/scenarioproperties.cpp campaigneditor/startingbonus.cpp campaigneditor/campaignview.cpp - EditorCallback.cpp ) set(editor_HEADERS @@ -102,7 +101,6 @@ set(editor_HEADERS campaigneditor/scenarioproperties.h campaigneditor/startingbonus.h campaigneditor/campaignview.h - EditorCallback.h ) set(editor_FORMS diff --git a/mapeditor/helper.cpp b/mapeditor/helper.cpp index 759e53106..e8595f15c 100644 --- a/mapeditor/helper.cpp +++ b/mapeditor/helper.cpp @@ -11,7 +11,6 @@ #include "StdInc.h" #include "helper.h" #include "mapcontroller.h" -#include "EditorCallback.h" #include "../lib/filesystem/Filesystem.h" #include "../lib/filesystem/CMemoryBuffer.h" @@ -24,7 +23,7 @@ #include "../lib/mapping/MapFormatJson.h" #include "../lib/modding/ModIncompatibility.h" -std::unique_ptr Helper::openMapInternal(const QString & filenameSelect) +std::unique_ptr Helper::openMapInternal(const QString & filenameSelect, IGameInfoCallback * ecb) { QFileInfo fi(filenameSelect); std::string fname = fi.fileName().toStdString(); @@ -50,12 +49,8 @@ std::unique_ptr Helper::openMapInternal(const QString & filenameSelect) if(!modList.empty()) throw ModIncompatibility(modList); - - auto cb = std::make_shared(nullptr); - - std::unique_ptr map = mapService.loadMap(resId, cb.get()); - cb->setMap(map.get()); - return map; + + return mapService.loadMap(resId, ecb); } else throw std::runtime_error("Corrupted map"); diff --git a/mapeditor/helper.h b/mapeditor/helper.h index 90a8b2259..62fa2aa4c 100644 --- a/mapeditor/helper.h +++ b/mapeditor/helper.h @@ -12,10 +12,11 @@ class CMap; class CampaignState; +class IGameInfoCallback; namespace Helper { - std::unique_ptr openMapInternal(const QString &); + std::unique_ptr openMapInternal(const QString &, IGameInfoCallback *); std::shared_ptr openCampaignInternal(const QString &); void saveCampaign(std::shared_ptr campaignState, const QString & filename); -} \ No newline at end of file +} diff --git a/mapeditor/inspector/artifactwidget.cpp b/mapeditor/inspector/artifactwidget.cpp index acfaa497d..ab2301921 100644 --- a/mapeditor/inspector/artifactwidget.cpp +++ b/mapeditor/inspector/artifactwidget.cpp @@ -43,19 +43,18 @@ ArtifactWidget::ArtifactWidget(CArtifactFittingSet & fittingSet, QWidget * paren } ui->possiblePositions->addItem(QString::fromStdString(NArtifactPosition::backpack), ArtifactPosition::BACKPACK_START); fillArtifacts(); - - } void ArtifactWidget::fillArtifacts() { ui->artifact->clear(); auto currentSlot = ui->possiblePositions->currentData().toInt(); - for (const auto& art : LIBRARY->arth->getDefaultAllowed()) + for (const auto & art : LIBRARY->arth->getDefaultAllowed()) { auto artifact = art.toArtifact(); // forbid spell scroll for now as require special handling - if (artifact->canBePutAt(&fittingSet, currentSlot, true) && artifact->getId() != ArtifactID::SPELL_SCROLL) { + if (artifact->canBePutAt(&fittingSet, currentSlot, true) && artifact->getId() != ArtifactID::SPELL_SCROLL) + { ui->artifact->addItem(QString::fromStdString(artifact->getNameTranslated()), QVariant::fromValue(artifact->getIndex())); } } diff --git a/mapeditor/inspector/heroartifactswidget.cpp b/mapeditor/inspector/heroartifactswidget.cpp index a668cdf9f..a9517c9e8 100644 --- a/mapeditor/inspector/heroartifactswidget.cpp +++ b/mapeditor/inspector/heroartifactswidget.cpp @@ -28,6 +28,10 @@ HeroArtifactsWidget::HeroArtifactsWidget(MapController & controller, CGHeroInsta fittingSet(CArtifactFittingSet(h)) { ui->setupUi(this); + + connect(ui->saveButton, &QPushButton::clicked, this, &HeroArtifactsWidget::onSaveButtonClicked); + connect(ui->cancelButton, &QPushButton::clicked, this, &HeroArtifactsWidget::onCancelButtonClicked); + } HeroArtifactsWidget::~HeroArtifactsWidget() @@ -37,9 +41,10 @@ HeroArtifactsWidget::~HeroArtifactsWidget() void HeroArtifactsWidget::on_addButton_clicked() { - ArtifactWidget artifactWidget{ fittingSet, this }; - connect(&artifactWidget, &ArtifactWidget::saveArtifact, this, &HeroArtifactsWidget::onSaveArtifact); - artifactWidget.exec(); + auto * artifactWidget = new ArtifactWidget(fittingSet, this); + connect(artifactWidget, &ArtifactWidget::saveArtifact, this, &HeroArtifactsWidget::onSaveArtifact); + artifactWidget->exec(); + artifactWidget->deleteLater(); } void HeroArtifactsWidget::on_removeButton_clicked() @@ -55,6 +60,16 @@ void HeroArtifactsWidget::on_removeButton_clicked() ui->artifacts->removeRow(row); } +void HeroArtifactsWidget::onSaveButtonClicked() +{ + accept(); +} + +void HeroArtifactsWidget::onCancelButtonClicked() +{ + reject(); +} + void HeroArtifactsWidget::onSaveArtifact(int32_t artifactIndex, ArtifactPosition slot) { auto artifact = controller.map()->createArtifact(LIBRARY->arth->getByIndex(artifactIndex)->getId()); @@ -143,8 +158,11 @@ void HeroArtifactsDelegate::setModelData(QWidget * editor, QAbstractItemModel * { if (auto * ed = qobject_cast(editor)) { - ed->commitChanges(); - updateModelData(model, index); + if(ed->result() == QDialog::Accepted) + { + ed->commitChanges(); + updateModelData(model, index); + } } else { @@ -158,6 +176,7 @@ void HeroArtifactsDelegate::updateModelData(QAbstractItemModel * model, const QM for(const auto & [artPosition, artSlotInfo] : hero.artifactsWorn) { auto slotText = NArtifactPosition::namesHero[artPosition.num]; + textList += QString("%1: %2").arg(QString::fromStdString(slotText)).arg(QString::fromStdString(artSlotInfo.getArt()->getType()->getNameTranslated())); } textList += QString("%1:").arg(QString::fromStdString(NArtifactPosition::backpack)); diff --git a/mapeditor/inspector/heroartifactswidget.h b/mapeditor/inspector/heroartifactswidget.h index 75a36fd15..22007dbee 100644 --- a/mapeditor/inspector/heroartifactswidget.h +++ b/mapeditor/inspector/heroartifactswidget.h @@ -38,6 +38,10 @@ private slots: void on_removeButton_clicked(); + void onSaveButtonClicked(); + + void onCancelButtonClicked(); + private: enum Column { diff --git a/mapeditor/inspector/heroartifactswidget.ui b/mapeditor/inspector/heroartifactswidget.ui index c3d326618..bf3cea782 100644 --- a/mapeditor/inspector/heroartifactswidget.ui +++ b/mapeditor/inspector/heroartifactswidget.ui @@ -3,7 +3,7 @@ HeroArtifactsWidget - Qt::NonModal + Qt::WindowModality::NonModal @@ -46,7 +46,7 @@ - Qt::Horizontal + Qt::Orientation::Horizontal @@ -96,19 +96,19 @@ true - Qt::ScrollBarAlwaysOff + Qt::ScrollBarPolicy::ScrollBarAlwaysOff - QAbstractScrollArea::AdjustToContents + QAbstractScrollArea::SizeAdjustPolicy::AdjustToContents - QAbstractItemView::NoEditTriggers + QAbstractItemView::EditTrigger::NoEditTriggers - QAbstractItemView::SingleSelection + QAbstractItemView::SelectionMode::SingleSelection - QAbstractItemView::SelectRows + QAbstractItemView::SelectionBehavior::SelectRows true @@ -137,6 +137,37 @@ + + + + + + Qt::Orientation::Horizontal + + + + 40 + 20 + + + + + + + + Save + + + + + + + Cancel + + + + + diff --git a/mapeditor/inspector/inspector.cpp b/mapeditor/inspector/inspector.cpp index 3960016fe..44afafa9e 100644 --- a/mapeditor/inspector/inspector.cpp +++ b/mapeditor/inspector/inspector.cpp @@ -41,6 +41,7 @@ Initializer::Initializer(MapController & controller, CGObjectInstance * o, const , defaultPlayer(pl) { logGlobal->info("New object instance initialized"); + o->cb = controller.getCallback(); ///IMPORTANT! initialize order should be from base objects to derived objects INIT_OBJ_TYPE(CGResource); INIT_OBJ_TYPE(CGArtifact); @@ -206,6 +207,13 @@ void Initializer::initialize(CGArtifact * o) auto a = controller.map()->createScroll(*RandomGeneratorUtil::nextItem(out, CRandomGenerator::getDefault())); o->setArtifactInstance(a); } + else if(o->ID == Obj::ARTIFACT) + { + auto instance = controller.map()->createArtifact(o->getArtifactType()); + o->setArtifactInstance(instance); + } + else + throw std::runtime_error("Unimplemented initializer for CGArtifact object ID = "+ std::to_string(o->ID.getNum())); } void Initializer::initialize(CGMine * o) @@ -365,11 +373,11 @@ void Inspector::updateProperties(CGTownInstance * o) void Inspector::updateProperties(CGArtifact * o) { if(!o) return; - + addProperty(QObject::tr("Message"), o->message, false); - + const CArtifactInstance * instance = o->getArtifactInstance(); - if(instance) + if(instance && o->ID == Obj::SPELL_SCROLL) { SpellID spellId = instance->getScrollSpellID(); if(spellId != SpellID::NONE) diff --git a/mapeditor/mainwindow.cpp b/mapeditor/mainwindow.cpp index e437b112b..1e5b55e8c 100644 --- a/mapeditor/mainwindow.cpp +++ b/mapeditor/mainwindow.cpp @@ -395,7 +395,7 @@ bool MainWindow::openMap(const QString & filenameSelect) { try { - controller.setMap(Helper::openMapInternal(filenameSelect)); + controller.setMap(Helper::openMapInternal(filenameSelect, controller.getCallback())); } catch(const ModIncompatibility & e) { @@ -703,7 +703,7 @@ void MainWindow::addGroupIntoCatalog(const QString & groupName, bool useCustomNa } //create object to extract name - auto temporaryObj(factory->create(nullptr, templ)); + auto temporaryObj(factory->create(controller.getCallback(), templ)); QString translated = useCustomName ? QString::fromStdString(temporaryObj->getObjectName().c_str()) : subGroupName; itemType->setText(translated); @@ -1370,7 +1370,8 @@ void MainWindow::on_actionh3m_converter_triggered() for(auto & m : mapFiles) { CMapService mapService; - auto map = Helper::openMapInternal(m); + auto map = Helper::openMapInternal(m, controller.getCallback()); + controller.setCallback(std::make_unique(map.get())); controller.repairMap(map.get()); mapService.saveMap(map, (saveDirectory + '/' + QFileInfo(m).completeBaseName() + ".vmap").toStdString()); } diff --git a/mapeditor/mapcontroller.cpp b/mapeditor/mapcontroller.cpp index 39931eda9..37a24d1d9 100644 --- a/mapeditor/mapcontroller.cpp +++ b/mapeditor/mapcontroller.cpp @@ -51,6 +51,7 @@ MapController::MapController(MainWindow * m): main(m) _miniscenes[i].reset(new MinimapScene(i)); } connectScenes(); + _cb = std::make_unique(nullptr); } void MapController::connectScenes() @@ -70,6 +71,16 @@ MapController::~MapController() main = nullptr; } +void MapController::setCallback(std::unique_ptr cb) +{ + _cb = std::move(cb); +} + +EditorCallback * MapController::getCallback() +{ + return _cb.get(); +} + const std::unique_ptr & MapController::getMapUniquePtr() const { return _map; @@ -104,6 +115,8 @@ void MapController::repairMap(CMap * map) { if(!map) return; + + assert(map->cb); //make sure events/rumors has name to have proper identifiers int emptyNameId = 1; @@ -201,7 +214,9 @@ void MapController::repairMap(CMap * map) void MapController::setMap(std::unique_ptr cmap) { + cmap->cb = _cb.get(); _map = std::move(cmap); + _cb->setMap(_map.get()); repairMap(); diff --git a/mapeditor/mapcontroller.h b/mapeditor/mapcontroller.h index 9e6134733..6ed3d90c3 100644 --- a/mapeditor/mapcontroller.h +++ b/mapeditor/mapcontroller.h @@ -13,6 +13,7 @@ #include "maphandler.h" #include "mapview.h" #include "lib/modding/ModVerificationInfo.h" +#include "../lib/callback/EditorCallback.h" VCMI_LIB_NAMESPACE_BEGIN using ModCompatibilityInfo = std::map; @@ -31,6 +32,8 @@ public: MapController(const MapController &&) = delete; ~MapController(); + void setCallback(std::unique_ptr); + EditorCallback * getCallback(); void setMap(std::unique_ptr); void initObstaclePainters(CMap * map); @@ -93,6 +96,7 @@ signals: void requestModsUpdate(const ModCompatibilityInfo & mods, bool leaveCheckedUnchanged) const; private: + std::unique_ptr _cb; std::unique_ptr _map; std::unique_ptr _mapHandler; MainWindow * main; diff --git a/mapeditor/mapview.cpp b/mapeditor/mapview.cpp index 89b96f3e9..1d478040d 100644 --- a/mapeditor/mapview.cpp +++ b/mapeditor/mapview.cpp @@ -594,7 +594,7 @@ void MapView::dragEnterEvent(QDragEnterEvent * event) auto factory = LIBRARY->objtypeh->getHandlerFor(objId, objSubId); auto templ = factory->getTemplates()[templateId]; controller->discardObject(sc->level); - controller->createObject(sc->level, factory->create(nullptr, templ)); + controller->createObject(sc->level, factory->create(controller->getCallback(), templ)); } } diff --git a/mapeditor/windownewmap.cpp b/mapeditor/windownewmap.cpp index 44cda87c6..ebfe6b84a 100644 --- a/mapeditor/windownewmap.cpp +++ b/mapeditor/windownewmap.cpp @@ -512,4 +512,4 @@ void WindowNewMap::on_sizeCustomRadio_toggled(bool checked) ui->sizeGroup2->setEnabled(true); } updateTemplateList(); -} \ No newline at end of file +} From 33c801f89df7294b828a95a1edd92a324c723760 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Zaremba?= Date: Tue, 3 Jun 2025 12:02:22 +0200 Subject: [PATCH 05/10] Fix PlayerSettings conflicting names --- mapeditor/CMakeLists.txt | 6 +++--- ...playersettings.cpp => PlayerSettingsDialog.cpp} | 14 +++++++------- .../{playersettings.h => PlayerSettingsDialog.h} | 10 +++++----- .../{playersettings.ui => PlayerSettingsDialog.ui} | 12 ++++++------ mapeditor/mainwindow.cpp | 4 ++-- mapeditor/playerparams.h | 2 ++ 6 files changed, 25 insertions(+), 23 deletions(-) rename mapeditor/{playersettings.cpp => PlayerSettingsDialog.cpp} (85%) rename mapeditor/{playersettings.h => PlayerSettingsDialog.h} (70%) rename mapeditor/{playersettings.ui => PlayerSettingsDialog.ui} (92%) diff --git a/mapeditor/CMakeLists.txt b/mapeditor/CMakeLists.txt index fcbd0d382..6072c3c93 100644 --- a/mapeditor/CMakeLists.txt +++ b/mapeditor/CMakeLists.txt @@ -21,7 +21,7 @@ set(editor_SRCS mapsettings/rumorsettings.cpp mapsettings/translations.cpp PlayerSelectionDialog.cpp - playersettings.cpp + PlayerSettingsDialog.cpp playerparams.cpp scenelayer.cpp mapcontroller.cpp @@ -72,7 +72,7 @@ set(editor_HEADERS mapsettings/rumorsettings.h mapsettings/translations.h PlayerSelectionDialog.h - playersettings.h + PlayerSettingsDialog.h playerparams.h scenelayer.h mapcontroller.h @@ -116,7 +116,7 @@ set(editor_FORMS mapsettings/eventsettings.ui mapsettings/rumorsettings.ui mapsettings/translations.ui - playersettings.ui + PlayerSettingsDialog.ui playerparams.ui validator.ui inspector/townbuildingswidget.ui diff --git a/mapeditor/playersettings.cpp b/mapeditor/PlayerSettingsDialog.cpp similarity index 85% rename from mapeditor/playersettings.cpp rename to mapeditor/PlayerSettingsDialog.cpp index 1efcb436a..5282b7e3b 100644 --- a/mapeditor/playersettings.cpp +++ b/mapeditor/PlayerSettingsDialog.cpp @@ -9,16 +9,16 @@ */ #include "StdInc.h" -#include "playersettings.h" -#include "ui_playersettings.h" +#include "PlayerSettingsDialog.h" +#include "ui_PlayerSettingsDialog.h" #include "playerparams.h" #include "mainwindow.h" #include "../lib/mapping/CMap.h" -PlayerSettings::PlayerSettings(MapController & ctrl, QWidget *parent) : +PlayerSettingsDialog::PlayerSettingsDialog(MapController & ctrl, QWidget *parent) : QDialog(parent), - ui(new Ui::PlayerSettings), + ui(new Ui::PlayerSettingsDialog), controller(ctrl) { ui->setupUi(this); @@ -48,13 +48,13 @@ PlayerSettings::PlayerSettings(MapController & ctrl, QWidget *parent) : setAttribute(Qt::WA_DeleteOnClose); } -PlayerSettings::~PlayerSettings() +PlayerSettingsDialog::~PlayerSettingsDialog() { controller.settingsDialog = nullptr; delete ui; } -void PlayerSettings::on_playersCount_currentIndexChanged(int index) +void PlayerSettingsDialog::on_playersCount_currentIndexChanged(int index) { const auto selectedPlayerCount = index + 1; assert(selectedPlayerCount <= controller.map()->players.size()); @@ -90,7 +90,7 @@ void PlayerSettings::on_playersCount_currentIndexChanged(int index) } -void PlayerSettings::on_pushButton_clicked() +void PlayerSettingsDialog::on_pushButton_clicked() { for(auto * w : paramWidgets) { diff --git a/mapeditor/playersettings.h b/mapeditor/PlayerSettingsDialog.h similarity index 70% rename from mapeditor/playersettings.h rename to mapeditor/PlayerSettingsDialog.h index 84960e50e..751be3c7b 100644 --- a/mapeditor/playersettings.h +++ b/mapeditor/PlayerSettingsDialog.h @@ -14,16 +14,16 @@ #include "playerparams.h" namespace Ui { -class PlayerSettings; +class PlayerSettingsDialog; } -class PlayerSettings : public QDialog +class PlayerSettingsDialog : public QDialog { Q_OBJECT public: - explicit PlayerSettings(MapController & controller, QWidget *parent = nullptr); - ~PlayerSettings(); + explicit PlayerSettingsDialog(MapController & controller, QWidget *parent = nullptr); + ~PlayerSettingsDialog(); private slots: @@ -32,7 +32,7 @@ private slots: void on_pushButton_clicked(); private: - Ui::PlayerSettings *ui; + Ui::PlayerSettingsDialog *ui; std::vector paramWidgets; diff --git a/mapeditor/playersettings.ui b/mapeditor/PlayerSettingsDialog.ui similarity index 92% rename from mapeditor/playersettings.ui rename to mapeditor/PlayerSettingsDialog.ui index 3e51fceee..084c79140 100644 --- a/mapeditor/playersettings.ui +++ b/mapeditor/PlayerSettingsDialog.ui @@ -1,9 +1,9 @@ - PlayerSettings - + PlayerSettingsDialog + - Qt::WindowModal + Qt::WindowModality::WindowModal @@ -14,7 +14,7 @@ - Qt::NoFocus + Qt::FocusPolicy::NoFocus Player settings @@ -33,8 +33,8 @@ 0 0 - 628 - 187 + 634 + 201 diff --git a/mapeditor/mainwindow.cpp b/mapeditor/mainwindow.cpp index 1e5b55e8c..3a2f9a062 100644 --- a/mapeditor/mainwindow.cpp +++ b/mapeditor/mainwindow.cpp @@ -46,7 +46,7 @@ #include "mapsettings/mapsettings.h" #include "mapsettings/translations.h" #include "mapsettings/modsettings.h" -#include "playersettings.h" +#include "PlayerSettingsDialog.h" #include "validator.h" #include "helper.h" #include "campaigneditor/campaigneditor.h" @@ -1143,7 +1143,7 @@ void MainWindow::on_actionMapSettings_triggered() void MainWindow::on_actionPlayers_settings_triggered() { - auto settingsDialog = new PlayerSettings(controller, this); + auto settingsDialog = new PlayerSettingsDialog(controller, this); settingsDialog->setWindowModality(Qt::WindowModal); settingsDialog->setModal(true); connect(settingsDialog, &QDialog::finished, this, &MainWindow::onPlayersChanged); diff --git a/mapeditor/playerparams.h b/mapeditor/playerparams.h index 57601d2c3..5c650cbfe 100644 --- a/mapeditor/playerparams.h +++ b/mapeditor/playerparams.h @@ -18,6 +18,8 @@ namespace Ui { class PlayerParams; } +class QListWidgetItem; + class PlayerParams : public QWidget { Q_OBJECT From 4881729ec1d02b805dab34d341f79d7243af4312 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Zaremba?= Date: Tue, 3 Jun 2025 14:01:34 +0200 Subject: [PATCH 06/10] Prevent crash when closing HeroArtifactsWidget with no artifacts --- mapeditor/inspector/heroartifactswidget.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/mapeditor/inspector/heroartifactswidget.cpp b/mapeditor/inspector/heroartifactswidget.cpp index a9517c9e8..b5b4c63d6 100644 --- a/mapeditor/inspector/heroartifactswidget.cpp +++ b/mapeditor/inspector/heroartifactswidget.cpp @@ -31,7 +31,6 @@ HeroArtifactsWidget::HeroArtifactsWidget(MapController & controller, CGHeroInsta connect(ui->saveButton, &QPushButton::clicked, this, &HeroArtifactsWidget::onSaveButtonClicked); connect(ui->cancelButton, &QPushButton::clicked, this, &HeroArtifactsWidget::onCancelButtonClicked); - } HeroArtifactsWidget::~HeroArtifactsWidget() @@ -43,8 +42,7 @@ void HeroArtifactsWidget::on_addButton_clicked() { auto * artifactWidget = new ArtifactWidget(fittingSet, this); connect(artifactWidget, &ArtifactWidget::saveArtifact, this, &HeroArtifactsWidget::onSaveArtifact); - artifactWidget->exec(); - artifactWidget->deleteLater(); + artifactWidget->open(); } void HeroArtifactsWidget::on_removeButton_clicked() From bf11b9b82aae1f9e4398518053c142343733a684 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Zaremba?= Date: Wed, 4 Jun 2025 00:05:18 +0200 Subject: [PATCH 07/10] Fix callback propagation when copy-pasting objects --- lib/serializer/CMemorySerializer.h | 6 ++++-- mapeditor/mapcontroller.cpp | 4 ++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/serializer/CMemorySerializer.h b/lib/serializer/CMemorySerializer.h index 3914ccf1a..966740bf3 100644 --- a/lib/serializer/CMemorySerializer.h +++ b/lib/serializer/CMemorySerializer.h @@ -31,10 +31,11 @@ public: CMemorySerializer(); template - static std::unique_ptr deepCopy(const T &data) + static std::unique_ptr deepCopy(const T &data, IGameInfoCallback * cb = nullptr) { CMemorySerializer mem; mem.oser & &data; + mem.iser.cb = cb; std::unique_ptr ret; mem.iser & ret; @@ -42,10 +43,11 @@ public: } template - static std::shared_ptr deepCopyShared(const T &data) + static std::shared_ptr deepCopyShared(const T &data, IGameInfoCallback * cb = nullptr) { CMemorySerializer mem; mem.oser & &data; + mem.iser.cb = cb; std::shared_ptr ret; mem.iser & ret; diff --git a/mapeditor/mapcontroller.cpp b/mapeditor/mapcontroller.cpp index 37a24d1d9..cf5a0c3bd 100644 --- a/mapeditor/mapcontroller.cpp +++ b/mapeditor/mapcontroller.cpp @@ -370,7 +370,7 @@ void MapController::copyToClipboard(int level) for(auto * obj : selectedObjects) { assert(obj->pos.z == level); - _clipboard.push_back(CMemorySerializer::deepCopy(*obj)); + _clipboard.push_back(CMemorySerializer::deepCopy(*obj, _cb.get())); } } @@ -385,7 +385,7 @@ void MapController::pasteFromClipboard(int level) QStringList errors; for(auto & objUniquePtr : _clipboard) { - auto obj = CMemorySerializer::deepCopyShared(*objUniquePtr); + auto obj = CMemorySerializer::deepCopyShared(*objUniquePtr, _cb.get()); QString errorMsg; if(!canPlaceObject(obj.get(), errorMsg)) { From 9e474422fd1a1700d38fed213063306f5042a940 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Zaremba?= Date: Sun, 15 Jun 2025 00:09:22 +0200 Subject: [PATCH 08/10] Fix map saving --- lib/callback/EditorCallback.h | 3 +-- lib/mapObjects/CGHeroInstance.cpp | 8 +++++++- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/callback/EditorCallback.h b/lib/callback/EditorCallback.h index 975706979..c32410669 100644 --- a/lib/callback/EditorCallback.h +++ b/lib/callback/EditorCallback.h @@ -15,13 +15,12 @@ VCMI_LIB_NAMESPACE_BEGIN class DLL_LINKAGE EditorCallback : public MapInfoCallback { -protected: - const CMap * getMapConstPtr() const override; public: explicit EditorCallback(const CMap * map); void setMap(const CMap * map); + const CMap * getMapConstPtr() const override; // Access to full game state — not available in editor CGameState & gameState() override; diff --git a/lib/mapObjects/CGHeroInstance.cpp b/lib/mapObjects/CGHeroInstance.cpp index 6eacf012e..06b2ae2c1 100644 --- a/lib/mapObjects/CGHeroInstance.cpp +++ b/lib/mapObjects/CGHeroInstance.cpp @@ -18,6 +18,7 @@ #include "../callback/IGameInfoCallback.h" #include "../callback/IGameEventCallback.h" #include "../callback/IGameRandomizer.h" +#include "../callback/EditorCallback.h" #include "../texts/CGeneralTextHandler.h" #include "../TerrainHandler.h" #include "../RoadHandler.h" @@ -1715,7 +1716,12 @@ void CGHeroInstance::serializeCommonOptions(JsonSerializeFormat & handler) handler.serializeIdArray("spellBook", spells); if(handler.saving) - CArtifactSet::serializeJsonArtifacts(handler, "artifacts", &cb->gameState().getMap()); + { + if(auto * ecb = dynamic_cast(cb)) + CArtifactSet::serializeJsonArtifacts(handler, "artifacts", const_cast(ecb->getMapConstPtr())); + else + CArtifactSet::serializeJsonArtifacts(handler, "artifacts", &cb->gameState().getMap()); + } } void CGHeroInstance::serializeJsonOptions(JsonSerializeFormat & handler) From aed832a99d5c1967c6b811f3275616fedc265828 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Zaremba?= Date: Sun, 15 Jun 2025 23:31:05 +0200 Subject: [PATCH 09/10] Fixes following review --- lib/callback/MapInfoCallback.h | 4 +++- lib/entities/artifact/ArtSlotInfo.h | 1 - lib/mapObjects/CGHeroInstance.cpp | 3 +++ mapeditor/helper.cpp | 4 ++-- mapeditor/inspector/inspector.cpp | 2 +- 5 files changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/callback/MapInfoCallback.h b/lib/callback/MapInfoCallback.h index a52a67687..2f34e3d50 100644 --- a/lib/callback/MapInfoCallback.h +++ b/lib/callback/MapInfoCallback.h @@ -17,9 +17,11 @@ class CMap; class DLL_LINKAGE MapInfoCallback : public IGameInfoCallback { +protected: + virtual const CMap * getMapConstPtr() const = 0; + public: virtual ~MapInfoCallback(); - virtual const CMap * getMapConstPtr() const = 0; const CGObjectInstance * getObj(ObjectInstanceID objid, bool verbose = true) const override; const CGObjectInstance * getObjInstance(ObjectInstanceID oid) const override; diff --git a/lib/entities/artifact/ArtSlotInfo.h b/lib/entities/artifact/ArtSlotInfo.h index f65dc9072..0ca8adb1f 100644 --- a/lib/entities/artifact/ArtSlotInfo.h +++ b/lib/entities/artifact/ArtSlotInfo.h @@ -21,7 +21,6 @@ struct DLL_LINKAGE ArtSlotInfo : public GameCallbackHolder ArtifactInstanceID artifactID; bool locked = false; //if locked, then artifact points to the combined artifact - ArtSlotInfo() = delete; explicit ArtSlotInfo(IGameInfoCallback * cb); ArtSlotInfo(const CArtifactInstance * artifact, bool locked); diff --git a/lib/mapObjects/CGHeroInstance.cpp b/lib/mapObjects/CGHeroInstance.cpp index 06b2ae2c1..d197dc065 100644 --- a/lib/mapObjects/CGHeroInstance.cpp +++ b/lib/mapObjects/CGHeroInstance.cpp @@ -1717,6 +1717,9 @@ void CGHeroInstance::serializeCommonOptions(JsonSerializeFormat & handler) if(handler.saving) { + // FIXME: EditorCallback (used in map editor) has no access to GameState. + // serializeJsonArtifacts expects non-const CMap * + // Find some cleaner solution if(auto * ecb = dynamic_cast(cb)) CArtifactSet::serializeJsonArtifacts(handler, "artifacts", const_cast(ecb->getMapConstPtr())); else diff --git a/mapeditor/helper.cpp b/mapeditor/helper.cpp index e8595f15c..2a44b6233 100644 --- a/mapeditor/helper.cpp +++ b/mapeditor/helper.cpp @@ -23,7 +23,7 @@ #include "../lib/mapping/MapFormatJson.h" #include "../lib/modding/ModIncompatibility.h" -std::unique_ptr Helper::openMapInternal(const QString & filenameSelect, IGameInfoCallback * ecb) +std::unique_ptr Helper::openMapInternal(const QString & filenameSelect, IGameInfoCallback * cb) { QFileInfo fi(filenameSelect); std::string fname = fi.fileName().toStdString(); @@ -50,7 +50,7 @@ std::unique_ptr Helper::openMapInternal(const QString & filenameSelect, IG if(!modList.empty()) throw ModIncompatibility(modList); - return mapService.loadMap(resId, ecb); + return mapService.loadMap(resId, cb); } else throw std::runtime_error("Corrupted map"); diff --git a/mapeditor/inspector/inspector.cpp b/mapeditor/inspector/inspector.cpp index 44afafa9e..6767f8053 100644 --- a/mapeditor/inspector/inspector.cpp +++ b/mapeditor/inspector/inspector.cpp @@ -78,7 +78,7 @@ void Initializer::initialize(CGCreature * o) o->character = CGCreature::Character::HOSTILE; if(!o->hasStackAtSlot(SlotID(0))) - o->putStack(SlotID(0), std::make_unique(nullptr, CreatureID(o->subID), 1, false)); + o->putStack(SlotID(0), std::make_unique(o->cb, CreatureID(o->subID), 1, false)); } void Initializer::initialize(CGDwelling * o) From f96f33ac3f7c9fd18fbc0fb6d12de176d5b33671 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Zaremba?= Date: Mon, 16 Jun 2025 00:01:48 +0200 Subject: [PATCH 10/10] After rebase: fix build --- lib/CMakeLists.txt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index 24c0e843e..9405dfe8d 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -486,12 +486,8 @@ set(lib_MAIN_HEADERS callback/GameRandomizer.h callback/MapInfoCallback.h callback/EditorCallback.h -<<<<<<< HEAD campaign/CampaignBonus.h -======= - ->>>>>>> eeff61da6 (Integrate EditorCallback into mapeditor) campaign/CampaignConstants.h campaign/CampaignHandler.h campaign/CampaignRegions.h