Selaa lähdekoodia

* next part of bonus selection screen (including Ivan's config)

mateuszb 15 vuotta sitten
vanhempi
sitoutus
968148c4dc
5 muutettua tiedostoa jossa 347 lisäystä ja 18 poistoa
  1. 127 1
      client/CPreGame.cpp
  2. 41 1
      client/CPreGame.h
  3. 131 0
      config/campaign_regions.txt
  4. 41 13
      hch/CCampaignHandler.cpp
  5. 7 3
      hch/CCampaignHandler.h

+ 127 - 1
client/CPreGame.cpp

@@ -2058,13 +2058,16 @@ void CHotSeatPlayers::enterSelectionScreen()
 	GH.pushInt(new CSelectionScreen(CMenuScreen::newGame));
 }
 
-CBonusSelection::CBonusSelection( const CCampaign * ourCampaign, int whichMap )
+CBonusSelection::CBonusSelection( const CCampaign * _ourCampaign, int _whichMap )
+: ourCampaign(_ourCampaign), whichMap(_whichMap), highlightedRegion(NULL)
 {
 	OBJ_CONSTRUCTION;
 	static const std::string bgNames [] = {"E1_BG.BMP", "G2_BG.BMP", "E2_BG.BMP", "G1_BG.BMP", "G3_BG.BMP", "N1_BG.BMP",
 		"S1_BG.BMP", "BR_BG.BMP", "IS_BG.BMP", "KR_BG.BMP", "NI_BG.BMP", "TA_BG.BMP", "AR_BG.BMP", "HS_BG.BMP",
 		"BB_BG.BMP", "NB_BG.BMP", "EL_BG.BMP", "RN_BG.BMP", "UA_BG.BMP", "SP_BG.BMP"};
 	
+	loadPositionsOfGraphics();
+
 	background = BitmapHandler::loadBitmap(bgNames[ourCampaign->header.mapVersion]);
 
 	SDL_Surface * panel = BitmapHandler::loadBitmap("CAMPBRF.BMP");
@@ -2145,6 +2148,29 @@ CBonusSelection::CBonusSelection( const CCampaign * ourCampaign, int whichMap )
 	}*/
 
 	SDL_FreeSurface(panel);
+
+	//bonus choosing
+	printAtLoc(CGI->generaltexth->allTexts[71], 510, 431, FONT_MEDIUM, zwykly, background); //Choose a bonus:
+
+	//difficulty
+	printAtLoc("Difficulty", 691, 431, FONT_MEDIUM, zwykly, background); //Difficulty
+
+	//set left part of window
+	for (int g=0; g<ourCampaign->scenarios.size(); ++g)
+	{
+		if(ourCampaign->conquerable(g))
+		{
+			regions.push_back(new CRegion(this, true, true, g));
+			if (highlightedRegion == NULL)
+			{
+				highlightedRegion = regions.back();
+			}
+		}
+		else if (ourCampaign->scenarios[g].conquered) //display as striped
+		{
+			regions.push_back(new CRegion(this, false, false, g));
+		}
+	}
 	
 }
 
@@ -2163,3 +2189,103 @@ void CBonusSelection::showAll( SDL_Surface * to )
 	CIntObject::showAll(to);
 	blitAt(background, pos.x, pos.y, to);
 }
+
+void CBonusSelection::loadPositionsOfGraphics()
+{
+	std::ifstream is((GVCMIDirs.UserPath + "/config/campaign_regions.txt").c_str(), std::ios_base::binary | std::ios_base::in);
+
+	assert(is.is_open());
+
+	for (int g=0; g<CGI->generaltexth->campaignMapNames.size(); ++g)
+	{
+		SCampPositions sc;
+		is >> sc.campPrefix;
+		is >> sc.colorSuffixLength;
+		bool contReading = true;
+		while(contReading)
+		{
+			SCampPositions::SRegionDesc rd;
+			is >> rd.infix;
+			if(rd.infix == "END")
+			{
+				contReading = false;
+			}
+			else
+			{
+				is >> rd.xpos >> rd.ypos;
+				sc.regions.push_back(rd);
+			}
+		}
+
+		campDescriptions.push_back(sc);
+	}
+
+}
+
+CBonusSelection::CRegion::CRegion( CBonusSelection * _owner, bool _accessible, bool _selectable, int _myNumber )
+: owner(_owner), accessible(_accessible), selectable(_selectable), myNumber(_myNumber)
+{
+	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 SCampPositions & campDsc = owner->campDescriptions[owner->ourCampaign->header.mapVersion];
+	const SCampPositions::SRegionDesc & desc = campDsc.regions[myNumber];
+	pos.x = desc.xpos;
+	pos.y = desc.ypos;
+
+	//loading of graphics
+
+	std::string prefix = campDsc.campPrefix + desc.infix + "_";
+	std::string suffix = colors[campDsc.colorSuffixLength - 1][owner->ourCampaign->scenarios[myNumber].regionColor];
+
+	static const std::string infix [] = {"En", "Se", "Co"};
+	for (int g = 0; g < ARRAY_COUNT(infix); g++)
+	{
+		graphics[g] = BitmapHandler::loadBitmap(prefix + infix[g] + suffix + ".BMP");
+	}
+
+}
+
+CBonusSelection::CRegion::~CRegion()
+{
+	for (int g=0; g<ARRAY_COUNT(graphics); ++g)
+	{
+		SDL_FreeSurface(graphics[g]);
+	}
+}
+
+void CBonusSelection::CRegion::clickLeft( tribool down, bool previousState )
+{
+	//select if selectable & clicked inside our graphic
+	if(!down && selectable)
+	{
+		//owner->highlightedRegion = this;
+	}
+}
+
+void CBonusSelection::CRegion::clickRight( tribool down, bool previousState )
+{
+	//show r-click text
+}
+
+void CBonusSelection::CRegion::show( SDL_Surface * to )
+{
+	const SCampPositions::SRegionDesc & desc = owner->campDescriptions[owner->ourCampaign->header.mapVersion].regions[myNumber];
+	if (!accessible)
+	{
+		//show as striped
+		blitAt(graphics[2], pos.x, pos.y, to);
+	}
+	else if (this == owner->highlightedRegion)
+	{
+		//show as selected
+		blitAt(graphics[1], pos.x, pos.y, to);
+	}
+	else
+	{
+		//show as not selected selected
+		blitAt(graphics[0], pos.x, pos.y, to);
+	}
+}

