1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-11-26 08:41:13 +02:00
vcmi/lib/mapping/CMapInfo.cpp

209 lines
5.6 KiB
C++
Raw Normal View History

/*
* CMapInfo.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
*
*/
2012-11-21 12:13:33 +03:00
#include "StdInc.h"
#include "CMapInfo.h"
2023-08-12 01:13:03 +02:00
#include <vstd/DateUtils.h>
#include "../filesystem/ResourcePath.h"
#include "../StartInfo.h"
#include "../GameConstants.h"
#include "CMapService.h"
2023-05-24 01:05:59 +02:00
#include "CMapHeader.h"
2023-05-24 00:14:06 +02:00
#include "MapFormat.h"
2023-06-25 21:28:24 +02:00
#include "../campaign/CampaignHandler.h"
#include "../filesystem/Filesystem.h"
#include "../serializer/CMemorySerializer.h"
#include "../CGeneralTextHandler.h"
#include "../rmg/CMapGenOptions.h"
#include "../CCreatureHandler.h"
#include "../GameSettings.h"
#include "../CHeroHandler.h"
VCMI_LIB_NAMESPACE_BEGIN
CMapInfo::CMapInfo()
: scenarioOptionsOfSave(nullptr), amountOfPlayersOnMap(0), amountOfHumanControllablePlayers(0), amountOfHumanPlayersInSave(0), isRandomMap(false)
{
}
CMapInfo::~CMapInfo()
{
vstd::clear_pointer(scenarioOptionsOfSave);
}
void CMapInfo::mapInit(const std::string & fname)
{
fileURI = fname;
CMapService mapService;
ResourcePath resource = ResourcePath(fname, EResType::MAP);
originalFileURI = resource.getOriginalName();
fullFileURI = boost::filesystem::canonical(*CResourceHandler::get()->getResourceName(resource)).string();
mapHeader = mapService.loadMapHeader(resource);
countPlayers();
}
void CMapInfo::saveInit(const ResourcePath & file)
{
CLoadFile lf(*CResourceHandler::get()->getResourceName(file), MINIMAL_SERIALIZATION_VERSION);
lf.checkMagicBytes(SAVEGAME_MAGIC);
2022-12-07 23:36:20 +02:00
mapHeader = std::make_unique<CMapHeader>();
2023-02-11 18:30:06 +02:00
lf >> *(mapHeader) >> scenarioOptionsOfSave;
fileURI = file.getName();
originalFileURI = file.getOriginalName();
fullFileURI = boost::filesystem::canonical(*CResourceHandler::get()->getResourceName(file)).string();
countPlayers();
std::time_t time = boost::filesystem::last_write_time(*CResourceHandler::get()->getResourceName(file));
2023-08-12 01:13:03 +02:00
date = vstd::getFormattedDateTime(time);
// We absolutely not need this data for lobby and server will read it from save
// FIXME: actually we don't want them in CMapHeader!
mapHeader->triggeredEvents.clear();
}
void CMapInfo::campaignInit()
{
ResourcePath resource = ResourcePath(fileURI, EResType::CAMPAIGN);
originalFileURI = resource.getOriginalName();
fullFileURI = boost::filesystem::canonical(*CResourceHandler::get()->getResourceName(resource)).string();
campaign = CampaignHandler::getHeader(fileURI);
}
void CMapInfo::countPlayers()
{
2013-03-03 20:06:03 +03:00
for(int i=0; i<PlayerColor::PLAYER_LIMIT_I; i++)
{
if(mapHeader->players[i].canHumanPlay)
{
amountOfPlayersOnMap++;
amountOfHumanControllablePlayers++;
}
else if(mapHeader->players[i].canComputerPlay)
{
amountOfPlayersOnMap++;
}
}
if(scenarioOptionsOfSave)
2023-02-11 18:30:06 +02:00
for(const auto & playerInfo : scenarioOptionsOfSave->playerInfos)
if(playerInfo.second.isControlledByHuman())
amountOfHumanPlayersInSave++;
}
2023-09-27 22:53:13 +02:00
std::string CMapInfo::getNameTranslated() const
{
2023-09-27 22:53:13 +02:00
if(campaign && !campaign->getNameTranslated().empty())
return campaign->getNameTranslated();
else if(mapHeader && !mapHeader->name.empty())
2023-10-11 01:26:07 +02:00
{
mapHeader->registerMapStrings();
2023-09-27 22:53:13 +02:00
return mapHeader->name.toString();
2023-10-11 01:26:07 +02:00
}
else
return VLC->generaltexth->allTexts[508];
}
std::string CMapInfo::getNameForList() const
{
if(scenarioOptionsOfSave)
{
// TODO: this could be handled differently
std::vector<std::string> path;
boost::split(path, originalFileURI, boost::is_any_of("\\/"));
return path[path.size()-1];
}
else
{
2023-09-27 22:53:13 +02:00
return getNameTranslated();
}
}
2023-09-27 22:53:13 +02:00
std::string CMapInfo::getDescriptionTranslated() const
2016-08-31 05:18:01 +02:00
{
if(campaign)
2023-09-27 22:53:13 +02:00
return campaign->getDescriptionTranslated();
else
2023-09-27 22:53:13 +02:00
return mapHeader->description.toString();
2016-08-31 05:18:01 +02:00
}
int CMapInfo::getMapSizeIconId() const
{
if(!mapHeader)
return 4;
switch(mapHeader->width)
{
case CMapHeader::MAP_SIZE_SMALL:
return 0;
case CMapHeader::MAP_SIZE_MIDDLE:
return 1;
case CMapHeader::MAP_SIZE_LARGE:
return 2;
case CMapHeader::MAP_SIZE_XLARGE:
return 3;
2022-12-12 02:46:42 +02:00
case CMapHeader::MAP_SIZE_HUGE:
return 4;
case CMapHeader::MAP_SIZE_XHUGE:
return 5;
case CMapHeader::MAP_SIZE_GIANT:
return 6;
default:
return 4;
}
}
int CMapInfo::getMapSizeFormatIconId() const
{
switch(mapHeader->version)
{
case EMapFormat::ROE:
return VLC->settings()->getValue(EGameSettings::MAP_FORMAT_RESTORATION_OF_ERATHIA)["iconIndex"].Integer();
case EMapFormat::AB:
return VLC->settings()->getValue(EGameSettings::MAP_FORMAT_ARMAGEDDONS_BLADE)["iconIndex"].Integer();
case EMapFormat::SOD:
return VLC->settings()->getValue(EGameSettings::MAP_FORMAT_SHADOW_OF_DEATH)["iconIndex"].Integer();
case EMapFormat::WOG:
return VLC->settings()->getValue(EGameSettings::MAP_FORMAT_IN_THE_WAKE_OF_GODS)["iconIndex"].Integer();
case EMapFormat::HOTA:
return VLC->settings()->getValue(EGameSettings::MAP_FORMAT_HORN_OF_THE_ABYSS)["iconIndex"].Integer();
case EMapFormat::VCMI:
return VLC->settings()->getValue(EGameSettings::MAP_FORMAT_JSON_VCMI)["iconIndex"].Integer();
}
return 0;
}
std::string CMapInfo::getMapSizeName() const
{
switch(mapHeader->width)
{
case CMapHeader::MAP_SIZE_SMALL:
return "S";
case CMapHeader::MAP_SIZE_MIDDLE:
return "M";
case CMapHeader::MAP_SIZE_LARGE:
return "L";
case CMapHeader::MAP_SIZE_XLARGE:
return "XL";
2022-12-12 02:46:42 +02:00
case CMapHeader::MAP_SIZE_HUGE:
return "H";
case CMapHeader::MAP_SIZE_XHUGE:
return "XH";
case CMapHeader::MAP_SIZE_GIANT:
return "G";
default:
return "C";
}
}
VCMI_LIB_NAMESPACE_END