From 69545bfbd9090308da008d867f562ab5393e24fb Mon Sep 17 00:00:00 2001 From: Gericom Date: Fri, 27 Feb 2015 13:29:57 +0100 Subject: [PATCH 1/5] Implemented create_balloon --- src/world/sprite.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/world/sprite.c b/src/world/sprite.c index ac4b6a3a07..148fa39aff 100644 --- a/src/world/sprite.c +++ b/src/world/sprite.c @@ -30,7 +30,20 @@ rct_sprite* g_sprite_list = RCT2_ADDRESS(RCT2_ADDRESS_SPRITE_LIST, rct_sprite); */ void create_balloon(int x, int y, int z, int colour) { - RCT2_CALLPROC_X(0x006736C7, x, colour << 8, y, z, 0, 0, 0); + //RCT2_CALLPROC_X(0x006736C7, x, colour << 8, y, z, 0, 0, 0); + rct_sprite* sprite = create_sprite(2); + if (sprite != NULL) + { + sprite->pad_00[0x14] = 13; + sprite->pad_00[9] = 22; + sprite->pad_00[0x15] = 11; + sprite->pad_00[0] = 2; + sprite_move(x, y, z, sprite); + sprite->pad_00[1] = 7; + *((uint16_t*)&sprite->pad_00[0x26]) = 0; + sprite->pad_00[0x2C] = colour; + sprite->pad_00[0x24] = 0; + } } /** From ff79e98819afcfed87a551caa4499adf420b4f67 Mon Sep 17 00:00:00 2001 From: Gericom Date: Fri, 27 Feb 2015 16:34:52 +0100 Subject: [PATCH 2/5] 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 */ From 961a251dd0520bd74653ded130d4d6f943a8512e Mon Sep 17 00:00:00 2001 From: Gericom Date: Sat, 28 Feb 2015 11:47:09 +0100 Subject: [PATCH 3/5] Added rct_balloon and rct_duck structs --- src/interface/viewport.c | 4 ++-- src/object.c | 7 ++++++- src/world/sprite.c | 38 +++++++++++++++++------------------ src/world/sprite.h | 43 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 69 insertions(+), 23 deletions(-) diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 7b764a3a03..74617ed1a0 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -409,10 +409,10 @@ void sub_6E7DE1(sint16 x, sint16 y, rct_window* w, rct_viewport* viewport){ memcpy(viewport, &view_copy, sizeof(rct_viewport)); } -//0x006E7A15 +//rct2: 0x006E7A15 void viewport_set_underground_flag(int underground, rct_window* window, rct_viewport* viewport) { - if (window->classification != 0) + if (window->classification != WC_MAIN_WINDOW) { if (!underground) { diff --git a/src/object.c b/src/object.c index a634b4e8bf..7962d609f0 100644 --- a/src/object.c +++ b/src/object.c @@ -385,6 +385,7 @@ int object_calculate_checksum(const rct_object_entry *entry, const char *data, i } /* ebp is made up of 3 pointers: no_elements, unknown, g1_source */ +//rct2: 0x006A9ED1 int sub_6A9ED1(uint8_t** ebp) { int result; @@ -409,6 +410,7 @@ int sub_6A9ED1(uint8_t** ebp) return result; } +//rct2: 0x006DE83E int paint_ride_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dpi, int esi, int ebp) { if ((flags & 0xFF) != 3) @@ -787,6 +789,7 @@ int paint_ride_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dp } } +//rct2: 0x006A8621 int paint_path_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dpi, int esi, int ebp) { if ((flags & 0xFF) != 3) @@ -845,6 +848,7 @@ int paint_path_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dp } } +//rct2: 0x00666E42 int paint_park_entrance_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dpi, int esi, int ebp) { if ((flags & 0xFF) != 3) @@ -888,6 +892,7 @@ int paint_park_entrance_entry(int flags, int ebx, int ecx, int edx, rct_drawpixe } } +//rct2: 0x006E6E2A int paint_water_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dpi, int esi, int ebp) { if ((flags & 0xFF) != 3) @@ -933,7 +938,7 @@ int paint_water_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* d } } -//0x0066B355 +//rct2: 0x0066B355 int paint_stex_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dpi, int esi, int ebp) { if ((flags & 0xFF) != 3) diff --git a/src/world/sprite.c b/src/world/sprite.c index be2d2fa078..4b5cfe8a63 100644 --- a/src/world/sprite.c +++ b/src/world/sprite.c @@ -31,19 +31,18 @@ rct_sprite* g_sprite_list = RCT2_ADDRESS(RCT2_ADDRESS_SPRITE_LIST, rct_sprite); */ void create_balloon(int x, int y, int z, int colour) { - //RCT2_CALLPROC_X(0x006736C7, x, colour << 8, y, z, 0, 0, 0); rct_sprite* sprite = create_sprite(2); if (sprite != NULL) { - sprite->pad_00[0x14] = 13; - sprite->pad_00[9] = 22; - sprite->pad_00[0x15] = 11; - sprite->pad_00[0] = 2; + sprite->balloon.var_14 = 13; + sprite->balloon.var_09 = 22; + sprite->balloon.var_15 = 11; + sprite->balloon.sprite_identifier = 2; sprite_move(x, y, z, sprite); - sprite->pad_00[1] = 7; - *((uint16_t*)&sprite->pad_00[0x26]) = 0; - sprite->pad_00[0x2C] = colour; - sprite->pad_00[0x24] = 0; + sprite->balloon.var_01 = 7; + sprite->balloon.var_26 = 0; + sprite->balloon.colour = colour; + sprite->balloon.var_24 = 0; } } @@ -53,15 +52,14 @@ 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); 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; + sprite->duck.sprite_identifier = 2; + sprite->duck.var_01 = 8; + sprite->duck.var_14 = 9; + sprite->duck.var_09 = 0xC; + sprite->duck.var_15 = 9; int ebx = scenario_rand(); int ebp = ebx; int edi = ebx; @@ -71,8 +69,8 @@ void create_duck(int targetX, int targetY) ebp &= 0x1E; targetX += ebp; targetY += ebp; - *((uint16_t*)&sprite->pad_00[0x30]) = targetX; - *((uint16_t*)&sprite->pad_00[0x32]) = targetY; + sprite->duck.x = targetX; + sprite->duck.y = targetY; switch (ebx & 3) { case 0: @@ -88,10 +86,10 @@ void create_duck(int targetX, int targetY) targetY = 8191 - edi; break; } - sprite->pad_00[0x1E] = (ebx << 3) & 0xFF; + sprite->duck.var_1E = (ebx << 3) & 0xFF; sprite_move(targetX, targetY, 496, sprite); - sprite->pad_00[0x48] = 0; - *((uint16_t*)&sprite->pad_00[0x26]) = 0; + sprite->duck.var_48 = 0; + sprite->duck.var_26 = 0; } } diff --git a/src/world/sprite.h b/src/world/sprite.h index a9d24991eb..02505e53e4 100644 --- a/src/world/sprite.h +++ b/src/world/sprite.h @@ -81,6 +81,47 @@ typedef struct { uint32 var_24; } rct_litter; +typedef struct { + uint8 sprite_identifier; // 0x00 + uint8 var_01; // 0x01 + uint16 var_02; // 0x02 + uint16 next; // 0x04 + uint16 previous; // 0x06 + uint8 linked_list_type_offset; // 0x08 Valid values are SPRITE_LINKEDLIST_OFFSET_... + uint8 var_09; // 0x09 + uint8 pad_0A[0xA]; + uint8 var_14; // 0x14 + uint8 var_15; // 0x15 + uint8 pad_16[0xE]; + uint8 var_24; // 0x24 + uint8 pad_25; + uint16 var_26; // 0x26 + uint8 pad_28[4]; + uint8 colour; // 0x2C +} rct_balloon; + +typedef struct { + uint8 sprite_identifier; // 0x00 + uint8 var_01; // 0x01 + uint16 var_02; // 0x02 + uint16 next; // 0x04 + uint16 previous; // 0x06 + uint8 linked_list_type_offset; // 0x08 Valid values are SPRITE_LINKEDLIST_OFFSET_... + uint8 var_09; // 0x09 + uint8 pad_0A[0xA]; + uint8 var_14; // 0x14 + uint8 var_15; // 0x15 + uint8 pad_16[0x8]; + uint8 var_1E; // 0x1E + uint8 pad_1F[0x7]; + uint16 var_26; + uint8 pad_28[0x8]; + sint16 x; // 0x30 + sint16 y; // 0x32 + uint8 pad_34[0x14]; + uint8 var_48; // 0x48 +} rct_duck; + /** * Sprite structure. * size: 0x0100 @@ -91,6 +132,8 @@ typedef union { rct_peep peep; rct_litter litter; rct_vehicle vehicle; + rct_balloon balloon; + rct_duck duck; } rct_sprite; // rct2: 0x010E63BC From b560638e23b5d73f2931747db5a8a380395de733 Mon Sep 17 00:00:00 2001 From: Gericom Date: Sat, 28 Feb 2015 14:48:04 +0100 Subject: [PATCH 4/5] More refactoring and fixed bug in create_duck --- src/world/sprite.c | 18 +++++++----------- src/world/sprite.h | 6 +++--- 2 files changed, 10 insertions(+), 14 deletions(-) diff --git a/src/world/sprite.c b/src/world/sprite.c index 4b5cfe8a63..d469b32de0 100644 --- a/src/world/sprite.c +++ b/src/world/sprite.c @@ -60,18 +60,14 @@ void create_duck(int targetX, int targetY) sprite->duck.var_14 = 9; sprite->duck.var_09 = 0xC; sprite->duck.var_15 = 9; - int ebx = scenario_rand(); - int ebp = ebx; - int edi = ebx; - ebp >>= 8; - edi >>= 16; - edi &= 0x3F; - ebp &= 0x1E; + int edi = scenario_rand() & 0x3F; + int ebp = scenario_rand() & 0x1E; targetX += ebp; targetY += ebp; - sprite->duck.x = targetX; - sprite->duck.y = targetY; - switch (ebx & 3) + sprite->duck.target_x = targetX; + sprite->duck.target_y = targetY; + uint8 direction = scenario_rand() & 3; + switch (direction) { case 0: targetX = 8191 - edi; @@ -86,7 +82,7 @@ void create_duck(int targetX, int targetY) targetY = 8191 - edi; break; } - sprite->duck.var_1E = (ebx << 3) & 0xFF; + sprite->duck.sprite_direction = direction << 3; sprite_move(targetX, targetY, 496, sprite); sprite->duck.var_48 = 0; sprite->duck.var_26 = 0; diff --git a/src/world/sprite.h b/src/world/sprite.h index 02505e53e4..ea1ec8a105 100644 --- a/src/world/sprite.h +++ b/src/world/sprite.h @@ -112,12 +112,12 @@ typedef struct { uint8 var_14; // 0x14 uint8 var_15; // 0x15 uint8 pad_16[0x8]; - uint8 var_1E; // 0x1E + uint8 sprite_direction; // 0x1E uint8 pad_1F[0x7]; uint16 var_26; uint8 pad_28[0x8]; - sint16 x; // 0x30 - sint16 y; // 0x32 + sint16 target_x; // 0x30 + sint16 target_y; // 0x32 uint8 pad_34[0x14]; uint8 var_48; // 0x48 } rct_duck; From 1421109f46288906f91737d2010ba24942dc3e6b Mon Sep 17 00:00:00 2001 From: Gericom Date: Sat, 28 Feb 2015 18:08:19 +0100 Subject: [PATCH 5/5] Renamed ebp and eleminated edi in create_duck --- src/world/sprite.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/world/sprite.c b/src/world/sprite.c index d469b32de0..3c4db8052c 100644 --- a/src/world/sprite.c +++ b/src/world/sprite.c @@ -60,26 +60,25 @@ void create_duck(int targetX, int targetY) sprite->duck.var_14 = 9; sprite->duck.var_09 = 0xC; sprite->duck.var_15 = 9; - int edi = scenario_rand() & 0x3F; - int ebp = scenario_rand() & 0x1E; - targetX += ebp; - targetY += ebp; + int offset_xy = scenario_rand() & 0x1E; + targetX += offset_xy; + targetY += offset_xy; sprite->duck.target_x = targetX; sprite->duck.target_y = targetY; uint8 direction = scenario_rand() & 3; switch (direction) { case 0: - targetX = 8191 - edi; + targetX = 8191 - (scenario_rand() & 0x3F); break; case 1: - targetY = edi; + targetY = scenario_rand() & 0x3F; break; case 2: - targetX = edi; + targetX = scenario_rand() & 0x3F; break; case 3: - targetY = 8191 - edi; + targetY = 8191 - (scenario_rand() & 0x3F); break; } sprite->duck.sprite_direction = direction << 3;