From fc9ebd257f4f5d033dd52f54e8560b3f03ffd34e Mon Sep 17 00:00:00 2001 From: rubidium Date: Sat, 20 Oct 2007 20:06:55 +0000 Subject: [PATCH] (svn r11316) -Codechange: add support for the half-tile (selection) graphics. --- bin/data/halffndw.grf | Bin 0 -> 21613 bytes bin/data/halfselw.grf | Bin 0 -> 2844 bytes src/gfxinit.cpp | 18 ++++++++++----- src/landscape.cpp | 41 ++++++++++++++++++----------------- src/table/files.h | 2 ++ src/table/landscape_sprite.h | 40 ++++++++++++++++++++++++++++++---- src/table/sprites.h | 17 ++++++++++++--- 7 files changed, 86 insertions(+), 32 deletions(-) create mode 100644 bin/data/halffndw.grf create mode 100644 bin/data/halfselw.grf diff --git a/bin/data/halffndw.grf b/bin/data/halffndw.grf new file mode 100644 index 0000000000000000000000000000000000000000..8fe4ad447aa25c5acba4a18e7bfb31d92763298f GIT binary patch literal 21613 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 Oa>s&aAC7@id;K@zDrhMH literal 0 HcmV?d00001 diff --git a/bin/data/halfselw.grf b/bin/data/halfselw.grf new file mode 100644 index 0000000000000000000000000000000000000000..e80c14ea17960feaf6280f8b73c59a19b92ce762 GIT binary patch literal 2844 zcmbuBeQ;D)8OGn|>}GfKxtp*dyCHn$YYE9Fgb-3>LWXt%4K$4mr3ewyT3bYIqm~Y1 zDaoYSa1ukWK_;Q>?wQ9cEKMkdC)v2aWF%o7%yD zI%ej{xjB!>2sTCe9}p`HPX$rmhPat=mF}Y{qzLANT=x6^cG#FNpfQ@ zs<9HcV;deo7xv=`yoghH9bq$cOdCfOmo`6(gIe(In1 z%FqW0l1Y{}b2T6s|efX<5>6nHd-`^Nehp zWeplxu=E_*jY1(y7*rX93NWY&235(Rf()vLLDe#-ItEoQH8jZBjj;Ng`nL|>fU2#L zF||@V-A_IA7(GiT={IzVKA;>dKs_GB3H%N3<0?MDHT;Y52w@iv;bKf#BIO@`b4yM+ z&CRb{s4`Rz-&ewym?vB_6BR-(U(eF2WW|2tq8O5nIWuw3dsBGcLSEc$ac(nj#uyP{-c(gXS zS=kXbptcK{tn|n(xHJt;R$4@ZUDIKU>cR>2XZ;G`>5rU`>2O6^Ci57 z-(q~qN2#Q9;MqSe?B#OKL%(7Zamb5Bs94KJiBYWzMPDhqrd(T!06S#m;#S=>=1RXi1RjxyC!V9inuWTxfyB z0Q+NzYx@Acg~t%#;~mE1&~OBO91-qoG2}O0HXc4no0%sfUc;wyRe|!`EX@<~tCf*r zk((7=uC|Hc;&33jQ+S-wyNr+sFVr41BjP8v$hXz8ScddQUrL_ml*`lMv(hgEV|H!; zxpT@$|0Cv3YEJdp?X-=)MuYS;{glqp+w@oZCuPEiQY_)2a~rns*x8959-D{RQJB^gD?8pc-P1lv3J%;j_4~IwIej~!xA}FZ5?dt)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; - if (IsSteepSlope(ti->tileh)) { - SpriteID lower_base; + /* 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; - /* 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; + if (IsSteepSlope(ti->tileh)) { + /* 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 @@ void DrawFoundation(TileInfo *ti, Foundation f) /* 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 @@ void DrawFoundation(TileInfo *ti, Foundation f) } } 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); diff --git a/src/table/files.h b/src/table/files.h index 98888c8d34..3deba561ae 100644 --- a/src/table/files.h +++ b/src/table/files.h @@ -65,5 +65,7 @@ static MD5File files_openttd[] = { { "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 } }, }; diff --git a/src/table/landscape_sprite.h b/src/table/landscape_sprite.h index 88f5f48b1b..49b650e47b 100644 --- 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 @@ END 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 @@ static const SpriteID _slopes_spriteindexes_0[] = { 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 @@ static const SpriteID _slopes_spriteindexes_1[] = { 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 @@ static const SpriteID _slopes_spriteindexes_2[] = { 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 }; diff --git a/src/table/sprites.h b/src/table/sprites.h index 787edccd70..ee9b6fa3fe 100644 --- a/src/table/sprites.h +++ b/src/table/sprites.h @@ -54,8 +54,9 @@ enum Sprites { 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 @@ enum Sprites { /* 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