mirror of
https://github.com/vcmi/vcmi.git
synced 2024-11-28 08:48:48 +02:00
* reading of .h3c headers
* a bit of readNormalNr deduplication * minor changes
This commit is contained in:
parent
ba80ba4f6e
commit
d0bf334394
@ -18,7 +18,6 @@
|
||||
*/
|
||||
|
||||
boost::mutex bitmap_handler_mx;
|
||||
int readNormalNr (int pos, int bytCon, const unsigned char * str);
|
||||
|
||||
extern DLL_EXPORT CLodHandler *bitmaph;
|
||||
|
||||
@ -58,9 +57,9 @@ SDL_Surface * CPCXConv::getSurface() const
|
||||
unsigned char add;
|
||||
int it=0;
|
||||
|
||||
fSize = readNormalNr(it,4,pcx);it+=4;
|
||||
width = readNormalNr(it,4,pcx);it+=4;
|
||||
height = readNormalNr(it,4,pcx);it+=4;
|
||||
fSize = readNormalNr(pcx, it); it+=4;
|
||||
width = readNormalNr(pcx, it); it+=4;
|
||||
height = readNormalNr(pcx, it); it+=4;
|
||||
if (fSize==width*height*3)
|
||||
check1=true;
|
||||
else
|
||||
|
@ -680,16 +680,16 @@ Font::Font(unsigned char *Data)
|
||||
i = 32;
|
||||
for(int ci = 0; ci < 256; ci++)
|
||||
{
|
||||
chars[ci].unknown1 = CDefHandler::readNormalNr(i, 4, data); i+=4;
|
||||
chars[ci].width = CDefHandler::readNormalNr(i, 4, data); i+=4;
|
||||
chars[ci].unknown2 = CDefHandler::readNormalNr(i, 4, data); i+=4;
|
||||
chars[ci].unknown1 = readNormalNr(data, i); i+=4;
|
||||
chars[ci].width = readNormalNr(data, i); i+=4;
|
||||
chars[ci].unknown2 =readNormalNr(data, i); i+=4;
|
||||
|
||||
//if(ci>=30)
|
||||
// tlog0 << ci << ". (" << (char)ci << "). Width: " << chars[ci].width << " U1/U2:" << chars[ci].unknown1 << "/" << chars[ci].unknown2 << std::endl;
|
||||
}
|
||||
for(int ci = 0; ci < 256; ci++)
|
||||
{
|
||||
chars[ci].offset = CDefHandler::readNormalNr(i, 4, data); i+=4;
|
||||
chars[ci].offset = readNormalNr(data, i); i+=4;
|
||||
chars[ci].pixels = data + 4128 + chars[ci].offset;
|
||||
}
|
||||
}
|
||||
|
@ -4,10 +4,20 @@
|
||||
#include <boost/filesystem.hpp>
|
||||
#include <stdio.h>
|
||||
#include <boost/algorithm/string/predicate.hpp>
|
||||
|
||||
#include "CLodHandler.h"
|
||||
|
||||
namespace fs = boost::filesystem;
|
||||
|
||||
/*
|
||||
* CCampaignHandler.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
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
std::vector<CCampaignHeader> CCampaignHandler::getCampaignHeaders()
|
||||
{
|
||||
@ -37,15 +47,19 @@ std::vector<CCampaignHeader> CCampaignHandler::getCampaignHeaders()
|
||||
|
||||
CCampaignHeader CCampaignHandler::getHeader( const std::string & name, int size )
|
||||
{
|
||||
FILE * input = fopen(name.c_str(), "rb");
|
||||
char * tab = new char[size];
|
||||
fread(tab, 1, size, input);
|
||||
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);
|
||||
|
||||
|
||||
|
||||
delete [] tab;
|
||||
delete [] cmpgn;
|
||||
|
||||
return ret;
|
||||
}
|
@ -5,10 +5,29 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
/*
|
||||
* CCampaignHandler.h, 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
|
||||
*
|
||||
*/
|
||||
|
||||
class DLL_EXPORT CCampaignHeader
|
||||
{
|
||||
public:
|
||||
si32 version; //5 - AB, 6 - SoD, WoG - ?!?
|
||||
ui8 mapVersion; //CampText.txt's format
|
||||
std::string name, description;
|
||||
ui8 difficultyChoosenByPlayer;
|
||||
ui8 music; //CmpMusic.txt, start from 0
|
||||
|
||||
template <typename Handler> void serialize(Handler &h, const int formatVersion)
|
||||
{
|
||||
h & version & mapVersion & name & description & difficultyChoosenByPlayer & music;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
@ -144,32 +144,6 @@ void CDefHandler::expand(unsigned char N,unsigned char & BL, unsigned char & BR)
|
||||
BL = (N & 0xE0) >> 5;
|
||||
BR = N & 0x1F;
|
||||
}
|
||||
int CDefHandler::readNormalNr (int pos, int bytCon, const unsigned char * str, bool cyclic)
|
||||
{
|
||||
int ret=0;
|
||||
int amp=1;
|
||||
if (str)
|
||||
{
|
||||
for (int i=0; i<bytCon; i++)
|
||||
{
|
||||
ret+=str[pos+i]*amp;
|
||||
amp*=256;
|
||||
}
|
||||
}
|
||||
//else
|
||||
//{
|
||||
// for (int i=0; i<bytCon; i++)
|
||||
// {
|
||||
// ret+=FDef[pos+i]*amp;
|
||||
// amp*=256;
|
||||
// }
|
||||
//}
|
||||
if(cyclic && bytCon<4 && ret>=amp/2)
|
||||
{
|
||||
ret = ret-amp;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
SDL_Surface * CDefHandler::getSprite (int SIndex, const unsigned char * FDef, const BMPPalette * palette) const
|
||||
{
|
||||
|
@ -88,7 +88,6 @@ public:
|
||||
|
||||
CDefHandler(); //c-tor
|
||||
~CDefHandler(); //d-tor
|
||||
static int readNormalNr (int pos, int bytCon, const unsigned char * str=NULL, bool cyclic=false);
|
||||
SDL_Surface * getSprite (int SIndex, const unsigned char * FDef, const BMPPalette * palette) const; //zapisuje klatke o zadanym numerze do "testtt.bmp"
|
||||
void openDef(std::string name);
|
||||
static void expand(unsigned char N,unsigned char & BL, unsigned char & BR);
|
||||
|
@ -27,19 +27,35 @@
|
||||
*
|
||||
*/
|
||||
|
||||
DLL_EXPORT int readNormalNr (int pos, int bytCon, const unsigned char * str)
|
||||
int readNormalNr (const unsigned char * bufor, int pos, int bytCon, bool cyclic)
|
||||
{
|
||||
int ret=0;
|
||||
int amp=1;
|
||||
if (str)
|
||||
for (int ir=0; ir<bytCon; ir++)
|
||||
{
|
||||
for (int i=0; i<bytCon; i++)
|
||||
{
|
||||
ret+=str[pos+i]*amp;
|
||||
amp<<=8;
|
||||
}
|
||||
ret+=bufor[pos+ir]*amp;
|
||||
amp*=256;
|
||||
}
|
||||
if(cyclic && bytCon<4 && ret>=amp/2)
|
||||
{
|
||||
ret = ret-amp;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
char readChar(const unsigned char * bufor, int &i)
|
||||
{
|
||||
return bufor[i++];
|
||||
}
|
||||
|
||||
std::string readString(const unsigned char * bufor, int &i)
|
||||
{
|
||||
int len = readNormalNr(bufor,i); i+=4;
|
||||
std::string ret; ret.reserve(len);
|
||||
for(int gg=0; gg<len; ++gg)
|
||||
{
|
||||
ret += bufor[i++];
|
||||
}
|
||||
else return -1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -279,3 +295,47 @@ CLodHandler::~CLodHandler()
|
||||
{
|
||||
delete mutex;
|
||||
}
|
||||
|
||||
unsigned char * CLodHandler::getUnpackedFile( const std::string & path, int * sizeOut )
|
||||
{
|
||||
const int bufsize = 65536;
|
||||
int mapsize = 0;
|
||||
|
||||
gzFile map = gzopen(path.c_str(), "rb");
|
||||
std::vector<unsigned char *> mapstr;
|
||||
|
||||
// Read a map by chunks
|
||||
// We could try to read the map size directly (cf RFC 1952) and then read
|
||||
// directly the whole map, but that would create more problems.
|
||||
do {
|
||||
unsigned char *buf = new unsigned char[bufsize];
|
||||
|
||||
int ret = gzread(map, buf, bufsize);
|
||||
if (ret == 0 || ret == -1) {
|
||||
delete [] buf;
|
||||
break;
|
||||
}
|
||||
|
||||
mapstr.push_back(buf);
|
||||
mapsize += ret;
|
||||
} while(1);
|
||||
|
||||
gzclose(map);
|
||||
|
||||
// Now that we know the uncompressed size, reassemble the chunks
|
||||
unsigned char *initTable = new unsigned char[mapsize];
|
||||
|
||||
std::vector<unsigned char *>::iterator it;
|
||||
int offset;
|
||||
int tocopy = mapsize;
|
||||
for (it = mapstr.begin(), offset = 0;
|
||||
it != mapstr.end();
|
||||
it++, offset+=bufsize ) {
|
||||
memcpy(&initTable[offset], *it, tocopy > bufsize ? bufsize : tocopy);
|
||||
tocopy -= bufsize;
|
||||
delete [] *it;
|
||||
}
|
||||
|
||||
*sizeOut = mapsize;
|
||||
return initTable;
|
||||
}
|
@ -37,6 +37,12 @@ struct LodEntry {
|
||||
Uint32 size; /* little endian */
|
||||
};
|
||||
|
||||
DLL_EXPORT int readNormalNr (const unsigned char * bufor, int pos, int bytCon = 4, bool cyclic = false);
|
||||
|
||||
DLL_EXPORT char readChar(const unsigned char * bufor, int &i);
|
||||
|
||||
DLL_EXPORT std::string readString(const unsigned char * bufor, int &i);
|
||||
|
||||
struct Entry
|
||||
{
|
||||
// Info extracted from LOD file
|
||||
@ -76,6 +82,8 @@ public:
|
||||
std::string getTextFile(std::string name); //extracts one file
|
||||
void extractFile(std::string FName, std::string name); //extracts a specific file
|
||||
void init(std::string lodFile, std::string dirName);
|
||||
|
||||
static unsigned char * getUnpackedFile(const std::string & path, int * sizeOut); //loads given file, decompresses and returns
|
||||
};
|
||||
|
||||
|
||||
|
68
lib/map.cpp
68
lib/map.cpp
@ -139,35 +139,7 @@ static EDefType getDefType(CGDefInfo * a)
|
||||
return TERRAINOBJ_DEF; // nothing to be handled
|
||||
}
|
||||
}
|
||||
static int readNormalNr (const unsigned char * bufor, int pos, int bytCon = 4, bool cyclic = false)
|
||||
{
|
||||
int ret=0;
|
||||
int amp=1;
|
||||
for (int ir=0; ir<bytCon; ir++)
|
||||
{
|
||||
ret+=bufor[pos+ir]*amp;
|
||||
amp*=256;
|
||||
}
|
||||
if(cyclic && bytCon<4 && ret>=amp/2)
|
||||
{
|
||||
ret = ret-amp;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
static char readChar(const unsigned char * bufor, int &i)
|
||||
{
|
||||
return bufor[i++];
|
||||
}
|
||||
static std::string readString(const unsigned char * bufor, int &i)
|
||||
{
|
||||
int len = readNormalNr(bufor,i); i+=4;
|
||||
std::string ret; ret.reserve(len);
|
||||
for(int gg=0; gg<len; ++gg)
|
||||
{
|
||||
ret += bufor[i++];
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
static CCreatureSet readCreatureSet(const unsigned char * bufor, int &i, int number, bool version) //version==true for >RoE maps
|
||||
{
|
||||
if(version)
|
||||
@ -558,50 +530,18 @@ void Mapa::addBlockVisTiles(CGObjectInstance * obj)
|
||||
}
|
||||
Mapa::Mapa(std::string filename)
|
||||
{
|
||||
const int bufsize = 65536;
|
||||
int mapsize = 0;
|
||||
|
||||
tlog0<<"Opening map file: "<<filename<<"\t "<<std::flush;
|
||||
gzFile map = gzopen(filename.c_str(),"rb");
|
||||
std::vector<unsigned char *> mapstr;
|
||||
|
||||
// Read a map by chunks
|
||||
// We could try to read the map size directly (cf RFC 1952) and then read
|
||||
// directly the whole map, but that would create more problems.
|
||||
do {
|
||||
unsigned char *buf = new unsigned char[bufsize];
|
||||
|
||||
int ret = gzread(map, buf, bufsize);
|
||||
if (ret == 0 || ret == -1) {
|
||||
delete [] buf;
|
||||
break;
|
||||
}
|
||||
|
||||
mapstr.push_back(buf);
|
||||
mapsize += ret;
|
||||
} while(1);
|
||||
|
||||
gzclose(map);
|
||||
|
||||
// Now that we know the uncompressed size, reassemble the chunks
|
||||
unsigned char *initTable = new unsigned char[mapsize];
|
||||
|
||||
std::vector<unsigned char *>::iterator it;
|
||||
int offset;
|
||||
int tocopy = mapsize;
|
||||
for (it = mapstr.begin(), offset = 0;
|
||||
it != mapstr.end();
|
||||
it++, offset+=bufsize ) {
|
||||
memcpy(&initTable[offset], *it, tocopy > bufsize ? bufsize : tocopy);
|
||||
tocopy -= bufsize;
|
||||
delete [] *it;
|
||||
}
|
||||
//load file and decompress
|
||||
unsigned char * initTable = CLodHandler::getUnpackedFile(filename, &mapsize);
|
||||
|
||||
tlog0<<"done."<<std::endl;
|
||||
|
||||
// Compute checksum
|
||||
boost::crc_32_type result;
|
||||
result.process_bytes(initTable,mapsize);
|
||||
result.process_bytes(initTable, mapsize);
|
||||
checksum = result.checksum();
|
||||
tlog0 << "\tOur map checksum: "<<result.checksum() << std::endl;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user