diff --git a/lib/CMapInfo.cpp b/lib/CMapInfo.cpp new file mode 100644 index 000000000..a98c56b50 --- /dev/null +++ b/lib/CMapInfo.cpp @@ -0,0 +1,70 @@ +#define VCMI_DLL + +#include "CMapInfo.h" +#include "..\StartInfo.h" +#include "map.h" +#include "..\hch\CCampaignHandler.h" + +void CMapInfo::countPlayers() +{ + actualHumanPlayers = playerAmnt = humenPlayers = 0; + for(int i=0;iplayers[i].canHumanPlay) + { + playerAmnt++; + humenPlayers++; + } + else if(mapHeader->players[i].canComputerPlay) + { + playerAmnt++; + } + } + + if(scenarioOpts) + for (std::map::const_iterator i = scenarioOpts->playerInfos.begin(); i != scenarioOpts->playerInfos.end(); i++) + if(i->second.human) + actualHumanPlayers++; +} + +CMapInfo::CMapInfo(bool map) + : mapHeader(NULL), campaignHeader(NULL), scenarioOpts(NULL) +{ +} + +void CMapInfo::mapInit(const std::string &fname, const unsigned char *map ) +{ + filename = fname; + int i = 0; + mapHeader = new CMapHeader(); + mapHeader->version = CMapHeader::invalid; + + try + { + mapHeader->initFromMemory(map, i); + countPlayers(); + } + catch (const std::string &e) + { + tlog1 << "\t\tWarning: evil map file: " << fname << ": " << e << std::endl; + delete mapHeader; + mapHeader = NULL; + } +} + +CMapInfo::~CMapInfo() +{ + delete mapHeader; + delete campaignHeader; +} + +void CMapInfo::campaignInit() +{ + campaignHeader = new CCampaignHeader( CCampaignHandler::getHeader(filename, lodCmpgn) ); +} + +void CMapInfo::setHeader(CMapHeader *header) +{ + mapHeader = header; +} + diff --git a/lib/CMapInfo.h b/lib/CMapInfo.h new file mode 100644 index 000000000..ec4693a44 --- /dev/null +++ b/lib/CMapInfo.h @@ -0,0 +1,35 @@ +#pragma once + +#include "../global.h" + +class CMapHeader; +class CCampaignHeader; +class StartInfo; + + +class DLL_EXPORT CMapInfo +{ +public: + CMapHeader * mapHeader; //may be NULL if campaign + CCampaignHeader * campaignHeader; //may be NULL if scenario + StartInfo *scenarioOpts; //options with which scenario has been started (used only with saved games) + std::string filename; + bool lodCmpgn; //tells if this campaign is located in Lod file + std::string date; + int playerAmnt, //players in map + humenPlayers; //players ALLOWED to be controlled by human + int actualHumanPlayers; // >1 if multiplayer game + CMapInfo(bool map = true); + ~CMapInfo(); + //CMapInfo(const std::string &fname, const unsigned char *map); + void setHeader(CMapHeader *header); + void mapInit(const std::string &fname, const unsigned char *map); + void campaignInit(); + void countPlayers(); + + template void serialize(Handler &h, const int Version) + { + h & mapHeader & campaignHeader & scenarioOpts & filename & lodCmpgn & date & playerAmnt & humenPlayers; + h & actualHumanPlayers; + } +}; \ No newline at end of file