1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2025-12-24 00:03:11 +01:00

Refactor park boundary fences to use data tables.

This commit is contained in:
ZehMatt
2017-12-05 18:59:53 +01:00
committed by Michael Steenbeek
parent 8814b15a85
commit 594c32b537

View File

@@ -341,6 +341,74 @@ struct tile_descriptor
corner_height corner_heights; corner_height corner_heights;
}; };
struct tile_surface_boundary_data
{
sint32 bit_1;
sint32 bit_8;
sint32 bit_4;
sint32 bit_2;
uint32 image[5];
LocationXY8 offset;
LocationXY16 box_offset;
LocationXY16 box_size;
};
static constexpr const tile_surface_boundary_data _tileSurfaceBoundaries[4] =
{
{ // Bottom right
1, 8, 4, 2,
{
SPR_TERRAIN_BOUNDARY_FENCES_1,
SPR_TERRAIN_BOUNDARY_FENCES_5,
SPR_TERRAIN_BOUNDARY_FENCES_3,
SPR_TERRAIN_BOUNDARY_FENCES_3,
SPR_TERRAIN_BOUNDARY_FENCES_5,
},
{ 1, 31 },
{ 1, 31 },
{ 30, 1 }
},
{ // Bottom left
1, 2, 4, 8,
{
SPR_TERRAIN_BOUNDARY_FENCES_2,
SPR_TERRAIN_BOUNDARY_FENCES_6,
SPR_TERRAIN_BOUNDARY_FENCES_4,
SPR_TERRAIN_BOUNDARY_FENCES_3,
SPR_TERRAIN_BOUNDARY_FENCES_5,
},
{ 31, 0 },
{ 31, 1 },
{ 1, 30 }
},
{ // Top left
4, 2, 8, 1,
{
SPR_TERRAIN_BOUNDARY_FENCES_1,
SPR_TERRAIN_BOUNDARY_FENCES_3,
SPR_TERRAIN_BOUNDARY_FENCES_5,
SPR_TERRAIN_BOUNDARY_FENCES_3,
SPR_TERRAIN_BOUNDARY_FENCES_5,
},
{ 1, 0 },
{ 1, 1 },
{ 30, 1 }
},
{ // Top right
4, 8, 2, 1,
{
SPR_TERRAIN_BOUNDARY_FENCES_2,
SPR_TERRAIN_BOUNDARY_FENCES_4,
SPR_TERRAIN_BOUNDARY_FENCES_6,
SPR_TERRAIN_BOUNDARY_FENCES_3,
SPR_TERRAIN_BOUNDARY_FENCES_5,
},
{ 1, 1 },
{ 1, 1 },
{ 1, 30 }
},
};
static uint8 viewport_surface_paint_setup_get_relative_slope(rct_tile_element * tileElement, sint32 rotation) static uint8 viewport_surface_paint_setup_get_relative_slope(rct_tile_element * tileElement, sint32 rotation)
{ {
uint8 slope = tileElement->properties.surface.slope; uint8 slope = tileElement->properties.surface.slope;
@@ -1028,8 +1096,8 @@ void surface_paint(paint_session * session, uint8 direction, uint16 height, rct_
LocationXY16 offset = viewport_surface_paint_data[i][rotation]; LocationXY16 offset = viewport_surface_paint_data[i][rotation];
LocationXY16 position = LocationXY16 position =
{ {
base.x + offset.x, (sint16)(base.x + offset.x),
base.y + offset.y (sint16)(base.y + offset.y)
}; };
tileDescriptors[i + 1].tile_element = NULL; tileDescriptors[i + 1].tile_element = NULL;
@@ -1395,9 +1463,8 @@ void surface_paint(paint_session * session, uint8 direction, uint16 height, rct_
} }
} }
if ((tileElement->properties.surface.ownership & 0x0F) && if ((tileElement->properties.surface.ownership & 0x0F) && !gTrackDesignSaveMode)
!gTrackDesignSaveMode {
) {
// Owned land boundary fences // Owned land boundary fences
session->InteractionType = VIEWPORT_INTERACTION_ITEM_PARK; session->InteractionType = VIEWPORT_INTERACTION_ITEM_PARK;
@@ -1408,114 +1475,70 @@ void surface_paint(paint_session * session, uint8 direction, uint16 height, rct_
uint8 al = regs.al | regs.ah; uint8 al = regs.al | regs.ah;
for (sint32 i = 0; i < 4; i++) { for (sint32 i = 0; i < 4; i++)
sint32 bit = al & 1; {
const sint32 bit = al & 1;
al >>= 1; al >>= 1;
if (bit == 0) { if (bit == 0)
{
continue; continue;
} }
const tile_surface_boundary_data& fenceData = _tileSurfaceBoundaries[i];
sint32 bit_1, bit_8, bit_4, bit_2;
LocationXY8 offset;
LocationXY16 box_offset, box_size;
uint32 image_1, image_2, image_3;
switch (i) {
default:
case 0:
// Bottom right
bit_1 = 1;
bit_8 = 8;
bit_4 = 4;
bit_2 = 2;
image_1 = 22872;
image_2 = 22876;
image_3 = 22874;
offset = {1, 31};
box_size = {30, 1};
box_offset = {1, 31};
break;
case 1:
// Bottom left
bit_1 = 1;
bit_8 = 2;
bit_4 = 4;
bit_2 = 8;
image_1 = 22873;
image_2 = 22877;
image_3 = 22875;
offset = {31, 0};
box_size = {1, 30};
box_offset = {31, 1};
break;
case 2:
// Top left
bit_1 = 4;
bit_8 = 2;
bit_4 = 8;
bit_2 = 1;
image_1 = 22872;
image_2 = 22874;
image_3 = 22876;
offset = {1, 0};
box_size = {30, 1};
box_offset ={1, 1};
// TODO: Fences on top tile get clipped after a while
break;
case 3:
// Top right
bit_1 = 4;
bit_8 = 8;
bit_4 = 2;
bit_2 = 1;
image_1 = 22873;
image_2 = 22875;
image_3 = 22877;
offset = {1, 1};
box_size = {1, 30};
box_offset = {1, 1};
break;
}
uint32 image_4, image_5;
if (i == 0 || i == 1) {
image_4 = image_3;
image_5 = image_2;
} else {
image_4 = image_2;
image_5 = image_3;
}
sint32 local_ebx = surfaceShape;
sint32 local_height = height; sint32 local_height = height;
sint32 image_id = 0; sint32 image_id = 0;
if (!(local_ebx & bit_1)) { // first
if (local_ebx & bit_8) { // second if (!(surfaceShape & fenceData.bit_1))
image_id = image_3; { // first
} else { if (surfaceShape & fenceData.bit_8)
image_id = image_1; { // second
image_id = fenceData.image[2];
} }
} else if (!(local_ebx & bit_8)) { // loc_6619A2: else
image_id = image_2; {
} else { image_id = fenceData.image[0];
}
}
else if (!(surfaceShape & fenceData.bit_8))
{ // loc_6619A2:
image_id = fenceData.image[1];
}
else
{
local_height += 16; local_height += 16;
if (!(local_ebx & 0x10)) { // loc_6619B5 (first) if (!(surfaceShape & 0x10))
image_id = image_1; { // loc_6619B5 (first)
} else if (local_ebx & bit_4) { // loc_6619B5 (second) image_id = fenceData.image[0];
image_id = image_4; }
} else if (local_ebx & bit_2) { // loc_6619B5 (third) else if (surfaceShape & fenceData.bit_4)
image_id = image_5; { // loc_6619B5 (second)
} else { image_id = fenceData.image[3];
image_id = image_1; }
else if (surfaceShape & fenceData.bit_2)
{ // loc_6619B5 (third)
image_id = fenceData.image[4];
}
else
{
image_id = fenceData.image[0];
} }
} }
sub_98197C(session, image_id, offset.x, offset.y, box_size.x, box_size.y, 9, local_height, box_offset.x, box_offset.y, local_height + 1, rotation); sub_98197C(session,
image_id,
fenceData.offset.x,
fenceData.offset.y,
fenceData.box_size.x,
fenceData.box_size.y,
9,
local_height,
fenceData.box_offset.x,
fenceData.box_offset.y,
local_height + 1,
rotation);
} }
} }