From 71ad9d670747f68c1ed05d3ca93bffa548fda82c Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Wed, 27 Sep 2023 21:23:54 +0300 Subject: [PATCH 1/5] Fix crash on starting map as non-red player --- client/CPlayerInterface.cpp | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/client/CPlayerInterface.cpp b/client/CPlayerInterface.cpp index 09bdc174f..29b23c448 100644 --- a/client/CPlayerInterface.cpp +++ b/client/CPlayerInterface.cpp @@ -166,8 +166,9 @@ void CPlayerInterface::initGameInterface(std::shared_ptr ENV, std:: env = ENV; CCS->musich->loadTerrainMusicThemes(); - initializeHeroTownList(); + + adventureInt.reset(new AdventureMapInterface()); } void CPlayerInterface::playerEndsTurn(PlayerColor player) @@ -207,9 +208,6 @@ void CPlayerInterface::playerStartsTurn(PlayerColor player) if(GH.windows().findWindows().empty()) { // after map load - remove all active windows and replace them with adventure map - // always recreate advmap interface to avoid possible memory-corruption bugs - adventureInt.reset(new AdventureMapInterface()); - GH.windows().clear(); GH.windows().pushWindow(adventureInt); } From 92fdaa20b16211172ed699f1ecce2c7e93364e46 Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Wed, 27 Sep 2023 21:24:25 +0300 Subject: [PATCH 2/5] Fix crash on loading Seer Hut with kill monster mission --- lib/mapObjects/CQuest.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/mapObjects/CQuest.cpp b/lib/mapObjects/CQuest.cpp index 377786a5a..6226bfe88 100644 --- a/lib/mapObjects/CQuest.cpp +++ b/lib/mapObjects/CQuest.cpp @@ -557,6 +557,10 @@ void CGSeerHut::setObjToKill() quest->heroName = getHeroToKill(false)->getNameTranslated(); quest->heroPortrait = getHeroToKill(false)->portrait; } + + quest->getCompletionText(configuration.onSelect); + for(auto & i : configuration.info) + quest->getCompletionText(i.message); } void CGSeerHut::init(CRandomGenerator & rand) @@ -596,10 +600,6 @@ void CGSeerHut::initObj(CRandomGenerator & rand) quest->progress = CQuest::COMPLETE; quest->firstVisitText = VLC->generaltexth->seerEmpty[quest->completedOption]; } - - quest->getCompletionText(configuration.onSelect); - for(auto & i : configuration.info) - quest->getCompletionText(i.message); } void CGSeerHut::getRolloverText(MetaString &text, bool onHover) const From f4c33f49eec22c5264cfbf71712e759861795c79 Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Wed, 27 Sep 2023 21:24:37 +0300 Subject: [PATCH 3/5] Removed excessive warning --- lib/mapping/MapFormatH3M.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mapping/MapFormatH3M.cpp b/lib/mapping/MapFormatH3M.cpp index 9da89c494..d2b264f20 100644 --- a/lib/mapping/MapFormatH3M.cpp +++ b/lib/mapping/MapFormatH3M.cpp @@ -425,7 +425,7 @@ void CMapLoaderH3M::readVictoryLossConditions() case EVictoryConditionType::BEATHERO: { if (!allowNormalVictory) - logGlobal->warn("Map %s: Has 'beat hero' as victory condition, but 'allow normal victory' not set. Ignoring", mapName); + logGlobal->debug("Map %s: Has 'beat hero' as victory condition, but 'allow normal victory' not set. Ignoring", mapName); allowNormalVictory = true; // H3 behavior assert(appliesToAI == false); // not selectable in editor EventCondition cond(EventCondition::DESTROY); From 16424d2fc00e0bcf7603f5f7a0de1eb3c8a77fb9 Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Wed, 27 Sep 2023 21:25:04 +0300 Subject: [PATCH 4/5] Fixed boat boarding --- server/CGameHandler.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/server/CGameHandler.cpp b/server/CGameHandler.cpp index 744152a9a..82c7543d7 100644 --- a/server/CGameHandler.cpp +++ b/server/CGameHandler.cpp @@ -1119,8 +1119,9 @@ bool CGameHandler::moveHero(ObjectInstanceID hid, int3 dst, ui8 teleporting, boo const bool canWalkOnSea = pathfinderHelper->hasBonusOfType(BonusType::WATER_WALKING) || (h->boat && h->boat->layer == EPathfindingLayer::WATER); const int cost = pathfinderHelper->getMovementCost(h->visitablePos(), hmpos, nullptr, nullptr, h->movementPointsRemaining()); - const bool standAtObstacle = t.blocked && !t.visitable; - const bool standAtWater = !h->boat && t.terType->isWater() && (objectToVisit || !objectToVisit->isCoastVisitable()); + const bool movingOntoObstacle = t.blocked && !t.visitable; + const bool objectCoastVisitable = objectToVisit && objectToVisit->isCoastVisitable(); + const bool movingOntoWater = !h->boat && t.terType->isWater() && !objectCoastVisitable; const auto complainRet = [&](const std::string & message) { @@ -1144,11 +1145,11 @@ bool CGameHandler::moveHero(ObjectInstanceID hid, int3 dst, ui8 teleporting, boo //it's a rock or blocked and not visitable tile //OR hero is on land and dest is water and (there is not present only one object - boat) - if (!t.terType->isPassable() || (standAtObstacle && !canFly)) + if (!t.terType->isPassable() || (movingOntoObstacle && !canFly)) return complainRet("Cannot move hero, destination tile is blocked!"); //hero is not on boat/water walking and dst water tile doesn't contain boat/hero (objs visitable from land) -> we test back cause boat may be on top of another object (#276) - if(standAtWater && !canFly && !canWalkOnSea) + if(movingOntoWater && !canFly && !canWalkOnSea) return complainRet("Cannot move hero, destination tile is on water!"); if(h->boat && h->boat->layer == EPathfindingLayer::SAIL && t.terType->isLand() && t.blocked) @@ -1294,7 +1295,7 @@ bool CGameHandler::moveHero(ObjectInstanceID hid, int3 dst, ui8 teleporting, boo if(h->boat && !h->boat->onboardAssaultAllowed) lookForGuards = IGNORE_GUARDS; - turnTimerHandler.setEndTurnAllowed(h->getOwner(), !standAtWater && !standAtObstacle); + turnTimerHandler.setEndTurnAllowed(h->getOwner(), !movingOntoWater && !movingOntoObstacle); doMove(TryMoveHero::SUCCESS, lookForGuards, visitDest, LEAVING_TILE); return true; } From 9b482a2b1e1afda735b173a580abec97b44d8b59 Mon Sep 17 00:00:00 2001 From: Ivan Savenko Date: Wed, 27 Sep 2023 21:25:27 +0300 Subject: [PATCH 5/5] Fix boat creation for heroes recruited on water --- lib/mapObjects/CGHeroInstance.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/mapObjects/CGHeroInstance.cpp b/lib/mapObjects/CGHeroInstance.cpp index e82688891..e490de9f0 100644 --- a/lib/mapObjects/CGHeroInstance.cpp +++ b/lib/mapObjects/CGHeroInstance.cpp @@ -487,7 +487,7 @@ void CGHeroInstance::onHeroVisit(const CGHeroInstance * h) const if (!boat) { //Create a new boat for hero - cb->createObject(boatPos, Obj::BOAT, getBoatType().getNum()); + cb->createObject(boatPos, h->getOwner(), Obj::BOAT, getBoatType().getNum()); boatId = cb->getTopObj(boatPos)->id; } }