1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-04 13:42:55 +01:00

First part

This commit is contained in:
Marijn van der Werf
2016-04-19 20:23:29 +02:00
parent d749848ff6
commit 2d613fccec

View File

@@ -1595,6 +1595,229 @@ void viewport_park_entrance_paint_setup(uint8 direction, int height, rct_map_ele
}
}
// rct2: 0x97B464
const rct_xy16 viewport_surface_paint_data_0[] = {
{32, 0},
{-32, 32},
{-64, 32},
{0, -64}
};
// rct2: 0x97B474
const rct_xy16 viewport_surface_paint_data_1[] = {
{0, 32},
{-64, 0},
{-32, -64},
{32, -32}
};
// rct2: 0x97B484
const rct_xy16 viewport_surface_paint_data_2[] = {
{0, -32},
{0, 0},
{-32, 0},
{-32, -32}
};
// rct2: 0x97B494
const rct_xy16 viewport_surface_paint_data_3[] = {
{-32, 0},
{-32, -32},
{0, -32},
{0, 0}
};
const uint8 byte_97B4A4[] =
{
0, 0, 0, 0, 0, 0, 0, 0, 1, 1,
1, 1, 1, 1, 1, 1, 0, 0, 0, 0,
0, 0, 0, 0, 1, 1, 1, 1, 1, 2,
1, 1
};
const uint8 byte_97B4C4[] =
{
0, 0, 0, 0, 1, 1, 1, 1, 0, 0,
0, 0, 1, 1, 1, 1, 0, 0, 0, 0,
1, 1, 1, 1, 0, 0, 0, 0, 1, 1,
2, 1
};
const uint8 byte_97B4E4[] =
{
0, 0, 1, 1, 0, 0, 1, 1, 0, 0,
1, 1, 0, 0, 1, 1, 0, 0, 1, 1,
0, 0, 1, 2, 0, 0, 1, 1, 0, 0,
1, 1
};
const uint8 byte_97B504[] =
{
0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 1, 0, 1,
0, 1, 0, 1, 0, 1, 0, 2, 0, 1,
0, 1
};
#define _dword_9E3240 RCT2_GLOBAL(0x9E3240, rct_map_element *)
#define _dword_9E3244 RCT2_GLOBAL(0x9E3244, rct_map_element *)
#define _dword_9E3248 RCT2_GLOBAL(0x9E3248, rct_map_element *)
#define _dword_9E324C RCT2_GLOBAL(0x9E324C, rct_map_element *)
#define _dword_9E3250 RCT2_GLOBAL(0x9E3250, rct_map_element *)
#define _dword_9E3254 RCT2_GLOBAL(0x9E3254, uint32)
#define _dword_9E3258 RCT2_GLOBAL(0x9E3258, uint32)
#define _dword_9E325C RCT2_GLOBAL(0x9E325C, uint32)
#define _dword_9E3260 RCT2_GLOBAL(0x9E3260, uint32)
#define _dword_9E3264 RCT2_GLOBAL(0x9E3264, uint32)
#define _dword_9E3268 RCT2_GLOBAL(0x9E3268, uint32)
#define _dword_9E326C RCT2_GLOBAL(0x9E326C, uint32)
#define _dword_9E3270 RCT2_GLOBAL(0x9E3270, uint32)
#define _dword_9E3274 RCT2_GLOBAL(0x9E3274, uint32)
#define _dword_9E3278 RCT2_GLOBAL(0x9E3278, uint32)
#define _dword_9E327C RCT2_GLOBAL(0x9E327C, uint16)
#define _dword_9E327E RCT2_GLOBAL(0x9E327E, uint16)
#define _dword_9E3280 RCT2_GLOBAL(0x9E3280, uint16)
#define _dword_9E3282 RCT2_GLOBAL(0x9E3282, uint16)
#define _dword_9E3284 RCT2_GLOBAL(0x9E3284, uint16)
#define _dword_9E3286 RCT2_GLOBAL(0x9E3286, uint16)
#define _dword_9E3288 RCT2_GLOBAL(0x9E3288, uint16)
#define _dword_9E328A RCT2_GLOBAL(0x9E328A, uint16)
uint32 viewport_surface_paint_setup_get_ebx(rct_map_element *mapElement, int cl) {
uint8 bl = mapElement->properties.surface.slope;
uint16 di = (bl & 0x0F) << cl;
uint32 ebx = bl & 0x10;
return ebx | (di | di >> 4);
}
/**
* rct2: 0x0066062C
*
* @param direction (cl)
* @param height (dx)
* @param map_element (esi)
*/
void viewport_surface_paint_setup(uint8 direction, uint16 height, rct_map_element *mapElement) {
//RCT2_CALLPROC_X(0x66062C, 0, 0, direction, height, (int) mapElement, 0, 0);
rct_drawpixelinfo *dpi = RCT2_GLOBAL(0x0140E9A8, rct_drawpixelinfo*);
RCT2_GLOBAL(RCT2_ADDRESS_PAINT_SETUP_CURRENT_TYPE, uint8) = VIEWPORT_INTERACTION_ITEM_TERRAIN;
RCT2_GLOBAL(0x9DE57C, uint16) |= 1;
RCT2_GLOBAL(0x009E3292, uint16) = dpi->zoom_level;
uint8 cl = get_current_rotation();
_dword_9E3250 = mapElement;
_dword_9E3264 = ((mapElement->type & MAP_ELEMENT_DIRECTION_MASK) << 3) | (mapElement->properties.surface.terrain >> 5);
uint32 edi = viewport_surface_paint_setup_get_ebx(mapElement, cl);
_dword_9E3278 = edi;
rct_xy16 base = {
.x = RCT2_GLOBAL(0x9DE568, sint16),
.y = RCT2_GLOBAL(0x9DE56C, sint16)
};
// Start loop
for (int i = 0; i < 4; i++) {
int index;
rct_xy16 offset;
uint8 *offset_al;
uint8 *offset_cl;
uint8 *offset_ch;
uint8 *offset_ah;
switch (i) {
case 0:
index = 2;
offset = viewport_surface_paint_data_0[get_current_rotation()];
offset_al = byte_97B4E4;
offset_cl = byte_97B504;
offset_ah = byte_97B4C4;
offset_ch = byte_97B4A4;
break;
case 1:
index = 1;
offset = viewport_surface_paint_data_1[get_current_rotation()];
offset_al = byte_97B4A4;
offset_cl = byte_97B504;
offset_ah = byte_97B4C4;
offset_ch = byte_97B4E4;
break;
case 2:
index = 3;
offset = viewport_surface_paint_data_2[get_current_rotation()];
offset_al = byte_97B4C4;
offset_cl = byte_97B4E4;
offset_ah = byte_97B4A4;
offset_ch = byte_97B504;
break;
case 3:
index = 0;
offset = viewport_surface_paint_data_3[get_current_rotation()];
offset_al = byte_97B4C4;
offset_cl = byte_97B4A4;
offset_ah = byte_97B4E4;
offset_ch = byte_97B504;
break;
}
rct_xy16 axbp = {.x = base.x + offset.x, .y = base.y + offset.y};
RCT2_GLOBAL(0x9E3240 + index * 4, rct_map_element *) = NULL;
if (axbp.x > 0x2000 || axbp.y > 0x2000) {
continue; // TODO: use continue instead
}
rct_map_element *surfaceElement = map_get_surface_element_at(axbp.x / 32, axbp.y / 32);
if (surfaceElement == NULL) {
continue; // TODO: use continue instead
}
RCT2_GLOBAL(0x9E3240 + index * 4, rct_map_element *) = surfaceElement;
RCT2_GLOBAL(0x9E3254 + index * 4, uint32) = ((mapElement->type & MAP_ELEMENT_DIRECTION_MASK) << 3) | (mapElement->properties.surface.terrain >> 5);
uint32 ebx = viewport_surface_paint_setup_get_ebx(surfaceElement, cl);
RCT2_GLOBAL(0x9E3268 + index * 4, uint32) = ebx;
uint8 al = height / 16;
uint8 ah = surfaceElement->base_height / 2;
uint8 cl = al + offset_cl[edi];
uint8 ch = ah + offset_ch[ebx];
al += offset_al[edi];
ah += offset_ah[ebx];
RCT2_GLOBAL(0x9E327C + index * 2, uint16) = ah << 8 | al;
RCT2_GLOBAL(0x9E3284 + index * 2, uint16) = ch << 8 | cl;
}
// end loop
if ((RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_VIEWPORT_FLAGS, uint16) & VIEWPORT_FLAG_LAND_HEIGHTS) && (RCT2_GLOBAL(0x9E3296, uint16) == 0)) {
sint16 x = RCT2_GLOBAL(0x009DE56A, sint16), y = RCT2_GLOBAL(0x009DE56E, sint16);
int dx = map_element_height(x + 16, y + 16) & 0xFFFF;
dx += 3;
int image_id = (5769 + dx / 16) | 0x20780000;
image_id += RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_HEIGHT_MARKERS, uint16);
image_id -= RCT2_GLOBAL(0x01359208, uint16);
sub_98196C(image_id, 16, 16, 1, 1, 0, height, get_current_rotation());
}
RCT2_CALLPROC_X(0x660AAB, 0, 0, direction, height, (int) mapElement, 0, 0);
}
/**
*
* rct2: 0x006C4794
@@ -1923,7 +2146,7 @@ static void sub_68B3FB(int x, int y)
switch (map_element_get_type(map_element))
{
case MAP_ELEMENT_TYPE_SURFACE:
RCT2_CALLPROC_X(0x66062C, 0, 0, direction, height, (int)map_element, 0, 0);
viewport_surface_paint_setup(direction, height, map_element);
break;
case MAP_ELEMENT_TYPE_PATH:
RCT2_CALLPROC_X(0x6A3590, 0, 0, direction, height, (int)map_element, 0, 0);