浏览代码

CampaignRegions class encapsulation

Ivan Savenko 2 年之前
父节点
当前提交
e2bd98e21e

+ 7 - 15
client/lobby/CBonusSelection.cpp

@@ -64,7 +64,7 @@ CBonusSelection::CBonusSelection()
 {
 	OBJ_CONSTRUCTION_CAPTURING_ALL_NO_DISPOSE;
 
-	std::string bgName = getCampaign()->getRegions().campPrefix + "_BG.BMP";
+	std::string bgName = getCampaign()->getRegions().getBackgroundName();
 	setBackground(bgName);
 
 	panelBackground = std::make_shared<CPicture>("CAMPBRF.BMP", 456, 6);
@@ -449,27 +449,19 @@ CBonusSelection::CRegion::CRegion(CampaignScenarioID id, bool accessible, bool s
 	: CIntObject(LCLICK | SHOW_POPUP), idOfMapAndRegion(id), accessible(accessible), selectable(selectable)
 {
 	OBJ_CONSTRUCTION;
-	static const std::string colors[2][8] =
-	{
-		{"R", "B", "N", "G", "O", "V", "T", "P"},
-		{"Re", "Bl", "Br", "Gr", "Or", "Vi", "Te", "Pi"}
-	};
 
-	const CampaignRegions::RegionDescription & desc = campDsc.regions[static_cast<int>(idOfMapAndRegion)];
-	pos.x += desc.xpos;
-	pos.y += desc.ypos;
+	pos += campDsc.getPosition(id);
 
-	std::string prefix = campDsc.campPrefix + desc.infix + "_";
-	std::string suffix = colors[campDsc.colorSuffixLength - 1][CSH->si->campState->scenario(idOfMapAndRegion).regionColor];
-	graphicsNotSelected = std::make_shared<CPicture>(prefix + "En" + suffix + ".BMP");
+	auto color = CSH->si->campState->scenario(idOfMapAndRegion).regionColor;
+
+	graphicsNotSelected = std::make_shared<CPicture>(campDsc.getAvailableName(id, color));
 	graphicsNotSelected->disable();
-	graphicsSelected = std::make_shared<CPicture>(prefix + "Se" + suffix + ".BMP");
+	graphicsSelected = std::make_shared<CPicture>(campDsc.getSelectedName(id, color));
 	graphicsSelected->disable();
-	graphicsStriped = std::make_shared<CPicture>(prefix + "Co" + suffix + ".BMP");
+	graphicsStriped = std::make_shared<CPicture>(campDsc.getConqueredName(id, color));
 	graphicsStriped->disable();
 	pos.w = graphicsNotSelected->pos.w;
 	pos.h = graphicsNotSelected->pos.h;
-
 }
 
 void CBonusSelection::CRegion::updateState()

+ 1 - 1
client/lobby/CBonusSelection.h

@@ -16,7 +16,7 @@
 VCMI_LIB_NAMESPACE_BEGIN
 
 class CampaignState;
-struct CampaignRegions;
+class CampaignRegions;
 
 VCMI_LIB_NAMESPACE_END
 

+ 41 - 0
lib/campaign/CampaignState.cpp

@@ -66,6 +66,47 @@ CampaignRegions CampaignRegions::getLegacy(int campId)
 	return campDescriptions.at(campId);
 }
 
+std::string CampaignRegions::getBackgroundName() const
+{
+	return campPrefix + "_BG.BMP";
+}
+
+Point CampaignRegions::getPosition(CampaignScenarioID which) const
+{
+	auto const & region = regions[static_cast<int>(which)];
+	return Point(region.xpos, region.ypos);
+}
+
+std::string CampaignRegions::getNameFor(CampaignScenarioID which, int colorIndex, std::string type) const
+{
+	auto const & region = regions[static_cast<int>(which)];
+
+	static const std::string colors[2][8] =
+	{
+		{"R", "B", "N", "G", "O", "V", "T", "P"},
+		{"Re", "Bl", "Br", "Gr", "Or", "Vi", "Te", "Pi"}
+	};
+
+	std::string color = colors[colorSuffixLength - 1][colorIndex];
+
+	return campPrefix + region.infix + "_" + type + color + ".BMP";
+}
+
+std::string CampaignRegions::getAvailableName(CampaignScenarioID which, int color) const
+{
+	return getNameFor(which, color, "En");
+}
+
+std::string CampaignRegions::getSelectedName(CampaignScenarioID which, int color) const
+{
+	return getNameFor(which, color, "Se");
+}
+
+std::string CampaignRegions::getConqueredName(CampaignScenarioID which, int color) const
+{
+	return getNameFor(which, color, "Co");
+}
+
 
 bool CampaignBonus::isBonusForHero() const
 {

+ 18 - 7
lib/campaign/CampaignState.h

@@ -23,8 +23,9 @@ class CMap;
 class CMapHeader;
 class CMapInfo;
 class JsonNode;
+class Point;
 
-struct DLL_LINKAGE CampaignRegions
+class DLL_LINKAGE CampaignRegions
 {
 	std::string campPrefix;
 	int colorSuffixLength;
@@ -46,6 +47,15 @@ struct DLL_LINKAGE CampaignRegions
 
 	std::vector<RegionDescription> regions;
 
+	std::string getNameFor(CampaignScenarioID which, int color, std::string type) const;
+
+public:
+	std::string getBackgroundName() const;
+	Point getPosition(CampaignScenarioID which) const;
+	std::string getAvailableName(CampaignScenarioID which, int color) const;
+	std::string getSelectedName(CampaignScenarioID which, int color) const;
+	std::string getConqueredName(CampaignScenarioID which, int color) const;
+
 	template <typename Handler> void serialize(Handler &h, const int formatVersion)
 	{
 		h & campPrefix;
@@ -101,7 +111,7 @@ public:
 
 struct DLL_LINKAGE CampaignBonus
 {
-	CampaignBonusType type = CampaignBonusType::NONE; //uses EBonusType
+	CampaignBonusType type = CampaignBonusType::NONE;
 
 	//purpose depends on type
 	int32_t info1 = 0;
@@ -119,10 +129,8 @@ struct DLL_LINKAGE CampaignBonus
 	}
 };
 
-class DLL_LINKAGE CampaignTravel
+struct DLL_LINKAGE CampaignTravel
 {
-public:
-
 	struct DLL_LINKAGE WhatHeroKeeps
 	{
 		bool experience = false;
@@ -160,9 +168,8 @@ public:
 	}
 };
 
-class DLL_LINKAGE CampaignScenario
+struct DLL_LINKAGE CampaignScenario
 {
-public:
 	std::string mapName; //*.h3m
 	std::string scenarioName; //from header. human-readble
 	std::set<CampaignScenarioID> preconditionRegions; //what we need to conquer to conquer this one (stored as bitfield in h3c)
@@ -242,12 +249,16 @@ class DLL_LINKAGE CampaignState : public Campaign
 	CampaignHeroes crossover;
 
 public:
+	/// Returns last completed scenario, if any
 	std::optional<CampaignScenarioID> lastScenario() const;
+
 	std::optional<CampaignScenarioID> currentScenario() const;
 	std::set<CampaignScenarioID> conqueredScenarios() const;
 
+	/// Returns bonus selected for specific scenario
 	std::optional<CampaignBonus> getBonus(CampaignScenarioID which) const;
 
+	/// Returns index of selected bonus for specified scenario
 	std::optional<ui8> getBonusID(CampaignScenarioID which) const;
 
 	/// Returns true if selected scenario can be selected and started by player

+ 1 - 1
lib/gameState/CGameState.h

@@ -26,7 +26,7 @@ class CMap;
 struct CPack;
 class CHeroClass;
 struct EventCondition;
-class CampaignTravel;
+struct CampaignTravel;
 class CStackInstance;
 class CGameStateCampaign;
 

+ 1 - 1
lib/gameState/CGameStateCampaign.h

@@ -14,7 +14,7 @@
 VCMI_LIB_NAMESPACE_BEGIN
 
 struct CampaignBonus;
-class CampaignTravel;
+struct CampaignTravel;
 class CGHeroInstance;
 class CGameState;
 class CMap;