From 9c4f06a04bbc3fae484c2a493f4c9d41116b4fce Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sat, 21 Jun 2014 13:31:28 +0100 Subject: [PATCH 1/4] 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(); From 1aaa88afaec0aab968e57d551fcb54fba4d12e55 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sat, 21 Jun 2014 15:50:13 +0100 Subject: [PATCH 2/4] Added 0x69E9A7 --- src/game.c | 16 +++++++++++++++- src/game.h | 1 + src/scenario.c | 2 +- src/title.c | 2 +- 4 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/game.c b/src/game.c index c652e3f014..5da9973f5d 100644 --- a/src/game.c +++ b/src/game.c @@ -1608,7 +1608,7 @@ int game_load_save() mainWindow->saved_view_y -= mainWindow->viewport->view_height >> 1; window_invalidate(mainWindow); - RCT2_CALLPROC_EBPSAFE(0x0069E9A7); + sub_0x0069E9A7(); RCT2_CALLPROC_EBPSAFE(0x006DFEE4); window_new_ride_init_vars(); RCT2_GLOBAL(0x009DEB7C, uint16) = 0; @@ -1620,6 +1620,20 @@ int game_load_save() return 1; } +/* + * + * rct2: 0x0069E9A7 + */ +void sub_0x0069E9A7(){ + //RCT2_CALLPROC_EBPSAFE(0x0069E9A7); + //return; + for (rct_sprite* spr = RCT2_ADDRESS(RCT2_ADDRESS_SPRITE_LIST, rct_sprite); spr < (rct_sprite*)RCT2_ADDRESS_SPRITES_NEXT_INDEX; ++spr){ + if (spr->unknown.sprite_identifier != 0xFF){ + RCT2_CALLPROC_X(0x0069E9D3, spr->unknown.x, 0, spr->unknown.y, spr->unknown.z, (int)spr, 0, 0); + } + } +} + /** * * rct2: 0x0066DBB7 diff --git a/src/game.h b/src/game.h index 4b1bd42d4c..47d7f51ceb 100644 --- a/src/game.h +++ b/src/game.h @@ -24,6 +24,7 @@ void game_create_windows(); void game_update(); void game_logic_update(); +void sub_0x0069E9A7(); int game_do_command(int eax, int ebx, int ecx, int edx, int esi, int edi, int ebp); diff --git a/src/scenario.c b/src/scenario.c index da2e83137b..d9aedb7fc4 100644 --- a/src/scenario.c +++ b/src/scenario.c @@ -214,7 +214,7 @@ void scenario_load_and_play(const rct_scenario_basic *scenario) mainWindow->saved_view_y -= mainWindow->viewport->view_height >> 1; window_invalidate(mainWindow); - RCT2_CALLPROC_EBPSAFE(0x0069E9A7); + sub_0x0069E9A7();// RCT2_CALLPROC_EBPSAFE(0x0069E9A7); window_new_ride_init_vars(); // Set the scenario pseduo-random seeds diff --git a/src/title.c b/src/title.c index 92253f4055..754c076533 100644 --- a/src/title.c +++ b/src/title.c @@ -192,7 +192,7 @@ static void title_update_showcase() } window_invalidate(w); - RCT2_CALLPROC_EBPSAFE(0x0069E9A7); + sub_0x0069E9A7();// RCT2_CALLPROC_EBPSAFE(0x0069E9A7); window_new_ride_init_vars(); RCT2_CALLPROC_EBPSAFE(0x00684AC3); RCT2_CALLPROC_EBPSAFE(0x006DFEE4); From 79e52e823aad7582719b82a908406d76e4f0cb6c Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sat, 21 Jun 2014 16:04:13 +0100 Subject: [PATCH 3/4] Updated missing function calls --- src/rct2.c | 3 ++- src/title.c | 7 ++++--- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/rct2.c b/src/rct2.c index 9e6d8f3844..5f18db7805 100644 --- a/src/rct2.c +++ b/src/rct2.c @@ -33,6 +33,7 @@ #include "climate.h" #include "config.h" #include "date.h" +#include "editor.h" #include "game.h" #include "gfx.h" #include "intro.h" @@ -171,7 +172,7 @@ void rct2_init() reset_sprite_list(); ride_init_all(); window_guest_list_init_vars_a(); - RCT2_CALLPROC_EBPSAFE(0x006BD3A4); //Peep? + sub_6BD3A4();// RCT2_CALLPROC_EBPSAFE(0x006BD3A4); //Peep? map_init(); park_init(); RCT2_CALLPROC_EBPSAFE(0x0066B5C0); // 0x0066B5C0 (part of 0x0066B3E8) screen_game_create_windows() diff --git a/src/title.c b/src/title.c index 754c076533..06a451667e 100644 --- a/src/title.c +++ b/src/title.c @@ -23,6 +23,7 @@ #include #include "addresses.h" #include "config.h" +#include "climate.h" #include "date.h" #include "game.h" #include "gfx.h" @@ -99,16 +100,16 @@ void title_load() reset_sprite_list(); ride_init_all(); window_guest_list_init_vars_a(); - RCT2_CALLPROC_EBPSAFE(0x006BD3A4); + sub_6BD3A4(); // RCT2_CALLPROC_EBPSAFE(0x006BD3A4); map_init(); park_init(); date_reset(); - RCT2_CALLPROC_X(0x006C45ED, 0, 0, 0, 0, 0, 0, 0); + climate_reset(CLIMATE_COOL_AND_WET); RCT2_CALLPROC_EBPSAFE(0x006DFEE4); window_new_ride_init_vars(); window_guest_list_init_vars_b(); window_staff_init_vars(); - RCT2_CALLPROC_EBPSAFE(0x0068AFFD); + map_update_tile_pointers(); //RCT2_CALLPROC_EBPSAFE(0x0068AFFD); reset_0x69EBE4();// RCT2_CALLPROC_EBPSAFE(0x0069EBE4); viewport_init_all(); news_item_init_queue(); From 8bd4e857644968ddd85e176670eb2ff95bf26445 Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Sat, 21 Jun 2014 16:20:05 +0100 Subject: [PATCH 4/4] Widgets now use draw_sprite --- src/gfx.h | 1 + src/widget.c | 19 +++++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/gfx.h b/src/gfx.h index d2e3eeb433..f82ae27d02 100644 --- a/src/gfx.h +++ b/src/gfx.h @@ -70,6 +70,7 @@ void gfx_draw_line(rct_drawpixelinfo *dpi, int x1, int y1, int x2, int y2, int c void gfx_fill_rect(rct_drawpixelinfo *dpi, int left, int top, int right, int bottom, int colour); void gfx_fill_rect_inset(rct_drawpixelinfo* dpi, short left, short top, short right, short bottom, int colour, short _si); void gfx_draw_sprite(rct_drawpixelinfo *dpi, int image_id, int x, int y); +void gfx_draw_sprite_palette_set(rct_drawpixelinfo *dpi, int image_id, int x, int y, uint8* palette_pointer, uint8* unknown_pointer); void gfx_draw_string(rct_drawpixelinfo *dpi, char *format, int colour, int x, int y); void gfx_transpose_palette(int pal, unsigned char product); diff --git a/src/widget.c b/src/widget.c index f686f1bd26..d69b239cba 100644 --- a/src/widget.c +++ b/src/widget.c @@ -22,6 +22,7 @@ #include #include #include "addresses.h" +#include "gfx.h" #include "sprites.h" #include "widget.h" #include "window.h" @@ -914,21 +915,23 @@ static void widget_draw_image(rct_drawpixelinfo *dpi, rct_window *w, int widgetI // Draw greyed out (light border bottom right shadow) colour = w->colours[widget->colour]; colour = RCT2_ADDRESS(0x00141FC4A, uint8)[(colour & 0x7F) * 8] & 0xFF; - RCT2_GLOBAL(0x009ABDA4, uint32) = 0x009DED74; - memset((void*)0x009DED74, colour, 256); - RCT2_GLOBAL(0x009DED74, uint8) = 0; + + uint8 palette[256]; + memset(palette, colour, 256); + palette[0] = 0; + RCT2_GLOBAL(0x00EDF81C, uint32) = 0x20000000; image &= 0x7FFFF; - RCT2_CALLPROC_X(0x0067A46E, 0, image, l + 1, t + 1, 0, (int)dpi, 0); + gfx_draw_sprite_palette_set(dpi, image | 0x20000000, l + 1, t + 1, palette, NULL); // Draw greyed out (dark) colour = w->colours[widget->colour]; colour = RCT2_ADDRESS(0x00141FC48, uint8)[(colour & 0x7F) * 8] & 0xFF; - RCT2_GLOBAL(0x009ABDA4, uint32) = 0x009DED74; - memset((void*)0x009DED74, colour, 256); - RCT2_GLOBAL(0x009DED74, uint8) = 0; + memset(palette, colour, 256); + palette[0] = 0; + RCT2_GLOBAL(0x00EDF81C, uint32) = 0x20000000; - RCT2_CALLPROC_X(0x0067A46E, 0, image, l, t, 0, (int)dpi, 0); + gfx_draw_sprite_palette_set(dpi, image | 0x20000000, l, t, palette, NULL); } else { if (image & 0x80000000) { // ?