From 11cdcea72bcff323c66d5c0e0df03901bec8941e Mon Sep 17 00:00:00 2001 From: LRFLEW Date: Sat, 30 Sep 2017 19:18:31 -0500 Subject: [PATCH] Fix RCTC g1.dat rendering issues --- src/openrct2/drawing/Sprite.cpp | 48 ++++++++++++++++++++++++--- src/openrct2/drawing/drawing.h | 1 + src/openrct2/drawing/font.c | 3 +- src/openrct2/drawing/scrolling_text.c | 3 +- src/openrct2/sprites.h | 17 ++++++++++ 5 files changed, 66 insertions(+), 6 deletions(-) diff --git a/src/openrct2/drawing/Sprite.cpp b/src/openrct2/drawing/Sprite.cpp index 89f2b6efb0..0f0c26d6fc 100644 --- a/src/openrct2/drawing/Sprite.cpp +++ b/src/openrct2/drawing/Sprite.cpp @@ -36,10 +36,35 @@ using namespace OpenRCT2; using namespace OpenRCT2::Ui; +constexpr struct +{ + int start; + sint32 x_offset; + sint32 y_offset; +} +sprite_peep_pickup_starts[15] = +{ + {SPR_PEEP_PICKUP_GUEST_START, 0, 15}, + {SPR_PEEP_PICKUP_HANDYMAN_START, 1, 18}, + {SPR_PEEP_PICKUP_MECHANIC_START, 3, 22}, + {SPR_PEEP_PICKUP_GUARD_START, 3, 15}, + {SPR_PEEP_PICKUP_PANDA_START, -1, 19}, + {SPR_PEEP_PICKUP_TIGER_START, -1, 17}, + {SPR_PEEP_PICKUP_ELEPHANT_START, -1, 17}, + {SPR_PEEP_PICKUP_GORILLA_START, 0, 17}, + {SPR_PEEP_PICKUP_SNOWMAN_START, -1, 16}, + {SPR_PEEP_PICKUP_KNIGHT_START, -2, 17}, + {SPR_PEEP_PICKUP_BANDIT_START, 0, 16}, + {SPR_PEEP_PICKUP_PIRATE_START, 0, 16}, + {SPR_PEEP_PICKUP_SHERIFF_START, 0, 16}, + {SPR_PEEP_PICKUP_ASTRONAUT_START, 0, 16}, + {SPR_PEEP_PICKUP_ROMAN_START, -1, 17}, +}; + static inline uint32 rctc_to_rct2_index(uint32 image) { - if ( image < 1575) return image; - else if (image >= 1607 && image < 4983) return image - 32; + if ( image < 1542) return image; + else if (image >= 1574 && image < 4983) return image - 32; else if (image >= 4986 && image < 17189) return image - 35; else if (image >= 17191 && image < 18121) return image - 37; else if (image >= 18123 && image < 23800) return image - 39; @@ -63,7 +88,7 @@ static void read_and_convert_gxdat(IStream * stream, size_t count, bool is_rctc, // statement skips over the elements we don't want. switch (i) { - case 1575: + case 1542: rctc += 32; break; case 23761: case 24627: @@ -98,6 +123,18 @@ static void read_and_convert_gxdat(IStream * stream, size_t count, bool is_rctc, ++rctc; } + + // The pincer graphic for picking up peeps is different in + // RCTC, and the sprites have different offsets to accommodate + // the change. This reverts the offsets to their RCT2 values. + for (const auto &animation : sprite_peep_pickup_starts) + { + for (int i=0; i < SPR_PEEP_PICKUP_COUNT; ++i) + { + elements[animation.start + i].x_offset -= animation.x_offset; + elements[animation.start + i].y_offset -= animation.y_offset; + } + } } else { @@ -131,6 +168,7 @@ extern "C" #else rct_g1_element * g1Elements = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element); #endif + bool gTinyFontAntiAliased = false; /** * @@ -156,7 +194,9 @@ extern "C" #ifdef NO_RCT2 g1Elements = Memory::AllocateArray(324206); #endif - read_and_convert_gxdat(&fs, header.num_entries, header.num_entries == SPR_RCTC_G1_END, g1Elements); + bool is_rctc = header.num_entries == SPR_RCTC_G1_END; + read_and_convert_gxdat(&fs, header.num_entries, is_rctc, g1Elements); + gTinyFontAntiAliased = is_rctc; // Read element data _g1Buffer = fs.ReadArray(header.total_size); diff --git a/src/openrct2/drawing/drawing.h b/src/openrct2/drawing/drawing.h index 28adf17bc2..9c87ec34cb 100644 --- a/src/openrct2/drawing/drawing.h +++ b/src/openrct2/drawing/drawing.h @@ -281,6 +281,7 @@ extern sint32 gPickupPeepX; extern sint32 gPickupPeepY; extern rct_g1_element *g1Elements; +extern bool gTinyFontAntiAliased; extern rct_drawpixelinfo gScreenDPI; extern rct_drawpixelinfo gWindowDPI; diff --git a/src/openrct2/drawing/font.c b/src/openrct2/drawing/font.c index 52e58cd12e..485d7f4ff8 100644 --- a/src/openrct2/drawing/font.c +++ b/src/openrct2/drawing/font.c @@ -45,7 +45,8 @@ void font_sprite_initialise_characters() for (uint8 glyphIndex = 0; glyphIndex < FONT_SPRITE_GLYPH_COUNT; glyphIndex++) { rct_g1_element g1 = g1Elements[glyphIndex + SPR_CHAR_START + glyphOffset]; - sint32 width = fontSize == FONT_SIZE_BIG ? g1.width + 1 : g1.width - 1; + sint32 width = g1.width + 2 * g1.x_offset; + width += fontSize == FONT_SIZE_BIG ? 1 : -1; if (glyphIndex >= (FORMAT_ARGUMENT_CODE_START - 32) && glyphIndex < (FORMAT_COLOUR_CODE_END - 32)) { width = 0; } diff --git a/src/openrct2/drawing/scrolling_text.c b/src/openrct2/drawing/scrolling_text.c index 962a20b677..27512f6dc7 100644 --- a/src/openrct2/drawing/scrolling_text.c +++ b/src/openrct2/drawing/scrolling_text.c @@ -68,7 +68,8 @@ void scrolling_text_initialise_bitmaps() uint8 val = 0; for (sint32 y = 0; y < 8; y++) { val >>= 1; - if (dpi.bits[x + y * 8] == 1) { + uint8 pixel = dpi.bits[x + y * 8]; + if (pixel == 1 || (gTinyFontAntiAliased && pixel == 2)) { val |= 0x80; } } diff --git a/src/openrct2/sprites.h b/src/openrct2/sprites.h index b0067b5217..2ae6561726 100644 --- a/src/openrct2/sprites.h +++ b/src/openrct2/sprites.h @@ -533,6 +533,23 @@ enum { SPR_6410 = 6410, + SPR_PEEP_PICKUP_COUNT = 12, + SPR_PEEP_PICKUP_GUEST_START = 6813, + SPR_PEEP_PICKUP_HANDYMAN_START = 11289, + SPR_PEEP_PICKUP_MECHANIC_START = 11469, + SPR_PEEP_PICKUP_GUARD_START = 11909, + SPR_PEEP_PICKUP_PANDA_START = 12001, + SPR_PEEP_PICKUP_TIGER_START = 12157, + SPR_PEEP_PICKUP_ELEPHANT_START = 12353, + SPR_PEEP_PICKUP_GORILLA_START = 12665, + SPR_PEEP_PICKUP_SNOWMAN_START = 12881, + SPR_PEEP_PICKUP_KNIGHT_START = 12981, + SPR_PEEP_PICKUP_BANDIT_START = 13197, + SPR_PEEP_PICKUP_PIRATE_START = 13469, + SPR_PEEP_PICKUP_SHERIFF_START = 13701, + SPR_PEEP_PICKUP_ASTRONAUT_START = 13845, + SPR_PEEP_PICKUP_ROMAN_START = 13925, + SPR_RIDE_DESIGN_PREVIEW_SPIRAL_ROLLER_COASTER_TRACK = 14222, SPR_RIDE_DESIGN_PREVIEW_SPIRAL_ROLLER_COASTER_SUPPORTS = 14223, SPR_RIDE_DESIGN_PREVIEW_STAND_UP_ROLLER_COASTER_TRACK = 14224,