mirror of
https://github.com/vcmi/vcmi.git
synced 2024-12-24 22:14:36 +02:00
Added endian aware macros read_le_u16 and read_le_u32 to replace readNormalNR(). Fixes a couple of issues on big endian machines.
This commit is contained in:
parent
8963293c07
commit
8403d177aa
@ -6,6 +6,8 @@
|
||||
|
||||
#include "../lib/CLodHandler.h"
|
||||
#include "../lib/JsonNode.h"
|
||||
#include "../lib/vcmi_endian.h"
|
||||
|
||||
#include "CBitmapHandler.h"
|
||||
#include "Graphics.h"
|
||||
#include "CAnimation.h"
|
||||
@ -95,12 +97,12 @@ CDefFile::CDefFile(std::string Name):
|
||||
palette = new SDL_Color[256];
|
||||
int it = 0;
|
||||
|
||||
unsigned int type = readNormalNr(data, it);
|
||||
unsigned int type = read_le_u32(data + it);
|
||||
it+=4;
|
||||
//int width = readNormalNr(data, it); it+=4;//not used
|
||||
//int height = readNormalNr(data, it); it+=4;
|
||||
//int width = read_le_u32(data + it); it+=4;//not used
|
||||
//int height = read_le_u32(data + it); it+=4;
|
||||
it+=8;
|
||||
unsigned int totalBlocks = readNormalNr(data, it);
|
||||
unsigned int totalBlocks = read_le_u32(data + it);
|
||||
it+=4;
|
||||
|
||||
for (unsigned int i= 0; i<256; i++)
|
||||
@ -117,9 +119,9 @@ CDefFile::CDefFile(std::string Name):
|
||||
|
||||
for (unsigned int i=0; i<totalBlocks; i++)
|
||||
{
|
||||
size_t blockID = readNormalNr(data, it);
|
||||
size_t blockID = read_le_u32(data + it);
|
||||
it+=4;
|
||||
size_t totalEntries = readNormalNr(data, it);
|
||||
size_t totalEntries = read_le_u32(data + it);
|
||||
it+=12;
|
||||
//8 unknown bytes - skipping
|
||||
|
||||
@ -128,7 +130,7 @@ CDefFile::CDefFile(std::string Name):
|
||||
|
||||
for (unsigned int j=0; j<totalEntries; j++)
|
||||
{
|
||||
size_t currOffset = readNormalNr(data, it);
|
||||
size_t currOffset = read_le_u32(data + it);
|
||||
offset[blockID].push_back(currOffset);
|
||||
it += 4;
|
||||
}
|
||||
@ -185,7 +187,7 @@ void CDefFile::loadFrame(size_t frame, size_t group, ImageLoader &loader) const
|
||||
for (unsigned int i=0; i<sprite.height; i++)
|
||||
{
|
||||
//get position of the line
|
||||
currentOffset=BaseOffset + SDL_SwapLE32(read_unaligned_u32(RWEntriesLoc + i));
|
||||
currentOffset=BaseOffset + read_le_u32(RWEntriesLoc + i);
|
||||
unsigned int TotalRowLength = 0;
|
||||
|
||||
while (TotalRowLength<sprite.width)
|
||||
@ -211,7 +213,7 @@ void CDefFile::loadFrame(size_t frame, size_t group, ImageLoader &loader) const
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
currentOffset = BaseOffset + SDL_SwapLE16(read_unaligned_u16(FDef + BaseOffset));
|
||||
currentOffset = BaseOffset + read_le_u16(FDef + BaseOffset);
|
||||
|
||||
for (unsigned int i=0; i<sprite.height; i++)
|
||||
{
|
||||
@ -242,7 +244,7 @@ void CDefFile::loadFrame(size_t frame, size_t group, ImageLoader &loader) const
|
||||
{
|
||||
for (unsigned int i=0; i<sprite.height; i++)
|
||||
{
|
||||
currentOffset = BaseOffset + SDL_SwapLE16(read_unaligned_u16(FDef + BaseOffset+i*2*(sprite.width/32)));
|
||||
currentOffset = BaseOffset + read_le_u16(FDef + BaseOffset+i*2*(sprite.width/32));
|
||||
unsigned int TotalRowLength=0;
|
||||
|
||||
while (TotalRowLength<sprite.width)
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include "CBitmapHandler.h"
|
||||
#include "CDefHandler.h"
|
||||
#include "../lib/CLodHandler.h"
|
||||
#include "../lib/vcmi_endian.h"
|
||||
#include <sstream>
|
||||
#include <boost/thread.hpp>
|
||||
|
||||
@ -57,9 +58,9 @@ SDL_Surface * CPCXConv::getSurface() const
|
||||
unsigned char add;
|
||||
int it=0;
|
||||
|
||||
fSize = readNormalNr(pcx, it); it+=4;
|
||||
width = readNormalNr(pcx, it); it+=4;
|
||||
height = readNormalNr(pcx, it); it+=4;
|
||||
fSize = read_le_u32(pcx + it); it+=4;
|
||||
width = read_le_u32(pcx + it); it+=4;
|
||||
height = read_le_u32(pcx + it); it+=4;
|
||||
if (fSize==width*height*3)
|
||||
check1=true;
|
||||
else
|
||||
@ -142,9 +143,9 @@ SDL_Surface * CPCXConv::getSurface() const
|
||||
|
||||
bool isPCX(const unsigned char *header)//check whether file can be PCX according to 1st 12 bytes
|
||||
{
|
||||
int fSize = readNormalNr(header, 0);
|
||||
int width = readNormalNr(header, 4);
|
||||
int height = readNormalNr(header, 8);
|
||||
int fSize = read_le_u32(header + 0);
|
||||
int width = read_le_u32(header + 4);
|
||||
int height = read_le_u32(header + 8);
|
||||
return fSize == width*height || fSize == width*height*3;
|
||||
}
|
||||
|
||||
|
@ -1,6 +1,7 @@
|
||||
#include "CCreatureAnimation.h"
|
||||
#include "../lib/CLodHandler.h"
|
||||
#include "../lib/VCMI_Lib.h"
|
||||
#include "../lib/vcmi_endian.h"
|
||||
#include <assert.h>
|
||||
#include "SDL_Extensions.h"
|
||||
|
||||
@ -46,11 +47,11 @@ CCreatureAnimation::CCreatureAnimation(std::string name) : internalFrame(0), onc
|
||||
|
||||
defName=name;
|
||||
i = 0;
|
||||
DEFType = readNormalNr<4>(i,FDef); i+=4;
|
||||
fullWidth = readNormalNr<4>(i,FDef); i+=4;
|
||||
fullHeight = readNormalNr<4>(i,FDef); i+=4;
|
||||
DEFType = read_le_u32(FDef + i); i+=4;
|
||||
fullWidth = read_le_u32(FDef + i); i+=4;
|
||||
fullHeight = read_le_u32(FDef + i); i+=4;
|
||||
i=0xc;
|
||||
totalBlocks = readNormalNr<4>(i,FDef); i+=4;
|
||||
totalBlocks = read_le_u32(FDef + i); i+=4;
|
||||
|
||||
i=0x10;
|
||||
for (int it=0;it<256;it++)
|
||||
@ -65,20 +66,20 @@ CCreatureAnimation::CCreatureAnimation(std::string name) : internalFrame(0), onc
|
||||
for (int z=0; z<totalBlocks; z++)
|
||||
{
|
||||
std::vector<int> frameIDs;
|
||||
int group = readNormalNr<4>(i,FDef); i+=4; //block ID
|
||||
totalInBlock = readNormalNr<4>(i,FDef); i+=4;
|
||||
int group = read_le_u32(FDef + i); i+=4; //block ID
|
||||
totalInBlock = read_le_u32(FDef + i); i+=4;
|
||||
for (j=SEntries.size(); j<totalEntries+totalInBlock; j++)
|
||||
{
|
||||
SEntries.push_back(SEntry());
|
||||
SEntries[j].group = group;
|
||||
frameIDs.push_back(j);
|
||||
}
|
||||
/*int unknown2 = readNormalNr<4>(i,FDef);*/ i+=4; //TODO use me
|
||||
/*int unknown3 = readNormalNr<4>(i,FDef);*/ i+=4; //TODO use me
|
||||
/*int unknown2 = read_le_u32(FDef + i);*/ i+=4; //TODO use me
|
||||
/*int unknown3 = read_le_u32(FDef + i);*/ i+=4; //TODO use me
|
||||
i+=13*totalInBlock; //omitting names
|
||||
for (j=0; j<totalInBlock; j++)
|
||||
{
|
||||
SEntries[totalEntries+j].offset = readNormalNr<4>(i,FDef); i+=4;
|
||||
SEntries[totalEntries+j].offset = read_le_u32(FDef + i); i+=4;
|
||||
}
|
||||
//totalEntries+=totalInBlock;
|
||||
for(int hh=0; hh<totalInBlock; ++hh)
|
||||
@ -173,14 +174,15 @@ int CCreatureAnimation::nextFrameT(SDL_Surface * dest, int x, int y, bool attack
|
||||
unsigned char SegmentType, SegmentLength;
|
||||
|
||||
i = BaseOffset = SEntries[SIndex].offset;
|
||||
/*int prSize = readNormalNr<4>(i, FDef);*/ i += 4; //TODO use me
|
||||
int defType2 = readNormalNr<4>(i, FDef); i += 4;
|
||||
FullWidth = readNormalNr<4>(i, FDef); i += 4;
|
||||
FullHeight = readNormalNr<4>(i, FDef); i += 4;
|
||||
SpriteWidth = readNormalNr<4>(i, FDef); i += 4;
|
||||
SpriteHeight = readNormalNr<4>(i, FDef); i += 4;
|
||||
LeftMargin = readNormalNr<4>(i, FDef); i += 4;
|
||||
TopMargin = readNormalNr<4>(i, FDef); i += 4;
|
||||
|
||||
/*int prSize = read_le_u32(FDef + i);*/ i += 4; //TODO use me
|
||||
int defType2 = read_le_u32(FDef + i); i += 4;
|
||||
FullWidth = read_le_u32(FDef + i); i += 4;
|
||||
FullHeight = read_le_u32(FDef + i); i += 4;
|
||||
SpriteWidth = read_le_u32(FDef + i); i += 4;
|
||||
SpriteHeight = read_le_u32(FDef + i); i += 4;
|
||||
LeftMargin = read_le_u32(FDef + i); i += 4;
|
||||
TopMargin = read_le_u32(FDef + i); i += 4;
|
||||
RightMargin = FullWidth - SpriteWidth - LeftMargin;
|
||||
BottomMargin = FullHeight - SpriteHeight - TopMargin;
|
||||
|
||||
@ -194,11 +196,11 @@ int CCreatureAnimation::nextFrameT(SDL_Surface * dest, int x, int y, bool attack
|
||||
{
|
||||
ftcp += FullWidth * TopMargin;
|
||||
}
|
||||
int *RLEntries = (int*)(FDef + BaseOffset);
|
||||
ui32 *RLEntries = (ui32*)(FDef + BaseOffset);
|
||||
BaseOffset += sizeof(int) * SpriteHeight;
|
||||
for (int i = 0; i < SpriteHeight; i++)
|
||||
{
|
||||
BaseOffset = BaseOffsetor + RLEntries[i];
|
||||
BaseOffset = BaseOffsetor + SDL_SwapLE32(RLEntries[i]);
|
||||
if (LeftMargin > 0)
|
||||
{
|
||||
ftcp += LeftMargin;
|
||||
|
@ -4,6 +4,7 @@
|
||||
#include <sstream>
|
||||
#include "../lib/CLodHandler.h"
|
||||
#include "../lib/VCMI_Lib.h"
|
||||
#include "../lib/vcmi_endian.h"
|
||||
#include "CBitmapHandler.h"
|
||||
|
||||
/*
|
||||
@ -80,7 +81,7 @@ void CDefHandler::openFromMemory(unsigned char *table, const std::string & name)
|
||||
SDefEntryBlock &block = * reinterpret_cast<SDefEntryBlock *>(p);
|
||||
unsigned int totalInBlock;
|
||||
|
||||
totalInBlock = SDL_SwapLE32(read_unaligned_u32(&block.totalInBlock));
|
||||
totalInBlock = read_le_u32(&block.totalInBlock);
|
||||
|
||||
for (unsigned int j=SEntries.size(); j<totalEntries+totalInBlock; j++)
|
||||
SEntries.push_back(SEntry());
|
||||
@ -96,7 +97,7 @@ void CDefHandler::openFromMemory(unsigned char *table, const std::string & name)
|
||||
}
|
||||
for (unsigned int j=0; j<totalInBlock; j++)
|
||||
{
|
||||
SEntries[totalEntries+j].offset = SDL_SwapLE32(read_unaligned_u32(p));
|
||||
SEntries[totalEntries+j].offset = read_le_u32(p);
|
||||
p += 4;
|
||||
}
|
||||
//totalEntries+=totalInBlock;
|
||||
@ -222,7 +223,7 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, const unsigned char * FDef, co
|
||||
BaseOffset += sizeof(int) * SpriteHeight;
|
||||
for (unsigned int i=0;i<SpriteHeight;i++)
|
||||
{
|
||||
BaseOffset=BaseOffsetor + SDL_SwapLE32(read_unaligned_u32(RWEntriesLoc + i));
|
||||
BaseOffset=BaseOffsetor + read_le_u32(RWEntriesLoc + i);
|
||||
if (LeftMargin>0)
|
||||
ftcp += LeftMargin;
|
||||
|
||||
@ -260,7 +261,7 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, const unsigned char * FDef, co
|
||||
|
||||
case 2:
|
||||
{
|
||||
BaseOffset = BaseOffsetor + SDL_SwapLE16(read_unaligned_u16(FDef + BaseOffsetor));
|
||||
BaseOffset = BaseOffsetor + read_le_u16(FDef + BaseOffsetor);
|
||||
|
||||
for (unsigned int i=0;i<SpriteHeight;i++)
|
||||
{
|
||||
@ -304,7 +305,7 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, const unsigned char * FDef, co
|
||||
{
|
||||
for (unsigned int i=0;i<SpriteHeight;i++)
|
||||
{
|
||||
BaseOffset = BaseOffsetor + SDL_SwapLE16(read_unaligned_u16(FDef + BaseOffsetor+i*2*(SpriteWidth/32)));
|
||||
BaseOffset = BaseOffsetor + read_le_u16(FDef + BaseOffsetor+i*2*(SpriteWidth/32));
|
||||
if (LeftMargin>0)
|
||||
ftcp += LeftMargin;
|
||||
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include "../lib/CDefObjInfoHandler.h"
|
||||
#include "../lib/CGameState.h"
|
||||
#include "../lib/JsonNode.h"
|
||||
#include "../lib/vcmi_endian.h"
|
||||
|
||||
using namespace boost::assign;
|
||||
using namespace CSDL_Ext;
|
||||
@ -670,7 +671,7 @@ Font * Graphics::loadFont( const char * name )
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int magic = *(const int*)hlp;
|
||||
int magic = SDL_SwapLE32(*(const Uint32*)hlp);
|
||||
if(len < 10000 || (magic != 589598 && magic != 589599))
|
||||
{
|
||||
tlog1 << "Suspicious font file (length " << len <<", fname " << name << "), logging to suspicious_" << name << ".fnt\n";
|
||||
@ -731,16 +732,16 @@ Font::Font(unsigned char *Data)
|
||||
i = 32;
|
||||
for(int ci = 0; ci < 256; ci++)
|
||||
{
|
||||
chars[ci].unknown1 = readNormalNr(data, i); i+=4;
|
||||
chars[ci].width = readNormalNr(data, i); i+=4;
|
||||
chars[ci].unknown2 =readNormalNr(data, i); i+=4;
|
||||
chars[ci].unknown1 = read_le_u32(data + i); i+=4;
|
||||
chars[ci].width = read_le_u32(data + i); i+=4;
|
||||
chars[ci].unknown2 = read_le_u32(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 = readNormalNr(data, i); i+=4;
|
||||
chars[ci].offset = read_le_u32(data + i); i+=4;
|
||||
chars[ci].pixels = data + 4128 + chars[ci].offset;
|
||||
}
|
||||
}
|
||||
|
@ -1063,23 +1063,6 @@ void CSDL_Ext::setPlayerColor(SDL_Surface * sur, unsigned char player)
|
||||
else
|
||||
tlog3 << "Warning, setPlayerColor called on not 8bpp surface!\n";
|
||||
}
|
||||
int readNormalNr (std::istream &in, int bytCon)
|
||||
{
|
||||
int ret=0;
|
||||
int amp=1;
|
||||
unsigned char byte;
|
||||
if (in.good())
|
||||
{
|
||||
for (int i=0; i<bytCon; i++)
|
||||
{
|
||||
in.read((char*)&byte,1);
|
||||
ret+=byte*amp;
|
||||
amp<<=8;
|
||||
}
|
||||
}
|
||||
else return -1;
|
||||
return ret;
|
||||
}
|
||||
|
||||
const TColorPutter CSDL_Ext::getPutterFor(SDL_Surface * const &dest, int incrementing)
|
||||
{
|
||||
@ -1323,4 +1306,4 @@ template struct ColorPutter<3, 0>;
|
||||
template struct ColorPutter<4, 0>;
|
||||
template struct ColorPutter<2, 1>;
|
||||
template struct ColorPutter<3, 1>;
|
||||
template struct ColorPutter<4, 1>;
|
||||
template struct ColorPutter<4, 1>;
|
||||
|
24
global.h
24
global.h
@ -722,30 +722,6 @@ extern DLL_EXPORT CLogger tlog6; //teal - AI info
|
||||
throw; \
|
||||
}
|
||||
|
||||
|
||||
#if defined(linux) && defined(sparc)
|
||||
/* SPARC does not support unaligned memory access. Let gcc know when
|
||||
* to emit the right code. */
|
||||
struct unaligned_Uint16 { ui16 val __attribute__(( packed )); };
|
||||
struct unaligned_Uint32 { ui32 val __attribute__(( packed )); };
|
||||
|
||||
static inline ui16 read_unaligned_u16(const void *p)
|
||||
{
|
||||
const struct unaligned_Uint16 *v = (const struct unaligned_Uint16 *)p;
|
||||
return v->val;
|
||||
}
|
||||
|
||||
static inline ui32 read_unaligned_u32(const void *p)
|
||||
{
|
||||
const struct unaligned_Uint32 *v = (const struct unaligned_Uint32 *)p;
|
||||
return v->val;
|
||||
}
|
||||
|
||||
#else
|
||||
#define read_unaligned_u16(p) (* reinterpret_cast<const Uint16 *>(p))
|
||||
#define read_unaligned_u32(p) (* reinterpret_cast<const Uint32 *>(p))
|
||||
#endif
|
||||
|
||||
//for explicit overrides
|
||||
#ifdef _MSC_VER
|
||||
#define OVERRIDE override
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include <boost/algorithm/string/predicate.hpp>
|
||||
#include "CLodHandler.h"
|
||||
#include "../lib/VCMI_Lib.h"
|
||||
#include "../lib/vcmi_endian.h"
|
||||
#include "CGeneralTextHandler.h"
|
||||
#include "../StartInfo.h"
|
||||
#include "CArtHandler.h" //for hero crossover
|
||||
@ -141,8 +142,8 @@ CCampaign * CCampaignHandler::getCampaign( const std::string & name, bool fromLo
|
||||
CCampaignHeader CCampaignHandler::readHeaderFromMemory( const unsigned char *buffer, int & outIt )
|
||||
{
|
||||
CCampaignHeader ret;
|
||||
ret.version = readNormalNr(buffer, outIt); outIt+=4;
|
||||
ret.mapVersion = readChar(buffer, outIt);
|
||||
ret.version = read_le_u32(buffer + outIt); outIt+=4;
|
||||
ret.mapVersion = read_le_u32(buffer + outIt);
|
||||
ret.mapVersion -= 1; //change range of it from [1, 20] to [0, 19]
|
||||
ret.name = readString(buffer, outIt);
|
||||
ret.description = readString(buffer, outIt);
|
||||
@ -177,10 +178,10 @@ CCampaignScenario CCampaignHandler::readScenarioFromMemory( const unsigned char
|
||||
CCampaignScenario ret;
|
||||
ret.conquered = false;
|
||||
ret.mapName = readString(buffer, outIt);
|
||||
ret.packedMapSize = readNormalNr(buffer, outIt); outIt += 4;
|
||||
ret.packedMapSize = read_le_u32(buffer + outIt); outIt += 4;
|
||||
if(mapVersion == 18)//unholy alliance
|
||||
{
|
||||
ret.preconditionRegion = readNormalNr(buffer, outIt, 2); outIt += 2;
|
||||
ret.preconditionRegion = read_le_u16(buffer + outIt); outIt += 2;
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -237,15 +238,15 @@ CScenarioTravel CCampaignHandler::readScenarioTravelFromMemory( const unsigned c
|
||||
{
|
||||
case 0: //spell
|
||||
{
|
||||
bonus.info1 = readNormalNr(buffer, outIt, 2); outIt += 2; //hero
|
||||
bonus.info1 = read_le_u16(buffer + outIt); outIt += 2; //hero
|
||||
bonus.info2 = buffer[outIt++]; //spell ID
|
||||
break;
|
||||
}
|
||||
case 1: //monster
|
||||
{
|
||||
bonus.info1 = readNormalNr(buffer, outIt, 2); outIt += 2; //hero
|
||||
bonus.info2 = readNormalNr(buffer, outIt, 2); outIt += 2; //monster type
|
||||
bonus.info3 = readNormalNr(buffer, outIt, 2); outIt += 2; //monster count
|
||||
bonus.info1 = read_le_u16(buffer + outIt); outIt += 2; //hero
|
||||
bonus.info2 = read_le_u16(buffer + outIt); outIt += 2; //monster type
|
||||
bonus.info3 = read_le_u16(buffer + outIt); outIt += 2; //monster count
|
||||
break;
|
||||
}
|
||||
case 2: //building
|
||||
@ -255,25 +256,25 @@ CScenarioTravel CCampaignHandler::readScenarioTravelFromMemory( const unsigned c
|
||||
}
|
||||
case 3: //artifact
|
||||
{
|
||||
bonus.info1 = readNormalNr(buffer, outIt, 2); outIt += 2; //hero
|
||||
bonus.info2 = readNormalNr(buffer, outIt, 2); outIt += 2; //artifact ID
|
||||
bonus.info1 = read_le_u16(buffer + outIt); outIt += 2; //hero
|
||||
bonus.info2 = read_le_u16(buffer + outIt); outIt += 2; //artifact ID
|
||||
break;
|
||||
}
|
||||
case 4: //spell scroll
|
||||
{
|
||||
bonus.info1 = readNormalNr(buffer, outIt, 2); outIt += 2; //hero
|
||||
bonus.info1 = read_le_u16(buffer + outIt); outIt += 2; //hero
|
||||
bonus.info2 = buffer[outIt++]; //spell ID
|
||||
break;
|
||||
}
|
||||
case 5: //prim skill
|
||||
{
|
||||
bonus.info1 = readNormalNr(buffer, outIt, 2); outIt += 2; //hero
|
||||
bonus.info2 = readNormalNr(buffer, outIt, 4); outIt += 4; //bonuses (4 bytes for 4 skills)
|
||||
bonus.info1 = read_le_u16(buffer + outIt); outIt += 2; //hero
|
||||
bonus.info2 = read_le_u32(buffer + outIt); outIt += 4; //bonuses (4 bytes for 4 skills)
|
||||
break;
|
||||
}
|
||||
case 6: //sec skills
|
||||
{
|
||||
bonus.info1 = readNormalNr(buffer, outIt, 2); outIt += 2; //hero
|
||||
bonus.info1 = read_le_u16(buffer + outIt); outIt += 2; //hero
|
||||
bonus.info2 = buffer[outIt++]; //skill ID
|
||||
bonus.info3 = buffer[outIt++]; //skill level
|
||||
break;
|
||||
@ -283,7 +284,7 @@ CScenarioTravel CCampaignHandler::readScenarioTravelFromMemory( const unsigned c
|
||||
bonus.info1 = buffer[outIt++]; //type
|
||||
//FD - wood+ore
|
||||
//FE - mercury+sulfur+crystal+gem
|
||||
bonus.info2 = readNormalNr(buffer, outIt, 4); outIt += 4; //count
|
||||
bonus.info2 = read_le_u32(buffer + outIt); outIt += 4; //count
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -313,7 +314,7 @@ CScenarioTravel CCampaignHandler::readScenarioTravelFromMemory( const unsigned c
|
||||
CScenarioTravel::STravelBonus bonus;
|
||||
bonus.type = 9;
|
||||
bonus.info1 = buffer[outIt++]; //player color
|
||||
bonus.info2 = readNormalNr(buffer, outIt, 2); outIt += 2; //hero, FF FF - random
|
||||
bonus.info2 = read_le_u16(buffer + outIt); outIt += 2; //hero, FF FF - random
|
||||
|
||||
ret.bonusesToChoose.push_back(bonus);
|
||||
}
|
||||
@ -378,7 +379,7 @@ bool CCampaignHandler::startsAt( const unsigned char * buffer, int size, int pos
|
||||
return false;
|
||||
}
|
||||
//size of map
|
||||
int mapsize = readNormalNr(buffer, pos+5);
|
||||
int mapsize = read_le_u32(buffer + pos+5);
|
||||
if(mapsize < 10 || mapsize > 530)
|
||||
{
|
||||
return false;
|
||||
@ -392,7 +393,7 @@ bool CCampaignHandler::startsAt( const unsigned char * buffer, int size, int pos
|
||||
}
|
||||
|
||||
//map name
|
||||
int len = readNormalNr(buffer, pos+10);
|
||||
int len = read_le_u32(buffer + pos+10);
|
||||
if(len < 0 || len > 100)
|
||||
{
|
||||
return false;
|
||||
@ -573,4 +574,4 @@ void CCampaignState::mapConquered( const std::vector<CGHeroInstance*> & heroes )
|
||||
mapsConquered.push_back(currentMap);
|
||||
mapsRemaining -= currentMap;
|
||||
camp->scenarios[currentMap].conquered = true;
|
||||
}
|
||||
}
|
||||
|
@ -12,7 +12,7 @@
|
||||
#include <boost/algorithm/string/replace.hpp>
|
||||
#include <boost/thread.hpp>
|
||||
#include <boost/foreach.hpp>
|
||||
#include <SDL_endian.h>
|
||||
#include "vcmi_endian.h"
|
||||
#ifdef max
|
||||
#undef max
|
||||
#endif
|
||||
@ -31,6 +31,7 @@ int readNormalNr (const unsigned char * bufor, int pos, int bytCon, bool cyclic)
|
||||
{
|
||||
int ret=0;
|
||||
int amp=1;
|
||||
|
||||
for (int ir=0; ir<bytCon; ir++)
|
||||
{
|
||||
ret+=bufor[pos+ir]*amp;
|
||||
@ -50,7 +51,7 @@ char readChar(const unsigned char * bufor, int &i)
|
||||
|
||||
std::string readString(const unsigned char * bufor, int &i)
|
||||
{
|
||||
int len = readNormalNr(bufor,i); i+=4;
|
||||
int len = read_le_u32(bufor + i); i+=4;
|
||||
assert(len >= 0 && len <= 500000); //not too long
|
||||
std::string ret; ret.reserve(len);
|
||||
for(int gg=0; gg<len; ++gg)
|
||||
|
187
lib/map.cpp
187
lib/map.cpp
@ -14,6 +14,7 @@
|
||||
#include "CSpellHandler.h"
|
||||
#include <boost/foreach.hpp>
|
||||
#include "../lib/JsonNode.h"
|
||||
#include "vcmi_endian.h"
|
||||
|
||||
/*
|
||||
* map.cpp, part of VCMI engine
|
||||
@ -137,13 +138,13 @@ CMapHeader::CMapHeader()
|
||||
|
||||
void CMapHeader::initFromMemory( const unsigned char *bufor, int &i )
|
||||
{
|
||||
version = (Eformat)(readNormalNr(bufor,i)); i+=4; //map version
|
||||
version = (Eformat)(read_le_u32(bufor + i)); i+=4; //map version
|
||||
if(version != RoE && version != AB && version != SoD && version != WoG)
|
||||
{
|
||||
throw std::string("Invalid map format!");
|
||||
}
|
||||
areAnyPLayers = readChar(bufor,i); //invalid on some maps
|
||||
height = width = (readNormalNr(bufor,i)); i+=4; // dimensions of map
|
||||
height = width = (read_le_u32(bufor + i)); i+=4; // dimensions of map
|
||||
twoLevel = readChar(bufor,i); //if there is underground
|
||||
int pom;
|
||||
name = readString(bufor,i);
|
||||
@ -184,7 +185,7 @@ void CMapHeader::initFromMemory( const unsigned char *bufor, int &i )
|
||||
}
|
||||
if(version>RoE) //probably reserved for further heroes
|
||||
{
|
||||
int placeholdersQty = readNormalNr(bufor, i); i+=4;
|
||||
int placeholdersQty = read_le_u32(bufor + i); i+=4;
|
||||
for(int p = 0; p < placeholdersQty; p++)
|
||||
placeholdedHeroes.push_back(bufor[i++]);
|
||||
}
|
||||
@ -296,14 +297,14 @@ void CMapHeader::loadViCLossConditions( const unsigned char * bufor, int &i)
|
||||
// int temp1 = bufor[i+2];
|
||||
// int temp2 = bufor[i+3];
|
||||
victoryCondition.ID = bufor[i+2];
|
||||
victoryCondition.count = readNormalNr(bufor, i+(version==RoE ? 3 : 4));
|
||||
victoryCondition.count = read_le_u32(bufor + i+(version==RoE ? 3 : 4));
|
||||
nr=(version==RoE ? 5 : 6);
|
||||
break;
|
||||
}
|
||||
case gatherResource:
|
||||
{
|
||||
victoryCondition.ID = bufor[i+2];
|
||||
victoryCondition.count = readNormalNr(bufor, i+3);
|
||||
victoryCondition.count = read_le_u32(bufor + i+3);
|
||||
nr = 5;
|
||||
break;
|
||||
}
|
||||
@ -373,8 +374,8 @@ void CMapHeader::loadViCLossConditions( const unsigned char * bufor, int &i)
|
||||
}
|
||||
case timeExpires:
|
||||
{
|
||||
lossCondition.timeLimit = readNormalNr(bufor,i++,2);
|
||||
i++;
|
||||
lossCondition.timeLimit = read_le_u16(bufor + i);
|
||||
i+=2;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -575,12 +576,12 @@ int Mapa::loadSeerHut( const unsigned char * bufor, int i, CGObjectInstance *& n
|
||||
{
|
||||
case 1:
|
||||
{
|
||||
hut->rVal = readNormalNr(bufor,i); i+=4;
|
||||
hut->rVal = read_le_u32(bufor + i); i+=4;
|
||||
break;
|
||||
}
|
||||
case 2:
|
||||
{
|
||||
hut->rVal = readNormalNr(bufor,i); i+=4;
|
||||
hut->rVal = read_le_u32(bufor + i); i+=4;
|
||||
break;
|
||||
}
|
||||
case 3:
|
||||
@ -626,13 +627,13 @@ int Mapa::loadSeerHut( const unsigned char * bufor, int i, CGObjectInstance *& n
|
||||
{
|
||||
if(version>RoE)
|
||||
{
|
||||
hut->rID = readNormalNr(bufor,i, 2); i+=2;
|
||||
hut->rVal = readNormalNr(bufor,i, 2); i+=2;
|
||||
hut->rID = read_le_u16(bufor + i); i+=2;
|
||||
hut->rVal = read_le_u16(bufor + i); i+=2;
|
||||
}
|
||||
else
|
||||
{
|
||||
hut->rID = bufor[i]; ++i;
|
||||
hut->rVal = readNormalNr(bufor,i, 2); i+=2;
|
||||
hut->rVal = read_le_u16(bufor + i); i+=2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -655,7 +656,7 @@ void Mapa::loadTown( CGObjectInstance * &nobj, const unsigned char * bufor, int
|
||||
nt->identifier = 0;
|
||||
if(version>RoE)
|
||||
{
|
||||
nt->identifier = readNormalNr(bufor,i); i+=4;
|
||||
nt->identifier = read_le_u32(bufor + i); i+=4;
|
||||
}
|
||||
nt->tempOwner = bufor[i]; ++i;
|
||||
if(readChar(bufor,i)) //has name
|
||||
@ -724,7 +725,7 @@ void Mapa::loadTown( CGObjectInstance * &nobj, const unsigned char * bufor, int
|
||||
|
||||
/////// reading castle events //////////////////////////////////
|
||||
|
||||
int numberOfEvent = readNormalNr(bufor,i); i+=4;
|
||||
int numberOfEvent = read_le_u32(bufor + i); i+=4;
|
||||
|
||||
for(int gh = 0; gh<numberOfEvent; ++gh)
|
||||
{
|
||||
@ -734,7 +735,7 @@ void Mapa::loadTown( CGObjectInstance * &nobj, const unsigned char * bufor, int
|
||||
nce->message = readString(bufor,i);
|
||||
for(int x=0; x < 7; x++)
|
||||
{
|
||||
nce->resources[x] = readNormalNr(bufor,i);
|
||||
nce->resources[x] = read_le_u32(bufor + i);
|
||||
i+=4;
|
||||
}
|
||||
|
||||
@ -747,7 +748,7 @@ void Mapa::loadTown( CGObjectInstance * &nobj, const unsigned char * bufor, int
|
||||
nce->humanAffected = true;
|
||||
|
||||
nce->computerAffected = bufor[i]; ++i;
|
||||
nce->firstOccurence = readNormalNr(bufor,i, 2); i+=2;
|
||||
nce->firstOccurence = read_le_u16(bufor + i); i+=2;
|
||||
nce->nextOccurence = bufor[i]; ++i;
|
||||
|
||||
i+=17;
|
||||
@ -765,7 +766,7 @@ void Mapa::loadTown( CGObjectInstance * &nobj, const unsigned char * bufor, int
|
||||
nce->creatures.resize(7);
|
||||
for(int vv=0; vv<7; ++vv)
|
||||
{
|
||||
nce->creatures[vv] = readNormalNr(bufor,i, 2);i+=2;
|
||||
nce->creatures[vv] = read_le_u16(bufor + i);i+=2;
|
||||
}
|
||||
i+=4;
|
||||
nt->events.push_back(nce);
|
||||
@ -791,12 +792,12 @@ CGObjectInstance * Mapa::loadHero(const unsigned char * bufor, int &i, int idToB
|
||||
int identifier = 0;
|
||||
if(version > RoE)
|
||||
{
|
||||
identifier = readNormalNr(bufor,i, 4); i+=4;
|
||||
identifier = read_le_u32(bufor + i); i+=4;
|
||||
questIdentifierToId[identifier] = idToBeGiven;
|
||||
}
|
||||
|
||||
ui8 owner = bufor[i++];
|
||||
nhi->subID = readNormalNr(bufor,i, 1); ++i;
|
||||
nhi->subID = bufor[i++];
|
||||
|
||||
for(unsigned int j=0; j<predefinedHeroes.size(); j++)
|
||||
{
|
||||
@ -826,13 +827,13 @@ CGObjectInstance * Mapa::loadHero(const unsigned char * bufor, int &i, int idToB
|
||||
if(version>AB)
|
||||
{
|
||||
if(readChar(bufor,i))//true if hero's experience is greater than 0
|
||||
{ nhi->exp = readNormalNr(bufor,i); i+=4; }
|
||||
{ nhi->exp = read_le_u32(bufor + i); i+=4; }
|
||||
else
|
||||
nhi->exp = 0xffffffff;
|
||||
}
|
||||
else
|
||||
{
|
||||
nhi->exp = readNormalNr(bufor,i); i+=4;
|
||||
nhi->exp = read_le_u32(bufor + i); i+=4;
|
||||
if(!nhi->exp) //0 means "not set" in <=AB maps
|
||||
nhi->exp = 0xffffffff;
|
||||
}
|
||||
@ -842,12 +843,12 @@ CGObjectInstance * Mapa::loadHero(const unsigned char * bufor, int &i, int idToB
|
||||
nhi->portrait = bufor[i++];
|
||||
if(readChar(bufor,i))//true if hero has specified abilities
|
||||
{
|
||||
int howMany = readNormalNr(bufor,i); i+=4;
|
||||
int howMany = read_le_u32(bufor + i); i+=4;
|
||||
nhi->secSkills.resize(howMany);
|
||||
for(int yy=0; yy<howMany; ++yy)
|
||||
{
|
||||
nhi->secSkills[yy].first = readNormalNr(bufor,i, 1); ++i;
|
||||
nhi->secSkills[yy].second = readNormalNr(bufor,i, 1); ++i;
|
||||
nhi->secSkills[yy].first = bufor[i++];
|
||||
nhi->secSkills[yy].second = bufor[i++];
|
||||
}
|
||||
}
|
||||
if(readChar(bufor,i))//true if hero has nonstandard garrison
|
||||
@ -855,7 +856,7 @@ CGObjectInstance * Mapa::loadHero(const unsigned char * bufor, int &i, int idToB
|
||||
|
||||
nhi->formation =bufor[i]; ++i; //formation
|
||||
loadArtifactsOfHero(bufor, i, nhi);
|
||||
nhi->patrol.patrolRadious = readNormalNr(bufor,i, 1); ++i;
|
||||
nhi->patrol.patrolRadious = bufor[i]; ++i;
|
||||
if(nhi->patrol.patrolRadious == 0xff)
|
||||
nhi->patrol.patrolling = false;
|
||||
else
|
||||
@ -921,14 +922,14 @@ CGObjectInstance * Mapa::loadHero(const unsigned char * bufor, int &i, int idToB
|
||||
|
||||
void Mapa::readRumors( const unsigned char * bufor, int &i)
|
||||
{
|
||||
int rumNr = readNormalNr(bufor,i,4);i+=4;
|
||||
int rumNr = read_le_u32(bufor + i);i+=4;
|
||||
for (int it=0;it<rumNr;it++)
|
||||
{
|
||||
Rumor ourRumor;
|
||||
int nameL = readNormalNr(bufor,i,4);i+=4; //read length of name of rumor
|
||||
int nameL = read_le_u32(bufor + i);i+=4; //read length of name of rumor
|
||||
for (int zz=0; zz<nameL; zz++)
|
||||
ourRumor.name+=bufor[i++];
|
||||
nameL = readNormalNr(bufor,i,4);i+=4; //read length of rumor
|
||||
nameL = read_le_u32(bufor + i);i+=4; //read length of rumor
|
||||
for (int zz=0; zz<nameL; zz++)
|
||||
ourRumor.text+=bufor[i++];
|
||||
rumors.push_back(ourRumor); //add to our list
|
||||
@ -949,7 +950,7 @@ void Mapa::readHeader( const unsigned char * bufor, int &i)
|
||||
{
|
||||
disposedHeroes[g].ID = bufor[i++];
|
||||
disposedHeroes[g].portrait = bufor[i++];
|
||||
int lenbuf = readNormalNr(bufor,i); i+=4;
|
||||
int lenbuf = read_le_u32(bufor + i); i+=4;
|
||||
for (int zz=0; zz<lenbuf; zz++)
|
||||
disposedHeroes[g].name+=bufor[i++];
|
||||
disposedHeroes[g].players = bufor[i++];
|
||||
@ -1046,17 +1047,17 @@ void Mapa::readPredefinedHeroes( const unsigned char * bufor, int &i)
|
||||
cgh->ID = HEROI_TYPE;
|
||||
cgh->subID = z;
|
||||
if(readChar(bufor,i))//true if hore's experience is greater than 0
|
||||
{ cgh->exp = readNormalNr(bufor,i); i+=4; }
|
||||
{ cgh->exp = read_le_u32(bufor + i); i+=4; }
|
||||
else
|
||||
cgh->exp = 0;
|
||||
if(readChar(bufor,i))//true if hero has specified abilities
|
||||
{
|
||||
int howMany = readNormalNr(bufor,i); i+=4;
|
||||
int howMany = read_le_u32(bufor + i); i+=4;
|
||||
cgh->secSkills.resize(howMany);
|
||||
for(int yy=0; yy<howMany; ++yy)
|
||||
{
|
||||
cgh->secSkills[yy].first = readNormalNr(bufor,i, 1); ++i;
|
||||
cgh->secSkills[yy].second = readNormalNr(bufor,i, 1); ++i;
|
||||
cgh->secSkills[yy].first = bufor[i]; ++i;
|
||||
cgh->secSkills[yy].second = bufor[i]; ++i;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1143,14 +1144,14 @@ void Mapa::readTerrain( const unsigned char * bufor, int &i)
|
||||
|
||||
void Mapa::readDefInfo( const unsigned char * bufor, int &i)
|
||||
{
|
||||
int defAmount = readNormalNr(bufor,i); i+=4;
|
||||
int defAmount = read_le_u32(bufor + i); i+=4;
|
||||
defy.reserve(defAmount+8);
|
||||
for (int idd = 0 ; idd<defAmount; idd++) // reading defs
|
||||
{
|
||||
CGDefInfo * vinya = new CGDefInfo(); // info about new def
|
||||
|
||||
//reading name
|
||||
int nameLength = readNormalNr(bufor,i,4);i+=4;
|
||||
int nameLength = read_le_u32(bufor + i);i+=4;
|
||||
vinya->name.reserve(nameLength);
|
||||
for (int cd=0;cd<nameLength;cd++)
|
||||
{
|
||||
@ -1164,10 +1165,10 @@ void Mapa::readDefInfo( const unsigned char * bufor, int &i)
|
||||
{
|
||||
bytes[v] = bufor[i++];
|
||||
}
|
||||
vinya->terrainAllowed = readNormalNr(bufor,i,2);i+=2;
|
||||
vinya->terrainMenu = readNormalNr(bufor,i,2);i+=2;
|
||||
vinya->id = readNormalNr(bufor,i,4);i+=4;
|
||||
vinya->subid = readNormalNr(bufor,i,4);i+=4;
|
||||
vinya->terrainAllowed = read_le_u16(bufor + i);i+=2;
|
||||
vinya->terrainMenu = read_le_u16(bufor + i);i+=2;
|
||||
vinya->id = read_le_u32(bufor + i);i+=4;
|
||||
vinya->subid = read_le_u32(bufor + i);i+=4;
|
||||
vinya->type = bufor[i++];
|
||||
vinya->printPriority = bufor[i++];
|
||||
for (int zi=0; zi<6; zi++)
|
||||
@ -1227,7 +1228,7 @@ public:
|
||||
|
||||
void Mapa::readObjects( const unsigned char * bufor, int &i)
|
||||
{
|
||||
int howManyObjs = readNormalNr(bufor,i, 4); i+=4;
|
||||
int howManyObjs = read_le_u32(bufor + i); i+=4;
|
||||
for(int ww=0; ww<howManyObjs; ++ww) //comment this line to turn loading objects off
|
||||
{
|
||||
CGObjectInstance * nobj = 0;
|
||||
@ -1237,7 +1238,7 @@ void Mapa::readObjects( const unsigned char * bufor, int &i)
|
||||
pos.y = bufor[i++];
|
||||
pos.z = bufor[i++];
|
||||
|
||||
int defnum = readNormalNr(bufor,i, 4); i+=4;
|
||||
int defnum = read_le_u32(bufor + i); i+=4;
|
||||
int idToBeGiven = objects.size();
|
||||
|
||||
CGDefInfo * defInfo = defy[defnum];
|
||||
@ -1253,7 +1254,7 @@ void Mapa::readObjects( const unsigned char * bufor, int &i)
|
||||
bool guardMess = bufor[i]; ++i;
|
||||
if(guardMess)
|
||||
{
|
||||
int messLong = readNormalNr(bufor,i, 4); i+=4;
|
||||
int messLong = read_le_u32(bufor + i); i+=4;
|
||||
if(messLong>0)
|
||||
{
|
||||
for(int yy=0; yy<messLong; ++yy)
|
||||
@ -1268,52 +1269,52 @@ void Mapa::readObjects( const unsigned char * bufor, int &i)
|
||||
}
|
||||
i+=4;
|
||||
}
|
||||
evnt->gainedExp = readNormalNr(bufor,i, 4); i+=4;
|
||||
evnt->manaDiff = readNormalNr(bufor,i, 4); i+=4;
|
||||
evnt->gainedExp = read_le_u32(bufor + i); i+=4;
|
||||
evnt->manaDiff = read_le_u32(bufor + i); i+=4;
|
||||
evnt->moraleDiff = readNormalNr(bufor,i, 1, true); ++i;
|
||||
evnt->luckDiff = readNormalNr(bufor,i, 1, true); ++i;
|
||||
|
||||
evnt->resources.resize(RESOURCE_QUANTITY);
|
||||
for(int x=0; x<7; x++)
|
||||
{
|
||||
evnt->resources[x] = readNormalNr(bufor,i);
|
||||
evnt->resources[x] = read_le_u32(bufor + i);
|
||||
i+=4;
|
||||
}
|
||||
|
||||
evnt->primskills.resize(PRIMARY_SKILLS);
|
||||
for(int x=0; x<4; x++)
|
||||
{
|
||||
evnt->primskills[x] = readNormalNr(bufor,i, 1);
|
||||
evnt->primskills[x] = bufor[i];
|
||||
i++;
|
||||
}
|
||||
|
||||
int gabn; //number of gained abilities
|
||||
gabn = readNormalNr(bufor,i, 1); ++i;
|
||||
gabn = bufor[i]; ++i;
|
||||
for(int oo = 0; oo<gabn; ++oo)
|
||||
{
|
||||
evnt->abilities.push_back(readNormalNr(bufor,i, 1)); ++i;
|
||||
evnt->abilityLevels.push_back(readNormalNr(bufor,i, 1)); ++i;
|
||||
evnt->abilities.push_back(bufor[i]); ++i;
|
||||
evnt->abilityLevels.push_back(bufor[i]); ++i;
|
||||
}
|
||||
|
||||
int gart = readNormalNr(bufor,i, 1); ++i; //number of gained artifacts
|
||||
int gart = bufor[i]; ++i; //number of gained artifacts
|
||||
for(int oo = 0; oo<gart; ++oo)
|
||||
{
|
||||
evnt->artifacts.push_back(readNormalNr(bufor,i, (version == RoE ? 1 : 2))); i+=(version == RoE ? 1 : 2);
|
||||
}
|
||||
|
||||
int gspel = readNormalNr(bufor,i, 1); ++i; //number of gained spells
|
||||
int gspel = bufor[i]; ++i; //number of gained spells
|
||||
for(int oo = 0; oo<gspel; ++oo)
|
||||
{
|
||||
evnt->spells.push_back(readNormalNr(bufor,i, 1)); ++i;
|
||||
evnt->spells.push_back(bufor[i]); ++i;
|
||||
}
|
||||
|
||||
int gcre = readNormalNr(bufor,i, 1); ++i; //number of gained creatures
|
||||
int gcre = bufor[i]; ++i; //number of gained creatures
|
||||
readCreatureSet(&evnt->creatures, bufor,i,gcre,(version>RoE));
|
||||
|
||||
i+=8;
|
||||
evnt->availableFor = readNormalNr(bufor,i, 1); ++i;
|
||||
evnt->computerActivate = readNormalNr(bufor,i, 1); ++i;
|
||||
evnt->removeAfterVisit = readNormalNr(bufor,i, 1); ++i;
|
||||
evnt->availableFor = bufor[i]; ++i;
|
||||
evnt->computerActivate = bufor[i]; ++i;
|
||||
evnt->removeAfterVisit = bufor[i]; ++i;
|
||||
evnt->humanActivate = true;
|
||||
|
||||
i+=4;
|
||||
@ -1372,13 +1373,13 @@ void Mapa::readObjects( const unsigned char * bufor, int &i)
|
||||
|
||||
if(version>RoE)
|
||||
{
|
||||
cre->identifier = readNormalNr(bufor,i); i+=4;
|
||||
cre->identifier = read_le_u32(bufor + i); i+=4;
|
||||
questIdentifierToId[cre->identifier] = idToBeGiven;
|
||||
//monsters[cre->identifier] = cre;
|
||||
}
|
||||
|
||||
CStackInstance *hlp = new CStackInstance();
|
||||
hlp->count = readNormalNr(bufor,i, 2); i+=2;
|
||||
hlp->count = read_le_u16(bufor + i); i+=2;
|
||||
//type will be set during initialization
|
||||
cre->putStack(0, hlp);
|
||||
|
||||
@ -1390,7 +1391,7 @@ void Mapa::readObjects( const unsigned char * bufor, int &i)
|
||||
cre->resources.resize(RESOURCE_QUANTITY);
|
||||
for(int j=0; j<7; j++)
|
||||
{
|
||||
cre->resources[j] = readNormalNr(bufor,i); i+=4;
|
||||
cre->resources[j] = read_le_u32(bufor + i); i+=4;
|
||||
}
|
||||
|
||||
int artID = readNormalNr(bufor,i, (version == RoE ? 1 : 2)); i+=(version == RoE ? 1 : 2);
|
||||
@ -1504,7 +1505,7 @@ void Mapa::readObjects( const unsigned char * bufor, int &i)
|
||||
|
||||
if(defInfo->id==93)
|
||||
{
|
||||
spellID = readNormalNr(bufor,i); i+=4;
|
||||
spellID = read_le_u32(bufor + i); i+=4;
|
||||
artID = 1;
|
||||
}
|
||||
else if(defInfo->id == 5) //specific artifact
|
||||
@ -1530,7 +1531,7 @@ void Mapa::readObjects( const unsigned char * bufor, int &i)
|
||||
}
|
||||
i+=4;
|
||||
}
|
||||
res->amount = readNormalNr(bufor,i); i+=4;
|
||||
res->amount = read_le_u32(bufor + i); i+=4;
|
||||
if (defInfo->subid == 6) // Gold is multiplied by 100.
|
||||
res->amount *= 100;
|
||||
i+=4;
|
||||
@ -1585,50 +1586,50 @@ void Mapa::readObjects( const unsigned char * bufor, int &i)
|
||||
i+=4;
|
||||
}
|
||||
|
||||
box->gainedExp = readNormalNr(bufor,i, 4); i+=4;
|
||||
box->manaDiff = readNormalNr(bufor,i, 4); i+=4;
|
||||
box->gainedExp = read_le_u32(bufor + i); i+=4;
|
||||
box->manaDiff = read_le_u32(bufor + i); i+=4;
|
||||
box->moraleDiff = readNormalNr(bufor,i, 1, true); ++i;
|
||||
box->luckDiff = readNormalNr(bufor,i, 1, true); ++i;
|
||||
|
||||
box->resources.resize(RESOURCE_QUANTITY);
|
||||
for(int x=0; x<7; x++)
|
||||
{
|
||||
box->resources[x] = readNormalNr(bufor,i);
|
||||
box->resources[x] = read_le_u32(bufor + i);
|
||||
i+=4;
|
||||
}
|
||||
|
||||
box->primskills.resize(PRIMARY_SKILLS);
|
||||
for(int x=0; x<4; x++)
|
||||
{
|
||||
box->primskills[x] = readNormalNr(bufor,i, 1);
|
||||
box->primskills[x] = bufor[i];
|
||||
i++;
|
||||
}
|
||||
|
||||
int gabn; //number of gained abilities
|
||||
gabn = readNormalNr(bufor,i, 1); ++i;
|
||||
gabn = bufor[i]; ++i;
|
||||
for(int oo = 0; oo<gabn; ++oo)
|
||||
{
|
||||
box->abilities.push_back(readNormalNr(bufor,i, 1)); ++i;
|
||||
box->abilityLevels.push_back(readNormalNr(bufor,i, 1)); ++i;
|
||||
box->abilities.push_back(bufor[i]); ++i;
|
||||
box->abilityLevels.push_back(bufor[i]); ++i;
|
||||
}
|
||||
int gart = readNormalNr(bufor,i, 1); ++i; //number of gained artifacts
|
||||
int gart = bufor[i]; ++i; //number of gained artifacts
|
||||
for(int oo = 0; oo<gart; ++oo)
|
||||
{
|
||||
if(version > RoE)
|
||||
{
|
||||
box->artifacts.push_back(readNormalNr(bufor,i, 2)); i+=2;
|
||||
box->artifacts.push_back(read_le_u16(bufor + i)); i+=2;
|
||||
}
|
||||
else
|
||||
{
|
||||
box->artifacts.push_back(readNormalNr(bufor,i, 1)); i+=1;
|
||||
box->artifacts.push_back(bufor[i]); i+=1;
|
||||
}
|
||||
}
|
||||
int gspel = readNormalNr(bufor,i, 1); ++i; //number of gained spells
|
||||
int gspel = bufor[i]; ++i; //number of gained spells
|
||||
for(int oo = 0; oo<gspel; ++oo)
|
||||
{
|
||||
box->spells.push_back(readNormalNr(bufor,i, 1)); ++i;
|
||||
box->spells.push_back(bufor[i]); ++i;
|
||||
}
|
||||
int gcre = readNormalNr(bufor,i, 1); ++i; //number of gained creatures
|
||||
int gcre = bufor[i]; ++i; //number of gained creatures
|
||||
readCreatureSet(&box->creatures, bufor,i,gcre,(version>RoE));
|
||||
i+=8;
|
||||
break;
|
||||
@ -1636,15 +1637,15 @@ void Mapa::readObjects( const unsigned char * bufor, int &i)
|
||||
case 36: //grail
|
||||
{
|
||||
grailPos = pos;
|
||||
grailRadious = readNormalNr(bufor,i); i+=4;
|
||||
grailRadious = read_le_u32(bufor + i); i+=4;
|
||||
continue;
|
||||
}
|
||||
case 217:
|
||||
{
|
||||
nobj = new CGDwelling();
|
||||
CCreGenObjInfo * spec = new CCreGenObjInfo;
|
||||
spec->player = readNormalNr(bufor,i); i+=4;
|
||||
spec->identifier = readNormalNr(bufor,i); i+=4;
|
||||
spec->player = read_le_u32(bufor + i); i+=4;
|
||||
spec->identifier = read_le_u32(bufor + i); i+=4;
|
||||
if(!spec->identifier)
|
||||
{
|
||||
spec->asCastle = false;
|
||||
@ -1663,8 +1664,8 @@ void Mapa::readObjects( const unsigned char * bufor, int &i)
|
||||
{
|
||||
nobj = new CGDwelling();
|
||||
CCreGen2ObjInfo * spec = new CCreGen2ObjInfo;
|
||||
spec->player = readNormalNr(bufor,i); i+=4;
|
||||
spec->identifier = readNormalNr(bufor,i); i+=4;
|
||||
spec->player = read_le_u32(bufor + i); i+=4;
|
||||
spec->identifier = read_le_u32(bufor + i); i+=4;
|
||||
if(!spec->identifier)
|
||||
{
|
||||
spec->asCastle = false;
|
||||
@ -1753,7 +1754,7 @@ void Mapa::readObjects( const unsigned char * bufor, int &i)
|
||||
case 87: //Shipyard
|
||||
{
|
||||
nobj = new CGShipyard();
|
||||
nobj->setOwner(readNormalNr(bufor,i)); i+=4;
|
||||
nobj->setOwner(read_le_u32(bufor + i)); i+=4;
|
||||
break;
|
||||
}
|
||||
case 214: //hero placeholder
|
||||
@ -1827,7 +1828,7 @@ void Mapa::readObjects( const unsigned char * bufor, int &i)
|
||||
case 42: //Lighthouse
|
||||
{
|
||||
nobj = new CGLighthouse();
|
||||
nobj->tempOwner = readNormalNr(bufor,i); i+=4;
|
||||
nobj->tempOwner = read_le_u32(bufor + i); i+=4;
|
||||
break;
|
||||
}
|
||||
case 2: //Altar of Sacrifice
|
||||
@ -1876,25 +1877,25 @@ void Mapa::readObjects( const unsigned char * bufor, int &i)
|
||||
|
||||
void Mapa::readEvents( const unsigned char * bufor, int &i )
|
||||
{
|
||||
int numberOfEvents = readNormalNr(bufor,i); i+=4;
|
||||
int numberOfEvents = read_le_u32(bufor + i); i+=4;
|
||||
for(int yyoo=0; yyoo<numberOfEvents; ++yyoo)
|
||||
{
|
||||
CMapEvent *ne = new CMapEvent();
|
||||
ne->name = std::string();
|
||||
ne->message = std::string();
|
||||
int nameLen = readNormalNr(bufor,i); i+=4;
|
||||
int nameLen = read_le_u32(bufor + i); i+=4;
|
||||
for(int qq=0; qq<nameLen; ++qq)
|
||||
{
|
||||
ne->name += bufor[i]; ++i;
|
||||
}
|
||||
int messLen = readNormalNr(bufor,i); i+=4;
|
||||
int messLen = read_le_u32(bufor + i); i+=4;
|
||||
for(int qq=0; qq<messLen; ++qq)
|
||||
{
|
||||
ne->message +=bufor[i]; ++i;
|
||||
}
|
||||
for(int k=0; k < 7; k++)
|
||||
{
|
||||
ne->resources[k] = readNormalNr(bufor,i); i+=4;
|
||||
ne->resources[k] = read_le_u32(bufor + i); i+=4;
|
||||
}
|
||||
ne->players = bufor[i]; ++i;
|
||||
if(version>AB)
|
||||
@ -1904,7 +1905,7 @@ void Mapa::readEvents( const unsigned char * bufor, int &i )
|
||||
else
|
||||
ne->humanAffected = true;
|
||||
ne->computerAffected = bufor[i]; ++i;
|
||||
ne->firstOccurence = readNormalNr(bufor,i, 2); i+=2;
|
||||
ne->firstOccurence = read_le_u16(bufor + i); i+=2;
|
||||
ne->nextOccurence = bufor[i]; ++i;
|
||||
|
||||
char unknown[17];
|
||||
@ -1943,7 +1944,7 @@ void Mapa::loadQuest(CQuest * guard, const unsigned char * bufor, int & i)
|
||||
case 3:
|
||||
case 4:
|
||||
{
|
||||
guard->m13489val = readNormalNr(bufor,i); i+=4;
|
||||
guard->m13489val = read_le_u32(bufor + i); i+=4;
|
||||
break;
|
||||
}
|
||||
case 5:
|
||||
@ -1951,7 +1952,7 @@ void Mapa::loadQuest(CQuest * guard, const unsigned char * bufor, int & i)
|
||||
int artNumber = bufor[i]; ++i;
|
||||
for(int yy=0; yy<artNumber; ++yy)
|
||||
{
|
||||
int artid = readNormalNr(bufor,i, 2); i+=2;
|
||||
int artid = read_le_u16(bufor + i); i+=2;
|
||||
guard->m5arts.push_back(artid);
|
||||
allowedArtifact[artid] = false; //these are unavailable for random generation
|
||||
}
|
||||
@ -1963,8 +1964,8 @@ void Mapa::loadQuest(CQuest * guard, const unsigned char * bufor, int & i)
|
||||
guard->m6creatures.resize(typeNumber);
|
||||
for(int hh=0; hh<typeNumber; ++hh)
|
||||
{
|
||||
guard->m6creatures[hh].type = VLC->creh->creatures[readNormalNr(bufor,i, 2)]; i+=2;
|
||||
guard->m6creatures[hh].count = readNormalNr(bufor,i, 2); i+=2;
|
||||
guard->m6creatures[hh].type = VLC->creh->creatures[read_le_u16(bufor + i)]; i+=2;
|
||||
guard->m6creatures[hh].count = read_le_u16(bufor + i); i+=2;
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -1973,7 +1974,7 @@ void Mapa::loadQuest(CQuest * guard, const unsigned char * bufor, int & i)
|
||||
guard->m7resources.resize(7);
|
||||
for(int x=0; x<7; x++)
|
||||
{
|
||||
guard->m7resources[x] = readNormalNr(bufor,i);
|
||||
guard->m7resources[x] = read_le_u32(bufor + i);
|
||||
i+=4;
|
||||
}
|
||||
break;
|
||||
@ -1987,7 +1988,7 @@ void Mapa::loadQuest(CQuest * guard, const unsigned char * bufor, int & i)
|
||||
}
|
||||
|
||||
|
||||
int limit = readNormalNr(bufor,i); i+=4;
|
||||
int limit = read_le_u32(bufor + i); i+=4;
|
||||
if(limit == ((int)0xffffffff))
|
||||
{
|
||||
guard->lastDay = -1;
|
||||
@ -2098,7 +2099,7 @@ void Mapa::loadArtifactsOfHero(const unsigned char * bufor, int & i, CGHeroInsta
|
||||
i+=1;
|
||||
|
||||
//bag artifacts //20
|
||||
int amount = readNormalNr(bufor,i, 2); i+=2; //number of artifacts in hero's bag
|
||||
int amount = read_le_u16(bufor + i); i+=2; //number of artifacts in hero's bag
|
||||
for(int ss = 0; ss < amount; ++ss)
|
||||
loadArtifactToSlot(nhi, Arts::BACKPACK_START + nhi->artifactsInBackpack.size(), bufor, i);
|
||||
} //artifacts
|
||||
|
30
lib/vcmi_endian.h
Normal file
30
lib/vcmi_endian.h
Normal file
@ -0,0 +1,30 @@
|
||||
#include <SDL_endian.h>
|
||||
|
||||
/* Reading values from memory.
|
||||
*
|
||||
* read_le_u16, read_le_u32 : read a little endian value from
|
||||
* memory. On big endian machines, the value will be byteswapped.
|
||||
*/
|
||||
|
||||
#if defined(linux) && defined(sparc)
|
||||
/* SPARC does not support unaligned memory access. Let gcc know when
|
||||
* to emit the right code. */
|
||||
struct unaligned_Uint16 { ui16 val __attribute__(( packed )); };
|
||||
struct unaligned_Uint32 { ui32 val __attribute__(( packed )); };
|
||||
|
||||
static inline ui16 read_unaligned_u16(const void *p)
|
||||
{
|
||||
const struct unaligned_Uint16 *v = (const struct unaligned_Uint16 *)p;
|
||||
return v->val;
|
||||
}
|
||||
|
||||
static inline ui32 read_unaligned_u32(const void *p)
|
||||
{
|
||||
const struct unaligned_Uint32 *v = (const struct unaligned_Uint32 *)p;
|
||||
return v->val;
|
||||
}
|
||||
|
||||
#else
|
||||
#define read_le_u16(p) (SDL_SwapLE16(* reinterpret_cast<const ui16 *>(p)))
|
||||
#define read_le_u32(p) (SDL_SwapLE32(* reinterpret_cast<const ui32 *>(p)))
|
||||
#endif
|
Loading…
Reference in New Issue
Block a user