Przeglądaj źródła

Rumors: use enum instead of magic numbers and avoid potential crash

ArseniyShestakov 10 lat temu
rodzic
commit
d856fde73f
3 zmienionych plików z 35 dodań i 23 usunięć
  1. 5 5
      lib/CGameInfoCallback.cpp
  2. 19 16
      lib/CGameState.cpp
  3. 11 2
      lib/CGameState.h

+ 5 - 5
lib/CGameInfoCallback.cpp

@@ -575,14 +575,14 @@ EPlayerStatus::EStatus CGameInfoCallback::getPlayerStatus(PlayerColor player, bo
 std::string CGameInfoCallback::getTavernRumor(const CGObjectInstance * townOrTavern) const
 {
 	std::string text = "", extraText = "";
-	if(gs->rumor.type == RumorState::RUMOR_NONE) // (version < 755 backward compatability
+	if(gs->rumor.type == RumorState::TYPE_NONE) // (version < 755 backward compatability
 		return text;
 
 	auto rumor = gs->rumor.last[gs->rumor.type];
 	switch(gs->rumor.type)
 	{
-	case RumorState::RUMOR_STATS:
-		if(rumor.first == 212)
+	case RumorState::TYPE_SPECIAL:
+		if(rumor.first == RumorState::RUMOR_GRAIL)
 			extraText = VLC->generaltexth->arraytxt[158 + rumor.second];
 		else
 			extraText = VLC->generaltexth->capColors[rumor.second];
@@ -590,11 +590,11 @@ std::string CGameInfoCallback::getTavernRumor(const CGObjectInstance * townOrTav
 		text = boost::str(boost::format(VLC->generaltexth->allTexts[rumor.first]) % extraText);
 
 		break;
-	case RumorState::RUMOR_MAP:
+	case RumorState::TYPE_MAP:
 		text = gs->map->rumors[rumor.first].text;
 		break;
 
-	case RumorState::RUMOR_RAND:
+	case RumorState::TYPE_RAND:
 		text = VLC->generaltexth->tavernRumors[rumor.first];
 		break;
 	}

+ 19 - 16
lib/CGameState.cpp

@@ -2135,25 +2135,28 @@ int3 CGameState::guardingCreaturePosition (int3 pos) const
 
 void CGameState::updateRumor()
 {
-	static std::vector<RumorState::ERumorType> rumorTypes = {RumorState::RUMOR_MAP, RumorState::RUMOR_STATS, RumorState::RUMOR_RAND, RumorState::RUMOR_RAND};
-	static std::vector<int> statsRumorTypes = {208, 209, 210, 211, 212};
+	static std::vector<RumorState::ERumorType> rumorTypes = {RumorState::TYPE_MAP, RumorState::TYPE_SPECIAL, RumorState::TYPE_RAND, RumorState::TYPE_RAND};
+	std::vector<RumorState::ERumorTypeSpecial> sRumorTypes = {
+		RumorState::RUMOR_OBELISKS, RumorState::RUMOR_ARTIFACTS, RumorState::RUMOR_ARMY, RumorState::RUMOR_INCOME};
+	if(map->grailPos.valid()) // Grail should always be on map, but I had related crash I didn't manage to reproduce
+		sRumorTypes.push_back(RumorState::RUMOR_GRAIL);
 
 	int rumorId = -1, rumorExtra = -1;
-	auto & rand = gs->getRandomGenerator();
+	auto & rand = getRandomGenerator();
 	rumor.type = *RandomGeneratorUtil::nextItem(rumorTypes, rand);
-	if(!gs->map->rumors.size() && rumor.type == RumorState::RUMOR_MAP)
-		rumor.type = RumorState::RUMOR_RAND;
+	if(!map->rumors.size() && rumor.type == RumorState::TYPE_MAP)
+		rumor.type = RumorState::TYPE_RAND;
 
 	do
 	{
 		switch(rumor.type)
 		{
-		case RumorState::RUMOR_STATS:
+		case RumorState::TYPE_SPECIAL:
 		{
 			SThievesGuildInfo tgi;
-			gs->obtainPlayersStats(tgi, 20);
-			rumorId = *RandomGeneratorUtil::nextItem(statsRumorTypes, rand);
-			if(rumorId == 212)
+			obtainPlayersStats(tgi, 20);
+			rumorId = *RandomGeneratorUtil::nextItem(sRumorTypes, rand);
+			if(rumorId == RumorState::RUMOR_GRAIL)
 			{
 				rumorExtra = getTile(map->grailPos)->terType;
 				break;
@@ -2162,19 +2165,19 @@ void CGameState::updateRumor()
 			std::vector<PlayerColor> players = {};
 			switch(rumorId)
 			{
-			case 208:
+			case RumorState::RUMOR_OBELISKS:
 				players = tgi.obelisks[0];
 				break;
 
-			case 209:
+			case RumorState::RUMOR_ARTIFACTS:
 				players = tgi.artifacts[0];
 				break;
 
-			case 210:
+			case RumorState::RUMOR_ARMY:
 				players = tgi.army[0];
 				break;
 
-			case 211:
+			case RumorState::RUMOR_INCOME:
 				players = tgi.income[0];
 				break;
 			}
@@ -2182,12 +2185,12 @@ void CGameState::updateRumor()
 
 			break;
 		}
-		case RumorState::RUMOR_MAP:
-			rumorId = rand.nextInt(gs->map->rumors.size() - 1);
+		case RumorState::TYPE_MAP:
+			rumorId = rand.nextInt(map->rumors.size() - 1);
 
 			break;
 
-		case RumorState::RUMOR_RAND:
+		case RumorState::TYPE_RAND:
 			do
 			{
 				rumorId = rand.nextInt(VLC->generaltexth->tavernRumors.size() - 1);

+ 11 - 2
lib/CGameState.h

@@ -212,13 +212,22 @@ struct DLL_LINKAGE RumorState
 {
 	enum ERumorType : ui8
 	{
-		RUMOR_NONE = 0, RUMOR_RAND, RUMOR_STATS, RUMOR_MAP
+		TYPE_NONE = 0, TYPE_RAND, TYPE_SPECIAL, TYPE_MAP
+	};
+
+	enum ERumorTypeSpecial : ui8
+	{
+		RUMOR_OBELISKS = 208,
+		RUMOR_ARTIFACTS = 209,
+		RUMOR_ARMY = 210,
+		RUMOR_INCOME = 211,
+		RUMOR_GRAIL = 212
 	};
 
 	ERumorType type;
 	std::map<ERumorType, std::pair<int, int>> last;
 
-	RumorState(){type = RUMOR_NONE; last = {};};
+	RumorState(){type = TYPE_NONE; last = {};};
 	bool update(int id, int extra);
 
 	template <typename Handler> void serialize(Handler &h, const int version)