瀏覽代碼

* some work on campaigns

mateuszb 13 年之前
父節點
當前提交
fb2f19b4c5
共有 7 個文件被更改,包括 34 次插入27 次删除
  1. 12 4
      client/CMT.cpp
  2. 1 4
      client/CPlayerInterface.cpp
  3. 5 5
      client/CPreGame.cpp
  4. 0 1
      lib/CCampaignHandler.cpp
  5. 9 9
      lib/CGameState.cpp
  6. 2 1
      lib/Connection.h
  7. 5 3
      lib/StartInfo.h

+ 12 - 4
client/CMT.cpp

@@ -773,10 +773,18 @@ static void listenForEvents()
 				break;
 			}*/
 			case RETURN_TO_MAIN_MENU:
-				endGame();
-				CGPreGame::create();
-				GH.curInt = CGP;
-				GH.defActionsDef = 63;
+				{
+					auto mode = client->getStartInfo()->mode;
+					endGame();
+					if(mode == StartInfo::CAMPAIGN)
+						GH.pushInt( new CBonusSelection(NULL) );
+					else
+					{
+						CGPreGame::create();
+						GH.curInt = CGP;
+						GH.defActionsDef = 63;
+					}
+				}
 				break;
 			case STOP_CLIENT:
 				client->endGame(false);

+ 1 - 4
client/CPlayerInterface.cpp

@@ -2026,10 +2026,7 @@ void CPlayerInterface::gameOver(ui8 player, bool victory )
 		howManyPeople--;
 		if(!howManyPeople) //all human players eliminated
 		{
-			if(cb->getStartInfo()->mode != StartInfo::CAMPAIGN)
-				requestReturningToMainMenu();
-			else
-				requestStoppingClient();
+			requestReturningToMainMenu();
 		}
 		cb->unregisterMyInterface(); //we already won/lost, nothing else matters
 	}

+ 5 - 5
client/CPreGame.cpp

@@ -796,6 +796,7 @@ void CSelectionScreen::startCampaign()
 		CCampaign * ourCampaign = CCampaignHandler::getCampaign(SEL->current->fileURI);
 		CCampaignState * campState = new CCampaignState();
 		campState->camp = ourCampaign;
+		sInfo.campSt = campState;
 		GH.pushInt( new CBonusSelection(campState) );
 	}
 }
@@ -2924,6 +2925,8 @@ void CBonusSelection::selectMap( int whichOne )
 	sInfo.difficulty = ourCampaign->camp->scenarios[whichOne].difficulty;
 	sInfo.mapname = ourCampaign->camp->header.filename;
 	sInfo.mode = StartInfo::CAMPAIGN;
+	sInfo.campSt = ourCampaign;
+	ourCampaign->currentMap = whichOne;
 
 	//get header
 	int i = 0;
@@ -2935,11 +2938,8 @@ void CBonusSelection::selectMap( int whichOne )
 	names[1] = settings["general"]["playerName"].String();
 	updateStartInfo(ourCampaign->camp->header.filename, sInfo, ourHeader, names);
 	sInfo.turnTime = 0;
-	sInfo.whichMapInCampaign = whichOne;
 	sInfo.difficulty = ourCampaign->camp->scenarios[whichOne].difficulty;
 
-	ourCampaign->currentMap = whichOne;
-
 	mapDesc->setTxt(ourHeader->description);
 
 	updateBonusSelection();
@@ -3016,7 +3016,7 @@ void CBonusSelection::updateBonusSelection()
 	//resource - BORES.DEF
 	//player - CREST58.DEF
 	//hero - PORTRAITSLARGE (HPL###.BMPs)
-	const CCampaignScenario &scenario = ourCampaign->camp->scenarios[sInfo.whichMapInCampaign];
+	const CCampaignScenario &scenario = ourCampaign->camp->scenarios[sInfo.campSt->currentMap];
 	const std::vector<CScenarioTravel::STravelBonus> & bonDescs = scenario.travelOptions.bonusesToChoose;
 
 	for (size_t i=0; i<bonuses->buttons.size(); i++)
