mirror of https://github.com/OpenRCT2/OpenRCT2.git
finish graph tab on ride window
This commit is contained in:
parent
409ee7a3da
commit
012ffcd8b2
11
src/ride.h
11
src/ride.h
|
@ -191,6 +191,8 @@ typedef struct {
|
||||||
uint8 pad_208[0x58];
|
uint8 pad_208[0x58];
|
||||||
} rct_ride;
|
} rct_ride;
|
||||||
|
|
||||||
|
#define RIDE_MEASUREMENT_MAX_ITEMS 4800
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ride measurement structure.
|
* Ride measurement structure.
|
||||||
* size: 0x04B0C
|
* size: 0x04B0C
|
||||||
|
@ -199,10 +201,13 @@ typedef struct {
|
||||||
uint8 var_00;
|
uint8 var_00;
|
||||||
uint8 var_01;
|
uint8 var_01;
|
||||||
uint8 pad_02[4];
|
uint8 pad_02[4];
|
||||||
uint16 var_06;
|
uint16 num_items; // 0x0006
|
||||||
uint16 var_08;
|
uint16 current_item; // 0x0008
|
||||||
uint16 var_0A;
|
uint16 var_0A;
|
||||||
uint8 pad_0C[0x4B00];
|
sint8 vertical[RIDE_MEASUREMENT_MAX_ITEMS]; // 0x000C
|
||||||
|
sint8 lateral[RIDE_MEASUREMENT_MAX_ITEMS]; // 0x12CC
|
||||||
|
uint8 velocity[RIDE_MEASUREMENT_MAX_ITEMS]; // 0x258C
|
||||||
|
uint8 altitude[RIDE_MEASUREMENT_MAX_ITEMS]; // 0x384C
|
||||||
} rct_ride_measurement;
|
} rct_ride_measurement;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
|
|
@ -4615,7 +4615,7 @@ enum {
|
||||||
*
|
*
|
||||||
* rct2: 0x006B66D9
|
* rct2: 0x006B66D9
|
||||||
*/
|
*/
|
||||||
rct_ride_measurement *ride_get_measurement(int rideIndex)
|
rct_ride_measurement *ride_get_measurement(int rideIndex, rct_string_id *message)
|
||||||
{
|
{
|
||||||
int eax, ebx, ecx, edx, esi, edi, ebp;
|
int eax, ebx, ecx, edx, esi, edi, ebp;
|
||||||
edx = rideIndex;
|
edx = rideIndex;
|
||||||
|
@ -4627,6 +4627,8 @@ rct_ride_measurement *ride_get_measurement(int rideIndex)
|
||||||
eax &= 0xFF;
|
eax &= 0xFF;
|
||||||
return GET_RIDE_MEASUREMENT(eax);
|
return GET_RIDE_MEASUREMENT(eax);
|
||||||
} else {
|
} else {
|
||||||
|
if (message != NULL)
|
||||||
|
*message = eax;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4730,10 +4732,10 @@ static void window_ride_graphs_update(rct_window *w)
|
||||||
widget = &window_ride_graphs_widgets[WIDX_GRAPH];
|
widget = &window_ride_graphs_widgets[WIDX_GRAPH];
|
||||||
x = w->scrolls[0].h_left;
|
x = w->scrolls[0].h_left;
|
||||||
if (!(w->list_information_type & 0x8000)) {
|
if (!(w->list_information_type & 0x8000)) {
|
||||||
measurement = ride_get_measurement(w->number);
|
measurement = ride_get_measurement(w->number, NULL);
|
||||||
x = measurement == NULL ?
|
x = measurement == NULL ?
|
||||||
0 :
|
0 :
|
||||||
measurement->var_08 - (((widget->right - widget->left) / 4) * 3);
|
measurement->current_item - (((widget->right - widget->left) / 4) * 3);
|
||||||
}
|
}
|
||||||
|
|
||||||
w->scrolls[0].h_left = clamp(0, x, w->scrolls[0].h_right - ((widget->right - widget->left) - 2));
|
w->scrolls[0].h_left = clamp(0, x, w->scrolls[0].h_right - ((widget->right - widget->left) - 2));
|
||||||
|
@ -4759,9 +4761,9 @@ static void window_ride_graphs_scrollgetheight()
|
||||||
height = 0;
|
height = 0;
|
||||||
|
|
||||||
// Get measurement size
|
// Get measurement size
|
||||||
measurement = ride_get_measurement(w->number);
|
measurement = ride_get_measurement(w->number, NULL);
|
||||||
if (measurement != NULL)
|
if (measurement != NULL)
|
||||||
width = max(width, measurement->var_06);
|
width = max(width, measurement->num_items);
|
||||||
|
|
||||||
// Return size
|
// Return size
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
|
@ -4800,18 +4802,21 @@ static void window_ride_graphs_tooltip()
|
||||||
short unused, widgetIndex, result;
|
short unused, widgetIndex, result;
|
||||||
rct_ride *ride;
|
rct_ride *ride;
|
||||||
rct_ride_measurement *measurement;
|
rct_ride_measurement *measurement;
|
||||||
|
rct_string_id stringId;
|
||||||
|
|
||||||
window_dropdown_get_registers(w, unused, widgetIndex);
|
window_dropdown_get_registers(w, unused, widgetIndex);
|
||||||
|
|
||||||
result = -1;
|
result = -1;
|
||||||
if (widgetIndex == WIDX_GRAPH) {
|
if (widgetIndex == WIDX_GRAPH) {
|
||||||
RCT2_GLOBAL(0x013CE952, uint16) = 3158;
|
RCT2_GLOBAL(0x013CE952, uint16) = 3158;
|
||||||
measurement = ride_get_measurement(w->number);
|
measurement = ride_get_measurement(w->number, &stringId);
|
||||||
if (measurement != NULL && (measurement->var_01 & 1)) {
|
if (measurement != NULL && (measurement->var_01 & 1)) {
|
||||||
RCT2_GLOBAL(0x013CE952 + 4, uint16) = measurement->var_0A + 1;
|
RCT2_GLOBAL(0x013CE952 + 4, uint16) = measurement->var_0A + 1;
|
||||||
ride = GET_RIDE(w->number);
|
ride = GET_RIDE(w->number);
|
||||||
RCT2_GLOBAL(0x013CE952 + 2, uint16) = RideNameConvention[ride->type].vehicle_name + 6;
|
RCT2_GLOBAL(0x013CE952 + 2, uint16) = RideNameConvention[ride->type].vehicle_name + 6;
|
||||||
result = 0;
|
result = 0;
|
||||||
|
} else {
|
||||||
|
result = stringId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4909,14 +4914,112 @@ static void window_ride_graphs_scrollpaint()
|
||||||
rct_window *w;
|
rct_window *w;
|
||||||
rct_drawpixelinfo *dpi;
|
rct_drawpixelinfo *dpi;
|
||||||
rct_ride_measurement *measurement;
|
rct_ride_measurement *measurement;
|
||||||
|
rct_widget *widget;
|
||||||
|
int x, y, width, time, listType, colour, top, bottom, tmp;
|
||||||
|
rct_string_id stringId;
|
||||||
|
|
||||||
window_paint_get_registers(w, dpi);
|
window_paint_get_registers(w, dpi);
|
||||||
|
|
||||||
gfx_clear(dpi, RCT2_GLOBAL(0x0141FC9D, uint8) * 0x01010101);
|
gfx_clear(dpi, RCT2_GLOBAL(0x0141FC9D, uint8) * 0x01010101);
|
||||||
|
|
||||||
measurement = ride_get_measurement(w->number);
|
widget = &window_ride_graphs_widgets[WIDX_GRAPH];
|
||||||
if (measurement == NULL)
|
listType = w->list_information_type & 0xFF;
|
||||||
|
measurement = ride_get_measurement(w->number, &stringId);
|
||||||
|
if (measurement == NULL) {
|
||||||
|
// No measurement message
|
||||||
|
x = (widget->right - widget->left) / 2;
|
||||||
|
y = (widget->bottom - widget->top) / 2 - 5;
|
||||||
|
width = widget->right - widget->left - 2;
|
||||||
|
gfx_draw_string_centred_wrapped(dpi, (void*)0x013CE952, x, y, width, stringId, 0);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vertical grid lines
|
||||||
|
time = 0;
|
||||||
|
for (x = 0; x < dpi->x + dpi->width; x += 80) {
|
||||||
|
if (x + 80 >= dpi->x) {
|
||||||
|
gfx_fill_rect(dpi, x + 0, dpi->y, x + 0, dpi->y + dpi->height - 1, RCT2_GLOBAL(0x0141FCA0, uint8));
|
||||||
|
gfx_fill_rect(dpi, x + 16, dpi->y, x + 16, dpi->y + dpi->height - 1, RCT2_GLOBAL(0x0141FC9F, uint8));
|
||||||
|
gfx_fill_rect(dpi, x + 32, dpi->y, x + 32, dpi->y + dpi->height - 1, RCT2_GLOBAL(0x0141FC9F, uint8));
|
||||||
|
gfx_fill_rect(dpi, x + 48, dpi->y, x + 48, dpi->y + dpi->height - 1, RCT2_GLOBAL(0x0141FC9F, uint8));
|
||||||
|
gfx_fill_rect(dpi, x + 64, dpi->y, x + 64, dpi->y + dpi->height - 1, RCT2_GLOBAL(0x0141FC9F, uint8));
|
||||||
|
}
|
||||||
|
time += 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Horizontal grid lines
|
||||||
|
y = widget->bottom - widget->top - 13;
|
||||||
|
short yUnit = RCT2_GLOBAL(0x0098DD9A + (listType * 8), uint16);
|
||||||
|
short ax = RCT2_GLOBAL(0x0098DD9E + (listType * 8), uint16);
|
||||||
|
short yUnitInterval = RCT2_GLOBAL(0x0098DD9C + (listType * 8), uint16);
|
||||||
|
short yInterval = RCT2_GLOBAL(0x0098DD98 + (listType * 8), uint16);
|
||||||
|
|
||||||
|
// Scale modifier
|
||||||
|
if (ax == 1420) {
|
||||||
|
short unk = RCT2_GLOBAL(0x01359208, uint16);
|
||||||
|
yUnit -= RCT2_GLOBAL(0x01359208, uint16);
|
||||||
|
unk *= 2;
|
||||||
|
yUnit -= unk;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (y = widget->bottom - widget->top - 13; y >= 8; y -= yInterval, yUnit += yUnitInterval) {
|
||||||
|
// Minor / major line
|
||||||
|
colour = yUnit == 0 ?
|
||||||
|
RCT2_GLOBAL(0x0141FCA0, uint8) :
|
||||||
|
RCT2_GLOBAL(0x0141FC9F, uint8);
|
||||||
|
|
||||||
|
gfx_fill_rect(dpi, dpi->x, y, dpi->x + dpi->width - 1, y, colour);
|
||||||
|
|
||||||
|
// Scale modifier
|
||||||
|
if (ax == 1420)
|
||||||
|
yUnit /= 2;
|
||||||
|
|
||||||
|
gfx_draw_string_left(dpi, ax, &yUnit, 0, w->scrolls[0].h_left + 1, y - 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Time marks
|
||||||
|
x = 0;
|
||||||
|
time = 0;
|
||||||
|
for (x = 0; x < dpi->x + dpi->width; x += 80) {
|
||||||
|
if (x + 80 >= dpi->x)
|
||||||
|
gfx_draw_string_left(dpi, 1414, &time, 0, x + 2, 1);
|
||||||
|
time += 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Plot
|
||||||
|
x = dpi->x;
|
||||||
|
for (width = 0; width < dpi->width; width++, x++) {
|
||||||
|
if (x < 0 || x >= measurement->num_items - 1)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
switch (listType) {
|
||||||
|
case GRAPH_VELOCITY:
|
||||||
|
top = measurement->velocity[x] / 2;
|
||||||
|
bottom = measurement->velocity[x + 1] / 2;
|
||||||
|
break;
|
||||||
|
case GRAPH_ALTITUDE:
|
||||||
|
top = measurement->altitude[x];
|
||||||
|
bottom = measurement->altitude[x + 1];
|
||||||
|
break;
|
||||||
|
case GRAPH_VERTICAL:
|
||||||
|
top = measurement->vertical[x] + 39;
|
||||||
|
bottom = measurement->vertical[x + 1] + 39;
|
||||||
|
break;
|
||||||
|
case GRAPH_LATERAL:
|
||||||
|
top = measurement->lateral[x] + 52;
|
||||||
|
bottom = measurement->lateral[x + 1] + 52;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
top = widget->bottom - widget->top - top - 13;
|
||||||
|
bottom = widget->bottom - widget->top - bottom - 13;
|
||||||
|
if (top > bottom) {
|
||||||
|
tmp = top;
|
||||||
|
top = bottom;
|
||||||
|
bottom = tmp;
|
||||||
|
}
|
||||||
|
gfx_fill_rect(dpi, x, top, x, bottom, x > measurement->current_item ? 17 : 21);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma endregion
|
#pragma endregion
|
||||||
|
|
Loading…
Reference in New Issue