refactor g1Elements pointer and implement sub_68371D

This commit is contained in:
IntelOrca 2015-05-28 00:16:51 +01:00
parent 6c89274bb1
commit 101fed0dd9
14 changed files with 57 additions and 38 deletions

View File

@ -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, "/");

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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*);

View File

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

View File

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