From ff79e98819afcfed87a551caa4499adf420b4f67 Mon Sep 17 00:00:00 2001 From: Gericom Date: Fri, 27 Feb 2015 16:34:52 +0100 Subject: [PATCH] Implemented a couple of functions, memory leak fix - create_duck - viewport_set_underground_flag (0x006E7A15) Free dpi in paint_park_entrance_entry --- src/interface/viewport.c | 27 ++++++++++++++++++++++++-- src/object.c | 1 + src/world/sprite.c | 42 +++++++++++++++++++++++++++++++++++++++- 3 files changed, 67 insertions(+), 3 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index af0a416ec1..7b764a3a03 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -409,6 +409,27 @@ void sub_6E7DE1(sint16 x, sint16 y, rct_window* w, rct_viewport* viewport){ memcpy(viewport, &view_copy, sizeof(rct_viewport)); } +//0x006E7A15 +void viewport_set_underground_flag(int underground, rct_window* window, rct_viewport* viewport) +{ + if (window->classification != 0) + { + if (!underground) + { + int bit = viewport->flags & VIEWPORT_FLAG_UNDERGROUND_INSIDE; + viewport->flags &= ~VIEWPORT_FLAG_UNDERGROUND_INSIDE; + if (!bit) return; + } + else + { + int bit = viewport->flags & VIEWPORT_FLAG_UNDERGROUND_INSIDE; + viewport->flags |= VIEWPORT_FLAG_UNDERGROUND_INSIDE; + if (bit) return; + } + window_invalidate(window); + } +} + /** * * rct2: 0x006E7A3A @@ -428,7 +449,8 @@ void viewport_update_position(rct_window *window) int height = map_element_height(0xFFFF & sprite->unknown.x, 0xFFFF & sprite->unknown.y) & 0xFFFF - 16; int underground = sprite->unknown.z < height; - RCT2_CALLPROC_X(0x6E7A15, sprite->unknown.x, sprite->unknown.y, sprite->unknown.z, underground, (int)window, (int)viewport, 0); + viewport_set_underground_flag(underground, window, viewport); + //RCT2_CALLPROC_X(0x6E7A15, sprite->unknown.x, sprite->unknown.y, sprite->unknown.z, underground, (int)window, (int)viewport, 0); int center_x, center_y; center_2d_coordinates(sprite->unknown.x, sprite->unknown.y, sprite->unknown.z, ¢er_x, ¢er_y, window->viewport); @@ -446,7 +468,8 @@ void viewport_update_position(rct_window *window) int curr_rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint32); sub_689174(&x, &y, &z, curr_rotation); - RCT2_CALLPROC_X(0x006E7A15, x, y, z, 0, (int)window, (int)viewport, 0); + viewport_set_underground_flag(0, window, viewport); + //RCT2_CALLPROC_X(0x006E7A15, x, y, z, 0, (int)window, (int)viewport, 0); //Clamp to the map minimum value int at_map_edge = 0; diff --git a/src/object.c b/src/object.c index 7f2ed4eb67..a634b4e8bf 100644 --- a/src/object.c +++ b/src/object.c @@ -882,6 +882,7 @@ int paint_park_entrance_entry(int flags, int ebx, int ecx, int edx, rct_drawpixe gfx_draw_sprite(dpi, image_id + 1, 24, 68, ebp); gfx_draw_sprite(dpi, image_id, 56, 84, ebp); gfx_draw_sprite(dpi, image_id + 2, 88, 100, ebp); + rct2_free(dpi); } return flags; } diff --git a/src/world/sprite.c b/src/world/sprite.c index 148fa39aff..be2d2fa078 100644 --- a/src/world/sprite.c +++ b/src/world/sprite.c @@ -21,6 +21,7 @@ #include "../addresses.h" #include "../interface/viewport.h" #include "sprite.h" +#include "../scenario.h" rct_sprite* g_sprite_list = RCT2_ADDRESS(RCT2_ADDRESS_SPRITE_LIST, rct_sprite); @@ -52,7 +53,46 @@ void create_balloon(int x, int y, int z, int colour) */ void create_duck(int targetX, int targetY) { - RCT2_CALLPROC_X(0x0067440F, targetX, 0, targetY, 0, 0, 0, 0); + //RCT2_CALLPROC_X(0x0067440F, targetX, 0, targetY, 0, 0, 0, 0); + rct_sprite* sprite = create_sprite(2); + if (sprite != NULL) + { + sprite->pad_00[0] = 2; + sprite->pad_00[1] = 8; + sprite->pad_00[0x14] = 9; + sprite->pad_00[9] = 0xC; + sprite->pad_00[0x15] = 9; + int ebx = scenario_rand(); + int ebp = ebx; + int edi = ebx; + ebp >>= 8; + edi >>= 16; + edi &= 0x3F; + ebp &= 0x1E; + targetX += ebp; + targetY += ebp; + *((uint16_t*)&sprite->pad_00[0x30]) = targetX; + *((uint16_t*)&sprite->pad_00[0x32]) = targetY; + switch (ebx & 3) + { + case 0: + targetX = 8191 - edi; + break; + case 1: + targetY = edi; + break; + case 2: + targetX = edi; + break; + case 3: + targetY = 8191 - edi; + break; + } + sprite->pad_00[0x1E] = (ebx << 3) & 0xFF; + sprite_move(targetX, targetY, 496, sprite); + sprite->pad_00[0x48] = 0; + *((uint16_t*)&sprite->pad_00[0x26]) = 0; + } } /* rct2: 0x006EC473 */