1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-07-01 00:45:26 +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;
}*/
case RETURN_TO_MAIN_MENU:
{
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);

View File

@ -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();
}
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);
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
{

View File

@ -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++)

View File

@ -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)
{

View File

@ -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;

View File

@ -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()