mirror of
https://github.com/vcmi/vcmi.git
synced 2025-08-13 19:54:17 +02:00
Use enum in h3m map parser
This commit is contained in:
@@ -989,11 +989,11 @@ void CMapLoaderH3M::readObjectTemplates()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
CGObjectInstance * CMapLoaderH3M::readEvent(const int3 & mapPosition)
|
CGObjectInstance * CMapLoaderH3M::readEvent(const int3 & mapPosition, const ObjectInstanceID & idToBeGiven)
|
||||||
{
|
{
|
||||||
auto * object = new CGEvent();
|
auto * object = new CGEvent();
|
||||||
|
|
||||||
readBoxContent(object, mapPosition);
|
readBoxContent(object, mapPosition, idToBeGiven);
|
||||||
|
|
||||||
reader->readBitmaskPlayers(object->availableFor, false);
|
reader->readBitmaskPlayers(object->availableFor, false);
|
||||||
object->computerActivate = reader->readBool();
|
object->computerActivate = reader->readBool();
|
||||||
@@ -1009,14 +1009,14 @@ CGObjectInstance * CMapLoaderH3M::readEvent(const int3 & mapPosition)
|
|||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
CGObjectInstance * CMapLoaderH3M::readPandora(const int3 & mapPosition)
|
CGObjectInstance * CMapLoaderH3M::readPandora(const int3 & mapPosition, const ObjectInstanceID & idToBeGiven)
|
||||||
{
|
{
|
||||||
auto * object = new CGPandoraBox();
|
auto * object = new CGPandoraBox();
|
||||||
readBoxContent(object, mapPosition);
|
readBoxContent(object, mapPosition, idToBeGiven);
|
||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMapLoaderH3M::readBoxContent(CGPandoraBox * object, const int3 & mapPosition)
|
void CMapLoaderH3M::readBoxContent(CGPandoraBox * object, const int3 & mapPosition, const ObjectInstanceID & idToBeGiven)
|
||||||
{
|
{
|
||||||
readMessageAndGuards(object->message, object, mapPosition);
|
readMessageAndGuards(object->message, object, mapPosition);
|
||||||
Rewardable::VisitInfo vinfo;
|
Rewardable::VisitInfo vinfo;
|
||||||
@@ -1024,8 +1024,8 @@ void CMapLoaderH3M::readBoxContent(CGPandoraBox * object, const int3 & mapPositi
|
|||||||
|
|
||||||
reward.heroExperience = reader->readUInt32();
|
reward.heroExperience = reader->readUInt32();
|
||||||
reward.manaDiff = reader->readInt32();
|
reward.manaDiff = reader->readInt32();
|
||||||
reward.bonuses.emplace_back(BonusDuration::ONE_BATTLE, BonusType::MORALE, BonusSource::OBJECT, reader->readUInt8(), object->id);
|
reward.bonuses.emplace_back(BonusDuration::ONE_BATTLE, BonusType::MORALE, BonusSource::OBJECT, reader->readUInt8(), idToBeGiven);
|
||||||
reward.bonuses.emplace_back(BonusDuration::ONE_BATTLE, BonusType::LUCK, BonusSource::OBJECT, reader->readUInt8(), object->id);
|
reward.bonuses.emplace_back(BonusDuration::ONE_BATTLE, BonusType::LUCK, BonusSource::OBJECT, reader->readUInt8(), idToBeGiven);
|
||||||
|
|
||||||
reader->readResourses(reward.resources);
|
reader->readResourses(reward.resources);
|
||||||
for(int x = 0; x < GameConstants::PRIMARY_SKILLS; ++x)
|
for(int x = 0; x < GameConstants::PRIMARY_SKILLS; ++x)
|
||||||
@@ -1417,7 +1417,7 @@ CGObjectInstance * CMapLoaderH3M::readObject(std::shared_ptr<const ObjectTemplat
|
|||||||
switch(objectTemplate->id)
|
switch(objectTemplate->id)
|
||||||
{
|
{
|
||||||
case Obj::EVENT:
|
case Obj::EVENT:
|
||||||
return readEvent(mapPosition);
|
return readEvent(mapPosition, objectInstanceID);
|
||||||
|
|
||||||
case Obj::HERO:
|
case Obj::HERO:
|
||||||
case Obj::RANDOM_HERO:
|
case Obj::RANDOM_HERO:
|
||||||
@@ -1440,7 +1440,7 @@ CGObjectInstance * CMapLoaderH3M::readObject(std::shared_ptr<const ObjectTemplat
|
|||||||
return readSign(mapPosition);
|
return readSign(mapPosition);
|
||||||
|
|
||||||
case Obj::SEER_HUT:
|
case Obj::SEER_HUT:
|
||||||
return readSeerHut(mapPosition);
|
return readSeerHut(mapPosition, objectInstanceID);
|
||||||
|
|
||||||
case Obj::WITCH_HUT:
|
case Obj::WITCH_HUT:
|
||||||
return readWitchHut();
|
return readWitchHut();
|
||||||
@@ -1483,7 +1483,7 @@ CGObjectInstance * CMapLoaderH3M::readObject(std::shared_ptr<const ObjectTemplat
|
|||||||
return readShrine();
|
return readShrine();
|
||||||
|
|
||||||
case Obj::PANDORAS_BOX:
|
case Obj::PANDORAS_BOX:
|
||||||
return readPandora(mapPosition);
|
return readPandora(mapPosition, objectInstanceID);
|
||||||
|
|
||||||
case Obj::GRAIL:
|
case Obj::GRAIL:
|
||||||
return readGrail(mapPosition, objectTemplate);
|
return readGrail(mapPosition, objectTemplate);
|
||||||
@@ -1794,7 +1794,7 @@ CGObjectInstance * CMapLoaderH3M::readHero(const int3 & mapPosition, const Objec
|
|||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
||||||
CGObjectInstance * CMapLoaderH3M::readSeerHut(const int3 & position)
|
CGObjectInstance * CMapLoaderH3M::readSeerHut(const int3 & position, const ObjectInstanceID & idToBeGiven)
|
||||||
{
|
{
|
||||||
auto * hut = new CGSeerHut();
|
auto * hut = new CGSeerHut();
|
||||||
|
|
||||||
@@ -1808,7 +1808,7 @@ CGObjectInstance * CMapLoaderH3M::readSeerHut(const int3 & position)
|
|||||||
logGlobal->warn("Map '%s': Seer Hut at %s - %d quests are not implemented!", mapName, position.toString(), questsCount);
|
logGlobal->warn("Map '%s': Seer Hut at %s - %d quests are not implemented!", mapName, position.toString(), questsCount);
|
||||||
|
|
||||||
for(size_t i = 0; i < questsCount; ++i)
|
for(size_t i = 0; i < questsCount; ++i)
|
||||||
readSeerHutQuest(hut, position);
|
readSeerHutQuest(hut, position, idToBeGiven);
|
||||||
|
|
||||||
if(features.levelHOTA3)
|
if(features.levelHOTA3)
|
||||||
{
|
{
|
||||||
@@ -1818,7 +1818,7 @@ CGObjectInstance * CMapLoaderH3M::readSeerHut(const int3 & position)
|
|||||||
logGlobal->warn("Map '%s': Seer Hut at %s - %d repeatable quests are not implemented!", mapName, position.toString(), repeateableQuestsCount);
|
logGlobal->warn("Map '%s': Seer Hut at %s - %d repeatable quests are not implemented!", mapName, position.toString(), repeateableQuestsCount);
|
||||||
|
|
||||||
for(size_t i = 0; i < repeateableQuestsCount; ++i)
|
for(size_t i = 0; i < repeateableQuestsCount; ++i)
|
||||||
readSeerHutQuest(hut, position);
|
readSeerHutQuest(hut, position, idToBeGiven);
|
||||||
}
|
}
|
||||||
|
|
||||||
reader->skipZero(2);
|
reader->skipZero(2);
|
||||||
@@ -1826,7 +1826,22 @@ CGObjectInstance * CMapLoaderH3M::readSeerHut(const int3 & position)
|
|||||||
return hut;
|
return hut;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMapLoaderH3M::readSeerHutQuest(CGSeerHut * hut, const int3 & position)
|
enum class ESeerHutRewardType : uint8_t
|
||||||
|
{
|
||||||
|
NOTHING = 0,
|
||||||
|
EXPERIENCE = 1,
|
||||||
|
MANA_POINTS = 2,
|
||||||
|
MORALE = 3,
|
||||||
|
LUCK = 4,
|
||||||
|
RESOURCES = 5,
|
||||||
|
PRIMARY_SKILL = 6,
|
||||||
|
SECONDARY_SKILL = 7,
|
||||||
|
ARTIFACT = 8,
|
||||||
|
SPELL = 9,
|
||||||
|
CREATURE = 10,
|
||||||
|
};
|
||||||
|
|
||||||
|
void CMapLoaderH3M::readSeerHutQuest(CGSeerHut * hut, const int3 & position, const ObjectInstanceID & idToBeGiven)
|
||||||
{
|
{
|
||||||
if(features.levelAB)
|
if(features.levelAB)
|
||||||
{
|
{
|
||||||
@@ -1854,37 +1869,37 @@ void CMapLoaderH3M::readSeerHutQuest(CGSeerHut * hut, const int3 & position)
|
|||||||
|
|
||||||
if(hut->quest->missionType)
|
if(hut->quest->missionType)
|
||||||
{
|
{
|
||||||
auto rewardType = reader->readUInt8();
|
auto rewardType = static_cast<ESeerHutRewardType>(reader->readUInt8());
|
||||||
Rewardable::VisitInfo vinfo;
|
Rewardable::VisitInfo vinfo;
|
||||||
auto & reward = vinfo.reward;
|
auto & reward = vinfo.reward;
|
||||||
switch(rewardType)
|
switch(rewardType)
|
||||||
{
|
{
|
||||||
case 0: //NOTHING
|
case ESeerHutRewardType::NOTHING:
|
||||||
{
|
{
|
||||||
// no-op
|
// no-op
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 1: //EXPERIENCE
|
case ESeerHutRewardType::EXPERIENCE:
|
||||||
{
|
{
|
||||||
reward.heroExperience = reader->readUInt32();
|
reward.heroExperience = reader->readUInt32();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 2: //MANA POINTS:
|
case ESeerHutRewardType::MANA_POINTS:
|
||||||
{
|
{
|
||||||
reward.manaDiff = reader->readUInt32();
|
reward.manaDiff = reader->readUInt32();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 3: //MORALE_BONUS
|
case ESeerHutRewardType::MORALE:
|
||||||
{
|
{
|
||||||
reward.bonuses.emplace_back(BonusDuration::ONE_BATTLE, BonusType::MORALE, BonusSource::OBJECT, reader->readUInt8(), hut->id);
|
reward.bonuses.emplace_back(BonusDuration::ONE_BATTLE, BonusType::MORALE, BonusSource::OBJECT, reader->readUInt8(), idToBeGiven);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 4: //LUCK_BONUS
|
case ESeerHutRewardType::LUCK:
|
||||||
{
|
{
|
||||||
reward.bonuses.emplace_back(BonusDuration::ONE_BATTLE, BonusType::LUCK, BonusSource::OBJECT, reader->readUInt8(), hut->id);
|
reward.bonuses.emplace_back(BonusDuration::ONE_BATTLE, BonusType::LUCK, BonusSource::OBJECT, reader->readUInt8(), idToBeGiven);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 5: //RESOURCES
|
case ESeerHutRewardType::RESOURCES:
|
||||||
{
|
{
|
||||||
auto rId = reader->readUInt8();
|
auto rId = reader->readUInt8();
|
||||||
auto rVal = reader->readUInt32();
|
auto rVal = reader->readUInt32();
|
||||||
@@ -1895,7 +1910,7 @@ void CMapLoaderH3M::readSeerHutQuest(CGSeerHut * hut, const int3 & position)
|
|||||||
reward.resources[rId] = rVal;
|
reward.resources[rId] = rVal;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 6: //PRIMARY_SKILL
|
case ESeerHutRewardType::PRIMARY_SKILL:
|
||||||
{
|
{
|
||||||
auto rId = reader->readUInt8();
|
auto rId = reader->readUInt8();
|
||||||
auto rVal = reader->readUInt8();
|
auto rVal = reader->readUInt8();
|
||||||
@@ -1903,7 +1918,7 @@ void CMapLoaderH3M::readSeerHutQuest(CGSeerHut * hut, const int3 & position)
|
|||||||
reward.primary.at(rId) = rVal;
|
reward.primary.at(rId) = rVal;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 7: //SECONDARY_SKILL
|
case ESeerHutRewardType::SECONDARY_SKILL:
|
||||||
{
|
{
|
||||||
auto rId = reader->readSkill();
|
auto rId = reader->readSkill();
|
||||||
auto rVal = reader->readUInt8();
|
auto rVal = reader->readUInt8();
|
||||||
@@ -1911,17 +1926,17 @@ void CMapLoaderH3M::readSeerHutQuest(CGSeerHut * hut, const int3 & position)
|
|||||||
reward.secondary[rId] = rVal;
|
reward.secondary[rId] = rVal;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 8: //ARTIFACT
|
case ESeerHutRewardType::ARTIFACT:
|
||||||
{
|
{
|
||||||
reward.artifacts.push_back(reader->readArtifact());
|
reward.artifacts.push_back(reader->readArtifact());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 9: //SPELL
|
case ESeerHutRewardType::SPELL:
|
||||||
{
|
{
|
||||||
reward.spells.push_back(reader->readSpell());
|
reward.spells.push_back(reader->readSpell());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 10: //CREATURE
|
case ESeerHutRewardType::CREATURE:
|
||||||
{
|
{
|
||||||
auto rId = reader->readCreature();
|
auto rId = reader->readCreature();
|
||||||
auto rVal = reader->readUInt16();
|
auto rVal = reader->readUInt16();
|
||||||
|
@@ -158,10 +158,10 @@ private:
|
|||||||
/// Reads single object from input stream based on template
|
/// Reads single object from input stream based on template
|
||||||
CGObjectInstance * readObject(std::shared_ptr<const ObjectTemplate> objectTemplate, const int3 & objectPosition, const ObjectInstanceID & idToBeGiven);
|
CGObjectInstance * readObject(std::shared_ptr<const ObjectTemplate> objectTemplate, const int3 & objectPosition, const ObjectInstanceID & idToBeGiven);
|
||||||
|
|
||||||
CGObjectInstance * readEvent(const int3 & objectPosition);
|
CGObjectInstance * readEvent(const int3 & objectPosition, const ObjectInstanceID & idToBeGiven);
|
||||||
CGObjectInstance * readMonster(const int3 & objectPosition, const ObjectInstanceID & idToBeGiven);
|
CGObjectInstance * readMonster(const int3 & objectPosition, const ObjectInstanceID & idToBeGiven);
|
||||||
CGObjectInstance * readHero(const int3 & initialPos, const ObjectInstanceID & idToBeGiven);
|
CGObjectInstance * readHero(const int3 & initialPos, const ObjectInstanceID & idToBeGiven);
|
||||||
CGObjectInstance * readSeerHut(const int3 & initialPos);
|
CGObjectInstance * readSeerHut(const int3 & initialPos, const ObjectInstanceID & idToBeGiven);
|
||||||
CGObjectInstance * readTown(const int3 & position, std::shared_ptr<const ObjectTemplate> objTempl);
|
CGObjectInstance * readTown(const int3 & position, std::shared_ptr<const ObjectTemplate> objTempl);
|
||||||
CGObjectInstance * readSign(const int3 & position);
|
CGObjectInstance * readSign(const int3 & position);
|
||||||
CGObjectInstance * readWitchHut();
|
CGObjectInstance * readWitchHut();
|
||||||
@@ -170,7 +170,7 @@ private:
|
|||||||
CGObjectInstance * readArtifact(const int3 & position, std::shared_ptr<const ObjectTemplate> objTempl);
|
CGObjectInstance * readArtifact(const int3 & position, std::shared_ptr<const ObjectTemplate> objTempl);
|
||||||
CGObjectInstance * readResource(const int3 & position, std::shared_ptr<const ObjectTemplate> objTempl);
|
CGObjectInstance * readResource(const int3 & position, std::shared_ptr<const ObjectTemplate> objTempl);
|
||||||
CGObjectInstance * readMine(const int3 & position, std::shared_ptr<const ObjectTemplate> objTempl);
|
CGObjectInstance * readMine(const int3 & position, std::shared_ptr<const ObjectTemplate> objTempl);
|
||||||
CGObjectInstance * readPandora(const int3 & position);
|
CGObjectInstance * readPandora(const int3 & position, const ObjectInstanceID & idToBeGiven);
|
||||||
CGObjectInstance * readDwelling(const int3 & position);
|
CGObjectInstance * readDwelling(const int3 & position);
|
||||||
CGObjectInstance * readDwellingRandom(const int3 & position, std::shared_ptr<const ObjectTemplate> objTempl);
|
CGObjectInstance * readDwellingRandom(const int3 & position, std::shared_ptr<const ObjectTemplate> objTempl);
|
||||||
CGObjectInstance * readShrine();
|
CGObjectInstance * readShrine();
|
||||||
@@ -196,7 +196,7 @@ private:
|
|||||||
*
|
*
|
||||||
* @param guard the quest guard where that quest should be applied to
|
* @param guard the quest guard where that quest should be applied to
|
||||||
*/
|
*/
|
||||||
void readBoxContent(CGPandoraBox * object, const int3 & position);
|
void readBoxContent(CGPandoraBox * object, const int3 & position, const ObjectInstanceID & idToBeGiven);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads a quest for the given quest guard.
|
* Reads a quest for the given quest guard.
|
||||||
@@ -205,7 +205,7 @@ private:
|
|||||||
*/
|
*/
|
||||||
void readQuest(IQuestObject * guard, const int3 & position);
|
void readQuest(IQuestObject * guard, const int3 & position);
|
||||||
|
|
||||||
void readSeerHutQuest(CGSeerHut * hut, const int3 & position);
|
void readSeerHutQuest(CGSeerHut * hut, const int3 & position, const ObjectInstanceID & idToBeGiven);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Reads events.
|
* Reads events.
|
||||||
|
Reference in New Issue
Block a user