From 5d2b5f4d5c607c4b3206f93c5e1941b886f4e3ef Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Wed, 2 Nov 2016 22:39:58 +0100 Subject: [PATCH 1/2] Make `NO_RCT2` builds possible again --- src/paint/paint.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/paint/paint.c b/src/paint/paint.c index 52fd51e073..8606bdb020 100644 --- a/src/paint/paint.c +++ b/src/paint/paint.c @@ -34,11 +34,13 @@ attached_paint_struct * g_aps_F1AD2C; paint_string_struct * gPaintPSStringHead; static paint_string_struct * _paintLastPSString; +#define MAX_PAINT_QUADRANTS (512) + #ifdef NO_RCT2 paint_entry gPaintStructs[4000]; static uint32 _paintQuadrantBackIndex; static uint32 _paintQuadrantFrontIndex; -static paint_struct *_paintQuadrants[512]; +static paint_struct *_paintQuadrants[MAX_PAINT_QUADRANTS]; void *g_currently_drawn_item; paint_entry * gEndOfPaintStructArray; sint16 gUnk9DE568; @@ -100,7 +102,7 @@ void paint_init(rct_drawpixelinfo * dpi) static void paint_add_ps_to_quadrant(paint_struct * ps, sint32 positionHash) { - uint32 paintQuadrantIndex = clamp(0, positionHash / 32, countof(_paintQuadrants) - 1); + uint32 paintQuadrantIndex = clamp(0, positionHash / 32, MAX_PAINT_QUADRANTS - 1); ps->var_18 = paintQuadrantIndex; ps->next_quadrant_ps = _paintQuadrants[paintQuadrantIndex]; From 0a431cf91882272d2ec40561eaa9975fcdb80211 Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Thu, 3 Nov 2016 00:05:02 +0100 Subject: [PATCH 2/2] Fix #4698: Scenery blocks wrong segments --- src/paint/map_element/scenery.c | 15 ++++++++------- src/windows/scenery.c | 2 +- src/world/map.c | 5 +++++ src/world/map.h | 1 + 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/paint/map_element/scenery.c b/src/paint/map_element/scenery.c index 1aff120795..3b72a88e58 100644 --- a/src/paint/map_element/scenery.c +++ b/src/paint/map_element/scenery.c @@ -98,7 +98,7 @@ void scenery_paint(uint8 direction, int height, rct_map_element* mapElement) { } } else { // 6DFFC2: - uint32 ecx = ((mapElement->type >> 6) + rotation) & 3; + uint8 ecx = (map_element_get_scenery_quadrant(mapElement) + rotation) & 3; x_offset = ScenerySubTileOffsets[ecx].x; y_offset = ScenerySubTileOffsets[ecx].y; boxoffset.x = x_offset; @@ -293,11 +293,12 @@ void scenery_paint(uint8 direction, int height, rct_map_element* mapElement) { } return; } - if (!(entry->small_scenery.flags & SMALL_SCENERY_FLAG_VOFFSET_CENTRE)) { + if (entry->small_scenery.flags & SMALL_SCENERY_FLAG_VOFFSET_CENTRE) { + // 6E075C: + uint8 direction = (map_element_get_scenery_quadrant(mapElement) + rotation) % 4; + paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C8 | SEGMENT_CC, direction), height, 0x20); return; } - // 6E075C: - paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C8 | SEGMENT_CC, rotation), height, 0x20); return; } if (entry->small_scenery.flags & (SMALL_SCENERY_FLAG27 | SMALL_SCENERY_FLAG_FULL_TILE)) { @@ -307,9 +308,9 @@ void scenery_paint(uint8 direction, int height, rct_map_element* mapElement) { } return; } - if (!(entry->small_scenery.flags & SMALL_SCENERY_FLAG_VOFFSET_CENTRE)) { + if (entry->small_scenery.flags & SMALL_SCENERY_FLAG_VOFFSET_CENTRE) { + uint8 direction = (map_element_get_scenery_quadrant(mapElement) + rotation) % 4; + paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C8 | SEGMENT_CC, direction), 0xFFFF, 0); return; } - paint_util_set_segment_support_height(paint_util_rotate_segments(SEGMENT_B4 | SEGMENT_C8 | SEGMENT_CC, rotation), 0xFFFF, 0); - return; } diff --git a/src/windows/scenery.c b/src/windows/scenery.c index ece8d7051e..1f21253aaf 100644 --- a/src/windows/scenery.c +++ b/src/windows/scenery.c @@ -1200,7 +1200,7 @@ void window_scenery_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int scrol gfx_draw_sprite(&clipdpi, imageId, 0x20, spriteTop, w->colours[1]); - if (sceneryEntry->small_scenery.flags & 0x200) { + if (sceneryEntry->small_scenery.flags & SMALL_SCENERY_FLAG_HAS_GLASS) { imageId = ((sceneryEntry->image + gWindowSceneryRotation) + 0x40000004) + ((gWindowSceneryPrimaryColour + 0x70) << 19); diff --git a/src/world/map.c b/src/world/map.c index e589c1a7bf..c9c822775d 100644 --- a/src/world/map.c +++ b/src/world/map.c @@ -242,6 +242,11 @@ int map_element_is_last_for_tile(const rct_map_element *element) return element->flags & MAP_ELEMENT_FLAG_LAST_TILE; } +uint8 map_element_get_scenery_quadrant(const rct_map_element *element) +{ + return (element->type & MAP_ELEMENT_QUADRANT_MASK) >> 6; +} + int map_element_get_type(const rct_map_element *element) { return element->type & MAP_ELEMENT_TYPE_MASK; diff --git a/src/world/map.h b/src/world/map.h index 6188c2f2e0..c71fe296bb 100644 --- a/src/world/map.h +++ b/src/world/map.h @@ -393,6 +393,7 @@ void map_update_tile_pointers(); rct_map_element *map_get_first_element_at(int x, int y); void map_set_tile_elements(int x, int y, rct_map_element *elements); int map_element_is_last_for_tile(const rct_map_element *element); +uint8 map_element_get_scenery_quadrant(const rct_map_element *element); int map_element_get_type(const rct_map_element *element); int map_element_get_direction(const rct_map_element *element); int map_element_get_terrain(const rct_map_element *element);