Create paint_session to replace paint globals

This commit is contained in:
Ted John 2017-09-01 00:41:40 +01:00
parent 1f3ccae8b1
commit cb09357bba
5 changed files with 150 additions and 116 deletions

View File

@ -285,7 +285,7 @@ void lightfx_prepare_light_list()
dpi->zoom_level = _viewportDpi1.zoom;
dpi->height = 1;
dpi->width = 1;
gEndOfPaintStructArray = 0xF1A4CC;
gPaintSession.EndOfPaintStructArray = 0xF1A4CC;
unk_140E9A8 = dpi;
painter_setup();
viewport_paint_setup();

View File

@ -754,8 +754,8 @@ static void viewport_paint_column(rct_drawpixelinfo * dpi, uint32 viewFlags)
viewport_paint_weather_gloom(dpi);
}
if (gPaintPSStringHead != NULL) {
paint_draw_money_structs(dpi, gPaintPSStringHead);
if (gPaintSession.PSStringHead != NULL) {
paint_draw_money_structs(dpi, gPaintSession.PSStringHead);
}
}

View File

@ -446,7 +446,7 @@ static void viewport_surface_smoothen_edge(enum edge_t edge, struct tile_descrip
uint32 image_id = maskImageBase + byte_97B444[self.slope];
if (paint_attach_to_previous_ps(image_id, 0, 0)) {
attached_paint_struct * out = g_aps_F1AD2C;
attached_paint_struct * out = gPaintSession.UnkF1AD2C;
// set content and enable masking
out->colour_image_id = dword_97B804[neighbour.terrain] + cl;
out->flags |= PAINT_STRUCT_FLAG_IS_MASKED;
@ -1194,10 +1194,10 @@ void surface_paint(uint8 direction, uint16 height, rct_map_element * mapElement)
paint_attach_to_previous_ps(SPR_TERRAIN_SELECTION_SQUARE + byte_97B444[surfaceShape], 0, 0);
} else if (mapElement->properties.surface.ownership & OWNERSHIP_AVAILABLE) {
rct_xy16 pos = {gPaintMapPosition.x, gPaintMapPosition.y};
paint_struct * backup = g_ps_F1AD28;
paint_struct * backup = gPaintSession.UnkF1AD28;
sint32 height2 = (map_element_height(pos.x + 16, pos.y + 16) & 0xFFFF) + 3;
sub_98196C(SPR_LAND_OWNERSHIP_AVAILABLE, 16, 16, 1, 1, 0, height2, rotation);
g_ps_F1AD28 = backup;
gPaintSession.UnkF1AD28 = backup;
}
}
@ -1207,11 +1207,11 @@ void surface_paint(uint8 direction, uint16 height, rct_map_element * mapElement)
assert(surfaceShape < countof(byte_97B444));
paint_attach_to_previous_ps(SPR_TERRAIN_SELECTION_DOTTED + byte_97B444[surfaceShape], 0, 0);
} else if (mapElement->properties.surface.ownership & OWNERSHIP_CONSTRUCTION_RIGHTS_AVAILABLE) {
paint_struct * backup = g_ps_F1AD28;
paint_struct * backup = gPaintSession.UnkF1AD28;
rct_xy16 pos = {gPaintMapPosition.x, gPaintMapPosition.y};
sint32 height2 = map_element_height(pos.x + 16, pos.y + 16) & 0xFFFF;
sub_98196C(SPR_LAND_CONSTRUCTION_RIGHTS_AVAILABLE, 16, 16, 1, 1, 0, height2 + 3, rotation);
g_ps_F1AD28 = backup;
gPaintSession.UnkF1AD28 = backup;
}
}
@ -1276,9 +1276,9 @@ void surface_paint(uint8 direction, uint16 height, rct_map_element * mapElement)
sint32 image_id = (SPR_TERRAIN_SELECTION_CORNER + byte_97B444[local_surfaceShape]) | 0x21300000;
paint_struct * backup = g_ps_F1AD28;
paint_struct * backup = gPaintSession.UnkF1AD28;
sub_98196C(image_id, 0, 0, 32, 32, 1, local_height, rotation);
g_ps_F1AD28 = backup;
gPaintSession.UnkF1AD28 = backup;
}
}
}

View File

