1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-07-03 00:46:55 +02:00

* some work on campaigns

This commit is contained in:
mateuszb
2012-09-18 17:47:52 +00:00
parent 2cf4905d9c
commit fb2f19b4c5
7 changed files with 34 additions and 27 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -21,7 +21,8 @@
#include "ConstTransitivePtr.h" #include "ConstTransitivePtr.h"
#include "CCreatureSet.h" //for CStackInstance #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 ui32 version = 732;
const TSlot COMMANDER_SLOT_PLACEHOLDER = -2; const TSlot COMMANDER_SLOT_PLACEHOLDER = -2;

View File

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