File diff r7881:a0fb6bf26ffe → r7882:cdf03a4ac84a
src/newgrf.cpp
Show inline comments
 
@@ -61,7 +61,6 @@
 

	
 
static int _skip_sprites; // XXX
 
static uint _file_index; // XXX
 
SpriteID _signal_base;
 
SpriteID _coast_base;
 

	
 
static GRFFile *_cur_grffile;
 
@@ -3241,6 +3240,34 @@ static void FeatureNewName(byte *buf, in
 
	}
 
}
 

	
 
/**
 
 * Sanitize incoming sprite offsets for Action 5 graphics replacements.
 
 * @param num         the number of sprites to load.
 
 * @param offset      offset from the base.
 
 * @param max_sprites the maximum number of sprites that can be loaded in this action 5.
 
 * @param name        used for error warnings.
 
 * @return the number of sprites that is going to be skipped
 
 */
 
static uint16 SanitizeSpriteOffset(uint16& num, uint16 offset, int max_sprites, const char *name)
 
{
 

	
 
	if (offset >= max_sprites) {
 
		grfmsg(1, "GraphicsNew: %s sprite offset must be less than %i, skipping", name, max_sprites);
 
		uint orig_num = num;
 
		num = 0;
 
		return orig_num;
 
	}
 

	
 
	if (offset + num > max_sprites) {
 
		grfmsg(4, "GraphicsNew: %s sprite overflow, truncating...", name);
 
		uint orig_num = num;
 
		num = max(max_sprites - offset, 0);
 
		return orig_num - num;
 
	}
 

	
 
	return 0;
 
}
 

	
 
/* Action 0x05 */
 
static void GraphicsNew(byte *buf, int len)
 