@@ -3216,7 +3216,7 @@ void CBonusSelection::selectBonus( int id )
 	}
 
 
-	const CCampaignScenario &scenario = ourCampaign->camp->scenarios[sInfo.whichMapInCampaign];
+	const CCampaignScenario &scenario = ourCampaign->camp->scenarios[sInfo.campSt->currentMap];
 	const std::vector<CScenarioTravel::STravelBonus> & bonDescs = scenario.travelOptions.bonusesToChoose;
 	if (bonDescs[id].type == 8) //hero crossover
 	{

+ 0 - 1
lib/CCampaignHandler.cpp

@@ -410,7 +410,6 @@ void CCampaignState::initNewCampaign( const StartInfo &si )
 {
 	assert(si.mode == StartInfo::CAMPAIGN);
 	campaignName = si.mapname;
-	currentMap = si.whichMapInCampaign;
 
 	camp = CCampaignHandler::getCampaign(campaignName);
 	for (ui8 i = 0; i < camp->mapPieces.size(); i++)

+ 9 - 9
lib/CGameState.cpp

@@ -793,7 +793,7 @@ void CGameState::init(StartInfo * si)
 							{
 								continue;
 							}
-							Bonus *bb = new Bonus(Bonus::PERMANENT, Bonus::PRIMARY_SKILL, Bonus::CAMPAIGN_BONUS, val, si->whichMapInCampaign, g);
+							Bonus *bb = new Bonus(Bonus::PERMANENT, Bonus::PRIMARY_SKILL, Bonus::CAMPAIGN_BONUS, val, si->campSt->currentMap, g);
 							hero->addNewBonus(bb);
 						}
 					}
@@ -847,9 +847,9 @@ void CGameState::init(StartInfo * si)
 		{
 			campaign = new CCampaignState();
 			campaign->initNewCampaign(*scenarioOps);
-			assert(vstd::contains(campaign->camp->mapPieces, scenarioOps->whichMapInCampaign));
+			assert(vstd::contains(campaign->camp->mapPieces, scenarioOps->campSt->currentMap));
 
-			std::vector<ui8> &mapContent = campaign->camp->mapPieces[scenarioOps->whichMapInCampaign];
+			std::vector<ui8> &mapContent = campaign->camp->mapPieces[scenarioOps->campSt->currentMap];
 			map = new Mapa();
 			map->initFromBytes((const ui8*)mapContent.data(), mapContent.size());
 		}
