1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-11-25 22:42:04 +02:00

Fixed loading of text strings for hota quests

This commit is contained in:
Ivan Savenko
2024-04-22 13:49:17 +03:00
parent a46e022421
commit a6dead7725
6 changed files with 45 additions and 41 deletions

View File

@@ -94,7 +94,7 @@ std::string CompleteQuest::questToString() const
return "find " + VLC->generaltexth->tentColors[q.obj->subID] + " keymaster tent"; return "find " + VLC->generaltexth->tentColors[q.obj->subID] + " keymaster tent";
} }
if(q.quest->questName == CQuest::missionName(0)) if(q.quest->questName == CQuest::missionName(EQuestMission::NONE))
return "inactive quest"; return "inactive quest";
MetaString ms; MetaString ms;

View File

@@ -99,7 +99,7 @@ std::string CompleteQuest::completeMessage() const
std::string CompleteQuest::questToString() const std::string CompleteQuest::questToString() const
{ {
if(q.quest->questName == CQuest::missionName(0)) if(q.quest->questName == CQuest::missionName(EQuestMission::NONE))
return "inactive quest"; return "inactive quest";
MetaString ms; MetaString ms;

View File

@@ -569,7 +569,9 @@ CGeneralTextHandler::CGeneralTextHandler():
for (size_t i = 0; i < 9; ++i) //9 types of quests for (size_t i = 0; i < 9; ++i) //9 types of quests
{ {
std::string questName = CQuest::missionName(1+i); EQuestMission missionID = static_cast<EQuestMission>(i+1);
std::string questName = CQuest::missionName(missionID);
for (size_t j = 0; j < 5; ++j) for (size_t j = 0; j < 5; ++j)
{ {

View File

@@ -49,7 +49,7 @@ CQuest::CQuest():
isCustomNext(false), isCustomNext(false),
isCustomComplete(false), isCustomComplete(false),
repeatedQuest(false), repeatedQuest(false),
questName(CQuest::missionName(0)) questName(CQuest::missionName(EQuestMission::NONE))
{ {
} }
@@ -59,9 +59,9 @@ static std::string visitedTxt(const bool visited)
return VLC->generaltexth->allTexts[id]; return VLC->generaltexth->allTexts[id];
} }
const std::string & CQuest::missionName(int mission) const std::string & CQuest::missionName(EQuestMission mission)
{ {
static const std::array<std::string, 13> names = { static const std::array<std::string, 14> names = {
"empty", "empty",
"heroLevel", "heroLevel",
"primarySkill", "primarySkill",
@@ -72,9 +72,10 @@ const std::string & CQuest::missionName(int mission)
"bringResources", "bringResources",
"bringHero", "bringHero",
"bringPlayer", "bringPlayer",
"hotaINVALID", // only used for h3m parsing
"keymaster", "keymaster",
"hota", "heroClass",
"other" "reachDate"
}; };
if(static_cast<size_t>(mission) < names.size()) if(static_cast<size_t>(mission) < names.size())
@@ -307,20 +308,18 @@ void CQuest::getCompletionText(IGameCallback * cb, MetaString &iwText) const
void CQuest::defineQuestName() void CQuest::defineQuestName()
{ {
//standard quests //standard quests
questName = CQuest::missionName(0); questName = CQuest::missionName(EQuestMission::NONE);
if(mission != Rewardable::Limiter{}) questName = CQuest::missionName(12); if(mission.heroLevel > 0) questName = CQuest::missionName(EQuestMission::LEVEL);
if(mission.heroLevel > 0) questName = CQuest::missionName(1); for(auto & s : mission.primary) if(s) questName = CQuest::missionName(EQuestMission::PRIMARY_SKILL);
for(auto & s : mission.primary) if(s) questName = CQuest::missionName(2); if(killTarget != ObjectInstanceID::NONE && !heroName.empty()) questName = CQuest::missionName(EQuestMission::KILL_HERO);
if(!mission.spells.empty()) questName = CQuest::missionName(2); if(killTarget != ObjectInstanceID::NONE && stackToKill != CreatureID::NONE) questName = CQuest::missionName(EQuestMission::KILL_CREATURE);
if(!mission.secondary.empty()) questName = CQuest::missionName(2); if(!mission.artifacts.empty()) questName = CQuest::missionName(EQuestMission::ARTIFACT);
if(killTarget != ObjectInstanceID::NONE && !heroName.empty()) questName = CQuest::missionName(3); if(!mission.creatures.empty()) questName = CQuest::missionName(EQuestMission::ARMY);
if(killTarget != ObjectInstanceID::NONE && stackToKill != CreatureID::NONE) questName = CQuest::missionName(4); if(mission.resources.nonZero()) questName = CQuest::missionName(EQuestMission::RESOURCES);
if(!mission.artifacts.empty()) questName = CQuest::missionName(5); if(!mission.heroes.empty()) questName = CQuest::missionName(EQuestMission::HERO);
if(!mission.creatures.empty()) questName = CQuest::missionName(6); if(!mission.players.empty()) questName = CQuest::missionName(EQuestMission::PLAYER);
if(mission.resources.nonZero()) questName = CQuest::missionName(7); if(mission.daysPassed > 0) questName = CQuest::missionName(EQuestMission::HOTA_REACH_DATE);
if(!mission.heroes.empty()) questName = CQuest::missionName(8); if(!mission.heroClasses.empty()) questName = CQuest::missionName(EQuestMission::HOTA_HERO_CLASS);
if(!mission.players.empty()) questName = CQuest::missionName(9);
if(mission.daysPassed > 0 || !mission.heroClasses.empty()) questName = CQuest::missionName(11);
} }
void CQuest::addKillTargetReplacements(MetaString &out) const void CQuest::addKillTargetReplacements(MetaString &out) const
@@ -466,7 +465,7 @@ void CGSeerHut::initObj(CRandomGenerator & rand)
if(quest->mission == Rewardable::Limiter{} && quest->killTarget == ObjectInstanceID::NONE) if(quest->mission == Rewardable::Limiter{} && quest->killTarget == ObjectInstanceID::NONE)
quest->isCompleted = true; quest->isCompleted = true;
if(quest->questName == quest->missionName(0)) if(quest->questName == quest->missionName(EQuestMission::NONE))
{ {
quest->firstVisitText.appendTextID(TextIdentifier("core", "seehut", "empty", quest->completedOption).get()); quest->firstVisitText.appendTextID(TextIdentifier("core", "seehut", "empty", quest->completedOption).get());
} }

View File

@@ -17,11 +17,30 @@ VCMI_LIB_NAMESPACE_BEGIN
class CGCreature; class CGCreature;
enum class EQuestMission {
NONE = 0,
LEVEL = 1,
PRIMARY_SKILL = 2,
KILL_HERO = 3,
KILL_CREATURE = 4,
ARTIFACT = 5,
ARMY = 6,
RESOURCES = 7,
HERO = 8,
PLAYER = 9,
HOTA_MULTI = 10,
// end of H3 missions
KEYMASTER = 11,
HOTA_HERO_CLASS = 12,
HOTA_REACH_DATE = 13,
};
class DLL_LINKAGE CQuest final class DLL_LINKAGE CQuest final
{ {
public: public:
static const std::string & missionName(int index); static const std::string & missionName(EQuestMission index);
static const std::string & missionState(int index); static const std::string & missionState(int index);
std::string questName; std::string questName;

View File

@@ -35,23 +35,7 @@ class SpellID;
class PlayerColor; class PlayerColor;
class int3; class int3;
enum class EQuestMission { enum class EQuestMission;
NONE = 0,
LEVEL = 1,
PRIMARY_SKILL = 2,
KILL_HERO = 3,
KILL_CREATURE = 4,
ARTIFACT = 5,
ARMY = 6,
RESOURCES = 7,
HERO = 8,
PLAYER = 9,
HOTA_MULTI = 10,
// end of H3 missions
KEYMASTER = 100,
HOTA_HERO_CLASS = 101,
HOTA_REACH_DATE = 102
};
enum class EVictoryConditionType : int8_t enum class EVictoryConditionType : int8_t
{ {