{
 
@@ -3252,50 +3279,52 @@ static void GraphicsNew(byte *buf, int l
 
	/* TODO */
 

	
 
	SpriteID replace = 0;
 
	const SpriteID *index_tbl = NULL;
 

	
 
	if (!check_length(len, 2, "GraphicsNew")) return;
 
	buf++;
 
	uint8 type = grf_load_byte(&buf);
 
	uint16 num = grf_load_extended(&buf);
 
	uint16 skip_num = 0;
 
	uint16 offset = HASBIT(type, 7) ? grf_load_extended(&buf) : 0;
 
	CLRBIT(type, 7); // Clear the high bit as that only indicates whether there is an offset.
 

	
 
	switch (type) {
 
		case 0x04: // Signal graphics
 
			if (num != 112 && num != 240) {
 
				grfmsg(1, "GraphicsNew: Signal graphics sprite count must be 112 or 240, skipping");
 
			if (num != PRESIGNAL_SPRITE_COUNT && num != PRESIGNAL_AND_SEMAPHORE_SPRITE_COUNT && num != PRESIGNAL_SEMAPHORE_AND_PBS_SPRITE_COUNT) {
 
				grfmsg(1, "GraphicsNew: Signal graphics sprite count must be 48, 112 or 240, skipping");
 
				return;
 
			}
 
			_signal_base = _cur_spriteid;
 
			replace = SPR_SIGNALS_BASE;
 
			break;
 

	
 
		case 0x05: // Catenary graphics
 
			if (num != 48) {
 
			if (num != ELRAIL_SPRITE_COUNT) {
 
				grfmsg(1, "GraphicsNew: Catenary graphics sprite count must be 48, skipping");
 
				return;
 
			}
 
			replace = SPR_ELRAIL_BASE + 3;
 
			replace = SPR_ELRAIL_BASE;
 
			break;
 

	
 
		case 0x06: // Foundations
 
			switch (num) {
 
				case 74: replace = SPR_SLOPES_BASE; break;
 
				case 90: index_tbl = _slopes_action05_90; break;
 
				default:
 
					grfmsg(1, "GraphicsNew: Foundation graphics sprite count must be 74 or 90, skipping");
 
					return;
 
			if (num != NORMAL_FOUNDATION_SPRITE_COUNT && num != NORMAL_AND_HALFTILE_FOUNDATION_SPRITE_COUNT) {
 
				grfmsg(1, "GraphicsNew: Foundation graphics sprite count must be 74 or 90, skipping");
 
				return;
 
			}
 
			replace = SPR_SLOPES_BASE; break;
 
			break;
 

	
 
		/* case 0x07: // TTDP GUI sprites. Not used by OTTD. */
 

	
 
		case 0x08: // Canal graphics
 
			if (num != 65) {
 
			if (num != CANALS_SPRITE_COUNT) {
 
				grfmsg(1, "GraphicsNew: Canal graphics sprite count must be 65, skipping");
 
				return;
 
			}
 
			replace = SPR_CANALS_BASE + 5;
 
			replace = SPR_CANALS_BASE;
 
			break;
 

	
 
		case 0x09: // One way graphics
 
			if (num != 6) {
 
			if (num != ONEWAY_SPRITE_COUNT) {
 
				grfmsg(1, "GraphicsNew: One way road graphics sprite count must be 6, skipping");
 
				return;
 
			}
 
@@ -3303,7 +3332,7 @@ static void GraphicsNew(byte *buf, int l
 
			break;
 

	
 
		case 0x0A: // 2CC colour maps
 
			if (num != 256) {
 
			if (num != TWOCCMAP_SPRITE_COUNT) {
 
				grfmsg(1, "GraphicsNew: 2CC colour maps sprite count must be 256, skipping");
 
				return;
 
			}
 
@@ -3311,13 +3340,15 @@ static void GraphicsNew(byte *buf, int l
 
			break;
 

	
 
		case 0x0B: // tramways
 
			if (num != 113) {
 
			if (num != TRAMWAY_SPRITE_COUNT) {
 
				grfmsg(1, "GraphicsNew: Tramway graphics sprite count must be 113, skipping");
 
				return;
 
			}
 
			replace = SPR_TRAMWAY_BASE;
 
			break;
 

	
 
		/* case 0x0C: // Snowy temperate trees. Not yet used by OTTD. */
 

	
 
		case 0x0D: // Coast graphics
 
			if (num != 16) {
 
				grfmsg(1, "GraphicsNew: Coast graphics sprite count must be 16, skipping");
 
@@ -3327,8 +3358,12 @@ static void GraphicsNew(byte *buf, int l
 
			_loaded_newgrf_features.has_newwater = true;
 
			break;
 

	
 
		/* case 0x0E: // New Signals. Not yet used by OTTD. */
 

	
 
		/* case 0x0F: // Tracks for marking sloped rail. Not yet used by OTTD. */
 

	
 
		case 0x10: // New airport sprites
 
			if (num != 15) {
 
			if (num != AIRPORTX_SPRITE_COUNT) {
 
				grfmsg(1, "GraphicsNew: Airport graphics sprite count must be 15, skipping");
 
				return;
 
			}
 
@@ -3336,13 +3371,33 @@ static void GraphicsNew(byte *buf, int l
 
			break;
 

	
 
		case 0x11: // Road stop sprites
 
			if (num != 8) {
 
			if (num != ROADSTOP_SPRITE_COUNT) {
 
				grfmsg(1, "GraphicsNew: Road stop graphics sprite count must be 8, skipping");
 
				return;
 
			}
 
			replace = SPR_ROADSTOP_BASE;
 
			break;
 

	
 
		/* case 0x12: // Aqueduct sprites. Not yet used by OTTD. */
 

	
 
		case 0x13: // Autorail sprites
 
			if (num != AUTORAIL_SPRITE_COUNT) {
 
				grfmsg(1, "GraphicsNew: Autorail graphics sprite count must be 55, skipping");
 
				return;
 
			}
 
			replace = SPR_AUTORAIL_BASE;
 
			break;
 

	
 
		case 0x14: // Flag sprites
 
			skip_num = SanitizeSpriteOffset(num, offset, FLAGS_SPRITE_COUNT, "Flag graphics");
 
			replace = SPR_FLAGS_BASE + offset;
 
			break;
 

	
 
		case 0x15: // OpenTTD GUI sprites
 
			skip_num = SanitizeSpriteOffset(num, offset, OPENTTD_SPRITE_COUNT, "OpenTTD graphics");
 
			replace = SPR_OPENTTD_BASE + offset;
 
			break;
 

	
 
		default:
 
			grfmsg(2, "GraphicsNew: Custom graphics (type 0x%02X) sprite block of length %u (unimplemented, ignoring)",
 
					type, num);
 
@@ -3350,12 +3405,6 @@ static void GraphicsNew(byte *buf, int l
 
			return;
 
	}
 

	
 
	if (index_tbl != NULL) {
 
		grfmsg(2, "GraphicsNew: Loading %u sprites of type 0x%02X at indexed SpriteIDs", num, type);
 
		LoadSpritesIndexed(_file_index, &_nfo_line, index_tbl);
 
		return;
 
	}
 

	
 
	if (replace == 0) {
 
		grfmsg(2, "GraphicsNew: Loading %u sprites of type 0x%02X at SpriteID 0x%04X", num, type, _cur_spriteid);
 
	} else {
 
@@ -3366,6 +3415,8 @@ static void GraphicsNew(byte *buf, int l
 
		LoadNextSprite(replace == 0 ? _cur_spriteid++ : replace++, _file_index, _nfo_line);
 
		_nfo_line++;
 
	}
 

	
 
	_skip_sprites = skip_num;
 
}
 

	
 
/* Action 0x05 (SKIP) */
 
@@ -5028,7 +5079,6 @@ static void ResetNewGRFData()
 
	_loaded_newgrf_features.has_newhouses     = false;
 
	_loaded_newgrf_features.has_newindustries = false;
 
	_loaded_newgrf_features.has_newwater      = false;
 
	_signal_base = 0;
 
	_coast_base = 0;
 

	
 
	InitializeSoundPool();