From 9c4f06a04bbc3fae484c2a493f4c9d41116b4fce Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sat, 21 Jun 2014 13:31:28 +0100 Subject: [PATCH] Added another reset function --- src/editor.c | 7 ++++--- src/game.c | 3 ++- src/rct2.c | 1 - src/scenario.c | 2 +- src/sprite.c | 38 ++++++++++++++++++++++++++++++++++++-- src/sprite.h | 3 ++- src/title.c | 5 +++-- 7 files changed, 48 insertions(+), 11 deletions(-) diff --git a/src/editor.c b/src/editor.c index f9f2a43c70..d70af6bea9 100644 --- a/src/editor.c +++ b/src/editor.c @@ -32,6 +32,7 @@ #include "viewport.h" #include "finance.h" #include "audio.h" +#include "sprite.h" #include "string_ids.h" static void set_all_land_owned(); @@ -53,7 +54,7 @@ void editor_load() RCT2_CALLPROC_EBPSAFE(0x006B9CB0); reset_park_entrances(); reset_saved_strings(); - RCT2_CALLPROC_EBPSAFE(0x0069EB13); // sprites_init + reset_sprite_list(); ride_init_all(); window_guest_list_init_vars_a(); sub_6BD3A4(); @@ -102,7 +103,7 @@ void trackdesigner_load() RCT2_CALLPROC_EBPSAFE(0x006B9CB0); reset_park_entrances(); reset_saved_strings(); - RCT2_CALLPROC_EBPSAFE(0x0069EB13); // reset_sprites + reset_sprite_list(); ride_init_all(); window_guest_list_init_vars_a(); sub_6BD3A4(); @@ -140,7 +141,7 @@ void trackmanager_load() RCT2_CALLPROC_EBPSAFE(0x006B9CB0); reset_park_entrances(); reset_saved_strings(); - RCT2_CALLPROC_EBPSAFE(0x0069EB13); // reset_sprites + reset_sprite_list(); ride_init_all(); window_guest_list_init_vars_a(); sub_6BD3A4(); diff --git a/src/game.c b/src/game.c index a5327e18c8..c652e3f014 100644 --- a/src/game.c +++ b/src/game.c @@ -32,6 +32,7 @@ #include "sawyercoding.h" #include "scenario.h" #include "screenshot.h" +#include "sprite.h" #include "string_ids.h" #include "title.h" #include "tutorial.h" @@ -1581,7 +1582,7 @@ int game_load_save() // The rest is the same as in scenario load and play RCT2_CALLPROC_EBPSAFE(0x006A9FC0); map_update_tile_pointers(); - RCT2_CALLPROC_EBPSAFE(0x0069EBE4); + reset_0x69EBE4();// RCT2_CALLPROC_EBPSAFE(0x0069EBE4); RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_FLAGS, uint8) = SCREEN_FLAGS_PLAYING; viewport_init_all(); game_create_windows(); diff --git a/src/rct2.c b/src/rct2.c index 522387760d..9e6d8f3844 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -169,7 +169,6 @@ void rct2_init() reset_park_entrances(); reset_saved_strings(); reset_sprite_list(); - //RCT2_CALLPROC_EBPSAFE(0x0069EB13); //Sprite list reset/load ride_init_all(); window_guest_list_init_vars_a(); RCT2_CALLPROC_EBPSAFE(0x006BD3A4); //Peep? diff --git a/src/scenario.c b/src/scenario.c index 6dc29fa1bf..da2e83137b 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -154,7 +154,7 @@ void scenario_load(const char *path) RCT2_CALLPROC_EBPSAFE(0x006A9FC0); map_update_tile_pointers(); - RCT2_CALLPROC_EBPSAFE(0x0069EBE4); + reset_0x69EBE4();// RCT2_CALLPROC_EBPSAFE(0x0069EBE4); return; } diff --git a/src/sprite.c b/src/sprite.c index ef3fecaa8c..b947a81f72 100644 --- a/src/sprite.c +++ b/src/sprite.c @@ -37,7 +37,7 @@ void create_balloon(int x, int y, int z, int colour) */ void reset_sprite_list(){ RCT2_GLOBAL(0x1388698, uint16) = 0; - memset((uint32*)RCT2_ADDRESS_SPRITE_LIST, 0, 0x9C400); + memset((rct_sprite*)RCT2_ADDRESS_SPRITE_LIST, 0, sizeof(rct_sprite)* 0x2710); for (int i = 0; i < 6; ++i){ RCT2_ADDRESS(RCT2_ADDRESS_SPRITES_NEXT_INDEX, uint16)[i] = -1; @@ -67,5 +67,39 @@ void reset_sprite_list(){ RCT2_GLOBAL(0x13573C8, uint16) = 0x2710; - RCT2_CALLPROC_EBPSAFE(0x0069EBE4); + //RCT2_CALLPROC_EBPSAFE(0x0069EBE4); + reset_0x69EBE4(); +} + +/* + * + * rct: 0x0069EBE4 + * This function looks as though it sets some sort of order for sprites. + * Sprites can share thier position if this is the case. + */ +void reset_0x69EBE4(){ + //RCT2_CALLPROC_EBPSAFE(0x0069EBE4); + //return; + memset((uint16*)0xF1EF60, -1, 0x10001*2); + + rct_sprite* spr = RCT2_ADDRESS(RCT2_ADDRESS_SPRITE_LIST, rct_sprite); + for (; spr < (rct_sprite*)RCT2_ADDRESS_SPRITES_NEXT_INDEX; spr++){ + + if (spr->unknown.sprite_identifier != 0xFF){ + uint32 edi = spr->unknown.x; + if ((uint16)(spr->unknown.x) == SPRITE_LOCATION_NULL){ + edi = 0x10000; + } + else{ + int ecx = spr->unknown.y; + ecx >>= 5; + edi &= 0x1FE0; + edi <<= 3; + edi |= ecx; + } + uint16 ax = RCT2_ADDRESS(0xF1EF60,uint16)[edi]; + RCT2_ADDRESS(0xF1EF60,uint16)[edi] = spr->unknown.sprite_index; + spr->unknown.var_02 = ax; + } + } } \ No newline at end of file diff --git a/src/sprite.h b/src/sprite.h index 45a7b7f38e..d2c36b6371 100644 --- a/src/sprite.h +++ b/src/sprite.h @@ -32,7 +32,7 @@ typedef struct { uint8 sprite_identifier; // 0x00 uint8 pad_01; - uint16 pad_02; + uint16 var_02; uint16 next; // 0x04 uint16 previous; // 0x06 uint8 var_08; @@ -69,5 +69,6 @@ typedef union { void create_balloon(int x, int y, int z, int colour); void reset_sprite_list(); +void reset_0x69EBE4(); #endif diff --git a/src/title.c b/src/title.c index fccce376a4..92253f4055 100644 --- a/src/title.c +++ b/src/title.c @@ -33,6 +33,7 @@ #include "rct2.h" #include "ride.h" #include "scenario.h" +#include "sprite.h" #include "string_ids.h" #include "viewport.h" #include "editor.h" @@ -95,7 +96,7 @@ void title_load() reset_park_entrances(); reset_saved_strings(); - RCT2_CALLPROC_EBPSAFE(0x0069EB13); + reset_sprite_list(); ride_init_all(); window_guest_list_init_vars_a(); RCT2_CALLPROC_EBPSAFE(0x006BD3A4); @@ -108,7 +109,7 @@ void title_load() window_guest_list_init_vars_b(); window_staff_init_vars(); RCT2_CALLPROC_EBPSAFE(0x0068AFFD); - RCT2_CALLPROC_EBPSAFE(0x0069EBE4); + reset_0x69EBE4();// RCT2_CALLPROC_EBPSAFE(0x0069EBE4); viewport_init_all(); news_item_init_queue(); title_create_windows();