mirror of
				https://github.com/vcmi/vcmi.git
				synced 2025-10-31 00:07:39 +02:00 
			
		
		
		
	- gcc compile fix
- mismatching enum (?) in HeroBonus - probably fixed some cases of unaligned access
This commit is contained in:
		| @@ -4,7 +4,6 @@ | ||||
| #include "../lib/Filesystem/CResourceLoader.h" | ||||
| #include "../lib/Filesystem/ISimpleResourceLoader.h" | ||||
| #include "../lib/JsonNode.h" | ||||
| #include "../lib/vcmi_endian.h" | ||||
|  | ||||
| #include "CBitmapHandler.h" | ||||
| #include "Graphics.h" | ||||
| @@ -131,13 +130,13 @@ CDefFile::CDefFile(std::string Name): | ||||
| 	static SDL_Color H3Palette[8] = | ||||
| 	{ | ||||
| 		{   0,   0,   0,   0},// 100% - transparency | ||||
| 		{   0,   0,   0, 192},//  75% - shadow border, | ||||
| 		{   0,   0,   0,  64},//  75% - shadow border, | ||||
| 		{   0,   0,   0, 128},// TODO: find exact value | ||||
| 		{   0,   0,   0, 128},// TODO: for transparency | ||||
| 		{   0,   0,   0, 128},//  50% - shadow body | ||||
| 		{   0,   0,   0,   0},// 100% - selection highlight | ||||
| 		{   0,   0,   0, 128},//  50% - shadow body   below selection | ||||
| 		{   0,   0,   0, 192} // 75% - shadow border below selection | ||||
| 		{   0,   0,   0,  64} // 75% - shadow border below selection | ||||
| 	}; | ||||
| 	data = animationCache.getCachedFile(ResourceID(std::string("SPRITES/") + Name, EResType::ANIMATION)); | ||||
|  | ||||
| @@ -196,14 +195,13 @@ void CDefFile::loadFrame(size_t frame, size_t group, ImageLoader &loader) const | ||||
| 	const SSpriteDef sd = * reinterpret_cast<const SSpriteDef *>(FDef); | ||||
| 	SSpriteDef sprite; | ||||
|  | ||||
| 	//sprite.size = SDL_SwapLE32(sd.size);//unused | ||||
| 	sprite.format = SDL_SwapLE32(sd.format); | ||||
| 	sprite.fullWidth = SDL_SwapLE32(sd.fullWidth); | ||||
| 	sprite.fullHeight = SDL_SwapLE32(sd.fullHeight); | ||||
| 	sprite.width = SDL_SwapLE32(sd.width); | ||||
| 	sprite.height = SDL_SwapLE32(sd.height); | ||||
| 	sprite.leftMargin = SDL_SwapLE32(sd.leftMargin); | ||||
| 	sprite.topMargin = SDL_SwapLE32(sd.topMargin); | ||||
| 	sprite.format = read_le_u32(&sd.format); | ||||
| 	sprite.fullWidth = read_le_u32(&sd.fullWidth); | ||||
| 	sprite.fullHeight = read_le_u32(&sd.fullHeight); | ||||
| 	sprite.width = read_le_u32(&sd.width); | ||||
| 	sprite.height = read_le_u32(&sd.height); | ||||
| 	sprite.leftMargin = read_le_u32(&sd.leftMargin); | ||||
| 	sprite.topMargin = read_le_u32(&sd.topMargin); | ||||
|  | ||||
| 	ui32 currentOffset = sizeof(SSpriteDef); | ||||
| 	ui32 BaseOffset =    sizeof(SSpriteDef); | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| #pragma once | ||||
|  | ||||
| #include "../lib/vcmi_endian.h" | ||||
| #include "UIFramework/CIntObject.h" | ||||
|  | ||||
| /* | ||||
| @@ -33,7 +34,7 @@ private: | ||||
| 		ui32 height; | ||||
| 		si32 leftMargin; | ||||
| 		si32 topMargin; | ||||
| 	}; | ||||
| 	} PACKED_STRUCT; | ||||
| 	//offset[group][frame] - offset of frame data in file | ||||
| 	std::map<size_t, std::vector <size_t> > offset; | ||||
|  | ||||
|   | ||||
| @@ -4,7 +4,6 @@ | ||||
|  | ||||
| #include "../lib/Filesystem/CResourceLoader.h" | ||||
| #include "../lib/VCMI_Lib.h" | ||||
| #include "../lib/vcmi_endian.h" | ||||
| #include "CBitmapHandler.h" | ||||
|  | ||||
| /* | ||||
| @@ -58,10 +57,10 @@ void CDefHandler::openFromMemory(ui8 *table, const std::string & name) | ||||
| 	ui8 *p; | ||||
|  | ||||
| 	defName = name; | ||||
| 	DEFType = SDL_SwapLE32(de.DEFType); | ||||
| 	width = SDL_SwapLE32(de.width); | ||||
| 	height = SDL_SwapLE32(de.height); | ||||
| 	ui32 totalBlocks = SDL_SwapLE32(de.totalBlocks); | ||||
| 	DEFType = read_le_u32(&de.DEFType); | ||||
| 	width = read_le_u32(&de.width); | ||||
| 	height = read_le_u32(&de.height); | ||||
| 	ui32 totalBlocks = read_le_u32(&de.totalBlocks); | ||||
|  | ||||
| 	for (ui32 it=0;it<256;it++) | ||||
| 	{ | ||||
| @@ -147,13 +146,13 @@ SDL_Surface * CDefHandler::getSprite (int SIndex, const ui8 * FDef, const BMPPal | ||||
| 	BaseOffset = SEntries[SIndex].offset; | ||||
| 	SSpriteDef sd = * reinterpret_cast<const SSpriteDef *>(FDef + BaseOffset); | ||||
|  | ||||
| 	defType2 = SDL_SwapLE32(sd.defType2); | ||||
| 	FullWidth = SDL_SwapLE32(sd.FullWidth); | ||||
| 	FullHeight = SDL_SwapLE32(sd.FullHeight); | ||||
| 	SpriteWidth = SDL_SwapLE32(sd.SpriteWidth); | ||||
| 	SpriteHeight = SDL_SwapLE32(sd.SpriteHeight); | ||||
| 	LeftMargin = SDL_SwapLE32(sd.LeftMargin); | ||||
| 	TopMargin = SDL_SwapLE32(sd.TopMargin); | ||||
| 	defType2 = read_le_u32(&sd.defType2); | ||||
| 	FullWidth = read_le_u32(&sd.FullWidth); | ||||
| 	FullHeight = read_le_u32(&sd.FullHeight); | ||||
| 	SpriteWidth = read_le_u32(&sd.SpriteWidth); | ||||
| 	SpriteHeight = read_le_u32(&sd.SpriteHeight); | ||||
| 	LeftMargin = read_le_u32(&sd.LeftMargin); | ||||
| 	TopMargin = read_le_u32(&sd.TopMargin); | ||||
| 	RightMargin = FullWidth - SpriteWidth - LeftMargin; | ||||
| 	BottomMargin = FullHeight - SpriteHeight - TopMargin; | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| #pragma once | ||||
|  | ||||
|  | ||||
| #include "../lib/vcmi_endian.h" | ||||
|  | ||||
| struct SDL_Surface; | ||||
| struct BMPPalette; | ||||
| @@ -24,17 +24,19 @@ struct Cimage | ||||
|  | ||||
| // Def entry in file. Integer fields are all little endian and will | ||||
| // need to be converted. | ||||
| struct SDefEntryBlock { | ||||
| struct SDefEntryBlock | ||||
| { | ||||
| 	ui32 unknown1; | ||||
| 	ui32 totalInBlock; | ||||
| 	ui32 unknown2; | ||||
| 	ui32 unknown3; | ||||
| 	ui8 data[0]; | ||||
| }; | ||||
| } PACKED_STRUCT; | ||||
|  | ||||
| // Def entry in file. Integer fields are all little endian and will | ||||
| // need to be converted. | ||||
| struct SDefEntry { | ||||
| struct SDefEntry | ||||
| { | ||||
| 	ui32 DEFType; | ||||
| 	ui32 width; | ||||
| 	ui32 height; | ||||
| @@ -49,11 +51,12 @@ struct SDefEntry { | ||||
| 	// SDefEntry is followed by a series of SDefEntryBlock | ||||
| 	// This is commented out because VC++ doesn't accept C99 syntax. | ||||
| 	//struct SDefEntryBlock blocks[]; | ||||
| }; | ||||
| } PACKED_STRUCT; | ||||
|  | ||||
| // Def entry in file. Integer fields are all little endian and will | ||||
| // need to be converted. | ||||
| struct SSpriteDef { | ||||
| struct SSpriteDef | ||||
| { | ||||
| 	ui32 prSize; | ||||
| 	ui32 defType2; | ||||
| 	ui32 FullWidth; | ||||
| @@ -62,7 +65,7 @@ struct SSpriteDef { | ||||
| 	ui32 SpriteHeight; | ||||
| 	ui32 LeftMargin; | ||||
| 	ui32 TopMargin; | ||||
| }; | ||||
| } PACKED_STRUCT; | ||||
|  | ||||
| class CDefEssential //DefHandler with images only | ||||
| { | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| #pragma once | ||||
| #include "../global.h" | ||||
|  | ||||
| #include "GameConstants.h" | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -49,43 +49,32 @@ CLodArchiveLoader::CLodArchiveLoader(const std::string & archive) | ||||
|  | ||||
| void CLodArchiveLoader::initLODArchive(CFileInputStream & fileStream) | ||||
| { | ||||
| 	// Define LodEntryBlock struct | ||||
| 	struct LodEntryBlock | ||||
| 	{ | ||||
| 		char filename[16]; | ||||
| 		ui32 offset; | ||||
| 		ui32 uncompressedSize; | ||||
| 		ui32 unused; | ||||
| 		ui32 size; | ||||
| 	}; | ||||
|  | ||||
| 	// Read count of total files | ||||
|     CBinaryReader reader(&fileStream); | ||||
| 	CBinaryReader reader(&fileStream); | ||||
|  | ||||
| 	fileStream.seek(8); | ||||
| 	ui32 totalFiles = reader.readUInt32(); | ||||
|  | ||||
| 	// Get all entries from file | ||||
| 	fileStream.seek(0x5c); | ||||
| 	struct LodEntryBlock * lodEntries = new struct LodEntryBlock[totalFiles]; | ||||
| 	fileStream.read(reinterpret_cast<ui8 *>(lodEntries), sizeof(struct LodEntryBlock) * totalFiles); | ||||
|  | ||||
| 	// Insert entries to list | ||||
| 	for(ui32 i = 0; i < totalFiles; i++) | ||||
| 	{ | ||||
| 		char filename[16]; | ||||
| 		reader.read(reinterpret_cast<ui8*>(filename), 16); | ||||
|  | ||||
| 		// Create archive entry | ||||
| 		ArchiveEntry entry; | ||||
| 		entry.name = lodEntries[i].filename; | ||||
| 		entry.offset= SDL_SwapLE32(lodEntries[i].offset); | ||||
| 		entry.realSize = SDL_SwapLE32(lodEntries[i].uncompressedSize); | ||||
| 		entry.size = SDL_SwapLE32(lodEntries[i].size); | ||||
| 		entry.name     = filename; | ||||
| 		entry.offset   = reader.readUInt32(); | ||||
| 		entry.realSize = reader.readUInt32(); | ||||
| 		fileStream.skip(4); // unused, unknown | ||||
| 		entry.size     = reader.readUInt32(); | ||||
|  | ||||
| 		// Add lod entry to local entries map | ||||
| 		entries[entry.name] = entry; | ||||
| 	} | ||||
|  | ||||
| 	// Delete lod entries array | ||||
| 	delete[] lodEntries; | ||||
| } | ||||
|  | ||||
| void CLodArchiveLoader::initVIDArchive(CFileInputStream & fileStream) | ||||
|   | ||||
| @@ -1496,7 +1496,7 @@ int RankRangeLimiter::limit(const BonusLimitationContext &context) const | ||||
| 	const CStackInstance *csi = retreiveStackInstance(&context.node); | ||||
| 	if(csi) | ||||
| 	{ | ||||
| 		if (csi->getNodeType() == Bonus::COMMANDER) //no stack exp bonuses for commander creatures | ||||
| 		if (csi->getNodeType() == CBonusSystemNode::COMMANDER) //no stack exp bonuses for commander creatures | ||||
| 			return true; | ||||
| 		return csi->getExpRank() < minRank || csi->getExpRank() > maxRank; | ||||
| 	} | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| #pragma once | ||||
|  | ||||
| //FIXME:library file depends on SDL - make cause troubles | ||||
| #include <SDL_endian.h> | ||||
|  | ||||
| /* | ||||
| @@ -18,7 +19,7 @@ | ||||
|  *    memory. On big endian machines, the value will be byteswapped. | ||||
|  */ | ||||
|  | ||||
| #if defined(linux) && defined(sparc)  | ||||
| #if defined(linux) && (defined(sparc) || defined(__arm__)) | ||||
| /* SPARC does not support unaligned memory access. Let gcc know when | ||||
|  * to emit the right code. */ | ||||
| struct unaligned_Uint16 { ui16 val __attribute__(( packed )); }; | ||||
| @@ -39,9 +40,15 @@ static inline ui32 read_unaligned_u32(const void *p) | ||||
| #define read_le_u16(p) (SDL_SwapLE16(read_unaligned_u16(p))) | ||||
| #define read_le_u32(p) (SDL_SwapLE32(read_unaligned_u32(p))) | ||||
|  | ||||
| #define PACKED_STRUCT __attribute__(( packed )) | ||||
|  | ||||
| #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))) | ||||
|  | ||||
| #define PACKED_STRUCT | ||||
|  | ||||
| #endif | ||||
|  | ||||
| static inline char readChar(const ui8 * buffer, int & i) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user