@@ -995,7 +995,7 @@ void CGameState::init(StartInfo * si)
 	{
 
 		CScenarioTravel::STravelBonus bonus =
-			campaign->camp->scenarios[scenarioOps->whichMapInCampaign].travelOptions.bonusesToChoose[scenarioOps->choosenCampaignBonus];
+			campaign->camp->scenarios[scenarioOps->campSt->currentMap].travelOptions.bonusesToChoose[scenarioOps->choosenCampaignBonus];
 
 
 		std::vector<CGHeroInstance *> Xheroes;
@@ -1079,7 +1079,7 @@ void CGameState::init(StartInfo * si)
 	if (scenarioOps->mode == StartInfo::CAMPAIGN)
 	{
 		CScenarioTravel::STravelBonus chosenBonus =
-			campaign->camp->scenarios[scenarioOps->whichMapInCampaign].travelOptions.bonusesToChoose[scenarioOps->choosenCampaignBonus];
+			campaign->camp->scenarios[scenarioOps->campSt->currentMap].travelOptions.bonusesToChoose[scenarioOps->choosenCampaignBonus];
 		if(chosenBonus.type == 7) //resource
 		{
 			std::vector<const PlayerSettings *> people = HLP::getHumanPlayerInfo(scenarioOps); //players we will give resource bonus
@@ -1164,7 +1164,7 @@ void CGameState::init(StartInfo * si)
 	{
 
 		CScenarioTravel::STravelBonus chosenBonus =
-			campaign->camp->scenarios[scenarioOps->whichMapInCampaign].travelOptions.bonusesToChoose[scenarioOps->choosenCampaignBonus];
+			campaign->camp->scenarios[scenarioOps->campSt->currentMap].travelOptions.bonusesToChoose[scenarioOps->choosenCampaignBonus];
 		if (chosenBonus.isBonusForHero() && chosenBonus.info1 != 0xFFFE) //exclude generated heroes
 		{
 			//find human player
@@ -1194,7 +1194,7 @@ void CGameState::init(StartInfo * si)
 				if(maxB < 0)
 					tlog2 << "Warning - cannot give bonus to hero cause there are no heroes!\n";
 				else
-					HLP::giveCampaignBonusToHero(heroes[maxB], scenarioOps, campaign->camp->scenarios[scenarioOps->whichMapInCampaign].travelOptions, this);
+					HLP::giveCampaignBonusToHero(heroes[maxB], scenarioOps, campaign->camp->scenarios[scenarioOps->campSt->currentMap].travelOptions, this);
 			}
 			else //specific hero
 			{
@@ -1202,7 +1202,7 @@ void CGameState::init(StartInfo * si)
 				{
 					if (heroes[b]->subID == chosenBonus.info1)
 					{
-						HLP::giveCampaignBonusToHero(heroes[b], scenarioOps, campaign->camp->scenarios[scenarioOps->whichMapInCampaign].travelOptions, this);
+						HLP::giveCampaignBonusToHero(heroes[b], scenarioOps, campaign->camp->scenarios[scenarioOps->campSt->currentMap].travelOptions, this);
 						break;
 					}
 				}
@@ -1378,7 +1378,7 @@ void CGameState::init(StartInfo * si)
 	if (scenarioOps->mode == StartInfo::CAMPAIGN)
 	{
 		CScenarioTravel::STravelBonus chosenBonus =
-			campaign->camp->scenarios[scenarioOps->whichMapInCampaign].travelOptions.bonusesToChoose[scenarioOps->choosenCampaignBonus];
+			campaign->camp->scenarios[scenarioOps->campSt->currentMap].travelOptions.bonusesToChoose[scenarioOps->choosenCampaignBonus];
 
 		if (chosenBonus.type == 2)
 		{

+ 2 - 1
lib/Connection.h

@@ -21,7 +21,8 @@
 
 #include "ConstTransitivePtr.h"
 #include "CCreatureSet.h" //for CStackInstance
-#include "CObjectHandler.h" //fo CArmedInstance
+#include "CObjectHandler.h" //for CArmedInstance
+#include "CCampaignHandler.h" //for CCampaignState
 
 const ui32 version = 732;
 const TSlot COMMANDER_SLOT_PLACEHOLDER = -2;

+ 5 - 3
lib/StartInfo.h

@@ -10,6 +10,8 @@
  *
  */
 
+class CCampaignState;
+
 /// Struct which describes the name, the color, the starting bonus of a player
 struct PlayerSettings
 {
@@ -18,7 +20,7 @@ struct PlayerSettings
 	si32 castle, hero,  //ID, if -1 then random, if -2 then none
 		heroPortrait; //-1 if default, else ID
 	std::string heroName;
-	si8 bonus; //usees enum type Ebonus
+	si8 bonus; //uses enum type Ebonus
 	ui8 color; //from 0 - 
 	ui8 handicap;//0-no, 1-mild, 2-severe
 	ui8 team;
@@ -63,8 +65,8 @@ struct StartInfo
 	ui32 mapfileChecksum; //0 if not relevant
 	ui8 turnTime; //in minutes, 0=unlimited
 	std::string mapname;
-	ui8 whichMapInCampaign; //used only for mode CAMPAIGN
 	ui8 choosenCampaignBonus; //used only for mode CAMPAIGN
+	CCampaignState * campSt;
 	PlayerSettings & getIthPlayersSettings(int no)
 	{
 		if(playerInfos.find(no) != playerInfos.end())
@@ -91,8 +93,8 @@ struct StartInfo
 		h & mapfileChecksum;
 		h & turnTime;
 		h & mapname;
-		h & whichMapInCampaign;
 		h & choosenCampaignBonus;
+		h & campSt;
 	}
 
 	StartInfo()