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:
@ -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);
|
||||
|
@ -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
|
||||
}
|
||||
|
@ -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
|
||||
{
|
||||
|
@ -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++)
|
||||
|
@ -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)
|
||||
{
|
||||
|
@ -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;
|
||||
|
@ -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()
|
||||
|
Reference in New Issue
Block a user