changeset 7767:33f9ed104293 draft

(svn r11316) -Codechange: add support for the half-tile (selection) graphics.
author rubidium <rubidium@openttd.org>
date Sat, 20 Oct 2007 20:06:55 +0000
parents f0585ed32dd3
children 529cd49be451
files bin/data/halffndw.grf bin/data/halfselw.grf src/gfxinit.cpp src/landscape.cpp src/table/files.h src/table/landscape_sprite.h src/table/sprites.h
diffstat 7 files changed, 86 insertions(+), 32 deletions(-) [+]
line wrap: on
line diff
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..8fe4ad447aa25c5acba4a18e7bfb31d92763298f
GIT binary patch
literal 21613
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
NtayC84U~n)e*@tvXej^y
new file mode 100644
index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..e80c14ea17960feaf6280f8b73c59a19b92ce762
GIT binary patch
literal 2844
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
--- a/src/gfxinit.cpp
+++ b/src/gfxinit.cpp
@@ -28,11 +28,6 @@
 	MD5File landscape[3];      ///< landscape specific grf files
 };
 
-enum {
-	SKIP = 0xFFFE,
-	END  = 0xFFFF
-};
-
 #include "table/files.h"
 #include "table/landscape_sprite.h"
 
@@ -49,6 +44,13 @@
 	_slopes_spriteindexes_3,
 };
 
