mirror of
https://github.com/vcmi/vcmi.git
synced 2025-08-13 19:54:17 +02:00
Load custom campaigns from gzip
This commit is contained in:
@@ -90,21 +90,19 @@ CCampaignHeader CCampaignHandler::getHeader( const std::string & name)
|
||||
std::string language = VLC->modh->getModLanguage(modName);
|
||||
std::string encoding = Languages::getLanguageOptions(language).encoding;
|
||||
|
||||
JsonNode jsonCampaign(resourceID);
|
||||
auto fileStream = CResourceHandler::get(modName)->load(resourceID);
|
||||
std::vector<ui8> cmpgn = getFile(std::move(fileStream), true)[0];
|
||||
JsonNode jsonCampaign((const char*)cmpgn.data(), cmpgn.size());
|
||||
if(jsonCampaign.isNull())
|
||||
{
|
||||
auto fileStream = CResourceHandler::get(modName)->load(resourceID);
|
||||
std::vector<ui8> cmpgn = getFile(std::move(fileStream), true)[0];
|
||||
//legacy OH3 campaign (*.h3c)
|
||||
CMemoryStream stream(cmpgn.data(), cmpgn.size());
|
||||
CBinaryReader reader(&stream);
|
||||
CCampaignHeader ret = readHeaderFromMemory(reader, resourceID.getName(), modName, encoding);
|
||||
return ret;
|
||||
}
|
||||
else
|
||||
{
|
||||
CCampaignHeader ret = readHeaderFromJson(jsonCampaign, resourceID.getName(), modName, encoding);
|
||||
return ret;
|
||||
return readHeaderFromMemory(reader, resourceID.getName(), modName, encoding);
|
||||
}
|
||||
|
||||
//VCMI (*.vcmp)
|
||||
return readHeaderFromJson(jsonCampaign, resourceID.getName(), modName, encoding);
|
||||
}
|
||||
|
||||
std::unique_ptr<CCampaign> CCampaignHandler::getCampaign( const std::string & name )
|
||||
@@ -116,66 +114,48 @@ std::unique_ptr<CCampaign> CCampaignHandler::getCampaign( const std::string & na
|
||||
|
||||
auto ret = std::make_unique<CCampaign>();
|
||||
|
||||
JsonNode jsonCampaign(resourceID);
|
||||
auto fileStream = CResourceHandler::get(modName)->load(resourceID);
|
||||
|
||||
std::vector<std::vector<ui8>> files = getFile(std::move(fileStream), false);
|
||||
|
||||
JsonNode jsonCampaign((const char*)files[0].data(), files[0].size());
|
||||
if(jsonCampaign.isNull())
|
||||
{
|
||||
auto fileStream = CResourceHandler::get(modName)->load(resourceID);
|
||||
|
||||
std::vector<std::vector<ui8>> file = getFile(std::move(fileStream), false);
|
||||
|
||||
CMemoryStream stream(file[0].data(), file[0].size());
|
||||
CMemoryStream stream(files[0].data(), files[0].size());
|
||||
CBinaryReader reader(&stream);
|
||||
ret->header = readHeaderFromMemory(reader, resourceID.getName(), modName, encoding);
|
||||
|
||||
int howManyScenarios = ret->header.numberOfScenarios;
|
||||
for(int g = 0; g < howManyScenarios; ++g)
|
||||
{
|
||||
CCampaignScenario sc = readScenarioFromMemory(reader, ret->header);
|
||||
ret->scenarios.push_back(sc);
|
||||
}
|
||||
|
||||
int scenarioID = 0;
|
||||
|
||||
//first entry is campaign header. start loop from 1
|
||||
for (int g=1; g<file.size() && scenarioID<howManyScenarios; ++g)
|
||||
{
|
||||
while(!ret->scenarios[scenarioID].isNotVoid()) //skip void scenarios
|
||||
{
|
||||
scenarioID++;
|
||||
}
|
||||
|
||||
std::string scenarioName = resourceID.getName();
|
||||
boost::to_lower(scenarioName);
|
||||
scenarioName += ':' + std::to_string(g - 1);
|
||||
|
||||
//set map piece appropriately, convert vector to string
|
||||
ret->mapPieces[scenarioID].assign(reinterpret_cast< const char* >(file[g].data()), file[g].size());
|
||||
CMapService mapService;
|
||||
auto hdr = mapService.loadMapHeader(
|
||||
reinterpret_cast<const ui8 *>(ret->mapPieces[scenarioID].c_str()),
|
||||
static_cast<int>(ret->mapPieces[scenarioID].size()),
|
||||
scenarioName,
|
||||
modName,
|
||||
encoding);
|
||||
ret->scenarios[scenarioID].scenarioName = hdr->name;
|
||||
scenarioID++;
|
||||
}
|
||||
for(int g = 0; g < ret->header.numberOfScenarios; ++g)
|
||||
ret->scenarios.emplace_back(readScenarioFromMemory(reader, ret->header));
|
||||
}
|
||||
else
|
||||
{
|
||||
ret->header = readHeaderFromJson(jsonCampaign, resourceID.getName(), modName, encoding);
|
||||
|
||||
for(auto & scenario : jsonCampaign["scenarios"].Vector())
|
||||
{
|
||||
CCampaignScenario sc = readScenarioFromJson(scenario);
|
||||
if(sc.isNotVoid())
|
||||
{
|
||||
CMapService mapService;
|
||||
if(auto hdr = mapService.loadMapHeader(ResourceID(sc.mapName, EResType::MAP)))
|
||||
sc.scenarioName = hdr->name;
|
||||
}
|
||||
ret->scenarios.push_back(sc);
|
||||
}
|
||||
ret->scenarios.emplace_back(readScenarioFromJson(scenario));
|
||||
}
|
||||
|
||||
//first entry is campaign header. start loop from 1
|
||||
for(int scenarioID = 0, g = 1; g < files.size() && scenarioID < ret->header.numberOfScenarios; ++g)
|
||||
{
|
||||
while(!ret->scenarios[scenarioID].isNotVoid()) //skip void scenarios
|
||||
scenarioID++;
|
||||
|
||||
std::string scenarioName = resourceID.getName();
|
||||
boost::to_lower(scenarioName);
|
||||
scenarioName += ':' + std::to_string(g - 1);
|
||||
|
||||
//set map piece appropriately, convert vector to string
|
||||
ret->mapPieces[scenarioID].assign(reinterpret_cast<const char*>(files[g].data()), files[g].size());
|
||||
CMapService mapService;
|
||||
auto hdr = mapService.loadMapHeader(
|
||||
reinterpret_cast<const ui8 *>(ret->mapPieces[scenarioID].c_str()),
|
||||
static_cast<int>(ret->mapPieces[scenarioID].size()),
|
||||
scenarioName,
|
||||
modName,
|
||||
encoding);
|
||||
ret->scenarios[scenarioID].scenarioName = hdr->name;
|
||||
scenarioID++;
|
||||
}
|
||||
|
||||
// handle campaign specific discrepancies
|
||||
@@ -817,10 +797,7 @@ CMap * CCampaignState::getMap(int scenarioId) const
|
||||
if(scenarioId == -1)
|
||||
scenarioId = currentMap.value();
|
||||
|
||||
CMapService mapService;
|
||||
if(camp->header.version == CampaignVersion::Version::VCMI)
|
||||
return mapService.loadMap(ResourceID(camp->scenarios.at(scenarioId).mapName, EResType::MAP)).release();
|
||||
|
||||
CMapService mapService;
|
||||
std::string scenarioName = camp->header.filename.substr(0, camp->header.filename.find('.'));
|
||||
boost::to_lower(scenarioName);
|
||||
scenarioName += ':' + std::to_string(scenarioId);
|
||||
|
Reference in New Issue
Block a user