2016-05-04 19:24:41 +02:00
|
|
|
#pragma region Copyright (c) 2014-2016 OpenRCT2 Developers
|
2014-05-08 22:48:31 +02:00
|
|
|
/*****************************************************************************
|
2016-05-04 19:24:41 +02:00
|
|
|
* OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
|
|
|
|
*
|
|
|
|
* OpenRCT2 is the work of many authors, a full list can be found in contributors.md
|
|
|
|
* For more information, visit https://github.com/OpenRCT2/OpenRCT2
|
|
|
|
*
|
|
|
|
* OpenRCT2 is free software: you can redistribute it and/or modify
|
|
|
|
* it under the terms of the GNU General Public License as published by
|
|
|
|
* the Free Software Foundation, either version 3 of the License, or
|
|
|
|
* (at your option) any later version.
|
|
|
|
*
|
|
|
|
* A full copy of the GNU General Public License can be found in licence.txt
|
|
|
|
*****************************************************************************/
|
|
|
|
#pragma endregion
|
2014-05-08 22:48:31 +02:00
|
|
|
|
2014-10-06 18:36:58 +02:00
|
|
|
#include "../audio/audio.h"
|
2017-02-18 16:45:10 +01:00
|
|
|
#include "../config/Config.h"
|
2014-10-06 18:36:58 +02:00
|
|
|
#include "../game.h"
|
2015-12-24 02:35:14 +01:00
|
|
|
#include "../interface/widget.h"
|
|
|
|
#include "../interface/window.h"
|
|
|
|
#include "../interface/themes.h"
|
|
|
|
#include "../localisation/localisation.h"
|
2014-10-06 18:36:58 +02:00
|
|
|
#include "../management/news_item.h"
|
2015-03-28 13:42:09 +01:00
|
|
|
#include "../management/research.h"
|
2015-12-24 02:35:14 +01:00
|
|
|
#include "../network/network.h"
|
2015-06-24 12:41:19 +02:00
|
|
|
#include "../object.h"
|
|
|
|
#include "../rct1.h"
|
2014-10-06 18:36:58 +02:00
|
|
|
#include "../ride/ride.h"
|
2016-10-22 18:06:27 +02:00
|
|
|
#include "../ride/ride_data.h"
|
2014-10-06 18:36:58 +02:00
|
|
|
#include "../ride/track.h"
|
2016-10-22 18:06:27 +02:00
|
|
|
#include "../ride/track_data.h"
|
2016-04-28 22:46:39 +02:00
|
|
|
#include "../ride/track_design.h"
|
2016-10-22 18:06:27 +02:00
|
|
|
#include "../ride/TrackDesignRepository.h"
|
2016-07-14 14:07:49 +02:00
|
|
|
#include "../sprites.h"
|
2016-09-26 04:24:29 +02:00
|
|
|
#include "../util/util.h"
|
2016-10-22 18:06:27 +02:00
|
|
|
#include "../world/scenery.h"
|
2014-05-08 22:48:31 +02:00
|
|
|
|
2016-09-06 00:20:08 +02:00
|
|
|
static uint8 _windowNewRideCurrentTab;
|
|
|
|
static ride_list_item _windowNewRideHighlightedItem[6];
|
|
|
|
static ride_list_item _windowNewRideListItems[384];
|
2014-08-19 22:33:05 +02:00
|
|
|
|
2014-08-20 08:50:01 +02:00
|
|
|
#pragma region Ride type view order
|
2014-08-20 01:05:40 +02:00
|
|
|
|
2014-08-20 08:50:01 +02:00
|
|
|
/**
|
|
|
|
* The order of ride types shown in the new ride window so that the order stays consistent across games and rides of the same
|
|
|
|
* type are kept together.
|
|
|
|
*/
|
|
|
|
const char RideTypeViewOrder[] = {
|
2014-08-20 01:05:40 +02:00
|
|
|
// Transport rides
|
|
|
|
RIDE_TYPE_MINIATURE_RAILWAY,
|
|
|
|
RIDE_TYPE_MONORAIL,
|
|
|
|
RIDE_TYPE_SUSPENDED_MONORAIL,
|
|
|
|
RIDE_TYPE_CHAIRLIFT,
|
2015-06-03 20:14:45 +02:00
|
|
|
RIDE_TYPE_LIFT,
|
2014-08-20 01:05:40 +02:00
|
|
|
|
|
|
|
// Roller Coasters
|
|
|
|
RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER,
|
|
|
|
RIDE_TYPE_VIRGINIA_REEL,
|
|
|
|
RIDE_TYPE_REVERSER_ROLLER_COASTER,
|
|
|
|
RIDE_TYPE_WOODEN_ROLLER_COASTER,
|
|
|
|
RIDE_TYPE_WOODEN_WILD_MOUSE,
|
|
|
|
RIDE_TYPE_WILD_MOUSE,
|
|
|
|
RIDE_TYPE_INVERTED_HAIRPIN_COASTER,
|
|
|
|
RIDE_TYPE_JUNIOR_ROLLER_COASTER,
|
|
|
|
RIDE_TYPE_MINI_ROLLER_COASTER,
|
|
|
|
RIDE_TYPE_SPIRAL_ROLLER_COASTER,
|
|
|
|
RIDE_TYPE_MINE_TRAIN_COASTER,
|
|
|
|
RIDE_TYPE_LOOPING_ROLLER_COASTER,
|
|
|
|
RIDE_TYPE_STAND_UP_ROLLER_COASTER,
|
|
|
|
RIDE_TYPE_CORKSCREW_ROLLER_COASTER,
|
2015-06-03 20:14:45 +02:00
|
|
|
RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER,
|
2014-08-20 01:05:40 +02:00
|
|
|
RIDE_TYPE_TWISTER_ROLLER_COASTER,
|
|
|
|
RIDE_TYPE_GIGA_COASTER,
|
|
|
|
RIDE_TYPE_SUSPENDED_SWINGING_COASTER,
|
|
|
|
RIDE_TYPE_COMPACT_INVERTED_COASTER,
|
|
|
|
RIDE_TYPE_INVERTED_ROLLER_COASTER,
|
|
|
|
RIDE_TYPE_INVERTED_IMPULSE_COASTER,
|
|
|
|
RIDE_TYPE_MINI_SUSPENDED_COASTER,
|
|
|
|
RIDE_TYPE_STEEPLECHASE,
|
|
|
|
RIDE_TYPE_BOBSLEIGH_COASTER,
|
|
|
|
RIDE_TYPE_MINE_RIDE,
|
|
|
|
RIDE_TYPE_HEARTLINE_TWISTER_COASTER,
|
|
|
|
RIDE_TYPE_LAY_DOWN_ROLLER_COASTER,
|
|
|
|
RIDE_TYPE_FLYING_ROLLER_COASTER,
|
|
|
|
RIDE_TYPE_MULTI_DIMENSION_ROLLER_COASTER,
|
|
|
|
RIDE_TYPE_REVERSE_FREEFALL_COASTER,
|
|
|
|
RIDE_TYPE_VERTICAL_DROP_ROLLER_COASTER,
|
|
|
|
RIDE_TYPE_AIR_POWERED_VERTICAL_COASTER,
|
|
|
|
|
|
|
|
// Gentle rides
|
|
|
|
RIDE_TYPE_MONORAIL_CYCLES,
|
|
|
|
RIDE_TYPE_CROOKED_HOUSE,
|
|
|
|
RIDE_TYPE_HAUNTED_HOUSE,
|
|
|
|
RIDE_TYPE_FERRIS_WHEEL,
|
|
|
|
RIDE_TYPE_MAZE,
|
|
|
|
RIDE_TYPE_MERRY_GO_ROUND,
|
|
|
|
RIDE_TYPE_MINI_GOLF,
|
|
|
|
RIDE_TYPE_OBSERVATION_TOWER,
|
|
|
|
RIDE_TYPE_CAR_RIDE,
|
|
|
|
RIDE_TYPE_MINI_HELICOPTERS,
|
|
|
|
RIDE_TYPE_SPIRAL_SLIDE,
|
2015-06-03 20:14:45 +02:00
|
|
|
RIDE_TYPE_DODGEMS,
|
2014-08-20 01:05:40 +02:00
|
|
|
RIDE_TYPE_SPACE_RINGS,
|
|
|
|
RIDE_TYPE_CIRCUS_SHOW,
|
|
|
|
RIDE_TYPE_GHOST_TRAIN,
|
|
|
|
RIDE_TYPE_FLYING_SAUCERS,
|
|
|
|
|
|
|
|
// Thrill rides
|
|
|
|
RIDE_TYPE_TWIST,
|
|
|
|
RIDE_TYPE_MAGIC_CARPET,
|
|
|
|
RIDE_TYPE_LAUNCHED_FREEFALL,
|
|
|
|
RIDE_TYPE_PIRATE_SHIP,
|
|
|
|
RIDE_TYPE_GO_KARTS,
|
|
|
|
RIDE_TYPE_SWINGING_INVERTER_SHIP,
|
|
|
|
RIDE_TYPE_MOTION_SIMULATOR,
|
|
|
|
RIDE_TYPE_3D_CINEMA,
|
|
|
|
RIDE_TYPE_TOP_SPIN,
|
|
|
|
RIDE_TYPE_ROTO_DROP,
|
|
|
|
RIDE_TYPE_ENTERPRISE,
|
|
|
|
|
|
|
|
// Water rides
|
|
|
|
RIDE_TYPE_DINGHY_SLIDE,
|
|
|
|
RIDE_TYPE_LOG_FLUME,
|
|
|
|
RIDE_TYPE_RIVER_RAPIDS,
|
|
|
|
RIDE_TYPE_SPLASH_BOATS,
|
|
|
|
RIDE_TYPE_SUBMARINE_RIDE,
|
2015-06-03 20:14:45 +02:00
|
|
|
RIDE_TYPE_BOAT_RIDE,
|
2014-08-20 01:05:40 +02:00
|
|
|
RIDE_TYPE_RIVER_RAFTS,
|
|
|
|
RIDE_TYPE_WATER_COASTER,
|
|
|
|
|
|
|
|
// Shops / stalls
|
|
|
|
RIDE_TYPE_FOOD_STALL,
|
|
|
|
RIDE_TYPE_1D,
|
|
|
|
RIDE_TYPE_DRINK_STALL,
|
|
|
|
RIDE_TYPE_1F,
|
|
|
|
RIDE_TYPE_SHOP,
|
|
|
|
RIDE_TYPE_22,
|
|
|
|
RIDE_TYPE_INFORMATION_KIOSK,
|
|
|
|
RIDE_TYPE_FIRST_AID,
|
2015-06-03 20:14:45 +02:00
|
|
|
RIDE_TYPE_CASH_MACHINE,
|
|
|
|
RIDE_TYPE_TOILETS
|
2014-08-20 01:05:40 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
#pragma endregion
|
|
|
|
|
2014-05-08 22:48:31 +02:00
|
|
|
enum {
|
2014-08-19 22:33:05 +02:00
|
|
|
WINDOW_NEW_RIDE_PAGE_TRANSPORT,
|
|
|
|
WINDOW_NEW_RIDE_PAGE_GENTLE,
|
|
|
|
WINDOW_NEW_RIDE_PAGE_ROLLER_COASTER,
|
|
|
|
WINDOW_NEW_RIDE_PAGE_THRILL,
|
|
|
|
WINDOW_NEW_RIDE_PAGE_WATER,
|
|
|
|
WINDOW_NEW_RIDE_PAGE_SHOP,
|
|
|
|
WINDOW_NEW_RIDE_PAGE_RESEARCH,
|
|
|
|
WINDOW_NEW_RIDE_PAGE_COUNT
|
|
|
|
};
|
|
|
|
|
|
|
|
#pragma region Widgets
|
2014-05-08 22:48:31 +02:00
|
|
|
|
2014-08-18 00:57:41 +02:00
|
|
|
enum {
|
|
|
|
WIDX_BACKGROUND,
|
|
|
|
WIDX_TITLE,
|
|
|
|
WIDX_CLOSE,
|
|
|
|
WIDX_PAGE_BACKGROUND,
|
|
|
|
WIDX_TAB_1,
|
|
|
|
WIDX_TAB_2,
|
|
|
|
WIDX_TAB_3,
|
|
|
|
WIDX_TAB_4,
|
|
|
|
WIDX_TAB_5,
|
|
|
|
WIDX_TAB_6,
|
|
|
|
WIDX_TAB_7,
|
2014-08-19 22:33:05 +02:00
|
|
|
WIDX_RIDE_LIST,
|
2015-06-18 23:20:49 +02:00
|
|
|
|
2014-08-18 00:57:41 +02:00
|
|
|
WIDX_CURRENTLY_IN_DEVELOPMENT_GROUP,
|
|
|
|
WIDX_LAST_DEVELOPMENT_GROUP,
|
2014-08-19 22:33:05 +02:00
|
|
|
WIDX_LAST_DEVELOPMENT_BUTTON,
|
|
|
|
WIDX_RESEARCH_FUNDING_BUTTON
|
|
|
|
};
|
|
|
|
|
|
|
|
static rct_widget window_new_ride_widgets[] = {
|
|
|
|
{ WWT_FRAME, 0, 0, 600, 0, 369, 0xFFFFFFFF, STR_NONE },
|
|
|
|
{ WWT_CAPTION, 0, 1, 599, 1, 14, 0xFFFFFFFF, STR_WINDOW_TITLE_TIP },
|
|
|
|
{ WWT_CLOSEBOX, 0, 588, 598, 2, 13, STR_CLOSE_X, STR_CLOSE_WINDOW_TIP },
|
|
|
|
{ WWT_RESIZE, 1, 0, 600, 43, 369, 0xFFFFFFFF, STR_NONE },
|
2016-07-14 14:07:49 +02:00
|
|
|
{ WWT_TAB, 1, 3, 33, 17, 43, 0x20000000 | SPR_TAB, STR_TRANSPORT_RIDES_TIP },
|
|
|
|
{ WWT_TAB, 1, 34, 64, 17, 43, 0x20000000 | SPR_TAB, STR_GENTLE_RIDES_TIP },
|
|
|
|
{ WWT_TAB, 1, 65, 95, 17, 43, 0x20000000 | SPR_TAB, STR_ROLLER_COASTERS_TIP },
|
|
|
|
{ WWT_TAB, 1, 96, 126, 17, 43, 0x20000000 | SPR_TAB, STR_THRILL_RIDES_TIP },
|
|
|
|
{ WWT_TAB, 1, 127, 157, 17, 43, 0x20000000 | SPR_TAB, STR_WATER_RIDES_TIP },
|
|
|
|
{ WWT_TAB, 1, 158, 188, 17, 43, 0x20000000 | SPR_TAB, STR_SHOPS_STALLS_TIP },
|
|
|
|
{ WWT_TAB, 1, 189, 219, 17, 43, 0x20000000 | SPR_TAB, STR_RESEARCH_AND_DEVELOPMENT_TIP },
|
|
|
|
{ WWT_SCROLL, 1, 3, 597, 46, 317, SCROLL_VERTICAL, STR_NONE },
|
2014-08-19 22:33:05 +02:00
|
|
|
{ WWT_GROUPBOX, 2, 3, 292, 47, 116, STR_CURRENTLY_IN_DEVELOPMENT, STR_NONE },
|
|
|
|
{ WWT_GROUPBOX, 2, 3, 292, 124, 188, STR_LAST_DEVELOPMENT, STR_NONE },
|
|
|
|
{ WWT_FLATBTN, 2, 265, 288, 161, 184, 0xFFFFFFFF, STR_RESEARCH_SHOW_DETAILS_TIP },
|
2016-07-14 14:07:49 +02:00
|
|
|
{ WWT_FLATBTN, 2, 265, 288, 68, 91, SPR_FINANCE, STR_FINANCES_RESEARCH_TIP },
|
2014-08-19 22:33:05 +02:00
|
|
|
{ WIDGETS_END },
|
2014-08-18 00:57:41 +02:00
|
|
|
};
|
|
|
|
|
2014-08-19 22:33:05 +02:00
|
|
|
#pragma endregion
|
|
|
|
|
|
|
|
#pragma region Events
|
|
|
|
|
2017-01-04 22:17:08 +01:00
|
|
|
static void window_new_ride_mouseup(rct_window *w, sint32 widgetIndex);
|
|
|
|
static void window_new_ride_mousedown(sint32 widgetIndex, rct_window *w, rct_widget *widget);
|
2014-08-19 22:33:05 +02:00
|
|
|
static void window_new_ride_update(rct_window *w);
|
2017-01-04 22:17:08 +01:00
|
|
|
static void window_new_ride_scrollgetsize(rct_window *w, sint32 scrollIndex, sint32 *width, sint32 *height);
|
|
|
|
static void window_new_ride_scrollmousedown(rct_window *w, sint32 scrollIndex, sint32 x, sint32 y);
|
|
|
|
static void window_new_ride_scrollmouseover(rct_window *w, sint32 scrollIndex, sint32 x, sint32 y);
|
|
|
|
static void window_new_ride_tooltip(rct_window* w, sint32 widgetIndex, rct_string_id *stringId);
|
2015-07-10 02:39:16 +02:00
|
|
|
static void window_new_ride_invalidate(rct_window *w);
|
|
|
|
static void window_new_ride_paint(rct_window *w, rct_drawpixelinfo *dpi);
|
2017-01-04 22:17:08 +01:00
|
|
|
static void window_new_ride_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, sint32 scrollIndex);
|
2014-08-19 22:33:05 +02:00
|
|
|
|
|
|
|
// 0x0098E354
|
2015-07-10 02:39:16 +02:00
|
|
|
static rct_window_event_list window_new_ride_events = {
|
|
|
|
NULL,
|
2014-08-19 22:33:05 +02:00
|
|
|
window_new_ride_mouseup,
|
2015-07-10 02:39:16 +02:00
|
|
|
NULL,
|
2014-08-19 22:33:05 +02:00
|
|
|
window_new_ride_mousedown,
|
2015-07-10 02:39:16 +02:00
|
|
|
NULL,
|
|
|
|
NULL,
|
2014-08-19 22:33:05 +02:00
|
|
|
window_new_ride_update,
|
2015-07-10 02:39:16 +02:00
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
2014-08-19 22:33:05 +02:00
|
|
|
window_new_ride_scrollgetsize,
|
|
|
|
window_new_ride_scrollmousedown,
|
2015-07-10 02:39:16 +02:00
|
|
|
NULL,
|
2014-08-19 22:33:05 +02:00
|
|
|
window_new_ride_scrollmouseover,
|
2015-07-10 02:39:16 +02:00
|
|
|
NULL,
|
|
|
|
NULL,
|
|
|
|
NULL,
|
2014-08-19 22:33:05 +02:00
|
|
|
window_new_ride_tooltip,
|
2015-07-10 02:39:16 +02:00
|
|
|
NULL,
|
|
|
|
NULL,
|
2014-08-19 22:33:05 +02:00
|
|
|
window_new_ride_invalidate,
|
|
|
|
window_new_ride_paint,
|
|
|
|
window_new_ride_scrollpaint
|
|
|
|
};
|
|
|
|
|
|
|
|
#pragma endregion
|
|
|
|
|
2016-07-14 14:07:49 +02:00
|
|
|
static const rct_string_id window_new_ride_titles[WINDOW_NEW_RIDE_PAGE_COUNT] = {
|
|
|
|
STR_NEW_TRANSPORT_RIDES,
|
|
|
|
STR_NEW_GENTLE_RIDES,
|
|
|
|
STR_NEW_ROLLER_COASTERS,
|
|
|
|
STR_NEW_THRILL_RIDES,
|
|
|
|
STR_NEW_WATER_RIDES,
|
|
|
|
STR_NEW_SHOPS_STALLS,
|
|
|
|
STR_RESEARCH_AND_DEVELOPMENT,
|
|
|
|
};
|
|
|
|
|
2017-01-04 22:17:08 +01:00
|
|
|
const sint32 window_new_ride_tab_animation_loops[] = { 20, 32, 10, 72, 24, 28, 16 };
|
|
|
|
const sint32 window_new_ride_tab_animation_divisor[] = { 4, 8, 2, 4, 4, 4, 2 };
|
2014-08-19 22:33:05 +02:00
|
|
|
|
2017-01-04 22:17:08 +01:00
|
|
|
static void window_new_ride_set_page(rct_window *w, sint32 page);
|
2014-08-19 22:33:05 +02:00
|
|
|
static void window_new_ride_refresh_widget_sizing(rct_window *w);
|
2017-01-04 22:17:08 +01:00
|
|
|
static ride_list_item window_new_ride_scroll_get_ride_list_item_at(rct_window *w, sint32 x, sint32 y);
|
|
|
|
static void window_new_ride_paint_ride_information(rct_window *w, rct_drawpixelinfo *dpi, ride_list_item item, sint32 x, sint32 y, sint32 width);
|
2014-08-20 23:06:47 +02:00
|
|
|
static void window_new_ride_select(rct_window *w);
|
2014-08-19 22:33:05 +02:00
|
|
|
|
2014-08-21 22:48:23 +02:00
|
|
|
static ride_list_item _lastTrackDesignCountRideType;
|
2017-01-04 22:17:08 +01:00
|
|
|
static sint32 _lastTrackDesignCount;
|
2016-01-23 15:01:17 +01:00
|
|
|
static bool _trackSelectionByType;
|
2014-08-21 22:48:23 +02:00
|
|
|
|
2014-05-08 22:48:31 +02:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x006ACA58
|
|
|
|
*/
|
2016-09-06 00:20:08 +02:00
|
|
|
void window_new_ride_init_vars()
|
|
|
|
{
|
2014-05-08 22:48:31 +02:00
|
|
|
// If we are in the track designer, default to the Roller Coaster tab
|
2016-04-23 12:16:46 +02:00
|
|
|
if (gScreenFlags & SCREEN_FLAGS_TRACK_DESIGNER) {
|
2016-09-06 00:20:08 +02:00
|
|
|
_windowNewRideCurrentTab = WINDOW_NEW_RIDE_PAGE_ROLLER_COASTER;
|
|
|
|
} else {
|
|
|
|
_windowNewRideCurrentTab = WINDOW_NEW_RIDE_PAGE_TRANSPORT;
|
2014-05-08 22:48:31 +02:00
|
|
|
}
|
|
|
|
|
2017-01-04 22:17:08 +01:00
|
|
|
for (sint16 i = 0; i < 6; i++) {
|
2014-05-08 22:48:31 +02:00
|
|
|
/*
|
|
|
|
Reset what is highlighted in each tab.
|
|
|
|
Each 16bit number represents the item in its respective tab.
|
|
|
|
*/
|
2016-09-06 00:20:08 +02:00
|
|
|
_windowNewRideHighlightedItem[i] = (ride_list_item){ 255, 255 };
|
2014-05-08 22:48:31 +02:00
|
|
|
}
|
2014-08-18 00:57:41 +02:00
|
|
|
}
|
|
|
|
|
2014-08-20 01:05:40 +02:00
|
|
|
/**
|
2015-06-24 12:41:19 +02:00
|
|
|
* rct2: 0x006B6F3E
|
2014-08-20 01:05:40 +02:00
|
|
|
*
|
2016-02-25 13:33:19 +01:00
|
|
|
* Note: When the user has selection by track type enabled, the categories are determined by the track type, not those in the rct_ride_entry.
|
2014-08-20 01:05:40 +02:00
|
|
|
*/
|
|
|
|
static void window_new_ride_populate_list()
|
|
|
|
{
|
2016-09-06 00:20:08 +02:00
|
|
|
uint8 currentCategory = _windowNewRideCurrentTab;
|
|
|
|
ride_list_item *nextListItem = _windowNewRideListItems;
|
2014-08-20 01:05:40 +02:00
|
|
|
|
2014-08-20 08:50:01 +02:00
|
|
|
// For each ride type in the view order list
|
2017-01-04 22:17:08 +01:00
|
|
|
for (sint32 i = 0; i < countof(RideTypeViewOrder); i++) {
|
2014-08-20 08:50:01 +02:00
|
|
|
uint8 rideType = RideTypeViewOrder[i];
|
2014-08-20 01:05:40 +02:00
|
|
|
if (rideType == RIDE_TYPE_NULL)
|
|
|
|
continue;
|
|
|
|
|
2015-06-24 12:41:19 +02:00
|
|
|
if(gConfigInterface.select_by_track_type) {
|
|
|
|
if(gRideCategories[rideType]!=currentCategory)
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
char preferredVehicleName[9];
|
2016-09-26 04:24:29 +02:00
|
|
|
safe_strcpy(preferredVehicleName, " ", sizeof(preferredVehicleName));
|
2015-06-24 12:41:19 +02:00
|
|
|
|
2016-05-10 01:00:59 +02:00
|
|
|
if (ride_type_is_invented(rideType)) {
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 dh = 0;
|
2014-08-20 01:05:40 +02:00
|
|
|
uint8 *rideEntryIndexPtr = get_ride_entry_indices_for_ride_type(rideType);
|
|
|
|
|
|
|
|
// For each ride entry for this ride type
|
|
|
|
while (*rideEntryIndexPtr != 255) {
|
|
|
|
uint8 rideEntryIndex = *rideEntryIndexPtr++;
|
2015-06-24 12:41:19 +02:00
|
|
|
char rideEntryName[9];
|
|
|
|
memcpy(rideEntryName,object_entry_groups[OBJECT_TYPE_RIDE].entries[rideEntryIndex].name,8);
|
|
|
|
rideEntryName[8]=0;
|
2014-08-20 01:05:40 +02:00
|
|
|
|
2015-08-07 22:34:15 +02:00
|
|
|
// Skip if vehicle type is not invented yet
|
2016-05-10 01:00:59 +02:00
|
|
|
if (!ride_entry_is_invented(rideEntryIndex))
|
2014-08-20 01:05:40 +02:00
|
|
|
continue;
|
|
|
|
|
|
|
|
// Ride entries
|
2016-02-25 13:33:19 +01:00
|
|
|
rct_ride_entry *rideEntry = get_ride_entry(rideEntryIndex);
|
2014-08-20 01:05:40 +02:00
|
|
|
|
|
|
|
// Check if ride is in this category
|
2015-06-24 12:41:19 +02:00
|
|
|
if (!gConfigInterface.select_by_track_type && (currentCategory != rideEntry->category[0] && currentCategory != rideEntry->category[1]))
|
2014-08-20 01:05:40 +02:00
|
|
|
continue;
|
|
|
|
|
2015-06-24 12:41:19 +02:00
|
|
|
// Skip if the vehicle isn't the preferred vehicle for this generic track type
|
2016-04-22 20:26:15 +02:00
|
|
|
if (gConfigInterface.select_by_track_type && (!(rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE) || rideTypeShouldLoseSeparateFlag(rideEntry))) {
|
|
|
|
if (strcmp(preferredVehicleName, " \0") == 0) {
|
2016-09-26 04:24:29 +02:00
|
|
|
safe_strcpy(preferredVehicleName, rideEntryName, sizeof(preferredVehicleName));
|
2016-04-22 20:26:15 +02:00
|
|
|
preferredVehicleName[8] = 0;
|
|
|
|
} else {
|
|
|
|
if (vehicle_preference_compare(rideType, preferredVehicleName, rideEntryName) == 1) {
|
2016-09-26 04:24:29 +02:00
|
|
|
safe_strcpy(preferredVehicleName, rideEntryName, sizeof(preferredVehicleName));
|
2016-04-22 20:26:15 +02:00
|
|
|
preferredVehicleName[8] = 0;
|
|
|
|
} else {
|
2015-06-24 12:41:19 +02:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-06-25 11:46:17 +02:00
|
|
|
if ((rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE) && !rideTypeShouldLoseSeparateFlag(rideEntry)) {
|
2014-08-20 01:05:40 +02:00
|
|
|
dh &= ~4;
|
|
|
|
nextListItem->type = rideType;
|
|
|
|
nextListItem->entry_index = rideEntryIndex;
|
|
|
|
nextListItem++;
|
|
|
|
} else if (!(dh & 1)) {
|
|
|
|
dh |= 5;
|
|
|
|
nextListItem->type = rideType;
|
|
|
|
nextListItem->entry_index = rideEntryIndex;
|
|
|
|
nextListItem++;
|
|
|
|
} else if (dh & 4) {
|
2015-03-31 18:09:16 +02:00
|
|
|
if (rideType == rideEntry->ride_type[0]) {
|
2014-08-20 01:05:40 +02:00
|
|
|
nextListItem--;
|
|
|
|
nextListItem->type = rideType;
|
|
|
|
nextListItem->entry_index = rideEntryIndex;
|
|
|
|
nextListItem++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
nextListItem->type = 255;
|
|
|
|
nextListItem->entry_index = 255;
|
2016-01-23 15:01:17 +01:00
|
|
|
_trackSelectionByType = gConfigInterface.select_by_track_type;
|
2014-08-20 01:05:40 +02:00
|
|
|
}
|
|
|
|
|
2014-08-20 21:18:17 +02:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x006B7220
|
|
|
|
*/
|
|
|
|
static void window_new_ride_scroll_to_focused_ride(rct_window *w)
|
|
|
|
{
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 scrollWidth = 0;
|
|
|
|
sint32 scrollHeight = 0;
|
2015-06-09 19:29:02 +02:00
|
|
|
window_get_scroll_size(w, 0, &scrollWidth, &scrollHeight);
|
2015-10-20 20:16:30 +02:00
|
|
|
|
2014-08-20 21:18:17 +02:00
|
|
|
// Find row index of the focused ride type
|
|
|
|
rct_widget *listWidget = &window_new_ride_widgets[WIDX_RIDE_LIST];
|
2016-12-28 19:50:55 +01:00
|
|
|
assert(_windowNewRideCurrentTab < countof(_windowNewRideHighlightedItem));
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 focusRideType = _windowNewRideHighlightedItem[_windowNewRideCurrentTab].ride_type_and_entry;
|
|
|
|
sint32 count = 0, row = 0;
|
2016-09-06 00:20:08 +02:00
|
|
|
ride_list_item *listItem = _windowNewRideListItems;
|
2014-08-20 21:18:17 +02:00
|
|
|
while (listItem->type != 255 || listItem->entry_index != 255) {
|
|
|
|
if (listItem->type == focusRideType) {
|
|
|
|
row = count / 5;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
|
|
|
count++;
|
|
|
|
listItem++;
|
|
|
|
};
|
|
|
|
|
|
|
|
// Update the Y scroll position
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 listWidgetHeight = listWidget->bottom - listWidget->top - 1;
|
2014-08-20 21:18:17 +02:00
|
|
|
scrollHeight = max(0, scrollHeight - listWidgetHeight);
|
|
|
|
w->scrolls[0].v_top = min(row * 116, scrollHeight);
|
|
|
|
widget_scroll_update_thumbs(w, WIDX_RIDE_LIST);
|
|
|
|
}
|
|
|
|
|
2014-08-18 00:57:41 +02:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x006B3CFF
|
|
|
|
*/
|
2015-03-31 03:21:30 +02:00
|
|
|
rct_window *window_new_ride_open()
|
2014-08-18 00:57:41 +02:00
|
|
|
{
|
|
|
|
rct_window *w;
|
|
|
|
|
2014-10-16 03:02:43 +02:00
|
|
|
w = window_bring_to_front_by_class(WC_CONSTRUCT_RIDE);
|
2014-08-18 00:57:41 +02:00
|
|
|
if (w != NULL)
|
2015-03-31 03:21:30 +02:00
|
|
|
return w;
|
2014-08-18 00:57:41 +02:00
|
|
|
|
|
|
|
// Not sure what these windows are
|
2014-10-16 03:02:43 +02:00
|
|
|
window_close_by_class(WC_TRACK_DESIGN_LIST);
|
|
|
|
window_close_by_class(WC_TRACK_DESIGN_PLACE);
|
2014-08-18 00:57:41 +02:00
|
|
|
|
2015-07-10 02:39:16 +02:00
|
|
|
w = window_create_auto_pos(601, 370, &window_new_ride_events, WC_CONSTRUCT_RIDE, WF_10);
|
2014-08-19 22:33:05 +02:00
|
|
|
w->widgets = window_new_ride_widgets;
|
2014-08-18 00:57:41 +02:00
|
|
|
w->enabled_widgets =
|
|
|
|
(1 << WIDX_CLOSE) |
|
|
|
|
(1 << WIDX_TAB_1) |
|
|
|
|
(1 << WIDX_TAB_2) |
|
|
|
|
(1 << WIDX_TAB_3) |
|
|
|
|
(1 << WIDX_TAB_4) |
|
|
|
|
(1 << WIDX_TAB_5) |
|
|
|
|
(1 << WIDX_TAB_6) |
|
|
|
|
(1 << WIDX_TAB_7) |
|
|
|
|
(1 << 14) |
|
|
|
|
(1 << 15);
|
2016-11-30 23:32:47 +01:00
|
|
|
window_new_ride_populate_list();
|
2016-12-28 23:44:25 +01:00
|
|
|
window_init_scroll_widgets(w);
|
2014-08-18 00:57:41 +02:00
|
|
|
|
|
|
|
w->frame_no = 0;
|
2014-08-24 08:34:18 +02:00
|
|
|
w->new_ride.selected_ride_id = -1;
|
2014-08-21 22:48:23 +02:00
|
|
|
_lastTrackDesignCountRideType.type = 255;
|
|
|
|
_lastTrackDesignCountRideType.entry_index = 255;
|
2016-09-06 00:20:08 +02:00
|
|
|
w->new_ride.highlighted_ride_id = _windowNewRideHighlightedItem[_windowNewRideCurrentTab].ride_type_and_entry;
|
2014-08-22 21:17:48 +02:00
|
|
|
if (w->new_ride.highlighted_ride_id == -1)
|
2016-09-06 00:20:08 +02:00
|
|
|
w->new_ride.highlighted_ride_id = _windowNewRideListItems[0].ride_type_and_entry;
|
2015-10-20 20:16:30 +02:00
|
|
|
|
2014-08-18 00:57:41 +02:00
|
|
|
w->width = 1;
|
2014-08-19 22:33:05 +02:00
|
|
|
window_new_ride_refresh_widget_sizing(w);
|
2017-01-01 21:07:28 +01:00
|
|
|
|
|
|
|
if (_windowNewRideCurrentTab != WINDOW_NEW_RIDE_PAGE_RESEARCH) {
|
|
|
|
window_new_ride_scroll_to_focused_ride(w);
|
|
|
|
}
|
2015-03-31 03:21:30 +02:00
|
|
|
|
|
|
|
return w;
|
|
|
|
}
|
|
|
|
|
|
|
|
rct_window *window_new_ride_open_research()
|
|
|
|
{
|
|
|
|
rct_window *w;
|
2015-10-20 20:16:30 +02:00
|
|
|
|
2015-03-31 03:21:30 +02:00
|
|
|
w = window_new_ride_open();
|
|
|
|
window_new_ride_set_page(w, WINDOW_NEW_RIDE_PAGE_RESEARCH);
|
|
|
|
return w;
|
2014-08-19 22:33:05 +02:00
|
|
|
}
|
|
|
|
|
2014-10-08 23:11:50 +02:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x006B3EBA
|
|
|
|
*/
|
|
|
|
void window_new_ride_focus(ride_list_item rideItem)
|
|
|
|
{
|
|
|
|
rct_window *w;
|
2016-02-25 13:33:19 +01:00
|
|
|
rct_ride_entry *rideType;
|
2014-10-08 23:11:50 +02:00
|
|
|
|
2014-10-16 03:02:43 +02:00
|
|
|
w = window_find_by_class(WC_CONSTRUCT_RIDE);
|
2014-10-08 23:11:50 +02:00
|
|
|
if (w == NULL)
|
|
|
|
return;
|
|
|
|
|
2016-01-22 15:38:52 +01:00
|
|
|
rideType = get_ride_entry(rideItem.entry_index);
|
2015-07-03 12:57:25 +02:00
|
|
|
|
|
|
|
if(!gConfigInterface.select_by_track_type)
|
|
|
|
window_new_ride_set_page(w, rideType->category[0]);
|
|
|
|
else
|
|
|
|
window_new_ride_set_page(w, gRideCategories[rideType->ride_type[0]]);
|
2014-10-08 23:11:50 +02:00
|
|
|
|
2016-09-06 00:20:08 +02:00
|
|
|
ride_list_item *listItem = _windowNewRideListItems;
|
2014-10-08 23:11:50 +02:00
|
|
|
while (listItem->type != RIDE_TYPE_NULL) {
|
2015-03-25 19:20:18 +01:00
|
|
|
if (listItem->type == rideItem.type && listItem->entry_index == rideItem.entry_index) {
|
2016-09-06 00:20:08 +02:00
|
|
|
_windowNewRideHighlightedItem[0] = rideItem;
|
|
|
|
w->new_ride.highlighted_ride_id = rideItem.ride_type_and_entry;
|
2014-10-08 23:11:50 +02:00
|
|
|
window_new_ride_scroll_to_focused_ride(w);
|
|
|
|
}
|
|
|
|
listItem++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-01-04 22:17:08 +01:00
|
|
|
static void window_new_ride_set_page(rct_window *w, sint32 page)
|
2014-10-08 23:11:50 +02:00
|
|
|
{
|
2016-09-06 00:20:08 +02:00
|
|
|
_windowNewRideCurrentTab = page;
|
2014-10-08 23:11:50 +02:00
|
|
|
w->frame_no = 0;
|
|
|
|
w->new_ride.highlighted_ride_id = -1;
|
|
|
|
w->new_ride.selected_ride_countdown = -1;
|
|
|
|
window_new_ride_populate_list();
|
|
|
|
if (page < WINDOW_NEW_RIDE_PAGE_RESEARCH) {
|
2016-09-06 00:20:08 +02:00
|
|
|
w->new_ride.highlighted_ride_id = _windowNewRideHighlightedItem[page].ride_type_and_entry;
|
2014-10-08 23:11:50 +02:00
|
|
|
if (w->new_ride.highlighted_ride_id == -1)
|
2016-09-06 00:20:08 +02:00
|
|
|
w->new_ride.highlighted_ride_id = _windowNewRideListItems[0].ride_type_and_entry;
|
2014-10-08 23:11:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
window_new_ride_refresh_widget_sizing(w);
|
|
|
|
window_invalidate(w);
|
2016-12-28 19:50:55 +01:00
|
|
|
|
|
|
|
if (page < WINDOW_NEW_RIDE_PAGE_RESEARCH) {
|
|
|
|
window_new_ride_scroll_to_focused_ride(w);
|
|
|
|
}
|
2014-10-08 23:11:50 +02:00
|
|
|
}
|
|
|
|
|
2014-08-19 22:33:05 +02:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x006B3DF1
|
|
|
|
*/
|
|
|
|
static void window_new_ride_refresh_widget_sizing(rct_window *w)
|
|
|
|
{
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 width, height;
|
2014-08-19 22:33:05 +02:00
|
|
|
|
|
|
|
// Show or hide unrelated widgets
|
2016-09-06 00:20:08 +02:00
|
|
|
if (_windowNewRideCurrentTab != WINDOW_NEW_RIDE_PAGE_RESEARCH) {
|
2014-08-19 22:33:05 +02:00
|
|
|
window_new_ride_widgets[WIDX_RIDE_LIST].type = WWT_SCROLL;
|
|
|
|
window_new_ride_widgets[WIDX_CURRENTLY_IN_DEVELOPMENT_GROUP].type = WWT_EMPTY;
|
|
|
|
window_new_ride_widgets[WIDX_LAST_DEVELOPMENT_GROUP].type = WWT_EMPTY;
|
|
|
|
window_new_ride_widgets[WIDX_LAST_DEVELOPMENT_BUTTON].type = WWT_EMPTY;
|
|
|
|
window_new_ride_widgets[WIDX_RESEARCH_FUNDING_BUTTON].type = WWT_EMPTY;
|
|
|
|
|
|
|
|
width = 601;
|
|
|
|
height = 370;
|
|
|
|
} else {
|
|
|
|
window_new_ride_widgets[WIDX_RIDE_LIST].type = WWT_EMPTY;
|
|
|
|
window_new_ride_widgets[WIDX_CURRENTLY_IN_DEVELOPMENT_GROUP].type = WWT_GROUPBOX;
|
|
|
|
window_new_ride_widgets[WIDX_LAST_DEVELOPMENT_GROUP].type = WWT_GROUPBOX;
|
|
|
|
window_new_ride_widgets[WIDX_LAST_DEVELOPMENT_BUTTON].type = WWT_FLATBTN;
|
2016-04-23 01:51:22 +02:00
|
|
|
if (!(gParkFlags & PARK_FLAGS_NO_MONEY))
|
2014-08-19 22:33:05 +02:00
|
|
|
window_new_ride_widgets[WIDX_RESEARCH_FUNDING_BUTTON].type = WWT_FLATBTN;
|
|
|
|
|
|
|
|
width = 300;
|
|
|
|
height = 196;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Handle new window size
|
|
|
|
if (w->width != width || w->height != height) {
|
|
|
|
window_invalidate(w);
|
|
|
|
|
|
|
|
// Resize widgets to new window size
|
|
|
|
window_new_ride_widgets[WIDX_BACKGROUND].right = width - 1;
|
|
|
|
window_new_ride_widgets[WIDX_BACKGROUND].bottom = height - 1;
|
|
|
|
window_new_ride_widgets[WIDX_PAGE_BACKGROUND].right = width - 1;
|
|
|
|
window_new_ride_widgets[WIDX_PAGE_BACKGROUND].bottom = height - 1;
|
|
|
|
window_new_ride_widgets[WIDX_TITLE].right = width - 2;
|
|
|
|
window_new_ride_widgets[WIDX_CLOSE].left = width - 13;
|
|
|
|
window_new_ride_widgets[WIDX_CLOSE].right = width - 3;
|
|
|
|
|
|
|
|
w->width = width;
|
|
|
|
w->height = height;
|
|
|
|
window_invalidate(w);
|
|
|
|
}
|
|
|
|
|
|
|
|
window_init_scroll_widgets(w);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void window_new_ride_set_pressed_tab(rct_window *w)
|
|
|
|
{
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 i;
|
2014-08-19 22:33:05 +02:00
|
|
|
for (i = 0; i < WINDOW_NEW_RIDE_PAGE_COUNT; i++)
|
|
|
|
w->pressed_widgets &= ~(1 << (WIDX_TAB_1 + i));
|
2016-09-06 00:20:08 +02:00
|
|
|
w->pressed_widgets |= 1LL << (WIDX_TAB_1 + _windowNewRideCurrentTab);
|
2014-08-19 22:33:05 +02:00
|
|
|
}
|
|
|
|
|
2017-01-04 22:17:08 +01:00
|
|
|
const sint32 ThrillRidesTabAnimationSequence[] = {
|
2014-08-19 22:33:05 +02:00
|
|
|
5, 6, 5, 4, 3, 2, 1, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0
|
|
|
|
};
|
|
|
|
|
2017-01-04 22:17:08 +01:00
|
|
|
static void window_new_ride_draw_tab_image(rct_drawpixelinfo *dpi, rct_window *w, sint32 page, sint32 spriteIndex)
|
2014-08-19 22:33:05 +02:00
|
|
|
{
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 widgetIndex = WIDX_TAB_1 + page;
|
2014-08-19 22:33:05 +02:00
|
|
|
|
2015-06-07 15:35:15 +02:00
|
|
|
if (w->widgets[widgetIndex].type != WWT_EMPTY && !(w->disabled_widgets & (1LL << widgetIndex))) {
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 frame = 0;
|
2016-09-06 00:20:08 +02:00
|
|
|
if (_windowNewRideCurrentTab == page)
|
2014-08-19 22:33:05 +02:00
|
|
|
frame = w->frame_no / window_new_ride_tab_animation_divisor[page];
|
|
|
|
|
|
|
|
spriteIndex += page == WINDOW_NEW_RIDE_PAGE_THRILL ?
|
|
|
|
ThrillRidesTabAnimationSequence[frame] : frame;
|
|
|
|
|
|
|
|
spriteIndex |= w->colours[1] << 19;
|
|
|
|
|
|
|
|
gfx_draw_sprite(dpi, spriteIndex, w->x + w->widgets[widgetIndex].left, w->y + w->widgets[widgetIndex].top, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void window_new_ride_draw_tab_images(rct_drawpixelinfo *dpi, rct_window *w)
|
|
|
|
{
|
2016-07-14 14:07:49 +02:00
|
|
|
window_new_ride_draw_tab_image(dpi, w, WINDOW_NEW_RIDE_PAGE_TRANSPORT, 0x20000000 | SPR_TAB_RIDES_TRANSPORT_0);
|
|
|
|
window_new_ride_draw_tab_image(dpi, w, WINDOW_NEW_RIDE_PAGE_GENTLE, SPR_TAB_RIDES_GENTLE_0);
|
|
|
|
window_new_ride_draw_tab_image(dpi, w, WINDOW_NEW_RIDE_PAGE_ROLLER_COASTER, 0x20000000 | SPR_TAB_RIDES_ROLLER_COASTERS_0);
|
|
|
|
window_new_ride_draw_tab_image(dpi, w, WINDOW_NEW_RIDE_PAGE_THRILL, SPR_TAB_RIDES_THRILL_0);
|
|
|
|
window_new_ride_draw_tab_image(dpi, w, WINDOW_NEW_RIDE_PAGE_WATER, SPR_TAB_RIDES_WATER_0);
|
|
|
|
window_new_ride_draw_tab_image(dpi, w, WINDOW_NEW_RIDE_PAGE_SHOP, SPR_TAB_RIDES_SHOP_0);
|
|
|
|
window_new_ride_draw_tab_image(dpi, w, WINDOW_NEW_RIDE_PAGE_RESEARCH, SPR_TAB_FINANCES_RESEARCH_0);
|
2014-08-19 22:33:05 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x006B6B38
|
|
|
|
*/
|
2017-01-04 22:17:08 +01:00
|
|
|
static void window_new_ride_mouseup(rct_window *w, sint32 widgetIndex)
|
2014-08-19 22:33:05 +02:00
|
|
|
{
|
|
|
|
switch (widgetIndex) {
|
|
|
|
case WIDX_CLOSE:
|
|
|
|
window_close(w);
|
|
|
|
break;
|
|
|
|
case WIDX_LAST_DEVELOPMENT_BUTTON:
|
2017-01-04 22:17:08 +01:00
|
|
|
news_item_open_subject(NEWS_ITEM_RESEARCH, (sint32)gResearchLastItemSubject);
|
2014-08-19 22:33:05 +02:00
|
|
|
break;
|
|
|
|
case WIDX_RESEARCH_FUNDING_BUTTON:
|
|
|
|
window_finances_research_open();
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x006B6B4F
|
|
|
|
*/
|
2017-01-04 22:17:08 +01:00
|
|
|
static void window_new_ride_mousedown(sint32 widgetIndex, rct_window *w, rct_widget *widget)
|
2014-08-19 22:33:05 +02:00
|
|
|
{
|
2014-10-08 23:11:50 +02:00
|
|
|
if (widgetIndex >= WIDX_TAB_1 && widgetIndex <= WIDX_TAB_7)
|
|
|
|
window_new_ride_set_page(w, widgetIndex - WIDX_TAB_1);
|
2014-08-19 22:33:05 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x006B6CE7
|
|
|
|
*/
|
|
|
|
static void window_new_ride_update(rct_window *w)
|
|
|
|
{
|
|
|
|
w->frame_no++;
|
2016-09-06 00:20:08 +02:00
|
|
|
if (w->frame_no >= window_new_ride_tab_animation_loops[_windowNewRideCurrentTab])
|
2014-08-19 22:33:05 +02:00
|
|
|
w->frame_no = 0;
|
|
|
|
|
2016-09-06 00:20:08 +02:00
|
|
|
widget_invalidate(w, WIDX_TAB_1 + _windowNewRideCurrentTab);
|
2014-08-19 22:33:05 +02:00
|
|
|
|
2014-08-24 08:34:18 +02:00
|
|
|
if (w->new_ride.selected_ride_id != -1 && w->new_ride.selected_ride_countdown-- == 0)
|
2014-08-20 23:06:47 +02:00
|
|
|
window_new_ride_select(w);
|
2016-01-23 15:01:17 +01:00
|
|
|
|
|
|
|
if (_trackSelectionByType != gConfigInterface.select_by_track_type) {
|
|
|
|
window_new_ride_populate_list();
|
|
|
|
widget_invalidate(w, WIDX_RIDE_LIST);
|
|
|
|
}
|
2014-08-19 22:33:05 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x006B6BC9
|
|
|
|
*/
|
2017-01-04 22:17:08 +01:00
|
|
|
static void window_new_ride_scrollgetsize(rct_window *w, sint32 scrollIndex, sint32 *width, sint32 *height)
|
2014-08-19 22:33:05 +02:00
|
|
|
{
|
2016-09-06 00:20:08 +02:00
|
|
|
ride_list_item *listItem = _windowNewRideListItems;
|
2014-08-19 22:33:05 +02:00
|
|
|
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 count = 0;
|
2014-08-20 23:06:47 +02:00
|
|
|
while (listItem->type != 255 || listItem->entry_index != 255) {
|
|
|
|
count++;
|
|
|
|
listItem++;
|
|
|
|
}
|
2015-07-10 02:39:16 +02:00
|
|
|
*height = ((count + 4) / 5) * 116;
|
2014-08-19 22:33:05 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x006B6C89
|
|
|
|
*/
|
2017-01-04 22:17:08 +01:00
|
|
|
static void window_new_ride_scrollmousedown(rct_window *w, sint32 scrollIndex, sint32 x, sint32 y)
|
2014-08-19 22:33:05 +02:00
|
|
|
{
|
2014-08-22 19:54:28 +02:00
|
|
|
ride_list_item item;
|
2014-08-20 23:06:47 +02:00
|
|
|
|
2014-08-22 19:54:28 +02:00
|
|
|
item = window_new_ride_scroll_get_ride_list_item_at(w, x, y);
|
2014-08-20 23:06:47 +02:00
|
|
|
if (item.type == 255 && item.entry_index == 255)
|
|
|
|
return;
|
|
|
|
|
2016-09-06 00:20:08 +02:00
|
|
|
_windowNewRideHighlightedItem[_windowNewRideCurrentTab] = item;
|
2016-02-25 15:57:18 +01:00
|
|
|
w->new_ride.selected_ride_id = item.ride_type_and_entry;
|
2014-08-20 23:06:47 +02:00
|
|
|
|
2015-11-18 00:05:24 +01:00
|
|
|
audio_play_sound_panned(SOUND_CLICK_1, w->x + (w->width / 2), 0, 0, 0);
|
2014-08-22 19:54:28 +02:00
|
|
|
w->new_ride.selected_ride_countdown = 8;
|
2014-08-20 23:06:47 +02:00
|
|
|
window_invalidate(w);
|
2014-08-19 22:33:05 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
2014-08-20 23:06:47 +02:00
|
|
|
* rct2: 0x006B6C51
|
2014-08-19 22:33:05 +02:00
|
|
|
*/
|
2017-01-04 22:17:08 +01:00
|
|
|
static void window_new_ride_scrollmouseover(rct_window *w, sint32 scrollIndex, sint32 x, sint32 y)
|
2014-08-19 22:33:05 +02:00
|
|
|
{
|
2014-08-22 19:54:28 +02:00
|
|
|
ride_list_item item;
|
2014-08-20 23:06:47 +02:00
|
|
|
|
2014-08-24 08:34:18 +02:00
|
|
|
if (w->new_ride.selected_ride_id != -1)
|
2014-08-20 23:06:47 +02:00
|
|
|
return;
|
|
|
|
|
2014-08-22 19:54:28 +02:00
|
|
|
item = window_new_ride_scroll_get_ride_list_item_at(w, x, y);
|
2014-08-23 14:27:54 +02:00
|
|
|
|
2016-02-25 15:57:18 +01:00
|
|
|
if (w->new_ride.highlighted_ride_id == item.ride_type_and_entry)
|
2014-08-20 23:06:47 +02:00
|
|
|
return;
|
2014-08-19 22:33:05 +02:00
|
|
|
|
2016-02-25 15:57:18 +01:00
|
|
|
w->new_ride.highlighted_ride_id = item.ride_type_and_entry;
|
2016-09-06 00:20:08 +02:00
|
|
|
_windowNewRideHighlightedItem[_windowNewRideCurrentTab] = item;
|
2014-08-20 23:06:47 +02:00
|
|
|
window_invalidate(w);
|
2014-08-19 22:33:05 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x006B6BBF
|
|
|
|
*/
|
2017-01-04 22:17:08 +01:00
|
|
|
static void window_new_ride_tooltip(rct_window* w, sint32 widgetIndex, rct_string_id *stringId)
|
2014-08-19 22:33:05 +02:00
|
|
|
{
|
2016-07-27 00:29:25 +02:00
|
|
|
set_format_arg(0, rct_string_id, STR_LIST);
|
2014-08-19 22:33:05 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x006B6819
|
|
|
|
*/
|
2015-07-10 02:39:16 +02:00
|
|
|
static void window_new_ride_invalidate(rct_window *w)
|
2014-08-19 22:33:05 +02:00
|
|
|
{
|
2015-05-29 18:04:53 +02:00
|
|
|
colour_scheme_update(w);
|
2015-05-21 12:28:51 +02:00
|
|
|
|
2014-08-19 22:33:05 +02:00
|
|
|
window_new_ride_set_pressed_tab(w);
|
|
|
|
|
2016-09-06 00:20:08 +02:00
|
|
|
window_new_ride_widgets[WIDX_TITLE].text = window_new_ride_titles[_windowNewRideCurrentTab];
|
2014-08-19 22:33:05 +02:00
|
|
|
window_new_ride_widgets[WIDX_TAB_7].type = WWT_TAB;
|
2016-07-14 14:07:49 +02:00
|
|
|
if (gScreenFlags & SCREEN_FLAGS_TRACK_DESIGNER)
|
2014-08-19 22:33:05 +02:00
|
|
|
window_new_ride_widgets[WIDX_TAB_7].type = WWT_EMPTY;
|
|
|
|
|
2016-09-06 00:20:08 +02:00
|
|
|
if (_windowNewRideCurrentTab == WINDOW_NEW_RIDE_PAGE_RESEARCH) {
|
2014-08-19 22:33:05 +02:00
|
|
|
window_new_ride_widgets[WIDX_LAST_DEVELOPMENT_BUTTON].type = WWT_EMPTY;
|
2016-05-09 21:38:26 +02:00
|
|
|
uint32 typeId = gResearchLastItemSubject;
|
2014-08-19 22:33:05 +02:00
|
|
|
if (typeId != 0xFFFFFFFF) {
|
|
|
|
window_new_ride_widgets[WIDX_LAST_DEVELOPMENT_BUTTON].type = WWT_FLATBTN;
|
2016-07-14 14:07:49 +02:00
|
|
|
window_new_ride_widgets[WIDX_LAST_DEVELOPMENT_BUTTON].image = typeId >= 0x10000 ? SPR_NEW_RIDE : SPR_NEW_SCENERY;
|
2014-08-19 22:33:05 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x006B689B
|
|
|
|
*/
|
2015-07-10 02:39:16 +02:00
|
|
|
static void window_new_ride_paint(rct_window *w, rct_drawpixelinfo *dpi)
|
2014-08-19 22:33:05 +02:00
|
|
|
{
|
|
|
|
window_draw_widgets(w, dpi);
|
|
|
|
window_new_ride_draw_tab_images(dpi, w);
|
|
|
|
|
2016-09-06 00:20:08 +02:00
|
|
|
if (_windowNewRideCurrentTab != WINDOW_NEW_RIDE_PAGE_RESEARCH) {
|
2016-02-25 15:57:18 +01:00
|
|
|
ride_list_item item = { .ride_type_and_entry = w->new_ride.highlighted_ride_id };
|
2015-06-18 23:20:49 +02:00
|
|
|
if (item.type != 255 || item.entry_index != 255)
|
|
|
|
window_new_ride_paint_ride_information(w, dpi, item, w->x + 3, w->y + w->height - 52, w->width - 6);
|
|
|
|
} else {
|
|
|
|
window_research_development_page_paint(w, dpi, WIDX_CURRENTLY_IN_DEVELOPMENT_GROUP);
|
2014-08-19 22:33:05 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x006B6ABF
|
|
|
|
*/
|
2017-01-04 22:17:08 +01:00
|
|
|
static void window_new_ride_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, sint32 scrollIndex)
|
2014-08-19 22:33:05 +02:00
|
|
|
{
|
2016-09-06 00:20:08 +02:00
|
|
|
if (_windowNewRideCurrentTab == WINDOW_NEW_RIDE_PAGE_RESEARCH)
|
2014-08-21 23:33:36 +02:00
|
|
|
return;
|
|
|
|
|
2016-11-16 14:27:02 +01:00
|
|
|
gfx_clear(dpi, ColourMapA[w->colours[1]].mid_light);
|
2014-08-21 23:33:36 +02:00
|
|
|
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 x = 1;
|
|
|
|
sint32 y = 1;
|
2016-09-06 00:20:08 +02:00
|
|
|
ride_list_item *listItem = _windowNewRideListItems;
|
2014-08-21 23:33:36 +02:00
|
|
|
while (listItem->type != 255 || listItem->entry_index != 255) {
|
2016-02-25 13:33:19 +01:00
|
|
|
rct_ride_entry *rideEntry;
|
2014-08-21 23:33:36 +02:00
|
|
|
// Draw flat button rectangle
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 flags = 0;
|
2014-08-24 08:34:18 +02:00
|
|
|
if (w->new_ride.selected_ride_id == *((sint16*)listItem))
|
2016-11-10 18:54:33 +01:00
|
|
|
flags |= INSET_RECT_FLAG_BORDER_INSET;
|
2014-08-22 21:17:48 +02:00
|
|
|
if (w->new_ride.highlighted_ride_id == *((sint16*)listItem) || flags != 0)
|
2016-11-10 18:54:33 +01:00
|
|
|
gfx_fill_rect_inset(dpi, x, y, x + 115, y + 115, w->colours[1], INSET_RECT_FLAG_FILL_MID_LIGHT | flags);
|
2015-10-20 20:16:30 +02:00
|
|
|
|
2015-08-06 02:00:03 +02:00
|
|
|
// Draw ride image with feathered border
|
2016-01-22 15:38:52 +01:00
|
|
|
rideEntry = get_ride_entry(listItem->entry_index);
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 image_id = rideEntry->images_offset;
|
2015-03-31 18:09:16 +02:00
|
|
|
if (listItem->type != rideEntry->ride_type[0]) {
|
2015-03-01 15:24:05 +01:00
|
|
|
image_id++;
|
2015-03-31 18:09:16 +02:00
|
|
|
if (listItem->type != rideEntry->ride_type[1])
|
2015-03-01 15:24:05 +01:00
|
|
|
image_id++;
|
2014-08-21 23:33:36 +02:00
|
|
|
}
|
2016-07-14 14:07:49 +02:00
|
|
|
gfx_draw_sprite_raw_masked(dpi, x + 2, y + 2, SPR_NEW_RIDE_MASK, image_id);
|
2014-08-21 23:33:36 +02:00
|
|
|
|
|
|
|
// Next position
|
|
|
|
x += 116;
|
|
|
|
if (x >= 116 * 5 + 1) {
|
|
|
|
x = 1;
|
|
|
|
y += 116;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Next item
|
|
|
|
listItem++;
|
|
|
|
}
|
2014-08-20 23:06:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x006B6D3C
|
|
|
|
*/
|
2017-01-04 22:17:08 +01:00
|
|
|
static ride_list_item window_new_ride_scroll_get_ride_list_item_at(rct_window *w, sint32 x, sint32 y)
|
2014-08-20 23:06:47 +02:00
|
|
|
{
|
|
|
|
ride_list_item result;
|
|
|
|
result.type = 255;
|
|
|
|
result.entry_index = 255;
|
|
|
|
|
|
|
|
if (--x < 0 || --y < 0)
|
|
|
|
return result;
|
|
|
|
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 column = x / 116;
|
|
|
|
sint32 row = y / 116;
|
2014-09-15 22:42:49 +02:00
|
|
|
if (column >= 5)
|
2014-08-20 23:06:47 +02:00
|
|
|
return result;
|
|
|
|
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 index = column + (row * 5);
|
2014-08-20 23:06:47 +02:00
|
|
|
|
2016-09-06 00:20:08 +02:00
|
|
|
ride_list_item *listItem = _windowNewRideListItems;
|
2014-08-20 23:06:47 +02:00
|
|
|
while (listItem->type != 255 || listItem->entry_index != 255) {
|
|
|
|
if (index-- == 0)
|
|
|
|
return *listItem;
|
|
|
|
listItem++;
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2017-01-04 22:17:08 +01:00
|
|
|
static sint32 get_num_track_designs(ride_list_item item)
|
2014-08-21 22:48:23 +02:00
|
|
|
{
|
2016-04-29 01:08:26 +02:00
|
|
|
char entry[9];
|
|
|
|
const char *entryPtr = NULL;
|
|
|
|
if (item.type < 0x80) {
|
|
|
|
rct_ride_entry *rideEntry = get_ride_entry(item.entry_index);
|
|
|
|
if ((rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE) && !rideTypeShouldLoseSeparateFlag(rideEntry)) {
|
|
|
|
get_ride_entry_name(entry, item.entry_index);
|
|
|
|
entryPtr = entry;
|
|
|
|
}
|
2014-08-21 22:48:23 +02:00
|
|
|
}
|
2016-04-29 01:08:26 +02:00
|
|
|
|
2017-01-04 22:17:08 +01:00
|
|
|
return (sint32)track_repository_get_count_for_ride(item.type, entryPtr);
|
2014-08-21 22:48:23 +02:00
|
|
|
}
|
|
|
|
|
2014-08-20 23:06:47 +02:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x006B701C
|
|
|
|
*/
|
2017-01-04 22:17:08 +01:00
|
|
|
static void window_new_ride_paint_ride_information(rct_window *w, rct_drawpixelinfo *dpi, ride_list_item item, sint32 x, sint32 y, sint32 width)
|
2014-08-20 23:06:47 +02:00
|
|
|
{
|
2016-02-25 13:33:19 +01:00
|
|
|
rct_ride_entry *rideEntry = get_ride_entry(item.entry_index);
|
2014-08-21 23:33:36 +02:00
|
|
|
|
|
|
|
// Ride name and description
|
2014-08-25 00:02:19 +02:00
|
|
|
rct_string_id rideName = rideEntry->name;
|
|
|
|
rct_string_id rideDescription = rideEntry->description;
|
2015-06-25 11:46:17 +02:00
|
|
|
if (!(rideEntry->flags & RIDE_ENTRY_FLAG_SEPARATE_RIDE_NAME) || rideTypeShouldLoseSeparateFlag(rideEntry)) {
|
2016-07-27 00:02:10 +02:00
|
|
|
rideName = RideNaming[item.type].name;
|
|
|
|
rideDescription = RideNaming[item.type].description;
|
2014-08-21 22:48:23 +02:00
|
|
|
}
|
|
|
|
|
2016-05-15 23:03:53 +02:00
|
|
|
set_format_arg(0, rct_string_id, rideName);
|
|
|
|
set_format_arg(2, rct_string_id, rideDescription);
|
2016-11-13 18:20:30 +01:00
|
|
|
gfx_draw_string_left_wrapped(dpi, gCommonFormatArgs, x, y, width, STR_NEW_RIDE_NAME_AND_DESCRIPTION, COLOUR_BLACK);
|
2014-08-21 22:48:23 +02:00
|
|
|
|
2014-08-21 23:33:36 +02:00
|
|
|
// Number of designs available
|
2015-03-07 20:56:30 +01:00
|
|
|
if (ride_type_has_flag(item.type, RIDE_TYPE_FLAG_HAS_TRACK)) {
|
2016-02-15 11:20:07 +01:00
|
|
|
// Track designs are disabled in multiplayer, so don't say there are any designs available when in multiplayer
|
|
|
|
if (network_get_mode() != NETWORK_MODE_NONE) {
|
|
|
|
_lastTrackDesignCount = 0;
|
|
|
|
}
|
|
|
|
else if (item.type != _lastTrackDesignCountRideType.type || item.entry_index != _lastTrackDesignCountRideType.entry_index) {
|
2014-08-21 23:33:36 +02:00
|
|
|
_lastTrackDesignCountRideType = item;
|
|
|
|
_lastTrackDesignCount = get_num_track_designs(item);
|
2014-08-21 22:48:23 +02:00
|
|
|
}
|
|
|
|
|
2014-08-21 23:33:36 +02:00
|
|
|
rct_string_id stringId;
|
|
|
|
switch (_lastTrackDesignCount) {
|
|
|
|
case 0:
|
2016-02-15 11:20:07 +01:00
|
|
|
stringId = STR_CUSTOM_DESIGNED_LAYOUT;
|
2014-08-21 23:33:36 +02:00
|
|
|
break;
|
|
|
|
case 1:
|
2016-02-15 11:20:07 +01:00
|
|
|
stringId = STR_1_DESIGN_AVAILABLE;
|
2014-08-21 23:33:36 +02:00
|
|
|
break;
|
|
|
|
default:
|
2016-02-15 11:20:07 +01:00
|
|
|
stringId = STR_X_DESIGNS_AVAILABLE;
|
2014-08-21 23:33:36 +02:00
|
|
|
break;
|
2014-08-21 22:48:23 +02:00
|
|
|
}
|
2016-11-13 23:29:03 +01:00
|
|
|
gfx_draw_string_left(dpi, stringId, &_lastTrackDesignCount, COLOUR_BLACK, x, y + 39);
|
2014-08-21 23:33:36 +02:00
|
|
|
}
|
2014-08-21 22:48:23 +02:00
|
|
|
|
2014-08-21 23:33:36 +02:00
|
|
|
// Price
|
2016-04-23 01:51:22 +02:00
|
|
|
if (!(gParkFlags & PARK_FLAGS_NO_MONEY)) {
|
2014-08-21 23:33:36 +02:00
|
|
|
// Get price of ride
|
2017-01-04 22:17:08 +01:00
|
|
|
sint32 unk2 = RideConstructionDefaultTrackType[item.type];
|
2016-04-03 13:41:00 +02:00
|
|
|
money32 price = RideTrackCosts[item.type].track_price;
|
2015-06-21 03:27:38 +02:00
|
|
|
if (ride_type_has_flag(item.type, RIDE_TYPE_FLAG_FLAT_RIDE)) {
|
2016-08-07 14:16:51 +02:00
|
|
|
price *= FlatRideTrackPricing[unk2];
|
2014-08-21 23:33:36 +02:00
|
|
|
} else {
|
2016-08-07 14:16:51 +02:00
|
|
|
price *= TrackPricing[unk2];
|
2014-08-21 23:33:36 +02:00
|
|
|
}
|
2016-04-03 14:53:17 +02:00
|
|
|
price = (price >> 17) * 10 * RideData5[item.type].price;
|
2014-08-21 22:48:23 +02:00
|
|
|
|
2015-10-20 20:16:30 +02:00
|
|
|
//
|
2016-07-14 14:07:49 +02:00
|
|
|
rct_string_id stringId = STR_NEW_RIDE_COST;
|
2016-02-20 17:37:09 +01:00
|
|
|
if (!ride_type_has_flag(item.type, RIDE_TYPE_FLAG_HAS_NO_TRACK))
|
2016-07-14 14:07:49 +02:00
|
|
|
stringId = STR_NEW_RIDE_COST_FROM;
|
2014-08-21 22:48:23 +02:00
|
|
|
|
2016-11-13 18:20:30 +01:00
|
|
|
gfx_draw_string_right(dpi, stringId, &price, COLOUR_BLACK, x + width, y + 39);
|
2014-08-21 22:48:23 +02:00
|
|
|
}
|
2014-08-20 23:06:47 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
*
|
|
|
|
* rct2: 0x006B6B78
|
|
|
|
*/
|
|
|
|
static void window_new_ride_select(rct_window *w)
|
|
|
|
{
|
2016-02-25 15:57:18 +01:00
|
|
|
ride_list_item item = { .ride_type_and_entry = w->new_ride.selected_ride_id };
|
2014-08-21 23:50:06 +02:00
|
|
|
if (item.type == 255)
|
|
|
|
return;
|
|
|
|
|
|
|
|
window_close(w);
|
2015-08-25 19:08:17 +02:00
|
|
|
window_close_construction_windows();
|
2014-08-21 23:50:06 +02:00
|
|
|
|
2015-12-24 02:35:14 +01:00
|
|
|
bool allowTrackDesigns = true;
|
|
|
|
#ifndef NETWORK_DISABLE
|
|
|
|
// TODO: FIX NETWORK TRACKS
|
|
|
|
// Until tracks work with the network this will disable them
|
|
|
|
if (network_get_mode() != NETWORK_MODE_NONE) {
|
|
|
|
allowTrackDesigns = false;
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
if (allowTrackDesigns && ride_type_has_flag(item.type, RIDE_TYPE_FLAG_HAS_TRACK)) {
|
2016-04-29 01:08:26 +02:00
|
|
|
if (_lastTrackDesignCount > 0) {
|
2014-09-27 01:41:24 +02:00
|
|
|
window_track_list_open(item);
|
2014-08-21 23:50:06 +02:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-09-28 00:48:42 +02:00
|
|
|
ride_construct_new(item);
|
2014-09-02 17:52:23 +02:00
|
|
|
}
|