From a975c54f8665451cacc3df1c80b68049b35e8854 Mon Sep 17 00:00:00 2001 From: mateuszb Date: Thu, 11 Feb 2010 14:12:22 +0000 Subject: [PATCH] * most of .h3c reading --- client/CPreGame.cpp | 6 +- hch/CCampaignHandler.cpp | 191 +++++++++++++++++++++++++++++++++++++-- hch/CCampaignHandler.h | 82 +++++++++++++++++ 3 files changed, 271 insertions(+), 8 deletions(-) diff --git a/client/CPreGame.cpp b/client/CPreGame.cpp index fb0cc1c28..9fbc97c65 100644 --- a/client/CPreGame.cpp +++ b/client/CPreGame.cpp @@ -106,7 +106,11 @@ CMenuScreen::CMenuScreen( EState which ) buttons[2] = new AdventureMapButton("", "", 0 /*cb*/, 486, 241, "ZSSARM.DEF", SDLK_c); buttons[3] = new AdventureMapButton("", "", 0 /*cb*/, 550, 358, "ZSSCUS.DEF", SDLK_t); buttons[4] = new AdventureMapButton("", "", bind(&CMenuScreen::moveTo, this, CGP->scrs[newGame]), 582, 464, "ZSSEXIT.DEF", SDLK_ESCAPE); - (new CCampaignHandler())->getCampaignHeaders(); //just for testing + + ////just for testing + CCampaignHandler * ch = new CCampaignHandler(); + ch->getCampaignHeaders(); + //ch->getCampaign("./Maps/1 Test cmpgn.h3c"); } break; } diff --git a/hch/CCampaignHandler.cpp b/hch/CCampaignHandler.cpp index 54bd442cd..b40f610f3 100644 --- a/hch/CCampaignHandler.cpp +++ b/hch/CCampaignHandler.cpp @@ -50,16 +50,193 @@ CCampaignHeader CCampaignHandler::getHeader( const std::string & name, int size int realSize; unsigned char * cmpgn = CLodHandler::getUnpackedFile(name, &realSize); - CCampaignHeader ret; int it = 0;//iterator for reading - ret.version = readNormalNr(cmpgn, it); it+=4; - ret.mapVersion = readChar(cmpgn, it); - ret.name = readString(cmpgn, it); - ret.description = readString(cmpgn, it); - ret.difficultyChoosenByPlayer = readChar(cmpgn, it); - ret.music = readChar(cmpgn, it); + CCampaignHeader ret = readHeaderFromMemory(cmpgn, it); delete [] cmpgn; + return ret; +} + +CCampaign * CCampaignHandler::getCampaign( const std::string & name ) +{ + CCampaign * ret = new CCampaign(); + + int realSize; + unsigned char * cmpgn = CLodHandler::getUnpackedFile(name, &realSize); + + int it = 0; //iterator for reading + ret->header = readHeaderFromMemory(cmpgn, it); + + it += 112; //omitting rubbish + CCampaignScenario sc = readScenarioFromMemory(cmpgn, it); + CCampaignScenario sc2 = readScenarioFromMemory(cmpgn, it); + + delete [] cmpgn; + + return ret; +} + +CCampaignHeader CCampaignHandler::readHeaderFromMemory( const unsigned char *buffer, int & outIt ) +{ + CCampaignHeader ret; + ret.version = readNormalNr(buffer, outIt); outIt+=4; + ret.mapVersion = readChar(buffer, outIt); + ret.name = readString(buffer, outIt); + ret.description = readString(buffer, outIt); + ret.difficultyChoosenByPlayer = readChar(buffer, outIt); + ret.music = readChar(buffer, outIt); + + return ret; +} + +CCampaignScenario CCampaignHandler::readScenarioFromMemory( const unsigned char *buffer, int & outIt ) +{ + struct HLP + { + //reads prolog/epilog info from memory + static CCampaignScenario::SScenarioPrologEpilog prologEpilogReader( const unsigned char *buffer, int & outIt ) + { + CCampaignScenario::SScenarioPrologEpilog ret; + ret.hasPrologEpilog = buffer[outIt++]; + if(ret.hasPrologEpilog) + { + ret.prologVideo = buffer[outIt++]; + ret.prologMusic = buffer[outIt++]; + ret.prologText = readString(buffer, outIt); + } + return ret; + } + }; + CCampaignScenario ret; + ret.mapName = readString(buffer, outIt); + ret.packedMapSize = readNormalNr(buffer, outIt); outIt += 4; + ret.preconditionRegion = buffer[outIt++]; + ret.regionColor = buffer[outIt++]; + ret.difficulty = buffer[outIt++]; + ret.regionText = readString(buffer, outIt); + ret.prolog = HLP::prologEpilogReader(buffer, outIt); + ret.epilog = HLP::prologEpilogReader(buffer, outIt); + + ret.travelOptions = readScenarioTravelFromMemory(buffer, outIt); + + return ret; +} + +CScenarioTravel CCampaignHandler::readScenarioTravelFromMemory( const unsigned char * buffer, int & outIt ) +{ + CScenarioTravel ret; + + ret.whatHeroKeeps = buffer[outIt++]; + memcpy(ret.monstersKeptByHero, buffer+outIt, ARRAY_COUNT(ret.monstersKeptByHero)); + outIt += ARRAY_COUNT(ret.monstersKeptByHero); + memcpy(ret.artifsKeptByHero, buffer+outIt, ARRAY_COUNT(ret.artifsKeptByHero)); + outIt += ARRAY_COUNT(ret.artifsKeptByHero); + + ret.startOptions = buffer[outIt++]; + + switch(ret.startOptions) + { + case 1: //reading of bonuses player can choose + { + ret.playerColor = buffer[outIt++]; + ui8 numOfBonuses = buffer[outIt++]; + for (int g=0; g void serialize(Handler &h, const int formatVersion) + { + h & type & info1 & info2 & info3; + } + }; + + std::vector bonusesToChoose; + + template void serialize(Handler &h, const int formatVersion) + { + h & whatHeroKeeps & monstersKeptByHero & artifsKeptByHero & startOptions & playerColor & bonusesToChoose; + } + +}; + +class DLL_EXPORT CCampaignScenario +{ +public: + std::string mapName; + ui32 packedMapSize; + ui8 preconditionRegion; + ui8 regionColor; + ui8 difficulty; + + std::string regionText; + + struct DLL_EXPORT SScenarioPrologEpilog + { + ui8 hasPrologEpilog; + ui8 prologVideo; // from CmpMovie.txt + ui8 prologMusic; // from CmpMusic.txt + std::string prologText; + + template void serialize(Handler &h, const int formatVersion) + { + h & hasPrologEpilog & prologVideo & prologMusic & prologText; + } + }; + + SScenarioPrologEpilog prolog, epilog; + + CScenarioTravel travelOptions; + + template void serialize(Handler &h, const int formatVersion) + { + h & mapName & packedMapSize & preconditionRegion & regionColor & difficulty & regionText & prolog & epilog & travelOptions; + } +}; + +class DLL_EXPORT CCampaign +{ +public: + CCampaignHeader header; + std::vector scenarios; + + template void serialize(Handler &h, const int formatVersion) + { + h & header & scenarios; + } +}; class DLL_EXPORT CCampaignHandler { + CCampaignHeader readHeaderFromMemory( const unsigned char *buffer, int & outIt ); + CCampaignScenario readScenarioFromMemory( const unsigned char *buffer, int & outIt ); + CScenarioTravel readScenarioTravelFromMemory( const unsigned char * buffer, int & outIt ); CCampaignHeader getHeader( const std::string & name, int size ); public: std::vector getCampaignHeaders(); + + CCampaign * getCampaign(const std::string & name); };