mirror of https://github.com/OpenRCT2/OpenRCT2.git
Cleaned up rain code. Remember to remove constant rain
This commit is contained in:
parent
6ec15b240b
commit
5257f368c9
139
src/game.c
139
src/game.c
|
@ -51,6 +51,55 @@ void game_handle_keyboard_input();
|
||||||
|
|
||||||
void process_mouse_over(int x, int y);
|
void process_mouse_over(int x, int y);
|
||||||
|
|
||||||
|
void sub_0x684027(int left, int top, int width, int height, int ebp, uint32 edi, uint32 esi){
|
||||||
|
uint32 eax = left, ecx = width, edx = height;
|
||||||
|
uint32 ebx = top;
|
||||||
|
uint8* pattern = RCT2_ADDRESS(0x9AC010, uint8*)[ebp];
|
||||||
|
uint8 pattern_x_space = *pattern++;
|
||||||
|
uint8 pattern_y_space = *pattern++;
|
||||||
|
|
||||||
|
uint8 pattern_start_x_offset = edi % pattern_x_space;
|
||||||
|
uint8 pattern_start_y_offset = esi % pattern_y_space;;
|
||||||
|
|
||||||
|
rct_drawpixelinfo* dpi = RCT2_ADDRESS(RCT2_ADDRESS_SCREEN_DPI, rct_drawpixelinfo);
|
||||||
|
uint32 pixel_offset = (dpi->pitch + dpi->width)*top + left;
|
||||||
|
uint8 pattern_y_pos = pattern_start_y_offset;
|
||||||
|
|
||||||
|
//Stores the colours of changed pixels
|
||||||
|
uint32* pixel_store = RCT2_ADDRESS(0xEDF850, uint32);
|
||||||
|
pixel_store += RCT2_GLOBAL(0x9AC00C, uint32);
|
||||||
|
|
||||||
|
for (; height != 0; height--){
|
||||||
|
int al = pattern[pattern_y_pos * 2];
|
||||||
|
if (al != 0xFF){
|
||||||
|
if (RCT2_GLOBAL(0x9AC00C, uint32) <= 0x1F38){
|
||||||
|
int _pixel_offset = pixel_offset;
|
||||||
|
|
||||||
|
eax = al - pattern_start_x_offset;
|
||||||
|
edx = width;
|
||||||
|
eax %= pattern_x_space;
|
||||||
|
//eax &= RCT2_GLOBAL(0xEE7868, uint32);
|
||||||
|
edx += _pixel_offset;
|
||||||
|
_pixel_offset += eax;
|
||||||
|
if (_pixel_offset < edx){
|
||||||
|
uint8 pattern_pixel = pattern[pattern_y_pos * 2 + 1];
|
||||||
|
//inner loop
|
||||||
|
while (_pixel_offset < edx){
|
||||||
|
uint8 current_pixel = dpi->bits[_pixel_offset];
|
||||||
|
dpi->bits[_pixel_offset] = pattern_pixel;
|
||||||
|
RCT2_GLOBAL(0x9AC00C, uint32)++;
|
||||||
|
*pixel_store++ = (_pixel_offset << 8) | current_pixel; //Store colour and position
|
||||||
|
_pixel_offset += pattern_x_space;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pattern_y_pos++;
|
||||||
|
pixel_offset += dpi->pitch + dpi->width;
|
||||||
|
pattern_y_pos %= pattern_y_space;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
typedef void(*draw_rain_func)(int left, int top, int width, int height);
|
typedef void(*draw_rain_func)(int left, int top, int width, int height);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -65,7 +114,8 @@ void draw_light_rain(int left, int top, int width, int height){
|
||||||
edi += left;
|
edi += left;
|
||||||
esi += top;
|
esi += top;
|
||||||
|
|
||||||
RCT2_CALLPROC_X(0x00684027, left, top, width, height, esi, edi, 0);
|
sub_0x684027(left, top, width, height, 0, edi, esi);
|
||||||
|
//RCT2_CALLPROC_X(0x00684027, left, top, width, height, esi, edi, 0);
|
||||||
|
|
||||||
edi = -RCT2_GLOBAL(0x00F663AC, int) + 0x18;
|
edi = -RCT2_GLOBAL(0x00F663AC, int) + 0x18;
|
||||||
esi = (RCT2_GLOBAL(0x00F663AC, int) * 4) + 0x0D;
|
esi = (RCT2_GLOBAL(0x00F663AC, int) * 4) + 0x0D;
|
||||||
|
@ -73,8 +123,8 @@ void draw_light_rain(int left, int top, int width, int height){
|
||||||
|
|
||||||
edi += left;
|
edi += left;
|
||||||
esi += top;
|
esi += top;
|
||||||
|
sub_0x684027(left, top, width, height, 0, edi, esi);
|
||||||
RCT2_CALLPROC_X(0x00684027, left, top, width, height, esi, edi, 0);
|
//RCT2_CALLPROC_X(0x00684027, left, top, width, height, esi, edi, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -89,7 +139,8 @@ void draw_heavy_rain(int left, int top, int width, int height){
|
||||||
edi += left;
|
edi += left;
|
||||||
esi += top;
|
esi += top;
|
||||||
|
|
||||||
RCT2_CALLPROC_X(0x00684027, left, top, width, height, esi, edi, 0);
|
sub_0x684027(left, top, width, height, 0, edi, esi);
|
||||||
|
//RCT2_CALLPROC_X(0x00684027, left, top, width, height, esi, edi, 0);
|
||||||
|
|
||||||
edi = -RCT2_GLOBAL(0x00F663AC, int) + 0x10;
|
edi = -RCT2_GLOBAL(0x00F663AC, int) + 0x10;
|
||||||
esi = (RCT2_GLOBAL(0x00F663AC, int) * 6) + 5;
|
esi = (RCT2_GLOBAL(0x00F663AC, int) * 6) + 5;
|
||||||
|
@ -98,7 +149,8 @@ void draw_heavy_rain(int left, int top, int width, int height){
|
||||||
edi += left;
|
edi += left;
|
||||||
esi += top;
|
esi += top;
|
||||||
|
|
||||||
RCT2_CALLPROC_X(0x00684027, left, top, width, height, esi, edi, 0);
|
sub_0x684027(left, top, width, height, 0, edi, esi);
|
||||||
|
//RCT2_CALLPROC_X(0x00684027, left, top, width, height, esi, edi, 0);
|
||||||
|
|
||||||
edi = -RCT2_GLOBAL(0x00F663AC, int) + 8;
|
edi = -RCT2_GLOBAL(0x00F663AC, int) + 8;
|
||||||
esi = (RCT2_GLOBAL(0x00F663AC, int) * 3) + 7;
|
esi = (RCT2_GLOBAL(0x00F663AC, int) * 3) + 7;
|
||||||
|
@ -107,7 +159,8 @@ void draw_heavy_rain(int left, int top, int width, int height){
|
||||||
edi += left;
|
edi += left;
|
||||||
esi += top;
|
esi += top;
|
||||||
|
|
||||||
RCT2_CALLPROC_X(0x00684027, left, top, width, height, esi, edi, 0);
|
sub_0x684027(left, top, width, height, 0, edi, esi);
|
||||||
|
//RCT2_CALLPROC_X(0x00684027, left, top, width, height, esi, edi, 0);
|
||||||
|
|
||||||
edi = -RCT2_GLOBAL(0x00F663AC, int) + 0x18;
|
edi = -RCT2_GLOBAL(0x00F663AC, int) + 0x18;
|
||||||
esi = (RCT2_GLOBAL(0x00F663AC, int) * 4) + 0x0D;
|
esi = (RCT2_GLOBAL(0x00F663AC, int) * 4) + 0x0D;
|
||||||
|
@ -116,7 +169,8 @@ void draw_heavy_rain(int left, int top, int width, int height){
|
||||||
edi += left;
|
edi += left;
|
||||||
esi += top;
|
esi += top;
|
||||||
|
|
||||||
RCT2_CALLPROC_X(0x00684027, left, top, width, height, esi, edi, 0);
|
sub_0x684027(left, top, width, height, 0, edi, esi);
|
||||||
|
//RCT2_CALLPROC_X(0x00684027, left, top, width, height, esi, edi, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -130,77 +184,7 @@ const draw_rain_func draw_rain_function[] = {
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
void sub_0x684027(int left, int top, int width, int height, int ebp, int edi, int esi){
|
|
||||||
int eax = left, ebx = top, ecx = width, edx = height;
|
|
||||||
ebp = RCT2_ADDRESS(0x9AC010,uint32)[ebp];
|
|
||||||
//RCT2_GLOBAL(0xee7854,uint32) = eax;
|
|
||||||
//RCT2_GLOBAL(0xee7858,uint32) = ebx;
|
|
||||||
//RCT2_GLOBAL(0xee785C,uint32) = ecx;
|
|
||||||
//RCT2_GLOBAL(0xee7860,uint32) = edx;
|
|
||||||
eax = *((uint8*)ebp);
|
|
||||||
ebx = *((uint8*)(ebp+1));
|
|
||||||
RCT2_GLOBAL(0xEE7864,uint32) = eax;
|
|
||||||
eax--;
|
|
||||||
ebx--;
|
|
||||||
RCT2_GLOBAL(0xEE7868,uint32) = eax;
|
|
||||||
RCT2_GLOBAL(0xEE786C,uint32) = ebx;
|
|
||||||
edi &= eax;
|
|
||||||
esi &= ebx;
|
|
||||||
RCT2_GLOBAL(0xEE7870,uint32) = edi;
|
|
||||||
ebp+=2;
|
|
||||||
rct_drawpixelinfo* dpi = RCT2_ADDRESS(RCT2_ADDRESS_SCREEN_DPI,rct_drawpixelinfo);
|
|
||||||
|
|
||||||
RCT2_GLOBAL(0xEE7874,uint32) = dpi->pitch + dpi->width;
|
|
||||||
ebx = (dpi->pitch + dpi->width)*top + left;
|
|
||||||
ecx = esi;
|
|
||||||
edi = RCT2_GLOBAL(0x9AC00C,uint32);
|
|
||||||
edi <<= 2;
|
|
||||||
|
|
||||||
//esi = RCT2_GLOBAL(RCT2_ADDRESS_SCREEN_DPI,uint32);
|
|
||||||
edi += 0xEDF850;
|
|
||||||
|
|
||||||
for (; height != 0; height--){
|
|
||||||
//0x6840A4
|
|
||||||
int al = *((uint8*)(ecx * 2 + ebp));
|
|
||||||
if (al == 0xFF) continue;
|
|
||||||
if (RCT2_GLOBAL(0x9AC00C, uint32) > 0x1F38) continue;
|
|
||||||
//push ebx
|
|
||||||
//push ecx
|
|
||||||
int _ebx = ebx;
|
|
||||||
int _ecx = ecx;
|
|
||||||
|
|
||||||
eax -= RCT2_GLOBAL(0xEE7870, uint32);
|
|
||||||
edx = width;
|
|
||||||
eax &= RCT2_GLOBAL(0xEE7868, uint32);
|
|
||||||
edx += ebx;
|
|
||||||
ebx += eax;
|
|
||||||
if (ebx >= edx)continue;
|
|
||||||
int ah = *((uint8*)(ecx * 2 + ebp + 1));
|
|
||||||
ecx = RCT2_GLOBAL(0xEE7864, uint32);
|
|
||||||
|
|
||||||
//inner loop
|
|
||||||
while (ebx < edx){
|
|
||||||
al = ah;
|
|
||||||
int old_al = al;
|
|
||||||
al = dpi->bits[ebx];
|
|
||||||
dpi->bits[ebx] = old_al;
|
|
||||||
RCT2_GLOBAL(0x9AC00C, uint32)++;
|
|
||||||
ebx <<= 8;
|
|
||||||
ebx |= al;
|
|
||||||
*(uint32*)edi = ebx;
|
|
||||||
ebx >>= 8;
|
|
||||||
edi += 4;
|
|
||||||
ebx += ecx;
|
|
||||||
}
|
|
||||||
//pop ecx
|
|
||||||
//pop ebx
|
|
||||||
ecx = _ecx;
|
|
||||||
ebx = _ebx;
|
|
||||||
ecx++;
|
|
||||||
ebx += dpi->pitch + dpi->width;
|
|
||||||
ecx &= RCT2_GLOBAL(0xEE786C, uint32);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -505,6 +489,7 @@ void update_rain_animation()
|
||||||
|
|
||||||
// Get rain draw function and draw rain
|
// Get rain draw function and draw rain
|
||||||
uint32 draw_rain_func = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RAIN_LEVEL, uint8);
|
uint32 draw_rain_func = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_RAIN_LEVEL, uint8);
|
||||||
|
draw_rain_func = 2;
|
||||||
if (draw_rain_func > 0 && !(RCT2_GLOBAL(0x009DEA6F, uint8) & 1))
|
if (draw_rain_func > 0 && !(RCT2_GLOBAL(0x009DEA6F, uint8) & 1))
|
||||||
draw_rain_animation(draw_rain_func);
|
draw_rain_animation(draw_rain_func);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue