1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-17 03:53:07 +01:00

Implemented a couple of functions, memory leak fix

- create_duck
- viewport_set_underground_flag (0x006E7A15)
Free dpi in paint_park_entrance_entry
This commit is contained in:
Gericom
2015-02-27 16:34:52 +01:00
parent 4157ddc065
commit ff79e98819
3 changed files with 67 additions and 3 deletions

View File

@@ -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, &center_x, &center_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;

View File

@@ -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;
}

View File

@@ -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 */