@ -31,23 +31,11 @@ const uint32 construction_markers[] = {
PALETTE_DARKEN_2 << 19 | IMAGE_TYPE_TRANSPARENT, // Translucent
};
paint_struct * g_ps_F1AD28;
attached_paint_struct * g_aps_F1AD2C;
paint_string_struct * gPaintPSStringHead;
static paint_string_struct * _paintLastPSString;
#define MAX_PAINT_QUADRANTS (512)
paint_session gPaintSession;
#ifdef NO_RCT2
paint_entry gPaintStructs[4000];
static uint32 _paintQuadrantBackIndex;
static uint32 _paintQuadrantFrontIndex;
static paint_struct *_paintQuadrants[MAX_PAINT_QUADRANTS];
void *g_currently_drawn_item;
paint_entry * gEndOfPaintStructArray;
rct_xy16 gPaintSpritePosition;
paint_struct gUnkF1A4CC;
uint8 gPaintInteractionType;
support_height gSupportSegments[9] = { 0 };
support_height gSupport;
@ -81,46 +69,51 @@ static void paint_ps_image_with_bounding_boxes(rct_drawpixelinfo * dpi, paint_st
static void paint_ps_image(rct_drawpixelinfo * dpi, paint_struct * ps, uint32 imageId, sint16 x, sint16 y);
static uint32 paint_ps_colourify_image(uint32 imageId, uint8 spriteType, uint32 viewFlags);
static void paint_session_init(paint_session * session, rct_drawpixelinfo * dpi)
{
memset(session, 0, sizeof(paint_session));
session->Unk140E9A8 = dpi;
session->EndOfPaintStructArray = &session->PaintStructs[4000 - 1];
session->NextFreePaintStruct = session->PaintStructs;
session->UnkF1AD28 = NULL;
session->UnkF1AD2C = NULL;
for (sint32 i = 0; i < MAX_PAINT_QUADRANTS; i++) {
session->Quadrants[i] = NULL;
}
session->QuadrantBackIndex = -1;
session->QuadrantFrontIndex = 0;
session->PSStringHead = NULL;
session->LastPSString = NULL;
session->WoodenSupportsPrependTo = NULL;
}
/**
*
* rct2: 0x0068615B
*/
void paint_init(rct_drawpixelinfo * dpi)
{
unk_140E9A8 = dpi;
gEndOfPaintStructArray = &gPaintStructs[4000 - 1];
gNextFreePaintStruct = gPaintStructs;
g_ps_F1AD28 = NULL;
g_aps_F1AD2C = NULL;
for (sint32 i = 0; i < 512; i++) {
_paintQuadrants[i] = NULL;
}
_paintQuadrantBackIndex = -1;
_paintQuadrantFrontIndex = 0;
gPaintPSStringHead = NULL;
_paintLastPSString = NULL;
gWoodenSupportsPrependTo = NULL;
paint_session_init(&gPaintSession, dpi);
}
static void paint_add_ps_to_quadrant(paint_struct * ps, sint32 positionHash)
static void paint_session_add_ps_to_quadrant(paint_session * session, paint_struct * ps, sint32 positionHash)
{
uint32 paintQuadrantIndex = clamp(0, positionHash / 32, MAX_PAINT_QUADRANTS - 1);
ps->quadrant_index = paintQuadrantIndex;
ps->next_quadrant_ps = _paintQuadrants[paintQuadrantIndex];
_paintQuadrants[paintQuadrantIndex] = ps;
ps->next_quadrant_ps = session->Quadrants[paintQuadrantIndex];
session->Quadrants[paintQuadrantIndex] = ps;
_paintQuadrantBackIndex = min(_paintQuadrantBackIndex, paintQuadrantIndex);
_paintQuadrantFrontIndex = max(_paintQuadrantFrontIndex, paintQuadrantIndex);
session->QuadrantBackIndex = min(session->QuadrantBackIndex, paintQuadrantIndex);
session->QuadrantFrontIndex = max(session->QuadrantFrontIndex, paintQuadrantIndex);
}
/**
* Extracted from 0x0098196c, 0x0098197c, 0x0098198c, 0x0098199c
*/
static paint_struct * sub_9819_c(uint32 image_id, rct_xyz16 offset, rct_xyz16 boundBoxSize, rct_xyz16 boundBoxOffset, uint8 rotation)
static paint_struct * sub_9819_c(paint_session * session, uint32 image_id, rct_xyz16 offset, rct_xyz16 boundBoxSize, rct_xyz16 boundBoxOffset, uint8 rotation)
{
if (gNextFreePaintStruct >= gEndOfPaintStructArray) return NULL;
paint_struct * ps = &gNextFreePaintStruct->basic;
if (session->NextFreePaintStruct >= session->EndOfPaintStructArray) return NULL;
paint_struct * ps = &session->NextFreePaintStruct->basic;
ps->image_id = image_id;
@ -141,8 +134,8 @@ static paint_struct * sub_9819_c(uint32 image_id, rct_xyz16 offset, rct_xyz16 bo
rotate_map_coordinates(&offset.x, &offset.y, 1);
break;
}
offset.x += gPaintSpritePosition.x;
offset.y += gPaintSpritePosition.y;
offset.x += session->SpritePosition.x;
offset.y += session->SpritePosition.y;
rct_xy16 map = coordinate_3d_to_2d(&offset, rotation);
@ -187,20 +180,20 @@ static paint_struct * sub_9819_c(uint32 image_id, rct_xyz16 offset, rct_xyz16 bo
break;
}
ps->bound_box_x_end = boundBoxSize.x + boundBoxOffset.x + gPaintSpritePosition.x;
ps->bound_box_x_end = boundBoxSize.x + boundBoxOffset.x + session->SpritePosition.x;
ps->bound_box_z = boundBoxOffset.z;
ps->bound_box_z_end = boundBoxOffset.z + boundBoxSize.z;
ps->bound_box_y_end = boundBoxSize.y + boundBoxOffset.y + gPaintSpritePosition.y;
ps->bound_box_y_end = boundBoxSize.y + boundBoxOffset.y + session->SpritePosition.y;
ps->flags = 0;
ps->bound_box_x = boundBoxOffset.x + gPaintSpritePosition.x;
ps->bound_box_y = boundBoxOffset.y + gPaintSpritePosition.y;
ps->bound_box_x = boundBoxOffset.x + session->SpritePosition.x;
ps->bound_box_y = boundBoxOffset.y + session->SpritePosition.y;
ps->attached_ps = NULL;
ps->var_20 = NULL;
ps->sprite_type = gPaintInteractionType;
ps->sprite_type = session->InteractionType;
ps->var_29 = 0;
ps->map_x = gPaintMapPosition.x;
ps->map_y = gPaintMapPosition.y;
ps->mapElement = g_currently_drawn_item;
ps->map_x = session->MapPosition.x;
ps->map_y = session->MapPosition.y;
ps->mapElement = session->CurrentlyDrawnItem;
return ps;
}
@ -228,14 +221,16 @@ paint_struct * sub_98196C(
assert((uint16) bound_box_length_x == (sint16) bound_box_length_x);
assert((uint16) bound_box_length_y == (sint16) bound_box_length_y);
g_ps_F1AD28 = 0;
g_aps_F1AD2C = NULL;
paint_session * session = &gPaintSession;
if (gNextFreePaintStruct >= gEndOfPaintStructArray) {
session->UnkF1AD28 = 0;
session->UnkF1AD2C = NULL;
if (session->NextFreePaintStruct >= session->EndOfPaintStructArray) {
return NULL;
}
paint_struct *ps = &gNextFreePaintStruct->basic;
paint_struct *ps = &session->NextFreePaintStruct->basic;
ps->image_id = image_id;
uint32 image_element = image_id & 0x7FFFF;
@ -282,8 +277,8 @@ paint_struct * sub_98196C(
break;
}
coord_3d.x += gPaintSpritePosition.x;
coord_3d.y += gPaintSpritePosition.y;
coord_3d.x += session->SpritePosition.x;
coord_3d.y += session->SpritePosition.y;
ps->bound_box_x_end = coord_3d.x + boundBox.x;
ps->bound_box_y_end = coord_3d.y + boundBox.y;
@ -315,13 +310,13 @@ paint_struct * sub_98196C(
ps->bound_box_y = coord_3d.y;
ps->attached_ps = NULL;
ps->var_20 = NULL;
ps->sprite_type = gPaintInteractionType;
ps->sprite_type = session->InteractionType;
ps->var_29 = 0;
ps->map_x = gPaintMapPosition.x;
ps->map_y = gPaintMapPosition.y;
ps->map_x = session->MapPosition.x;
ps->map_y = session->MapPosition.y;
ps->mapElement = g_currently_drawn_item;
g_ps_F1AD28 = ps;
session->UnkF1AD28 = ps;
sint32 positionHash = 0;
switch (rotation) {
@ -338,9 +333,9 @@ paint_struct * sub_98196C(
positionHash = coord_3d.x - coord_3d.y + 0x2000;
break;
}
paint_add_ps_to_quadrant(ps, positionHash);
paint_session_add_ps_to_quadrant(session, ps, positionHash);
gNextFreePaintStruct++;
session->NextFreePaintStruct++;
return ps;
}
@ -369,19 +364,21 @@ paint_struct * sub_98197C(
sint16 bound_box_offset_x, sint16 bound_box_offset_y, sint16 bound_box_offset_z,
uint32 rotation
) {
g_ps_F1AD28 = 0;
g_aps_F1AD2C = NULL;
paint_session * session = &gPaintSession;
session->UnkF1AD28 = 0;
session->UnkF1AD2C = NULL;
rct_xyz16 offset = {.x = x_offset, .y = y_offset, .z = z_offset};
rct_xyz16 boundBoxSize = {.x = bound_box_length_x, .y = bound_box_length_y, .z = bound_box_length_z};
rct_xyz16 boundBoxOffset = {.x = bound_box_offset_x, .y = bound_box_offset_y, .z = bound_box_offset_z};
paint_struct * ps = sub_9819_c(image_id, offset, boundBoxSize, boundBoxOffset, rotation);
paint_struct * ps = sub_9819_c(session, image_id, offset, boundBoxSize, boundBoxOffset, rotation);
if (ps == NULL) {
return NULL;
}
g_ps_F1AD28 = ps;
session->UnkF1AD28 = ps;
rct_xy16 attach = {
.x = ps->bound_box_x,
@ -402,9 +399,9 @@ paint_struct * sub_98197C(
}
sint32 positionHash = attach.x + attach.y;
paint_add_ps_to_quadrant(ps, positionHash);
paint_session_add_ps_to_quadrant(session, ps, positionHash);
gNextFreePaintStruct++;
session->NextFreePaintStruct++;
return ps;
}
@ -436,20 +433,21 @@ paint_struct * sub_98198C(
assert((uint16) bound_box_length_x == (sint16) bound_box_length_x);
assert((uint16) bound_box_length_y == (sint16) bound_box_length_y);
g_ps_F1AD28 = 0;
g_aps_F1AD2C = NULL;
paint_session * session = &gPaintSession;
session->UnkF1AD28 = 0;
session->UnkF1AD2C = NULL;
rct_xyz16 offset = {.x = x_offset, .y = y_offset, .z = z_offset};
rct_xyz16 boundBoxSize = {.x = bound_box_length_x, .y = bound_box_length_y, .z = bound_box_length_z};
rct_xyz16 boundBoxOffset = {.x = bound_box_offset_x, .y = bound_box_offset_y, .z = bound_box_offset_z};
paint_struct * ps = sub_9819_c(image_id, offset, boundBoxSize, boundBoxOffset, rotation);
paint_struct * ps = sub_9819_c(session, image_id, offset, boundBoxSize, boundBoxOffset, rotation);
if (ps == NULL) {
return NULL;
}
g_ps_F1AD28 = ps;
gNextFreePaintStruct++;
session->UnkF1AD28 = ps;
session->NextFreePaintStruct++;
return ps;
}
@ -481,7 +479,9 @@ paint_struct * sub_98199C(
assert((uint16) bound_box_length_x == (sint16) bound_box_length_x);
assert((uint16) bound_box_length_y == (sint16) bound_box_length_y);
if (g_ps_F1AD28 == NULL) {
paint_session * session = &gPaintSession;
if (session->UnkF1AD28 == NULL) {
return sub_98197C(
image_id,
x_offset, y_offset,
@ -495,17 +495,17 @@ paint_struct * sub_98199C(
rct_xyz16 offset = {.x = x_offset, .y = y_offset, .z = z_offset};
rct_xyz16 boundBox = {.x = bound_box_length_x, .y = bound_box_length_y, .z = bound_box_length_z};
rct_xyz16 boundBoxOffset = {.x = bound_box_offset_x, .y = bound_box_offset_y, .z = bound_box_offset_z};
paint_struct * ps = sub_9819_c(image_id, offset, boundBox, boundBoxOffset, rotation);
paint_struct * ps = sub_9819_c(session, image_id, offset, boundBox, boundBoxOffset, rotation);
if (ps == NULL) {
return NULL;
}
paint_struct *old_ps = g_ps_F1AD28;
paint_struct *old_ps = session->UnkF1AD28;
old_ps->var_20 = ps;
g_ps_F1AD28 = ps;
gNextFreePaintStruct++;
session->UnkF1AD28 = ps;
session->NextFreePaintStruct++;
return ps;
}
@ -519,27 +519,29 @@ paint_struct * sub_98199C(
*/
bool paint_attach_to_previous_attach(uint32 image_id, uint16 x, uint16 y)
{
if (g_aps_F1AD2C == NULL) {
paint_session * session = &gPaintSession;
if (session->UnkF1AD2C == NULL) {
return paint_attach_to_previous_ps(image_id, x, y);
}
if (gNextFreePaintStruct >= gEndOfPaintStructArray) {
if (session->NextFreePaintStruct >= session->EndOfPaintStructArray) {
return false;
}
attached_paint_struct * ps = &gNextFreePaintStruct->attached;
attached_paint_struct * ps = &session->NextFreePaintStruct->attached;
ps->image_id = image_id;
ps->x = x;
ps->y = y;
ps->flags = 0;
attached_paint_struct * ebx = g_aps_F1AD2C;
attached_paint_struct * ebx = session->UnkF1AD2C;
ps->next = NULL;
ebx->next = ps;
g_aps_F1AD2C = ps;
session->UnkF1AD2C = ps;
gNextFreePaintStruct++;
session->NextFreePaintStruct++;
return true;
}
@ -554,29 +556,31 @@ bool paint_attach_to_previous_attach(uint32 image_id, uint16 x, uint16 y)
*/
bool paint_attach_to_previous_ps(uint32 image_id, uint16 x, uint16 y)
{
if (gNextFreePaintStruct >= gEndOfPaintStructArray) {
paint_session * session = &gPaintSession;
if (session->NextFreePaintStruct >= session->EndOfPaintStructArray) {
return false;
}
attached_paint_struct * ps = &gNextFreePaintStruct->attached;
attached_paint_struct * ps = &session->NextFreePaintStruct->attached;
ps->image_id = image_id;
ps->x = x;
ps->y = y;
ps->flags = 0;
paint_struct * masterPs = g_ps_F1AD28;
paint_struct * masterPs = session->UnkF1AD28;
if (masterPs == NULL) {
return false;
}
gNextFreePaintStruct++;
session->NextFreePaintStruct++;
attached_paint_struct * oldFirstAttached = masterPs->attached_ps;
masterPs->attached_ps = ps;
ps->next = oldFirstAttached;
g_aps_F1AD2C = ps;
session->UnkF1AD2C = ps;
return true;
}
@ -593,10 +597,12 @@ bool paint_attach_to_previous_ps(uint32 image_id, uint16 x, uint16 y)
*/
void paint_floating_money_effect(money32 amount, rct_string_id string_id, sint16 y, sint16 z, sint8 y_offsets[], sint16 offset_x, uint32 rotation)
{
if (gNextFreePaintStruct >= gEndOfPaintStructArray) {
paint_session * session = &gPaintSession;
if (session->NextFreePaintStruct >= session->EndOfPaintStructArray) {
return;
}
paint_string_struct * ps = &gNextFreePaintStruct->string;
paint_string_struct * ps = &session->NextFreePaintStruct->string;
ps->string_id = string_id;
ps->next = 0;
@ -606,20 +612,23 @@ void paint_floating_money_effect(money32 amount, rct_string_id string_id, sint16
ps->args[3] = 0;
ps->y_offsets = (uint8 *) y_offsets;
rct_xyz16 position = {.x = gPaintSpritePosition.x, .y = gPaintSpritePosition.y, .z = z};
rct_xyz16 position = {
.x = session->SpritePosition.x,
.y = session->SpritePosition.y,
.z = z };
rct_xy16 coord = coordinate_3d_to_2d(&position, rotation);
ps->x = coord.x + offset_x;
ps->y = coord.y;
gNextFreePaintStruct++;
session->NextFreePaintStruct++;
if (_paintLastPSString == NULL) {
gPaintPSStringHead = ps;
if (session->LastPSString == NULL) {
session->PSStringHead = ps;
} else {
_paintLastPSString->next = ps;
session->LastPSString->next = ps;
}
_paintLastPSString = ps;
session->LastPSString = ps;
}
/**
@ -841,15 +850,15 @@ static paint_struct * paint_arrange_structs_helper(paint_struct * ps_next, uint1
*
* rct2: 0x00688217
*/
paint_struct paint_arrange_structs()
static paint_struct paint_session_arrange_structs(paint_session * session)
{
paint_struct psHead = { 0 };
paint_struct * ps = &psHead;
ps->next_quadrant_ps = NULL;
uint32 quadrantIndex = _paintQuadrantBackIndex;
uint32 quadrantIndex = session->QuadrantBackIndex;
if (quadrantIndex != UINT32_MAX) {
do {
paint_struct * ps_next = _paintQuadrants[quadrantIndex];
paint_struct * ps_next = session->Quadrants[quadrantIndex];
if (ps_next != NULL) {
ps->next_quadrant_ps = ps_next;
do {
@ -857,18 +866,23 @@ paint_struct paint_arrange_structs()
ps_next = ps_next->next_quadrant_ps;
} while (ps_next != NULL);
}
} while (++quadrantIndex <= _paintQuadrantFrontIndex);
} while (++quadrantIndex <= session->QuadrantFrontIndex);
paint_struct * ps_cache = paint_arrange_structs_helper(&psHead, _paintQuadrantBackIndex & 0xFFFF, PAINT_QUADRANT_FLAG_NEXT);
paint_struct * ps_cache = paint_arrange_structs_helper(&psHead, session->QuadrantBackIndex & 0xFFFF, PAINT_QUADRANT_FLAG_NEXT);
quadrantIndex = _paintQuadrantBackIndex;
while (++quadrantIndex < _paintQuadrantFrontIndex) {
quadrantIndex = session->QuadrantBackIndex;
while (++quadrantIndex < session->QuadrantFrontIndex) {
ps_cache = paint_arrange_structs_helper(ps_cache, quadrantIndex & 0xFFFF, 0);
}
}
return psHead;
}
paint_struct paint_arrange_structs()
{
return paint_session_arrange_structs(&gPaintSession);
}
/**
*
* rct2: 0x00688485

View File

@ -91,9 +91,6 @@ struct paint_struct {
assert_struct_size(paint_struct, 0x34);
#endif
extern paint_struct * g_ps_F1AD28;
extern attached_paint_struct * g_aps_F1AD2C;
typedef struct paint_string_struct paint_string_struct;
/* size 0x1E */
@ -133,11 +130,36 @@ typedef struct support_height {
uint8 pad;
} support_height;
#define MAX_PAINT_QUADRANTS 512
typedef struct paint_session
{
rct_drawpixelinfo * Unk140E9A8;
paint_entry PaintStructs[4000];
paint_struct * Quadrants[MAX_PAINT_QUADRANTS];
uint32 QuadrantBackIndex;
uint32 QuadrantFrontIndex;
void * CurrentlyDrawnItem;
paint_entry * EndOfPaintStructArray;
paint_entry * NextFreePaintStruct;
rct_xy16 SpritePosition;
paint_struct UnkF1A4CC;
paint_struct * UnkF1AD28;
attached_paint_struct * UnkF1AD2C;
uint8 InteractionType;
support_height SupportSegments[9];
support_height Support;
paint_string_struct * PSStringHead;
paint_string_struct * LastPSString;
paint_struct * WoodenSupportsPrependTo;
rct_xy16 MapPosition;
} paint_session;
extern paint_session gPaintSession;
#ifdef NO_RCT2
extern void *g_currently_drawn_item;
extern paint_entry * gEndOfPaintStructArray;
extern rct_xy16 gPaintSpritePosition;
extern paint_entry gPaintStructs[4000];
#else
#define gPaintStructs RCT2_ADDRESS(0x00EE788C, paint_entry)
#define g_currently_drawn_item RCT2_GLOBAL(0x009DE578, void*)
@ -155,8 +177,6 @@ extern support_height gSupportSegments[9];
extern support_height gSupport;
#endif
extern paint_string_struct * gPaintPSStringHead;
/** rct2: 0x00993CC4 */
extern const uint32 construction_markers[];
extern bool gShowDirtyVisuals;