diff --git a/lib/CHeroHandler.h b/lib/CHeroHandler.h index 4152eaa3c..b8b2f5e61 100644 --- a/lib/CHeroHandler.h +++ b/lib/CHeroHandler.h @@ -195,6 +195,13 @@ public: h & imageBattleFemale; h & imageMapMale; h & imageMapFemale; + + if(!h.saving) + { + for(auto i = 0; i < secSkillProbability.size(); i++) + if(secSkillProbability[i] < 0) + secSkillProbability[i] = 0; + } } EAlignment::EAlignment getAlignment() const; }; diff --git a/lib/CSkillHandler.cpp b/lib/CSkillHandler.cpp index 12f10d8d4..826e085f3 100644 --- a/lib/CSkillHandler.cpp +++ b/lib/CSkillHandler.cpp @@ -34,6 +34,7 @@ CSkill::LevelInfo::~LevelInfo() CSkill::CSkill(SecondarySkill id, std::string identifier) : id(id), identifier(identifier) { + gainChance[0] = gainChance[1] = 0; //affects CHeroClassHandler::afterLoadFinalization() levels.resize(NSecondarySkill::levels.size() - 1); } diff --git a/server/CGameHandler.cpp b/server/CGameHandler.cpp index 07d3f9bf6..e8f960a46 100644 --- a/server/CGameHandler.cpp +++ b/server/CGameHandler.cpp @@ -1812,7 +1812,7 @@ void CGameHandler::newTurn() setPortalDwelling(t, true, (n.specialWeek == NewTurn::PLAGUE ? true : false)); //set creatures for Portal of Summoning if (!firstTurn) - if (t->hasBuilt(BuildingID::TREASURY, ETownType::RAMPART) && player < PlayerColor::PLAYER_LIMIT) + if (t->hasBuilt(BuildingSubID::TREASURY) && player < PlayerColor::PLAYER_LIMIT) n.res[player][Res::GOLD] += hadGold.at(player)/10; //give 10% of starting gold if (!vstd::contains(n.cres, t->id)) @@ -3848,8 +3848,18 @@ bool CGameHandler::queryReply(QueryID qid, const JsonNode & answer, PlayerColor logGlobal->trace(answer.toJson()); auto topQuery = queries.topQuery(player); + COMPLAIN_RET_FALSE_IF(!topQuery, "This player doesn't have any queries!"); - COMPLAIN_RET_FALSE_IF(topQuery->queryID != qid, "This player top query has different ID!"); + + if(topQuery->queryID != qid) + { + auto currentQuery = queries.getQuery(qid); + + if(currentQuery != nullptr && currentQuery->endsByPlayerAnswer()) + currentQuery->setReply(answer); + + COMPLAIN_RET("This player top query has different ID!"); //topQuery->queryID != qid + } COMPLAIN_RET_FALSE_IF(!topQuery->endsByPlayerAnswer(), "This query cannot be ended by player's answer!"); topQuery->setReply(answer); diff --git a/server/CQuery.cpp b/server/CQuery.cpp index 5c2e105fd..c6bebb595 100644 --- a/server/CQuery.cpp +++ b/server/CQuery.cpp @@ -248,10 +248,10 @@ std::vector> Queries::allQueries() const return ret; } -std::vector> Queries::allQueries() +std::vector Queries::allQueries() { //TODO code duplication with const function :( - std::vector> ret; + std::vector ret; for(auto & playerQueries : queries) for(auto & query : playerQueries.second) ret.push_back(query); @@ -259,6 +259,15 @@ std::vector> Queries::allQueries() return ret; } +QueryPtr Queries::getQuery(QueryID queryID) +{ + for(auto & playerQueries : queries) + for(auto & query : playerQueries.second) + if(query->queryID == queryID) + return query; + return nullptr; +} + void CBattleQuery::notifyObjectAboutRemoval(const CObjectVisitQuery & objectVisit) const { assert(result); diff --git a/server/CQuery.h b/server/CQuery.h index 417685d5d..e4abbb654 100644 --- a/server/CQuery.h +++ b/server/CQuery.h @@ -219,7 +219,7 @@ public: QueryPtr topQuery(PlayerColor player); std::vector> allQueries() const; - std::vector> allQueries(); + std::vector allQueries(); + QueryPtr getQuery(QueryID queryID); //void removeQuery - };