+static const SpriteID * const _halftile_foundation_spriteindexes[] = {
+	_halftile_foundation_spriteindexes_0,
+	_halftile_foundation_spriteindexes_1,
+	_halftile_foundation_spriteindexes_2,
+	_halftile_foundation_spriteindexes_3,
+};
+
 
 static uint LoadGrfFile(const char* filename, uint load_index, int file_index)
 {
@@ -386,6 +388,12 @@
 
 	load_index++; // SPR_EMPTY_BOUNDING_BOX
 
+	assert(load_index == SPR_HALFTILE_FOUNDATION_BASE);
+	LoadGrfIndexed("halffndw.grf", _halftile_foundation_spriteindexes[_opt.landscape], i++);
+
+	load_index = SPR_HALFTILE_SELECTION_BASE;
+	load_index += LoadGrfFile("halfselw.grf", load_index, i++);
+
 	assert(load_index == SPR_FLAGS_BASE);
 	load_index += LoadGrfFile("flags.grf", load_index, i++);
 
--- a/src/landscape.cpp
+++ b/src/landscape.cpp
@@ -308,23 +308,28 @@
 {
 	if (!IsFoundation(f)) return;
 
-	SpriteID sprite_base = SPR_SLOPES_VIRTUAL_BASE;
+	uint sprite_block = 0;
 	uint z;
 	Slope slope = GetFoundationSlope(ti->tile, &z);
 
-	if (!HasFoundationNW(ti->tile, slope, z)) sprite_base += SPR_SLOPES_NO_FOUNDATION_NW_OFFSET;
-	if (!HasFoundationNE(ti->tile, slope, z)) sprite_base += SPR_SLOPES_NO_FOUNDATION_NE_OFFSET;
+	/* Select the needed block of foundations sprites
+	 * Block 0: Walls at NW and NE edge
+	 * Block 1: Wall  at        NE edge
+	 * Block 2: Wall  at NW        edge
+	 * Block 3: No walls at NW or NE edge
+	 */
+	if (!HasFoundationNW(ti->tile, slope, z)) sprite_block += 1;
+	if (!HasFoundationNE(ti->tile, slope, z)) sprite_block += 2;
+
+	/* Use the original slope sprites if NW and NE borders should be visible */
+	SpriteID leveled_base = (sprite_block == 0 ? (int)SPR_FOUNDATION_BASE : (SPR_SLOPES_VIRTUAL_BASE + sprite_block * SPR_TRKFOUND_BLOCK_SIZE));
+	SpriteID inclined_base = SPR_SLOPES_VIRTUAL_BASE + SPR_SLOPES_INCLINED_OFFSET + sprite_block * SPR_TRKFOUND_BLOCK_SIZE;
+	//SpriteID halftile_base = SPR_HALFTILE_FOUNDATION_BASE + sprite_block * SPR_HALFTILE_BLOCK_SIZE;
 
 	if (IsSteepSlope(ti->tileh)) {
-		SpriteID lower_base;
-
-		/* Lower part of foundation
-		 * Use the original slope sprites if NW and NE borders should be visible
-		 */
-		lower_base = sprite_base;
-		if (lower_base == SPR_SLOPES_VIRTUAL_BASE) lower_base = SPR_FOUNDATION_BASE;
+		/* Lower part of foundation */
 		AddSortableSpriteToDraw(
-			lower_base + (ti->tileh & ~SLOPE_STEEP), PAL_NONE, ti->x, ti->y, 16, 16, 7, ti->z
+			leveled_base + (ti->tileh & ~SLOPE_STEEP), PAL_NONE, ti->x, ti->y, 16, 16, 7, ti->z
 		);
 
 		Corner highest_corner = GetHighestSlopeCorner(ti->tileh);
@@ -334,13 +339,13 @@
 			/* inclined foundation */
 			byte inclined = highest_corner * 2 + (f == FOUNDATION_INCLINED_Y ? 1 : 0);
 
-			AddSortableSpriteToDraw(sprite_base + SPR_SLOPES_INCLINED_OFFSET + inclined, PAL_NONE, ti->x, ti->y, 16, 16, 1, ti->z);
+			AddSortableSpriteToDraw(inclined_base + inclined, PAL_NONE, ti->x, ti->y, 16, 16, 1, ti->z);
 			OffsetGroundSprite(31, 9);
 		} else if (f >= FOUNDATION_STEEP_HIGHER) {
 			/* three corners raised:
 			 * Draw inclined foundations for both axes, that results in the needed image.
 			 */
-			SpriteID upper = sprite_base + SPR_SLOPES_INCLINED_OFFSET + highest_corner * 2;
+			SpriteID upper = inclined_base + highest_corner * 2;
 
 			AddSortableSpriteToDraw(upper, PAL_NONE, ti->x, ti->y, 16, 16, 1, ti->z);
 			AddChildSpriteScreen(upper + 1, PAL_NONE, 31, 9);
@@ -351,18 +356,14 @@
 		}
 	} else {
 		if (IsLeveledFoundation(f)) {
-			/* leveled foundation
-			 * Use the original slope sprites if NW and NE borders should be visible
-			 */
-			if (sprite_base == SPR_SLOPES_VIRTUAL_BASE) sprite_base = SPR_FOUNDATION_BASE;
-
-			AddSortableSpriteToDraw(sprite_base + ti->tileh, PAL_NONE, ti->x, ti->y, 16, 16, 7, ti->z);
+			/* leveled foundation */
+			AddSortableSpriteToDraw(leveled_base + ti->tileh, PAL_NONE, ti->x, ti->y, 16, 16, 7, ti->z);
 			OffsetGroundSprite(31, 1);
 		} else {
 			/* inclined foundation */
 			byte inclined = GetHighestSlopeCorner(ti->tileh) * 2 + (f == FOUNDATION_INCLINED_Y ? 1 : 0);
 
-			AddSortableSpriteToDraw(sprite_base + SPR_SLOPES_INCLINED_OFFSET + inclined, PAL_NONE, ti->x, ti->y, 16, 16, 1, ti->z);
+			AddSortableSpriteToDraw(inclined_base + inclined, PAL_NONE, ti->x, ti->y, 16, 16, 1, ti->z);
 			OffsetGroundSprite(31, 9);
 		}
 		ti->z += ApplyFoundationToSlope(f, &ti->tileh);
--- a/src/table/files.h
+++ b/src/table/files.h
@@ -65,5 +65,7 @@
 	{ "group.grf",     { 0xe8, 0x52, 0x5f, 0x1c, 0x3e, 0xf9, 0x91, 0x9d, 0x0f, 0x70, 0x8c, 0x8a, 0x21, 0xa4, 0xc7, 0x02 } },
 	{ "tramtrkw.grf",  { 0x83, 0x0a, 0xf4, 0x9f, 0x29, 0x10, 0x48, 0xfd, 0x76, 0xe9, 0xda, 0xac, 0x5d, 0xa2, 0x30, 0x45 } },
 	{ "oneway.grf",    { 0xbb, 0xc6, 0xa3, 0xb2, 0xb3, 0xa0, 0xc9, 0x3c, 0xc9, 0xee, 0x24, 0x7c, 0xb6, 0x51, 0x74, 0x63 } },
+	{ "halffndw.grf",  { 0xf2, 0x10, 0xe0, 0xc1, 0xa1, 0xdc, 0xb3, 0x6e, 0x3f, 0xce, 0xb8, 0x98, 0x1a, 0x08, 0xb0, 0x67 } },
+	{ "halfselw.grf",  { 0xf2, 0x12, 0x2e, 0x88, 0x58, 0x08, 0xc4, 0xa5, 0xbd, 0x91, 0xb3, 0xc2, 0x5b, 0x5a, 0xb9, 0xf4 } },
 	{ "flags.grf",     { 0xa1, 0xd7, 0x72, 0x75, 0x0e, 0x81, 0x86, 0x0e, 0xc9, 0xcd, 0xc2, 0x57, 0xb2, 0x19, 0xe1, 0x0c } },
 };
--- a/src/table/landscape_sprite.h
+++ b/src/table/landscape_sprite.h
@@ -1,5 +1,10 @@
 /* $Id$ */
 
+enum {
+	SKIP = 0xFFFE,
+	END  = 0xFFFF
+};
+
 static const SpriteID _landscape_spriteindexes_1[] = {
  0xF67,  0xF9F,
  0xAAD,  0xAB0,
@@ -138,7 +143,7 @@
 Skip first 3 sprites and only load the proper set */
 static const SpriteID _slopes_spriteindexes_0[] = {
 	SKIP, 3,
-	SPR_SLOPES_BASE, SPR_SLOPES_BASE + 73,
+	SPR_SLOPES_VIRTUAL_BASE + 15, SPR_SLOPES_VIRTUAL_BASE + 4 * SPR_TRKFOUND_BLOCK_SIZE,
 	END
 };
 
@@ -146,7 +151,7 @@
 Skip first 79 sprites and only load the proper set */
 static const SpriteID _slopes_spriteindexes_1[] = {
 	SKIP, 79,
-	SPR_SLOPES_BASE, SPR_SLOPES_BASE + 73,
+	SPR_SLOPES_VIRTUAL_BASE + 15, SPR_SLOPES_VIRTUAL_BASE + 4 * SPR_TRKFOUND_BLOCK_SIZE,
 	END
 };
 
@@ -154,7 +159,7 @@
 Skip first 155 sprites and only load the proper set */
 static const SpriteID _slopes_spriteindexes_2[] = {
 	SKIP, 155,
-	SPR_SLOPES_BASE, SPR_SLOPES_BASE + 73,
+	SPR_SLOPES_VIRTUAL_BASE + 15, SPR_SLOPES_VIRTUAL_BASE + 4 * SPR_TRKFOUND_BLOCK_SIZE,
 	END
 };
 
@@ -162,6 +167,33 @@
 Skip first 231 sprites and only load the proper set */
 static const SpriteID _slopes_spriteindexes_3[] = {
 	SKIP, 231,
-	SPR_SLOPES_BASE, SPR_SLOPES_BASE + 73,
+	SPR_SLOPES_VIRTUAL_BASE + 15, SPR_SLOPES_VIRTUAL_BASE + 4 * SPR_TRKFOUND_BLOCK_SIZE,
+	END
+};
+
+/* Halftile foundation indexes for temperate climate */
+static const SpriteID _halftile_foundation_spriteindexes_0[] = {
+	SPR_HALFTILE_FOUNDATION_BASE, SPR_HALFTILE_FOUNDATION_BASE + 4 * SPR_HALFTILE_BLOCK_SIZE - 1,
 	END
 };
+
+/* Halftile foundation indexes for arctic climate */
+static const SpriteID _halftile_foundation_spriteindexes_1[] = {
+	SKIP, 16,
+	SPR_HALFTILE_FOUNDATION_BASE, SPR_HALFTILE_FOUNDATION_BASE + 4 * SPR_HALFTILE_BLOCK_SIZE - 1,
+	END
+};
+
+/* Halftile foundation indexes for tropic climate */
+static const SpriteID _halftile_foundation_spriteindexes_2[] = {
+	SKIP, 32,
+	SPR_HALFTILE_FOUNDATION_BASE, SPR_HALFTILE_FOUNDATION_BASE + 4 * SPR_HALFTILE_BLOCK_SIZE - 1,
+	END
+};
+
+/* Halftile foundation indexes for toyland climate */
+static const SpriteID _halftile_foundation_spriteindexes_3[] = {
+	SKIP, 48,
+	SPR_HALFTILE_FOUNDATION_BASE, SPR_HALFTILE_FOUNDATION_BASE + 4 * SPR_HALFTILE_BLOCK_SIZE - 1,
+	END
+};
--- a/src/table/sprites.h
+++ b/src/table/sprites.h
@@ -54,8 +54,9 @@
 	SPR_SLOPES_BASE                    = SPR_CANALS_BASE + 70,
 	SPR_SLOPES_INCLINED_OFFSET         = 15,
 	SPR_SLOPES_VIRTUAL_BASE            = SPR_SLOPES_BASE - SPR_SLOPES_INCLINED_OFFSET, // The original foundations (see SPR_FOUNDATION_BASE below) are mapped before the additional foundations.
-	SPR_SLOPES_NO_FOUNDATION_NW_OFFSET = 22, // no wall on the NW edge of the tile.
-	SPR_SLOPES_NO_FOUNDATION_NE_OFFSET = 44, // no wall on the NE edge of the tile.
+	SPR_TRKFOUND_BLOCK_SIZE            = 22, // The sprites in trkfoundw.grf are organized in blocks of 22.
+
+	/* between slopes and autorail are 4 unused sprites */
 
 	SPR_AUTORAIL_BASE = SPR_SLOPES_BASE + 78,
 	SPR_ELRAIL_BASE   = SPR_AUTORAIL_BASE + 55,
@@ -179,8 +180,18 @@
 	/* Not really a sprite, but an empty bounding box. Used to construct bounding boxes, that help sorting the sprites, but do not have a sprite associated. */
 	SPR_EMPTY_BOUNDING_BOX = SPR_ONEWAY_BASE + 6,
 
+	/* Halftile foundations */
+	SPR_HALFTILE_FOUNDATION_BASE     = SPR_EMPTY_BOUNDING_BOX + 1,
+	SPR_HALFTILE_BLOCK_SIZE          = 4,  // The sprites in halffndw.grf are organized in blocks of 4.
+
+	/* Halftile-selection sprites */
+	SPR_HALFTILE_SELECTION_BASE      = SPR_HALFTILE_FOUNDATION_BASE + 4 * SPR_HALFTILE_BLOCK_SIZE,
+	SPR_HALFTILE_SELECTION_FLAT      = SPR_HALFTILE_SELECTION_BASE,
+	SPR_HALFTILE_SELECTION_DOWN      = SPR_HALFTILE_SELECTION_BASE + 4,
+	SPR_HALFTILE_SELECTION_UP        = SPR_HALFTILE_SELECTION_BASE + 8,
+
 	/* Flags sprites (in same order as enum NetworkLanguage) */
-	SPR_FLAGS_BASE = SPR_EMPTY_BOUNDING_BOX + 1,
+	SPR_FLAGS_BASE = SPR_HALFTILE_SELECTION_BASE + 12,
 
 	/* Manager face sprites */
 	SPR_GRADIENT = 874, // background gradient behind manager face