mirror of
https://github.com/vcmi/vcmi.git
synced 2024-11-28 08:48:48 +02:00
144 lines
3.6 KiB
C++
144 lines
3.6 KiB
C++
/*
|
|
* CMapHeader.cpp, part of VCMI engine
|
|
*
|
|
* Authors: listed in file AUTHORS in main folder
|
|
*
|
|
* License: GNU General Public License v2.0 or later
|
|
* Full text of license available in license.txt file, in main folder
|
|
*
|
|
*/
|
|
#include "StdInc.h"
|
|
#include "CMapHeader.h"
|
|
|
|
#include "MapFormat.h"
|
|
|
|
#include "../VCMI_Lib.h"
|
|
#include "../CTownHandler.h"
|
|
#include "../CGeneralTextHandler.h"
|
|
#include "../CHeroHandler.h"
|
|
|
|
VCMI_LIB_NAMESPACE_BEGIN
|
|
|
|
SHeroName::SHeroName() : heroId(-1)
|
|
{
|
|
}
|
|
|
|
PlayerInfo::PlayerInfo(): canHumanPlay(false), canComputerPlay(false),
|
|
aiTactic(EAiTactic::RANDOM), isFactionRandom(false), hasRandomHero(false), mainCustomHeroPortrait(-1), mainCustomHeroId(-1), hasMainTown(false),
|
|
generateHeroAtMainTown(false), posOfMainTown(-1), team(TeamID::NO_TEAM)
|
|
{
|
|
allowedFactions = VLC->townh->getAllowedFactions();
|
|
}
|
|
|
|
si8 PlayerInfo::defaultCastle() const
|
|
{
|
|
//if random allowed set it as default
|
|
if(isFactionRandom)
|
|
return -1;
|
|
|
|
if(!allowedFactions.empty())
|
|
return *allowedFactions.begin();
|
|
|
|
// fall back to random
|
|
return -1;
|
|
}
|
|
|
|
si8 PlayerInfo::defaultHero() const
|
|
{
|
|
// we will generate hero in front of main town
|
|
if((generateHeroAtMainTown && hasMainTown) || hasRandomHero)
|
|
{
|
|
//random hero
|
|
return -1;
|
|
}
|
|
|
|
return -2;
|
|
}
|
|
|
|
bool PlayerInfo::canAnyonePlay() const
|
|
{
|
|
return canHumanPlay || canComputerPlay;
|
|
}
|
|
|
|
bool PlayerInfo::hasCustomMainHero() const
|
|
{
|
|
return !mainCustomHeroNameTextId.empty() && mainCustomHeroPortrait != -1;
|
|
}
|
|
|
|
EventCondition::EventCondition(EWinLoseType condition):
|
|
object(nullptr),
|
|
metaType(EMetaclass::INVALID),
|
|
value(-1),
|
|
objectType(-1),
|
|
objectSubtype(-1),
|
|
position(-1, -1, -1),
|
|
condition(condition)
|
|
{
|
|
}
|
|
|
|
EventCondition::EventCondition(EWinLoseType condition, si32 value, si32 objectType, const int3 & position):
|
|
object(nullptr),
|
|
metaType(EMetaclass::INVALID),
|
|
value(value),
|
|
objectType(objectType),
|
|
objectSubtype(-1),
|
|
position(position),
|
|
condition(condition)
|
|
{}
|
|
|
|
|
|
void CMapHeader::setupEvents()
|
|
{
|
|
EventCondition victoryCondition(EventCondition::STANDARD_WIN);
|
|
EventCondition defeatCondition(EventCondition::DAYS_WITHOUT_TOWN);
|
|
defeatCondition.value = 7;
|
|
|
|
//Victory condition - defeat all
|
|
TriggeredEvent standardVictory;
|
|
standardVictory.effect.type = EventEffect::VICTORY;
|
|
standardVictory.effect.toOtherMessage.appendTextID("core.genrltxt.5");
|
|
standardVictory.identifier = "standardVictory";
|
|
standardVictory.description.clear(); // TODO: display in quest window
|
|
standardVictory.onFulfill.appendTextID("core.genrltxt.659");
|
|
standardVictory.trigger = EventExpression(victoryCondition);
|
|
|
|
//Loss condition - 7 days without town
|
|
TriggeredEvent standardDefeat;
|
|
standardDefeat.effect.type = EventEffect::DEFEAT;
|
|
standardDefeat.effect.toOtherMessage.appendTextID("core.genrltxt.8");
|
|
standardDefeat.identifier = "standardDefeat";
|
|
standardDefeat.description.clear(); // TODO: display in quest window
|
|
standardDefeat.onFulfill.appendTextID("core.genrltxt.7");
|
|
standardDefeat.trigger = EventExpression(defeatCondition);
|
|
|
|
triggeredEvents.push_back(standardVictory);
|
|
triggeredEvents.push_back(standardDefeat);
|
|
|
|
victoryIconIndex = 11;
|
|
victoryMessage.appendTextID("core.vcdesc.0");
|
|
|
|
defeatIconIndex = 3;
|
|
defeatMessage.appendTextID("core.lcdesc.0");
|
|
}
|
|
|
|
CMapHeader::CMapHeader() : version(EMapFormat::VCMI), height(72), width(72),
|
|
twoLevel(true), difficulty(1), levelLimit(0), howManyTeams(0), areAnyPlayers(false)
|
|
{
|
|
setupEvents();
|
|
allowedHeroes = VLC->heroh->getDefaultAllowed();
|
|
players.resize(PlayerColor::PLAYER_LIMIT_I);
|
|
VLC->generaltexth->addSubContainer(*this);
|
|
}
|
|
|
|
CMapHeader::~CMapHeader()
|
|
{
|
|
VLC->generaltexth->removeSubContainer(*this);
|
|
}
|
|
|
|
ui8 CMapHeader::levels() const
|
|
{
|
|
return (twoLevel ? 2 : 1);
|
|
}
|
|
|
|
VCMI_LIB_NAMESPACE_END
|