From 101fed0dd91c33ddda375a567c53f0ae0b4e9ac5 Mon Sep 17 00:00:00 2001 From: IntelOrca Date: Thu, 28 May 2015 00:16:51 +0100 Subject: [PATCH] refactor g1Elements pointer and implement sub_68371D --- src/cmdline_sprite.c | 2 +- src/drawing/drawing.c | 8 ++++---- src/drawing/drawing.h | 3 +++ src/drawing/rect.c | 4 ++-- src/drawing/sprite.c | 31 ++++++++++++++++++++++--------- src/drawing/string.c | 18 +++++++++--------- src/game.c | 10 +++++----- src/interface/viewport.c | 4 ++-- src/object.c | 2 +- src/platform/shared.c | 5 ++++- src/windows/install_track.c | 2 +- src/windows/map.c | 2 +- src/windows/track_list.c | 2 +- src/windows/track_place.c | 2 +- 14 files changed, 57 insertions(+), 38 deletions(-) diff --git a/src/cmdline_sprite.c b/src/cmdline_sprite.c index 83c2d1b536..d87ce21a9d 100644 --- a/src/cmdline_sprite.c +++ b/src/cmdline_sprite.c @@ -434,7 +434,7 @@ int cmdline_for_sprite(const char **argv, int argc) fprintf(stderr, "Building: %s\n", spriteFilePath); for (int i = 0; fileExists; i++) { - itoa(i, number, 10); + _itoa(i, number, 10); strcpy(imagePath, resourcePath); if (resourceLength == 0 || (resourcePath[resourceLength - 1] != '/' && resourcePath[resourceLength - 1] != '\\')) strcat(imagePath, "/"); diff --git a/src/drawing/drawing.c b/src/drawing/drawing.c index 901af71bdf..b26c79ad60 100644 --- a/src/drawing/drawing.c +++ b/src/drawing/drawing.c @@ -135,7 +135,7 @@ void gfx_draw_pixel(rct_drawpixelinfo *dpi, int x, int y, int colour) */ void gfx_transpose_palette(int pal, unsigned char product) { - rct_g1_element g1 = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[pal]; + rct_g1_element g1 = g1Elements[pal]; int width = g1.width; int x = g1.x_offset; uint8* dest_pointer = (uint8*)&(RCT2_ADDRESS(0x01424680, uint8)[x * 4]); @@ -161,7 +161,7 @@ void load_palette(){ palette = water_type->image_id; } - rct_g1_element g1 = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[palette]; + rct_g1_element g1 = g1Elements[palette]; int width = g1.width; int x = g1.x_offset; uint8* dest_pointer = (uint8*)&(RCT2_ADDRESS(0x01424680, uint8)[x * 4]); @@ -514,7 +514,7 @@ void redraw_peep_and_rain() if (sprite != -1) { sprite = sprite & 0x7FFFF; - rct_g1_element *g1_elements = &RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[sprite]; + rct_g1_element *g1_elements = &g1Elements[sprite]; int left = RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_X, sint16) + g1_elements->x_offset; int top = RCT2_GLOBAL(RCT2_ADDRESS_PICKEDUP_PEEP_Y, sint16) + g1_elements->y_offset; int right = left + g1_elements->width; @@ -546,4 +546,4 @@ void redraw_peep_and_rain() } } RCT2_GLOBAL(RCT2_ADDRESS_NO_RAIN_PIXELS, uint32) = 0; -} +} \ No newline at end of file diff --git a/src/drawing/drawing.h b/src/drawing/drawing.h index e258f07654..80f3713e1a 100644 --- a/src/drawing/drawing.h +++ b/src/drawing/drawing.h @@ -64,6 +64,8 @@ extern uint8 text_palette[]; extern int gLastDrawStringX; extern int gLastDrawStringY; +extern rct_g1_element *g1Elements; + // rct_drawpixelinfo* clip_drawpixelinfo(rct_drawpixelinfo* dpi, int left, int width, int top, int height); void gfx_set_dirty_blocks(int left, int top, int right, int bottom); @@ -91,6 +93,7 @@ void gfx_fill_rect_inset(rct_drawpixelinfo* dpi, short left, short top, short ri // sprite int gfx_load_g1(); int gfx_load_g2(); +void sub_68371D(); void gfx_bmp_sprite_to_buffer(uint8* palette_pointer, uint8* unknown_pointer, uint8* source_pointer, uint8* dest_pointer, rct_g1_element* source_image, rct_drawpixelinfo *dest_dpi, int height, int width, int image_type); void gfx_rle_sprite_to_buffer(uint8* source_bits_pointer, uint8* dest_bits_pointer, uint8* palette_pointer, rct_drawpixelinfo *dpi, int image_type, int source_y_start, int height, int source_x_start, int width); void gfx_draw_sprite(rct_drawpixelinfo *dpi, int image_id, int x, int y, uint32 tertiary_colour); diff --git a/src/drawing/rect.c b/src/drawing/rect.c index ac4558dcf1..e5a4b1e483 100644 --- a/src/drawing/rect.c +++ b/src/drawing/rect.c @@ -109,7 +109,7 @@ void gfx_fill_rect(rct_drawpixelinfo *dpi, int left, int top, int right, int bot // Find colour in colour table? uint16 eax = palette_to_g1_offset[(colour & 0xFF)]; - rct_g1_element g1_element = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[eax]; + rct_g1_element g1_element = g1Elements[eax]; // Fill the rectangle with the colours from the colour table for (int i = 0; i < height>>dpi->zoom_level; ++i) { @@ -211,7 +211,7 @@ void gfx_fill_rect(rct_drawpixelinfo *dpi, int left, int top, int right, int bot esi = RCT2_GLOBAL(0xEDF828,sint32); esi *= 0x40; left = 0; - esi += (uint32)(RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS,rct_g1_element)[right]).offset;//??? + esi += (uint32)g1Elements[right].offset;//??? //Not finished //Start of loop return; diff --git a/src/drawing/sprite.c b/src/drawing/sprite.c index 0f102dd57b..edadd6ece4 100644 --- a/src/drawing/sprite.c +++ b/src/drawing/sprite.c @@ -38,6 +38,8 @@ typedef struct { rct_gx g2; +rct_g1_element *g1Elements = (rct_g1_element*)RCT2_ADDRESS_G1_ELEMENTS; + /** * * rct2: 0x00678998 @@ -50,8 +52,6 @@ int gfx_load_g1() rct_g1_header header; unsigned int i; - rct_g1_element *g1Elements = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element); - file = fopen(get_file_path(PATH_ID_G1), "rb"); if (file != NULL) { if (fread(&header, 8, 1, file) == 1) { @@ -118,6 +118,19 @@ int gfx_load_g2() return 0; } +/** + * This function looks like it initialises the 0x009E3CE4 array which references sprites used for background / palette mixing or + * something. Further investigation is needed. + */ +void sub_68371D() +{ + uint8 **unk_9E3CE4 = (uint8**)0x009E3CE4; + + unk_9E3CE4[0] = NULL; + for (int i = 1; i < 8; i++) + unk_9E3CE4[i] = g1Elements[23199 + i].offset; +} + /** * Copies a sprite onto the buffer. There is no compression used on the sprite * image. @@ -405,7 +418,7 @@ void gfx_draw_sprite(rct_drawpixelinfo *dpi, int image_id, int x, int y, uint32 } uint16 palette_offset = palette_to_g1_offset[palette_ref]; - palette_pointer = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[palette_offset].offset; + palette_pointer = g1Elements[palette_offset].offset; } else if (image_type && !(image_type & IMAGE_TYPE_USE_PALETTE)){ RCT2_GLOBAL(0x9E3CDC, uint32) = 0; @@ -416,9 +429,9 @@ void gfx_draw_sprite(rct_drawpixelinfo *dpi, int image_id, int x, int y, uint32 uint32 secondary_offset = palette_to_g1_offset[(image_id >> 24) & 0x1F]; uint32 tertiary_offset = palette_to_g1_offset[tertiary_colour]; - rct_g1_element* primary_colour = &RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[primary_offset]; - rct_g1_element* secondary_colour = &RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[secondary_offset]; - rct_g1_element* tertiary_colour = &RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[tertiary_offset]; + rct_g1_element* primary_colour = &g1Elements[primary_offset]; + rct_g1_element* secondary_colour = &g1Elements[secondary_offset]; + rct_g1_element* tertiary_colour = &g1Elements[tertiary_offset]; memcpy(palette_pointer + 0xF3, &primary_colour->offset[0xF3], 12); memcpy(palette_pointer + 0xCA, &secondary_colour->offset[0xF3], 12); @@ -437,13 +450,13 @@ void gfx_draw_sprite(rct_drawpixelinfo *dpi, int image_id, int x, int y, uint32 //Top int top_type = (image_id >> 19) & 0x1f; uint32 top_offset = palette_to_g1_offset[top_type]; //RCT2_ADDRESS(0x97FCBC, uint32)[top_type]; - rct_g1_element top_palette = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[top_offset]; + rct_g1_element top_palette = g1Elements[top_offset]; memcpy(palette_pointer + 0xF3, top_palette.offset + 0xF3, 12); //Trousers int trouser_type = (image_id >> 24) & 0x1f; uint32 trouser_offset = palette_to_g1_offset[trouser_type]; //RCT2_ADDRESS(0x97FCBC, uint32)[trouser_type]; - rct_g1_element trouser_palette = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[trouser_offset]; + rct_g1_element trouser_palette = g1Elements[trouser_offset]; memcpy(palette_pointer + 0xCA, trouser_palette.offset + 0xF3, 12); } @@ -469,7 +482,7 @@ void gfx_draw_sprite_palette_set(rct_drawpixelinfo *dpi, int image_id, int x, in rct_g1_element* g1_source; if (image_element < SPR_G2_BEGIN) { - g1_source = &(RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[image_element]); + g1_source = &g1Elements[image_element]; } else { g1_source = &g2.elements[image_element - SPR_G2_BEGIN]; } diff --git a/src/drawing/string.c b/src/drawing/string.c index 746ebfa9c5..b1c417d4ee 100644 --- a/src/drawing/string.c +++ b/src/drawing/string.c @@ -32,7 +32,7 @@ void gfx_load_character_widths(){ uint8* char_width_pointer = RCT2_ADDRESS(RCT2_ADDRESS_FONT_CHAR_WIDTH, uint8); for (int char_set_offset = 0; char_set_offset < 4*0xE0; char_set_offset+=0xE0){ for (uint8 c = 0; c < 0xE0; c++, char_width_pointer++){ - rct_g1_element g1 = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[c + SPR_CHAR_START + char_set_offset]; + rct_g1_element g1 = g1Elements[c + SPR_CHAR_START + char_set_offset]; int width; if (char_set_offset == 0xE0*3) width = g1.width + 1; @@ -75,7 +75,7 @@ void gfx_load_character_widths(){ } for (int i = 0; i < 0x20; ++i){ - rct_g1_element* g1 = &(RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[0x606 + i]); + rct_g1_element* g1 = &g1Elements[0x606 + i]; uint8* unknown_pointer = RCT2_ADDRESS(0x9C3852, uint8) + 0xa12 * i; g1->offset = unknown_pointer; g1->width = 0x40; @@ -138,7 +138,7 @@ int gfx_get_string_width_new_lined(char* buffer){ case 0x10: continue; case FORMAT_INLINE_SPRITE: - g1_element = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[*((uint32*)(curr_char + 1)) & 0x7FFFF]; + g1_element = g1Elements[*((uint32*)(curr_char + 1)) & 0x7FFFF]; width += g1_element.width; curr_char += 4; break; @@ -214,7 +214,7 @@ int gfx_get_string_width(char* buffer) case 0x10: continue; case FORMAT_INLINE_SPRITE: - g1_element = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[*((uint32*)(curr_char+1))&0x7FFFF]; + g1_element = g1Elements[*((uint32*)(curr_char + 1)) & 0x7FFFF]; width += g1_element.width; curr_char += 4; break; @@ -297,7 +297,7 @@ int gfx_clip_string(char* buffer, int width) case 0x10: continue; case FORMAT_INLINE_SPRITE: - g1_element = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[*((uint32*)(curr_char+1))&0x7FFFF]; + g1_element = g1Elements[*((uint32*)(curr_char + 1)) & 0x7FFFF]; clipped_width += g1_element.width; curr_char += 4; continue; @@ -396,7 +396,7 @@ int gfx_wrap_string(char* buffer, int width, int* num_lines, int* font_height) case 0x10: continue; case FORMAT_INLINE_SPRITE: - g1_element = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[*((uint32*)(curr_char + 1)) & 0x7FFFF]; + g1_element = g1Elements[*((uint32*)(curr_char + 1)) & 0x7FFFF]; line_width += g1_element.width; curr_char += 4; break; @@ -718,7 +718,7 @@ void colour_char(uint8 colour, uint16* current_font_flags, uint8* palette_pointe int eax; - rct_g1_element g1_element = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[0x1332]; + rct_g1_element g1_element = g1Elements[0x1332]; eax = ((uint32*)g1_element.offset)[colour & 0xFF]; if (!(*current_font_flags & 2)) { @@ -896,7 +896,7 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in } eax = palette_to_g1_offset[al]; //RCT2_ADDRESS(0x097FCBC, uint32)[al * 4]; - g1_element = &(RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[eax]); + g1_element = &g1Elements[eax]; ebx = g1_element->offset[0xF9] + (1 << 8); if (!(*current_font_flags & 2)) { ebx = ebx & 0xFF; @@ -1008,7 +1008,7 @@ void gfx_draw_string(rct_drawpixelinfo *dpi, char *buffer, int colour, int x, in } uint32 image_id = *((uint32*)(buffer - 3)); uint32 image_offset = image_id & 0x7FFFF; - g1_element = &(RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[image_offset]); + g1_element = &g1Elements[image_offset]; gfx_draw_sprite(dpi, image_id, max_x, max_y, 0); diff --git a/src/game.c b/src/game.c index a42b071237..aa7834491e 100644 --- a/src/game.c +++ b/src/game.c @@ -102,7 +102,7 @@ void update_palette_effects() if ((sint32)water_type != -1) { palette = water_type->image_id; } - rct_g1_element g1_element = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[palette]; + rct_g1_element g1_element = g1Elements[palette]; int xoffset = g1_element.x_offset; xoffset = xoffset * 4; for (int i = 0; i < g1_element.width; i++) { @@ -123,7 +123,7 @@ void update_palette_effects() palette = water_type->image_id; } - rct_g1_element g1_element = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[palette]; + rct_g1_element g1_element = g1Elements[palette]; int xoffset = g1_element.x_offset; xoffset = xoffset * 4; for (int i = 0; i < g1_element.width; i++) { @@ -148,7 +148,7 @@ void update_palette_effects() if ((sint32)water_type != -1) { p = water_type->var_06; } - rct_g1_element g1_element = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[q + p]; + rct_g1_element g1_element = g1Elements[q + p]; uint8* vs = &g1_element.offset[j * 3]; uint8* vd = RCT2_ADDRESS(0x01424A18, uint8); int n = 5; @@ -167,7 +167,7 @@ void update_palette_effects() if ((sint32)water_type != -1) { p = water_type->var_0A; } - g1_element = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[q + p]; + g1_element = g1Elements[q + p]; vs = &g1_element.offset[j * 3]; n = 5; for (int i = 0; i < n; i++) { @@ -183,7 +183,7 @@ void update_palette_effects() j = ((uint16)(RCT2_GLOBAL(RCT2_ADDRESS_PALETTE_EFFECT_FRAME_NO, uint32) * -960) * 3) >> 16; p = 1539; - g1_element = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[q + p]; + g1_element = g1Elements[q + p]; vs = &g1_element.offset[j * 3]; vd += 12; n = 3; diff --git a/src/interface/viewport.c b/src/interface/viewport.c index 80b93835be..cd5043b6ea 100644 --- a/src/interface/viewport.c +++ b/src/interface/viewport.c @@ -88,7 +88,7 @@ void viewport_init_all() // Palette from sprites? d = 0; for (i = 4915; i < 4947; i++) { - g1_element = &(RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[i]); + g1_element = &g1Elements[i]; *((int*)(0x0141FC44 + d)) = *((int*)(&g1_element->offset[0xF5])); *((int*)(0x0141FC48 + d)) = *((int*)(&g1_element->offset[0xF9])); *((int*)(0x0141FD44 + d)) = *((int*)(&g1_element->offset[0xFD])); @@ -743,7 +743,7 @@ int sub_0x686806(rct_sprite* sprite, int eax, int image_id, int ecx, int edx){ ps->image_id = image_id; - rct_g1_element *g1Element = &RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[image_id & 0x7FFFF]; + rct_g1_element *g1Element = &g1Elements[image_id & 0x7FFFF]; eax = (eax & 0xFF) + RCT2_GLOBAL(0x9DE568, uint16); ecx = (ecx & 0xFF) + RCT2_GLOBAL(0x9DE56C, uint16); diff --git a/src/object.c b/src/object.c index 7f2be9d177..64414d549f 100644 --- a/src/object.c +++ b/src/object.c @@ -396,7 +396,7 @@ int object_chunk_load_image_directory(uint8_t** chunk) RCT2_GLOBAL(RCT2_ADDRESS_TOTAL_NO_IMAGES, uint32_t) = no_images + image_start_no; - rct_g1_element* g1_dest = &RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[image_start_no]; + rct_g1_element* g1_dest = &g1Elements[image_start_no]; // After length of data is the start of all g1 element structs rct_g1_element* g1_source = (rct_g1_element*)(*chunk); diff --git a/src/platform/shared.c b/src/platform/shared.c index 574dfa531e..c6f356b473 100644 --- a/src/platform/shared.c +++ b/src/platform/shared.c @@ -525,7 +525,10 @@ static void platform_create_window() SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, 0); platform_load_cursors(); - RCT2_CALLPROC_EBPSAFE(0x0068371D); + + // TODO This should probably be called somewhere else. It has nothing to do with window creation and can be done as soon as + // g1.dat is loaded. + sub_68371D(); // Get window size width = gConfigGeneral.window_width; diff --git a/src/windows/install_track.c b/src/windows/install_track.c index 922ed382f7..9fa360876d 100644 --- a/src/windows/install_track.c +++ b/src/windows/install_track.c @@ -299,7 +299,7 @@ static void window_install_track_paint() uint16 holes, speed, drops, dropHeight, inversions; fixed32_2dp rating; int x, y, colour, gForces, airTime; - rct_g1_element tmpElement, *subsituteElement, *g1Elements = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element); + rct_g1_element tmpElement, *subsituteElement; window_paint_get_registers(w, dpi); diff --git a/src/windows/map.c b/src/windows/map.c index 47f7b03098..ec4d5332cc 100644 --- a/src/windows/map.c +++ b/src/windows/map.c @@ -893,7 +893,7 @@ static void window_map_scrollpaint() gfx_clear(dpi, 0x0A0A0A0A); - g1_element = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element); + g1_element = &g1Elements[0]; pushed_g1_element = *g1_element; g1_element->offset = RCT2_GLOBAL(RCT2_ADDRESS_MAP_IMAGE_DATA, uint8*); diff --git a/src/windows/track_list.c b/src/windows/track_list.c index f36aa355ea..f7868c1f75 100644 --- a/src/windows/track_list.c +++ b/src/windows/track_list.c @@ -393,7 +393,7 @@ static void window_track_list_paint() uint16 holes, speed, drops, dropHeight, inversions; fixed32_2dp rating; int trackIndex, x, y, colour, gForces, airTime; - rct_g1_element tmpElement, *subsituteElement, *g1Elements = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element); + rct_g1_element tmpElement, *subsituteElement; window_paint_get_registers(w, dpi); diff --git a/src/windows/track_place.c b/src/windows/track_place.c index 6ac32ddad2..099617f42c 100644 --- a/src/windows/track_place.c +++ b/src/windows/track_place.c @@ -596,7 +596,7 @@ static void window_track_place_paint() { rct_window *w; rct_drawpixelinfo *dpi, *clippedDpi; - rct_g1_element tmpElement, *subsituteElement, *g1Elements = RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element); + rct_g1_element tmpElement, *subsituteElement; window_paint_get_registers(w, dpi);