diff --git a/src/ride.h b/src/ride.h
index 2afa6b291f..8d7294bfd3 100644
--- a/src/ride.h
+++ b/src/ride.h
@@ -33,7 +33,7 @@ typedef struct {
uint8 pad_005[0x44];
uint8 status; // 0x049
uint16 var_04A;
- uint32 pad_04C;
+ uint32 var_04C;
uint16 var_050; // 0x050
uint8 pad_052[0x18];
uint16 var_06A[4]; // probably entrance map coordinates
diff --git a/src/window_ride_list.c b/src/window_ride_list.c
index 78b224090d..380d5bff55 100644
--- a/src/window_ride_list.c
+++ b/src/window_ride_list.c
@@ -18,6 +18,7 @@
* along with this program. If not, see .
*****************************************************************************/
+#include
#include "addresses.h"
#include "ride.h"
#include "strings.h"
@@ -70,6 +71,8 @@ static void window_ride_list_mousedown();
static void window_ride_list_dropdown();
static void window_ride_list_update();
static void window_ride_list_scrollgetsize();
+static void window_ride_list_scrollmousedown();
+static void window_ride_list_scrollmouseover();
static void window_ride_list_tooltip();
static void window_ride_list_invalidate();
static void window_ride_list_paint();
@@ -92,9 +95,9 @@ static uint32 window_ride_list_events[] = {
window_ride_list_emptysub,
window_ride_list_emptysub,
window_ride_list_scrollgetsize,
+ window_ride_list_scrollmousedown,
window_ride_list_emptysub,
- window_ride_list_emptysub,
- window_ride_list_emptysub,
+ window_ride_list_scrollmouseover,
window_ride_list_emptysub,
window_ride_list_emptysub,
window_ride_list_emptysub,
@@ -337,6 +340,48 @@ static void window_ride_list_scrollgetsize()
__asm mov edx, height
}
+/**
+ *
+ * rct2: 0x006B361F
+ */
+static void window_ride_list_scrollmousedown()
+{
+ int index;
+ short y;
+ rct_window *w;
+
+ __asm mov y, dx
+ __asm mov w, esi
+
+ index = y / 10;
+ if (index >= w->var_476)
+ return;
+
+ // Open ride window
+ RCT2_CALLPROC_X(0x006ACC28, w->var_076[index], 0, 0, 0, 0, 0, 0);
+}
+
+/**
+ *
+ * rct2: 0x006B35EF
+ */
+static void window_ride_list_scrollmouseover()
+{
+ int index;
+ short y;
+ rct_window *w;
+
+ __asm mov y, dx
+ __asm mov w, esi
+
+ index = y / 10;
+ if (index >= w->var_476)
+ return;
+
+ w->var_47A = index;
+ window_invalidate(w);
+}
+
/**
*
* rct2: 0x006B3861
@@ -427,14 +472,21 @@ static void window_ride_list_scrollpaint()
y = 0;
for (i = 0; i < w->var_476; i++) {
format = 1191;
+
+ // Background highlight
if (i == w->var_47A) {
gfx_fill_rect(dpi, 0, y, 800, y + 9, 0x02000031);
format = 1193;
}
- formatSecondary = 0;
-
+
+ // Get ride
ride = &RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[w->var_076[i]];
+
+ // Ride name
gfx_draw_string_left_clipped(dpi, format, &ride->var_04A, 0, 0, y - 1, 159);
+
+ // Ride information
+ formatSecondary = 0;
switch (_window_ride_list_information_type) {
case INFORMATION_TYPE_STATUS:
ride_get_status(i, &formatSecondary, &argument);
@@ -539,8 +591,9 @@ static void window_ride_list_draw_tab_images(rct_drawpixelinfo *dpi, rct_window
*/
static void window_ride_list_refresh_list(rct_window *w)
{
- int i, j, countA, countB;
- rct_ride *ride;
+ int i, j, k, countA, countB;
+ sint16 swapper;
+ rct_ride *ride, *otherRide;
countA = countB = 0;
for (i = 0; i < MAX_RIDES; i++) {
@@ -573,8 +626,111 @@ static void window_ride_list_refresh_list(rct_window *w)
continue;
w->var_076[j] = i;
+ k = j;
switch (w->var_490) {
+ case INFORMATION_TYPE_STATUS:
+ RCT2_GLOBAL(0x013CE952, uint32) = ride->var_04C;
+ RCT2_CALLPROC_X(0x006C2538, ride->var_04A, 0, 0x013CE952, 0, 0, 0x0141ED68, 0);
+ while (--k >= 0) {
+ otherRide = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[w->var_076[k]]);
+ RCT2_GLOBAL(0x013CE952, uint32) = otherRide->var_04C;
+ RCT2_CALLPROC_X(0x006C2538, otherRide->var_04A, 0, 0x013CE952, 0, 0, 0x0141EF68, 0);
+ if (strcmp(0x0141ED68, 0x0141EF68) >= 0)
+ break;
+ swapper = w->var_076[k];
+ w->var_076[k] = w->var_076[k + 1];
+ w->var_076[k + 1] = swapper;
+ }
+ break;
+ case INFORMATION_TYPE_POPULARITY:
+ while (--k >= 0) {
+ otherRide = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[w->var_076[k]]);
+ if ((ride->var_158 * 4) & 0xFF <= (otherRide->var_158 * 4) & 0xFF)
+ break;
+
+ swapper = w->var_076[k];
+ w->var_076[k] = w->var_076[k + 1];
+ w->var_076[k + 1] = swapper;
+ }
+ break;
+ case INFORMATION_TYPE_SATISFACTION:
+ while (--k >= 0) {
+ otherRide = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[w->var_076[k]]);
+ if ((ride->var_14A * 5) & 0xFF <= (otherRide->var_14A * 5) & 0xFF)
+ break;
+
+ swapper = w->var_076[k];
+ w->var_076[k] = w->var_076[k + 1];
+ w->var_076[k + 1] = swapper;
+ }
+ break;
+ case INFORMATION_TYPE_PROFIT:
+ while (--k >= 0) {
+ otherRide = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[w->var_076[k]]);
+ if (ride->profit <= otherRide->profit)
+ break;
+
+ swapper = w->var_076[k];
+ w->var_076[k] = w->var_076[k + 1];
+ w->var_076[k + 1] = swapper;
+ }
+ break;
+ case INFORMATION_TYPE_QUEUE_LENGTH:
+ while (--k >= 0) {
+ otherRide = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[w->var_076[k]]);
+ if (ride_get_total_queue_length(ride) <= ride_get_total_queue_length(otherRide))
+ break;
+
+ swapper = w->var_076[k];
+ w->var_076[k] = w->var_076[k + 1];
+ w->var_076[k + 1] = swapper;
+ }
+ break;
+ case INFORMATION_TYPE_QUEUE_TIME:
+ while (--k >= 0) {
+ otherRide = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[w->var_076[k]]);
+ if (ride_get_max_queue_time(ride) <= ride_get_max_queue_time(otherRide))
+ break;
+
+ swapper = w->var_076[k];
+ w->var_076[k] = w->var_076[k + 1];
+ w->var_076[k + 1] = swapper;
+ }
+ break;
+ case INFORMATION_TYPE_RELIABILITY:
+ while (--k >= 0) {
+ otherRide = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[w->var_076[k]]);
+ if (ride->var_196 >> 8 <= otherRide->var_196 >> 8)
+ break;
+
+ swapper = w->var_076[k];
+ w->var_076[k] = w->var_076[k + 1];
+ w->var_076[k + 1] = swapper;
+ }
+ break;
+ case INFORMATION_TYPE_DOWN_TIME:
+ while (--k >= 0) {
+ otherRide = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[w->var_076[k]]);
+ if (ride->var_199 <= otherRide->var_199)
+ break;
+
+ swapper = w->var_076[k];
+ w->var_076[k] = w->var_076[k + 1];
+ w->var_076[k + 1] = swapper;
+ }
+ break;
+ case INFORMATION_TYPE_GUESTS_FAVOURITE:
+ while (--k >= 0) {
+ otherRide = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[w->var_076[k]]);
+ if (ride->guests_favourite <= otherRide->guests_favourite)
+ break;
+
+ swapper = w->var_076[k];
+ w->var_076[k] = w->var_076[k + 1];
+ w->var_076[k + 1] = swapper;
+ }
+ break;
}
j++;