瀏覽代碼

Merge pull request #3216 from IvanSavenko/allowed_hero_fix

Better fix for allowed heroes on h3m maps
Ivan Savenko 1 年之前
父節點
當前提交
47c1d3dcba

+ 1 - 1
lib/IHandlerBase.h

@@ -116,7 +116,7 @@ public:
 		if(index < 0 || index >= objects.size())
 		{
 			logMod->error("%s id %d is invalid", getTypeNames()[0], index);
-			throw std::runtime_error("internal error");
+			throw std::runtime_error("Attempt to access invalid index " + std::to_string(index) + " of type " + getTypeNames().front());
 		}
 
 		return objects[index];

+ 1 - 1
lib/mapObjects/CGTownInstance.cpp

@@ -1079,7 +1079,7 @@ void CGTownInstance::addHeroToStructureVisitors(const CGHeroInstance *h, si64 st
 	{
 		//should never ever happen
 		logGlobal->error("Cannot add hero %s to visitors of structure # %d", h->getNameTranslated(), structureInstanceID);
-		throw std::runtime_error("internal error");
+		throw std::runtime_error("unexpected hero in CGTownInstance::addHeroToStructureVisitors");
 	}
 }
 

+ 1 - 1
lib/mapObjects/MiscObjects.cpp

@@ -1239,7 +1239,7 @@ void CGObelisk::setPropertyDer(ObjProperty what, ObjPropertyID identifier)
 				if(progress > obeliskCount)
 				{
 					logGlobal->error("Visited %d of %d", static_cast<int>(progress), obeliskCount);
-					throw std::runtime_error("internal error");
+					throw std::runtime_error("Player visited more obelisks than present on map!");
 				}
 
 				break;

+ 1 - 1
lib/mapping/CMap.cpp

@@ -166,7 +166,7 @@ CMap::CMap()
 	, grailRadius(0)
 	, uidCounter(0)
 {
-	allHeroes.resize(allowedHeroes.size());
+	allHeroes.resize(VLC->heroh->objects.size());
 	allowedAbilities = VLC->skillh->getDefaultAllowed();
 	allowedArtifact = VLC->arth->getDefaultAllowed();
 	allowedSpells = VLC->spellh->getDefaultAllowed();

+ 4 - 2
lib/mapping/MapFormatH3M.cpp

@@ -108,8 +108,6 @@ void CMapLoaderH3M::init()
 	inputStream->seek(0);
 
 	readHeader();
-	map->allHeroes.resize(map->allowedHeroes.size());
-
 	readDisposedHeroes();
 	readMapOptions();
 	readAllowedArtifacts();
@@ -678,6 +676,8 @@ void CMapLoaderH3M::readTeamInfo()
 
 void CMapLoaderH3M::readAllowedHeroes()
 {
+	mapHeader->allowedHeroes = VLC->heroh->getDefaultAllowed();
+
 	if(features.levelHOTA0)
 		reader->readBitmaskHeroesSized(mapHeader->allowedHeroes, false);
 	else
@@ -747,6 +747,8 @@ void CMapLoaderH3M::readMapOptions()
 
 void CMapLoaderH3M::readAllowedArtifacts()
 {
+	map->allowedArtifact = VLC->arth->getDefaultAllowed();
+
 	if(features.levelAB)
 	{
 		if(features.levelHOTA0)

+ 2 - 2
lib/mapping/MapReaderH3M.cpp

@@ -325,8 +325,6 @@ void MapReaderH3M::readBitmaskSkills(std::set<SecondarySkill> & dest, bool inver
 template<class Identifier>
 void MapReaderH3M::readBitmask(std::set<Identifier> & dest, int bytesToRead, int objectsToRead, bool invert)
 {
-	dest.clear();
-
 	for(int byte = 0; byte < bytesToRead; ++byte)
 	{
 		const ui8 mask = reader->readUInt8();
@@ -343,6 +341,8 @@ void MapReaderH3M::readBitmask(std::set<Identifier> & dest, int bytesToRead, int
 
 				if (result)
 					dest.insert(vcmiID);
+				else
+					dest.erase(vcmiID);
 			}
 		}
 	}

+ 4 - 1
server/CGameHandler.cpp

@@ -548,7 +548,10 @@ void CGameHandler::init(StartInfo *si, Load::ProgressAccumulator & progressTrack
 		turnOrder->addPlayer(elem.first);
 
 	for (auto & elem : gs->map->allHeroes)
-		heroPool->getHeroSkillsRandomGenerator(elem->getHeroType()); // init RMG seed
+	{
+		if(elem)
+			heroPool->getHeroSkillsRandomGenerator(elem->getHeroType()); // init RMG seed
+	}
 
 	reinitScripting();
 }