mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-24 22:14:36 +02:00
Hero portraits in campaign bonus selection.
This commit is contained in:
parent
13b3d23b26
commit
2f39db2375
1
Global.h
1
Global.h
@ -79,6 +79,7 @@
|
|||||||
#include <boost/program_options.hpp>
|
#include <boost/program_options.hpp>
|
||||||
#include <boost/optional.hpp>
|
#include <boost/optional.hpp>
|
||||||
#include <boost/range/algorithm.hpp>
|
#include <boost/range/algorithm.hpp>
|
||||||
|
#include <boost/range/adaptor/filtered.hpp>
|
||||||
#include <boost/thread.hpp>
|
#include <boost/thread.hpp>
|
||||||
#include <boost/unordered_map.hpp>
|
#include <boost/unordered_map.hpp>
|
||||||
#include <boost/unordered_set.hpp>
|
#include <boost/unordered_set.hpp>
|
||||||
|
@ -3409,7 +3409,7 @@ void CBonusSelection::updateBonusSelection()
|
|||||||
bonuses->buttons.clear();
|
bonuses->buttons.clear();
|
||||||
|
|
||||||
static const char *bonusPics[] = {"SPELLBON.DEF", "TWCRPORT.DEF", "", "ARTIFBON.DEF", "SPELLBON.DEF",
|
static const char *bonusPics[] = {"SPELLBON.DEF", "TWCRPORT.DEF", "", "ARTIFBON.DEF", "SPELLBON.DEF",
|
||||||
"PSKILBON.DEF", "SSKILBON.DEF", "BORES.DEF", "CREST58.DEF", "PORTRAITSLARGE"};
|
"PSKILBON.DEF", "SSKILBON.DEF", "BORES.DEF", "PORTRAITSLARGE", "PORTRAITSLARGE"};
|
||||||
|
|
||||||
for(int i = 0; i < bonDescs.size(); i++)
|
for(int i = 0; i < bonDescs.size(); i++)
|
||||||
{
|
{
|
||||||
@ -3531,11 +3531,14 @@ void CBonusSelection::updateBonusSelection()
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case CScenarioTravel::STravelBonus::PLAYER_PREV_SCENARIO:
|
case CScenarioTravel::STravelBonus::PLAYER_PREV_SCENARIO:
|
||||||
picNumber = bonDescs[i].info1;
|
{
|
||||||
desc = CGI->generaltexth->allTexts[718];
|
auto superhero = ourCampaign->camp->scenarios[bonDescs[i].info2].strongestHero(bonDescs[i].info1);
|
||||||
|
if (!superhero) tlog5 << "No superhero! How could it be transfered?\n";
|
||||||
|
picNumber = superhero ? superhero->portrait : 0;
|
||||||
|
desc = CGI->generaltexth->allTexts[719];
|
||||||
|
|
||||||
boost::algorithm::replace_first(desc, "%s", CGI->generaltexth->capColors[bonDescs[i].info1]); //player color
|
boost::algorithm::replace_first(desc, "%s", ourCampaign->camp->scenarios[bonDescs[i].info2].scenarioName); //scenario
|
||||||
boost::algorithm::replace_first(desc, "%s", ourCampaign->camp->scenarios[bonDescs[i].info2].mapName); //scenario
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
case CScenarioTravel::STravelBonus::HERO:
|
case CScenarioTravel::STravelBonus::HERO:
|
||||||
|
@ -10,6 +10,8 @@
|
|||||||
#include "../CArtHandler.h" //for hero crossover
|
#include "../CArtHandler.h" //for hero crossover
|
||||||
#include "../CObjectHandler.h" //for hero crossover
|
#include "../CObjectHandler.h" //for hero crossover
|
||||||
#include "../CHeroHandler.h"
|
#include "../CHeroHandler.h"
|
||||||
|
#include "CMapService.h"
|
||||||
|
#include "CMap.h"
|
||||||
|
|
||||||
namespace fs = boost::filesystem;
|
namespace fs = boost::filesystem;
|
||||||
|
|
||||||
@ -64,6 +66,7 @@ unique_ptr<CCampaign> CCampaignHandler::getCampaign( const std::string & name )
|
|||||||
|
|
||||||
//set map piece appropriately, convert vector to string
|
//set map piece appropriately, convert vector to string
|
||||||
ret->mapPieces[scenarioID].assign(reinterpret_cast< const char* >(file[g].data()), file[g].size());
|
ret->mapPieces[scenarioID].assign(reinterpret_cast< const char* >(file[g].data()), file[g].size());
|
||||||
|
ret->scenarios[scenarioID].scenarioName = CMapService::loadMapHeader((const ui8*)ret->mapPieces[scenarioID].c_str(), ret->mapPieces[scenarioID].size())->name;
|
||||||
scenarioID++;
|
scenarioID++;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -397,6 +400,17 @@ void CCampaignScenario::prepareCrossoverHeroes( std::vector<CGHeroInstance *> he
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const CGHeroInstance * CCampaignScenario::strongestHero( TPlayerColor owner ) const
|
||||||
|
{
|
||||||
|
using boost::adaptors::filtered;
|
||||||
|
std::function<bool(CGHeroInstance*)> isOwned = [=](const CGHeroInstance *h){ return h->tempOwner == owner; };
|
||||||
|
auto ownedHeroes = crossoverHeroes | filtered(isOwned);
|
||||||
|
|
||||||
|
auto i = vstd::maxElementByFun(ownedHeroes,
|
||||||
|
[](const CGHeroInstance * h) {return h->getTotalStrength();});
|
||||||
|
return i == ownedHeroes.end() ? nullptr : *i;
|
||||||
|
}
|
||||||
|
|
||||||
bool CScenarioTravel::STravelBonus::isBonusForHero() const
|
bool CScenarioTravel::STravelBonus::isBonusForHero() const
|
||||||
{
|
{
|
||||||
return type == SPELL || type == MONSTER || type == ARTIFACT || type == SPELL_SCROLL || type == PRIMARY_SKILL
|
return type == SPELL || type == MONSTER || type == ARTIFACT || type == SPELL_SCROLL || type == PRIMARY_SKILL
|
||||||
|
@ -83,7 +83,8 @@ public:
|
|||||||
class DLL_LINKAGE CCampaignScenario
|
class DLL_LINKAGE CCampaignScenario
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
std::string mapName;
|
std::string mapName; //*.h3m
|
||||||
|
std::string scenarioName; //from header. human-readble
|
||||||
ui32 packedMapSize; //generally not used
|
ui32 packedMapSize; //generally not used
|
||||||
std::set<ui8> preconditionRegions; //what we need to conquer to conquer this one (stored as bitfield in h3c)
|
std::set<ui8> preconditionRegions; //what we need to conquer to conquer this one (stored as bitfield in h3c)
|
||||||
ui8 regionColor;
|
ui8 regionColor;
|
||||||
@ -111,6 +112,8 @@ public:
|
|||||||
|
|
||||||
std::vector<CGHeroInstance *> crossoverHeroes;
|
std::vector<CGHeroInstance *> crossoverHeroes;
|
||||||
|
|
||||||
|
const CGHeroInstance * strongestHero(TPlayerColor owner) const;
|
||||||
|
|
||||||
void loadPreconditionRegions(ui32 regions);
|
void loadPreconditionRegions(ui32 regions);
|
||||||
void prepareCrossoverHeroes(std::vector<CGHeroInstance *> heroes);
|
void prepareCrossoverHeroes(std::vector<CGHeroInstance *> heroes);
|
||||||
|
|
||||||
@ -118,7 +121,7 @@ public:
|
|||||||
|
|
||||||
template <typename Handler> void serialize(Handler &h, const int formatVersion)
|
template <typename Handler> void serialize(Handler &h, const int formatVersion)
|
||||||
{
|
{
|
||||||
h & mapName & packedMapSize & preconditionRegions & regionColor & difficulty & conquered & regionText &
|
h & mapName & scenarioName & packedMapSize & preconditionRegions & regionColor & difficulty & conquered & regionText &
|
||||||
prolog & epilog & travelOptions & crossoverHeroes;
|
prolog & epilog & travelOptions & crossoverHeroes;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -1329,8 +1329,7 @@ void CMapLoaderH3M::readObjects()
|
|||||||
CGHeroPlaceholder * hp = new CGHeroPlaceholder();
|
CGHeroPlaceholder * hp = new CGHeroPlaceholder();
|
||||||
nobj = hp;
|
nobj = hp;
|
||||||
|
|
||||||
int a = reader.readUInt8();//unknown byte, seems to be always 0 (if not - scream!)
|
hp->setOwner(reader.readUInt8());
|
||||||
tlog2 << "Unhandled Hero Placeholder detected: " << a << std::endl;
|
|
||||||
|
|
||||||
int htid = reader.readUInt8();; //hero type id
|
int htid = reader.readUInt8();; //hero type id
|
||||||
nobj->subID = htid;
|
nobj->subID = htid;
|
||||||
|
Loading…
Reference in New Issue
Block a user