+ 41 - 1
client/CPreGame.h

@@ -256,8 +256,48 @@ class CBonusSelection : public CIntObject
 {
 	SDL_Surface * background;
 	AdventureMapButton * startB, * backB;
+
+	struct SCampPositions
+	{
+		std::string campPrefix;
+		int colorSuffixLength;
+
+		struct SRegionDesc
+		{
+			std::string infix;
+			int xpos, ypos;
+		};
+
+		std::vector<SRegionDesc> regions;
+
+	};
+
+	std::vector<SCampPositions> campDescriptions;
+
+	class CRegion : public CIntObject
+	{
+		CBonusSelection * owner;
+		SDL_Surface * graphics[3]; //[0] - not selected, [1] - selected, [2] - striped
+		bool accessible; //false if region should be striped
+		bool selectable; //true if region should be selectable
+		int myNumber; //number of region
+	public:
+		CRegion(CBonusSelection * _owner, bool _accessible, bool _selectable, int _myNumber);
+		~CRegion();
+
+		void clickLeft(tribool down, bool previousState);
+		void clickRight(tribool down, bool previousState);
+		void show(SDL_Surface * to);
+	};
+
+	std::vector<CRegion *> regions;
+	CRegion * highlightedRegion;
+
+	void loadPositionsOfGraphics();
+	const CCampaign * ourCampaign;
+	int whichMap;
 public:
-	CBonusSelection(const CCampaign * ourCampaign, int whichMap);
+	CBonusSelection(const CCampaign * _ourCampaign, int _whichMap);
 	~CBonusSelection();
 
 	void showAll(SDL_Surface * to);

+ 131 - 0
config/campaign_regions.txt

@@ -0,0 +1,131 @@
+E1 1
+A 270 332
+B 138 113
+C 26 70
+P1 256 127
+P2 57 314
+P3 137 310
+P4 44 163
+END
+G2 1
+A 56 90
+B 316 49
+C 54 378
+D 151 126
+END
+E2 1
+A 131 202
+B 60 145
+C 92 261
+D 218 307
+END
+G1 1
+A 57 314
+B 137 309
+C 44 163
+END
+G3 1
+A 289 376
+B 60 147
+C 131 202
+END
+N1 1
+A 42 94
+B 309 290
+CD 188 202
+END
+S1 1
+A 263 199
+B 182 210
+C 82 152
+END
+BR 2
+A 18 233
+B 125 381
+C 224 357
+D 192 320
+END
+IS 2
+A 294 399
+B 183 293
+C 40 92
+D 294 398
+END
+KR 2
+A 148 323
+B 192 235
+C 136 158
+D 87 107
+END
+NI 2
+A 118 111
+B 223 145
+C 320 213
+D 233 250
+END
+TA 2
+A 228 233
+B 147 194
+C 112 97
+END
+AR 2
+A 135 238
+B 135 121
+C 206 155
+D 105 397
+E 109 275
+F 158 188
+G 200 261
+H 232 197
+END
+HS 2
+A 140 326
+B 238 275
+C 22 161
+D 5 9
+END
+BB 2
+A 167 342
+B 217 263
+C 0 71
+D 291 79
+E 316 199
+END
+NB 2
+A 6 292
+B 161 334
+C 63 195
+D 56 46
+END
+EL 2
+A 11 73
+B 0 241
+C 254 34
+D 91 144
+END
+RN 2
+A 84 319
+B 194 275
+C 67 185
+D 77 30
+END
+UA 2
+A 157 409
+B 62 346
+C 8 8
+D 206 1
+E 132 357
+F 184 83
+G 159 263
+H 108 173
+I 55 127
+J 9 252
+K 210 176
+L 260 210
+END
+SP 2
+A 7 295
+B 44 141
+C 141 21
+D 243 156
+END

+ 41 - 13
hch/CCampaignHandler.cpp

@@ -79,17 +79,20 @@ CCampaign * CCampaignHandler::getCampaign( const std::string & name )
 
 	std::vector<ui32> h3mStarts = locateH3mStarts(cmpgn, it, realSize);
 
-	if(h3mStarts.size() != howManyScenarios)
+	assert(h3mStarts.size() <= howManyScenarios);
+	//it looks like we can have less scenarios than we should..
+	//if(h3mStarts.size() != howManyScenarios)
+	//{
+	//	tlog1<<"Our heuristic for h3m start points gave wrong results for campaign " << name <<std::endl;
+	//	tlog1<<"Please send this campaign to VCMI Project team to help us fix this problem" << std::endl;
+	//	delete [] cmpgn;
+	//	assert(0);
+	//	return NULL;
+	//}
+
+	for (int g=0; g<h3mStarts.size(); ++g)
 	{
-		tlog1<<"Our heuristic for h3m start points gave wrong results for campaign " << name <<std::endl;
-		tlog1<<"Please send this campaign to VCMI Project team to help us fix this problem" << std::endl;
-		delete [] cmpgn;
-		return NULL;
-	}
-
-	for (int g=0; g<howManyScenarios; ++g)
-	{
-		if(g == howManyScenarios - 1)
+		if(g == h3mStarts.size() - 1)
 		{
 			ret->mapPieces.push_back(std::string( cmpgn + h3mStarts[g], cmpgn + realSize ));
 		}
@@ -141,11 +144,17 @@ CCampaignScenario CCampaignHandler::readScenarioFromMemory( const unsigned char
 		}
 	};
 	CCampaignScenario ret;
+	ret.conquered = false;
 	ret.mapName = readString(buffer, outIt);
 	ret.packedMapSize = readNormalNr(buffer, outIt); outIt += 4;
 	if(mapVersion == 18)//unholy alliance
-		outIt++;
-	ret.preconditionRegion = buffer[outIt++];
+	{
+		ret.preconditionRegion = readNormalNr(buffer, outIt, 2); outIt += 2;
+	}
+	else
+	{
+		ret.preconditionRegion = buffer[outIt++];
+	}
 	ret.regionColor = buffer[outIt++];
 	ret.difficulty = buffer[outIt++];
 	ret.regionText = readString(buffer, outIt);
@@ -181,6 +190,9 @@ CScenarioTravel CCampaignHandler::readScenarioTravelFromMemory( const unsigned c
 	
 	switch(ret.startOptions)
 	{
+	case 0:
+		//no bonuses. Seems to be OK
+		break;
 	case 1: //reading of bonuses player can choose
 		{
 			ret.playerColor = buffer[outIt++];
@@ -368,4 +380,20 @@ bool CCampaignHandler::startsAt( const unsigned char * buffer, int size, int pos
 		return false;
 	}
 	return true;
-}
+}
+
+bool CCampaign::conquerable( int whichScenario ) const
+{
+	if (scenarios[whichScenario].conquered)
+	{
+		return false;
+	}
+	//check preconditioned regions
+	for (int g=0; g<scenarios.size(); ++g)
+	{
+		if(( (1 << g) & scenarios[whichScenario].preconditionRegion ) && !scenarios[g].conquered)
+			return false; //prerequisite does not met
+			
+	}
+	return true;
+}

+ 7 - 3
hch/CCampaignHandler.h

@@ -66,10 +66,11 @@ class DLL_EXPORT CCampaignScenario
 {
 public:
 	std::string mapName;
-	ui32 packedMapSize;
-	ui8 preconditionRegion;
+	ui32 packedMapSize; //generally not used
+	ui16 preconditionRegion; //what we need to conquer to conquer this one (bitfield!)
 	ui8 regionColor;
 	ui8 difficulty;
+	ui8 conquered;
 
 	std::string regionText;
 
@@ -92,7 +93,8 @@ public:
 
 	template <typename Handler> void serialize(Handler &h, const int formatVersion)
 	{
-		h & mapName & packedMapSize & preconditionRegion & regionColor & difficulty & regionText & prolog & epilog & travelOptions;
+		h & mapName & packedMapSize & preconditionRegion & regionColor & difficulty & conquered & regionText & 
+			prolog & epilog & travelOptions;
 	}
 };
 
@@ -107,6 +109,8 @@ public:
 	{
 		h & header & scenarios & mapPieces;
 	}
+
+	bool conquerable(int whichScenario) const;
 };
 
 class DLL_EXPORT CCampaignHandler