mirror of
https://github.com/OpenRCT2/OpenRCT2
synced 2026-01-15 11:03:00 +01:00
Merge pull request #344 from duncanspumpkin/window_peep_functions
Window peep functions
This commit is contained in:
@@ -540,4 +540,12 @@ void get_arguments_from_action(rct_peep* peep, uint32 *argument_1, uint32* argum
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* rct2: 0x00698827
|
||||
* returns 1 on pickup (CF not set)
|
||||
*/
|
||||
int peep_can_be_picked_up(rct_peep* peep){
|
||||
return RCT2_ADDRESS(0x982004, uint8)[peep->state] & 1;
|
||||
}
|
||||
@@ -437,6 +437,7 @@ typedef struct {
|
||||
if (peep->type == PEEP_TYPE_STAFF)
|
||||
|
||||
int peep_get_staff_count();
|
||||
int peep_can_be_picked_up(rct_peep* peep);
|
||||
void peep_update_all();
|
||||
void peep_problem_warnings_update();
|
||||
void peep_update_crowd_noise();
|
||||
|
||||
@@ -54,7 +54,7 @@ typedef struct {
|
||||
uint8 status; // 0x049
|
||||
uint16 var_04A;
|
||||
uint32 var_04C;
|
||||
uint16 overall_view; // 0x050
|
||||
uint16 overall_view; // 0x050 00XX = X, XX00 = Y (* 32 + 16)
|
||||
uint16 station_starts[4]; // 0x052
|
||||
uint8 station_heights[4]; // 0x05A
|
||||
uint8 pad_05E[0xC];
|
||||
|
||||
@@ -41,4 +41,7 @@ typedef struct {
|
||||
|
||||
void vehicle_update_all();
|
||||
|
||||
/** Helper macro until rides are stored in this module. */
|
||||
#define GET_VEHICLE(sprite_index) &(g_sprite_list[sprite_index].vehicle)
|
||||
|
||||
#endif
|
||||
@@ -162,7 +162,7 @@ void viewport_create(rct_window *w, int x, int y, int width, int height, int zoo
|
||||
viewport->width = width;
|
||||
viewport->height = height;
|
||||
|
||||
if (!(flags & (1 << 0))){
|
||||
if (!(flags & VIEWPORT_FOCUS_TYPE_COORDINATE)){
|
||||
zoom = 0;
|
||||
}
|
||||
|
||||
@@ -171,12 +171,12 @@ void viewport_create(rct_window *w, int x, int y, int width, int height, int zoo
|
||||
viewport->zoom = zoom;
|
||||
viewport->flags = 0;
|
||||
|
||||
if (RCT2_GLOBAL(0x9AAC7A, uint8) & 1){
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_KEYBOARD_SHORTCUTS, uint8) & 1){
|
||||
viewport->flags |= VIEWPORT_FLAG_GRIDLINES;
|
||||
}
|
||||
w->viewport = viewport;
|
||||
|
||||
if (flags & (1<<1)){
|
||||
if (flags & VIEWPORT_FOCUS_TYPE_SPRITE){
|
||||
w->viewport_target_sprite = sprite;
|
||||
rct_sprite* center_sprite = &g_sprite_list[sprite];
|
||||
center_x = center_sprite->unknown.x;
|
||||
|
||||
40
src/window.c
40
src/window.c
@@ -27,6 +27,7 @@
|
||||
#include "widget.h"
|
||||
#include "window.h"
|
||||
#include "viewport.h"
|
||||
#include "sprite.h"
|
||||
|
||||
#define RCT2_FIRST_WINDOW (RCT2_ADDRESS(RCT2_ADDRESS_WINDOW_LIST, rct_window))
|
||||
#define RCT2_LAST_WINDOW (RCT2_GLOBAL(RCT2_ADDRESS_NEW_WINDOW_PTR, rct_window*) - 1)
|
||||
@@ -394,11 +395,11 @@ rct_window *window_create(int x, int y, int width, int height, uint32 *event_han
|
||||
w->disabled_widgets = 0;
|
||||
w->pressed_widgets = 0;
|
||||
w->var_020 = 0;
|
||||
w->var_480 = 0;
|
||||
w->var_482 = 0;
|
||||
w->var_484 = 0;
|
||||
w->var_486 = 0;
|
||||
w->var_488 = 0;
|
||||
w->viewport_focus_coordinates.var_480 = 0;
|
||||
w->viewport_focus_coordinates.x = 0;
|
||||
w->viewport_focus_coordinates.y = 0;
|
||||
w->viewport_focus_coordinates.z = 0;
|
||||
w->viewport_focus_coordinates.rotation = 0;
|
||||
w->page = 0;
|
||||
w->var_48C = 0;
|
||||
w->frame_no = 0;
|
||||
@@ -885,6 +886,35 @@ rct_window *window_get_main()
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* Based on
|
||||
* rct2: 0x696ee9 & 0x66842F
|
||||
*
|
||||
*/
|
||||
void window_scroll_to_viewport(rct_window *w)
|
||||
{
|
||||
int x, y, z;
|
||||
rct_window *mainWindow;
|
||||
// In original checked to make sure x and y were not -1 as well.
|
||||
if (w->viewport == NULL || w->viewport_focus_coordinates.y == -1)
|
||||
return;
|
||||
|
||||
if (w->viewport_focus_sprite.type & VIEWPORT_FOCUS_TYPE_SPRITE) {
|
||||
rct_sprite *sprite = &(g_sprite_list[w->viewport_focus_sprite.sprite_id]);
|
||||
x = sprite->unknown.x;
|
||||
y = sprite->unknown.y;
|
||||
z = sprite->unknown.z;
|
||||
} else {
|
||||
x = w->viewport_focus_coordinates.x;
|
||||
y = w->viewport_focus_coordinates.y & VIEWPORT_FOCUS_Y_MASK;
|
||||
z = w->viewport_focus_coordinates.z;
|
||||
}
|
||||
|
||||
mainWindow = window_get_main();
|
||||
if (mainWindow != NULL)
|
||||
window_scroll_to_location(mainWindow, x, y, z);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* rct2: 0x006E7C9C
|
||||
|
||||
79
src/window.h
79
src/window.h
@@ -93,6 +93,69 @@ typedef struct {
|
||||
sint16 v_thumb_bottom; // 0x10
|
||||
} rct_scroll;
|
||||
|
||||
/**
|
||||
* Viewport focus structure.
|
||||
* size: 0xA
|
||||
* Use sprite.type to work out type.
|
||||
*/
|
||||
typedef struct{
|
||||
sint16 var_480;
|
||||
sint16 x; //0x482
|
||||
sint16 y; //0x484 & VIEWPORT_FOCUS_Y_MASK
|
||||
sint16 z; //0x486
|
||||
uint8 rotation;//0x488
|
||||
uint8 pad_489;
|
||||
} coordinate_focus;
|
||||
|
||||
// Type is viewport_target_sprite_id & 0x80000000 != 0
|
||||
typedef struct{
|
||||
sint16 var_480;
|
||||
uint16 sprite_id; //0x482
|
||||
uint8 pad_484;
|
||||
uint8 type; //0x485 & VIEWPORT_FOCUS_TYPE_MASK
|
||||
uint16 pad_486;
|
||||
uint8 rotation; //0x488
|
||||
uint8 pad_489;
|
||||
} sprite_focus;
|
||||
|
||||
#define VIEWPORT_FOCUS_TYPE_MASK 0xC0
|
||||
enum{
|
||||
VIEWPORT_FOCUS_TYPE_COORDINATE = (1<<6),
|
||||
VIEWPORT_FOCUS_TYPE_SPRITE = (1<<7)
|
||||
};
|
||||
#define VIEWPORT_FOCUS_Y_MASK 0x3FFF;
|
||||
|
||||
|
||||
typedef struct{
|
||||
sint16 campaign_type;
|
||||
sint16 no_weeks; //0x482
|
||||
uint16 ride_id; //0x484
|
||||
uint32 pad_486;
|
||||
} campaign_variables;
|
||||
|
||||
typedef struct{
|
||||
sint16 selected_ride_id; //0x480
|
||||
sint16 highlighted_ride_id; //0x482
|
||||
uint16 pad_484;
|
||||
uint16 pad_486;
|
||||
uint16 selected_ride_countdown; //488
|
||||
} new_ride_variables;
|
||||
|
||||
typedef struct{
|
||||
sint16 var_480;
|
||||
sint16 var_482;
|
||||
uint16 var_484;
|
||||
uint16 var_486;
|
||||
uint16 var_488;
|
||||
} news_variables;
|
||||
|
||||
typedef struct{
|
||||
sint16 rotation;
|
||||
sint16 var_482;
|
||||
uint16 var_484;
|
||||
uint16 var_486;
|
||||
uint16 var_488;
|
||||
}map_variables;
|
||||
/**
|
||||
* Window structure
|
||||
* size: 0x4C0
|
||||
@@ -122,11 +185,14 @@ typedef struct rct_window {
|
||||
sint16 selected_list_item; // 0x47A -1 for none selected
|
||||
sint16 pad_47C;
|
||||
sint16 pad_47E;
|
||||
sint16 var_480;
|
||||
sint16 var_482; // viewport target x
|
||||
sint16 var_484; // viewport target y
|
||||
sint16 var_486; // viewport target z
|
||||
sint16 var_488; // viewport rotation << 8
|
||||
union{
|
||||
coordinate_focus viewport_focus_coordinates;
|
||||
sprite_focus viewport_focus_sprite;
|
||||
campaign_variables campaign;
|
||||
new_ride_variables new_ride;
|
||||
news_variables news;
|
||||
map_variables map;
|
||||
};
|
||||
sint16 page; // 0x48A
|
||||
sint16 var_48C;
|
||||
sint16 frame_no; // 0x48E updated every tic for motion in windows sprites
|
||||
@@ -326,6 +392,7 @@ void window_push_others_below(rct_window *w1);
|
||||
|
||||
rct_window *window_get_main();
|
||||
|
||||
void window_scroll_to_viewport(rct_window *w);
|
||||
void window_scroll_to_location(rct_window *w, int x, int y, int z);
|
||||
void window_rotate_camera(rct_window *w);
|
||||
void window_zoom_in(rct_window *w);
|
||||
@@ -374,7 +441,7 @@ void window_park_objective_open();
|
||||
void window_park_rating_open();
|
||||
void window_finances_open();
|
||||
void window_finances_research_open();
|
||||
void window_new_campaign_open(int campaignType);
|
||||
void window_new_campaign_open(sint16 campaignType);
|
||||
void window_ride_list_open();
|
||||
void window_new_ride_open();
|
||||
void window_banner_open();
|
||||
|
||||
@@ -162,7 +162,7 @@ void window_map_open()
|
||||
w->var_020 |= 0x300;
|
||||
|
||||
window_init_scroll_widgets(w);
|
||||
w->var_480 = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint16);
|
||||
w->map.rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint16);
|
||||
|
||||
window_map_init_map();
|
||||
RCT2_GLOBAL(0x00F64F05, uint8) = 0;
|
||||
|
||||
@@ -128,7 +128,7 @@ int ride_name_compare(const void *a, const void *b)
|
||||
*
|
||||
* rct2: 0x0069E16F
|
||||
*/
|
||||
void window_new_campaign_open(int campaignType)
|
||||
void window_new_campaign_open(sint16 campaignType)
|
||||
{
|
||||
// RCT2_CALLPROC_X(0x0069E16F, campaignType, 0, 0, 0, 0, 0, 0);
|
||||
|
||||
@@ -138,7 +138,7 @@ void window_new_campaign_open(int campaignType)
|
||||
|
||||
w = window_bring_to_front_by_id(WC_NEW_CAMPAIGN, 0);
|
||||
if (w != NULL) {
|
||||
if (w->var_480 == campaignType)
|
||||
if (w->campaign.campaign_type == campaignType)
|
||||
return;
|
||||
|
||||
window_close(w);
|
||||
@@ -162,13 +162,13 @@ void window_new_campaign_open(int campaignType)
|
||||
window_new_campaign_widgets[WIDX_TITLE].image = STR_MARKETING_VOUCHERS_FOR_FREE_ENTRY_TO_THE_PARK + campaignType;
|
||||
|
||||
// Campaign type
|
||||
w->var_480 = campaignType;
|
||||
w->campaign.campaign_type = campaignType;
|
||||
|
||||
// Number of weeks
|
||||
w->var_482 = 2;
|
||||
w->campaign.no_weeks = 2;
|
||||
|
||||
// Currently selected ride
|
||||
w->var_484 = SELECTED_RIDE_UNDEFINED;
|
||||
w->campaign.ride_id = SELECTED_RIDE_UNDEFINED;
|
||||
|
||||
// Get all applicable rides
|
||||
numApplicableRides = 0;
|
||||
@@ -234,7 +234,7 @@ static void window_new_campaign_mouseup()
|
||||
break;
|
||||
case WIDX_START_BUTTON:
|
||||
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, uint16) = STR_CANT_START_MARKETING_CAMPAIGN;
|
||||
game_do_command(0, (w->var_482 << 8) | 1, 0, (w->var_484 << 8) | w->var_480, GAME_COMMAND_START_MARKETING_CAMPAIGN, 0, 0);
|
||||
game_do_command(0, (w->campaign.no_weeks << 8) | 1, 0, (w->campaign.ride_id << 8) | w->campaign.campaign_type, GAME_COMMAND_START_MARKETING_CAMPAIGN, 0, 0);
|
||||
window_close(w);
|
||||
break;
|
||||
}
|
||||
@@ -252,7 +252,7 @@ static void window_new_campaign_mousedown(int widgetIndex, rct_window *w, rct_wi
|
||||
case WIDX_RIDE_DROPDOWN_BUTTON:
|
||||
dropdownWidget = widget - 1;
|
||||
|
||||
if (w->var_480 == ADVERTISING_CAMPAIGN_FOOD_OR_DRINK_FREE) {
|
||||
if (w->campaign.campaign_type == ADVERTISING_CAMPAIGN_FOOD_OR_DRINK_FREE) {
|
||||
window_new_campaign_get_shop_items();
|
||||
if (window_new_campaign_shop_items[0] != 255) {
|
||||
int numItems = 0;
|
||||
@@ -305,11 +305,11 @@ static void window_new_campaign_mousedown(int widgetIndex, rct_window *w, rct_wi
|
||||
}
|
||||
break;
|
||||
case WIDX_WEEKS_INCREASE_BUTTON:
|
||||
w->var_482 = min(w->var_482 + 1, 6);
|
||||
w->campaign.no_weeks = min(w->campaign.no_weeks + 1, 6);
|
||||
window_invalidate(w);
|
||||
break;
|
||||
case WIDX_WEEKS_DECREASE_BUTTON:
|
||||
w->var_482 = max(w->var_482 - 1, 2);
|
||||
w->campaign.no_weeks = max(w->campaign.no_weeks - 1, 2);
|
||||
window_invalidate(w);
|
||||
break;
|
||||
}
|
||||
@@ -329,13 +329,13 @@ static void window_new_campaign_dropdown()
|
||||
if (widgetIndex != WIDX_RIDE_DROPDOWN_BUTTON)
|
||||
return;
|
||||
|
||||
if (w->var_480 == ADVERTISING_CAMPAIGN_FOOD_OR_DRINK_FREE) {
|
||||
if (w->campaign.campaign_type == ADVERTISING_CAMPAIGN_FOOD_OR_DRINK_FREE) {
|
||||
rct_string_id itemStringId = (uint16)gDropdownItemsArgs[dropdownIndex] - 2016;
|
||||
if (itemStringId >= 32)
|
||||
itemStringId -= 96;
|
||||
w->var_484 = itemStringId;
|
||||
w->campaign.ride_id = itemStringId;
|
||||
} else {
|
||||
w->var_484 = window_new_campaign_rides[dropdownIndex];
|
||||
w->campaign.ride_id = window_new_campaign_rides[dropdownIndex];
|
||||
}
|
||||
|
||||
window_invalidate(w);
|
||||
@@ -355,15 +355,15 @@ static void window_new_campaign_invalidate()
|
||||
window_new_campaign_widgets[WIDX_RIDE_DROPDOWN].type = WWT_EMPTY;
|
||||
window_new_campaign_widgets[WIDX_RIDE_DROPDOWN_BUTTON].type = WWT_EMPTY;
|
||||
window_new_campaign_widgets[WIDX_RIDE_DROPDOWN].image = STR_MARKETING_NOT_SELECTED;
|
||||
switch (w->var_480) {
|
||||
switch (w->campaign.campaign_type) {
|
||||
case ADVERTISING_CAMPAIGN_RIDE_FREE:
|
||||
case ADVERTISING_CAMPAIGN_RIDE:
|
||||
window_new_campaign_widgets[WIDX_RIDE_LABEL].type = WWT_24;
|
||||
window_new_campaign_widgets[WIDX_RIDE_DROPDOWN].type = WWT_DROPDOWN;
|
||||
window_new_campaign_widgets[WIDX_RIDE_DROPDOWN_BUTTON].type = WWT_DROPDOWN_BUTTON;
|
||||
window_new_campaign_widgets[WIDX_RIDE_LABEL].image = STR_MARKETING_RIDE;
|
||||
if (w->var_484 != SELECTED_RIDE_UNDEFINED) {
|
||||
rct_ride *ride = GET_RIDE(w->var_484);
|
||||
if (w->campaign.ride_id != SELECTED_RIDE_UNDEFINED) {
|
||||
rct_ride *ride = GET_RIDE(w->campaign.ride_id);
|
||||
window_new_campaign_widgets[WIDX_RIDE_DROPDOWN].image = ride->var_04A;
|
||||
RCT2_GLOBAL(0x013CE952, uint32) = ride->var_04C;
|
||||
}
|
||||
@@ -373,8 +373,8 @@ static void window_new_campaign_invalidate()
|
||||
window_new_campaign_widgets[WIDX_RIDE_DROPDOWN].type = WWT_DROPDOWN;
|
||||
window_new_campaign_widgets[WIDX_RIDE_DROPDOWN_BUTTON].type = WWT_DROPDOWN_BUTTON;
|
||||
window_new_campaign_widgets[WIDX_RIDE_LABEL].image = STR_MARKETING_ITEM;
|
||||
if (w->var_484 != SELECTED_RIDE_UNDEFINED) {
|
||||
rct_string_id itemStringId = w->var_484 + 2016;
|
||||
if (w->campaign.ride_id != SELECTED_RIDE_UNDEFINED) {
|
||||
rct_string_id itemStringId = w->campaign.ride_id + 2016;
|
||||
if (itemStringId >= 2048)
|
||||
itemStringId += 96;
|
||||
window_new_campaign_widgets[WIDX_RIDE_DROPDOWN].image = itemStringId;
|
||||
@@ -383,11 +383,11 @@ static void window_new_campaign_invalidate()
|
||||
}
|
||||
|
||||
// Set current number of weeks spinner
|
||||
window_new_campaign_widgets[WIDX_WEEKS_SPINNER].image = (STR_MARKETING_1_WEEK - 1) + w->var_482;
|
||||
window_new_campaign_widgets[WIDX_WEEKS_SPINNER].image = (STR_MARKETING_1_WEEK - 1) + w->campaign.no_weeks;
|
||||
|
||||
// Enable / disable start button based on ride dropdown
|
||||
w->disabled_widgets &= ~(1 << WIDX_START_BUTTON);
|
||||
if (window_new_campaign_widgets[WIDX_RIDE_DROPDOWN].type == WWT_DROPDOWN && w->var_484 == SELECTED_RIDE_UNDEFINED)
|
||||
if (window_new_campaign_widgets[WIDX_RIDE_DROPDOWN].type == WWT_DROPDOWN && w->campaign.ride_id == SELECTED_RIDE_UNDEFINED)
|
||||
w->disabled_widgets |= 1 << WIDX_START_BUTTON;
|
||||
}
|
||||
|
||||
@@ -409,11 +409,11 @@ static void window_new_campaign_paint()
|
||||
y = w->y + 60;
|
||||
|
||||
// Price per week
|
||||
money32 pricePerWeek = AdvertisingCampaignPricePerWeek[w->var_480];
|
||||
money32 pricePerWeek = AdvertisingCampaignPricePerWeek[w->campaign.campaign_type];
|
||||
gfx_draw_string_left(dpi, STR_MARKETING_COST_PER_WEEK, &pricePerWeek, 0, x, y);
|
||||
y += 13;
|
||||
|
||||
// Total price
|
||||
money32 totalPrice = AdvertisingCampaignPricePerWeek[w->var_480] * w->var_482;
|
||||
money32 totalPrice = AdvertisingCampaignPricePerWeek[w->campaign.campaign_type] * w->campaign.no_weeks;
|
||||
gfx_draw_string_left(dpi, STR_MARKETING_TOTAL_COST, &totalPrice, 0, x, y);
|
||||
}
|
||||
@@ -431,16 +431,16 @@ void window_new_ride_open()
|
||||
w->colours[0] = 24;
|
||||
w->colours[1] = 26;
|
||||
w->colours[2] = 26;
|
||||
w->var_480 = -1;
|
||||
w->var_482 = -1;
|
||||
w->new_ride.selected_ride_countdown = -1;
|
||||
w->new_ride.highlighted_ride_id = -1;
|
||||
_lastTrackDesignCountRideType.type = 255;
|
||||
_lastTrackDesignCountRideType.entry_index = 255;
|
||||
|
||||
window_new_ride_populate_list();
|
||||
|
||||
w->var_482 = RCT2_ADDRESS(0x00F43825, sint16)[_window_new_ride_current_tab];
|
||||
if (w->var_482 == -1)
|
||||
w->var_482 = RCT2_GLOBAL(0x00F43523, sint16);
|
||||
w->new_ride.highlighted_ride_id = RCT2_ADDRESS(0x00F43825, sint16)[_window_new_ride_current_tab];
|
||||
if (w->new_ride.highlighted_ride_id == -1)
|
||||
w->new_ride.highlighted_ride_id = RCT2_GLOBAL(0x00F43523, sint16);
|
||||
|
||||
w->width = 1;
|
||||
window_new_ride_refresh_widget_sizing(w);
|
||||
@@ -577,13 +577,13 @@ static void window_new_ride_mousedown(int widgetIndex, rct_window *w, rct_widget
|
||||
|
||||
_window_new_ride_current_tab = page;
|
||||
w->frame_no = 0;
|
||||
w->var_482 = -1;
|
||||
w->var_480 = -1;
|
||||
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) {
|
||||
w->var_482 = RCT2_ADDRESS(0x00F43825, sint16)[page];
|
||||
if (w->var_482 == -1)
|
||||
w->var_482 = RCT2_GLOBAL(0x00F43523, sint16);
|
||||
w->new_ride.highlighted_ride_id = RCT2_ADDRESS(0x00F43825, sint16)[page];
|
||||
if (w->new_ride.highlighted_ride_id == -1)
|
||||
w->new_ride.highlighted_ride_id = RCT2_GLOBAL(0x00F43523, sint16);
|
||||
}
|
||||
|
||||
window_new_ride_refresh_widget_sizing(w);
|
||||
@@ -603,7 +603,7 @@ static void window_new_ride_update(rct_window *w)
|
||||
|
||||
widget_invalidate(w->classification, w->number, WIDX_TAB_1 + _window_new_ride_current_tab);
|
||||
|
||||
if (w->var_480 != -1 && w->var_488-- == 0)
|
||||
if (w->new_ride.selected_ride_countdown != -1 && w->new_ride.selected_ride_countdown-- == 0)
|
||||
window_new_ride_select(w);
|
||||
}
|
||||
|
||||
@@ -645,21 +645,22 @@ static void window_new_ride_scrollmousedown()
|
||||
{
|
||||
short x, y;
|
||||
rct_window *w;
|
||||
ride_list_item item;
|
||||
|
||||
window_scrollmouse_get_registers(w, x, y);
|
||||
|
||||
if (RCT2_GLOBAL(0x009DEA6E, uint8) != 0)
|
||||
return;
|
||||
|
||||
ride_list_item item = window_new_ride_scroll_get_ride_list_item_at(w, x, y);
|
||||
item = window_new_ride_scroll_get_ride_list_item_at(w, x, y);
|
||||
if (item.type == 255 && item.entry_index == 255)
|
||||
return;
|
||||
|
||||
RCT2_ADDRESS(0x00F43825, ride_list_item)[_window_new_ride_current_tab] = item;
|
||||
w->var_480 = *((sint16*)&item);
|
||||
w->new_ride.selected_ride_countdown = *((sint16*)&item);
|
||||
|
||||
sound_play_panned(SOUND_CLICK_1, w->x + (w->width / 2));
|
||||
w->var_488 = 8;
|
||||
w->new_ride.selected_ride_countdown = 8;
|
||||
window_invalidate(w);
|
||||
}
|
||||
|
||||
@@ -671,17 +672,18 @@ static void window_new_ride_scrollmouseover()
|
||||
{
|
||||
short x, y;
|
||||
rct_window *w;
|
||||
ride_list_item item;
|
||||
|
||||
window_scrollmouse_get_registers(w, x, y);
|
||||
|
||||
if (w->var_480 != -1)
|
||||
if (w->new_ride.selected_ride_countdown != -1)
|
||||
return;
|
||||
|
||||
ride_list_item item = window_new_ride_scroll_get_ride_list_item_at(w, x, y);
|
||||
if (w->var_482 == *((sint16*)&item))
|
||||
item = window_new_ride_scroll_get_ride_list_item_at(w, x, y);
|
||||
if (w->new_ride.highlighted_ride_id == *((sint16*)&item))
|
||||
return;
|
||||
|
||||
w->var_482 = *((sint16*)&item);
|
||||
w->new_ride.highlighted_ride_id = *((sint16*)&item);
|
||||
RCT2_ADDRESS(0x00F43825, ride_list_item)[_window_new_ride_current_tab] = item;
|
||||
window_invalidate(w);
|
||||
}
|
||||
@@ -737,7 +739,7 @@ static void window_new_ride_paint()
|
||||
window_new_ride_draw_tab_images(dpi, w);
|
||||
|
||||
if (_window_new_ride_current_tab != WINDOW_NEW_RIDE_PAGE_RESEARCH) {
|
||||
ride_list_item item = *((ride_list_item*)&w->var_482);
|
||||
ride_list_item item = *((ride_list_item*)&w->new_ride.highlighted_ride_id);
|
||||
if (item.type == 255 && item.entry_index == 255)
|
||||
return;
|
||||
|
||||
@@ -827,15 +829,16 @@ static void window_new_ride_scrollpaint()
|
||||
int y = 1;
|
||||
ride_list_item *listItem = (ride_list_item*)0x00F43523;
|
||||
while (listItem->type != 255 || listItem->entry_index != 255) {
|
||||
uint8 *rideEntry;
|
||||
// Draw flat button rectangle
|
||||
int flags = 0;
|
||||
if (w->var_480 == *((sint16*)listItem))
|
||||
if (w->new_ride.selected_ride_countdown == *((sint16*)listItem))
|
||||
flags |= 0x20;
|
||||
if (w->var_482 == *((sint16*)listItem) || flags != 0)
|
||||
if (w->new_ride.highlighted_ride_id == *((sint16*)listItem) || flags != 0)
|
||||
gfx_fill_rect_inset(dpi, x, y, x + 115, y + 115, w->colours[1], 0x80 | flags);
|
||||
|
||||
// Draw ride image
|
||||
uint8 *rideEntry = rideEntries[listItem->entry_index];
|
||||
rideEntry = rideEntries[listItem->entry_index];
|
||||
int unk = RCT2_GLOBAL(rideEntry + 4, uint32);
|
||||
if (listItem->type != RCT2_GLOBAL(rideEntry + 12, uint8)) {
|
||||
unk++;
|
||||
@@ -970,7 +973,7 @@ static void window_new_ride_paint_ride_information(rct_window *w, rct_drawpixeli
|
||||
*/
|
||||
static void window_new_ride_select(rct_window *w)
|
||||
{
|
||||
ride_list_item item = *((ride_list_item*)&w->var_480);
|
||||
ride_list_item item = *((ride_list_item*)&w->new_ride.selected_ride_countdown);
|
||||
if (item.type == 255)
|
||||
return;
|
||||
|
||||
|
||||
@@ -107,7 +107,7 @@ void window_news_open()
|
||||
window->colours[0] = 1;
|
||||
window->colours[1] = 1;
|
||||
window->colours[2] = 0;
|
||||
window->var_480 = -1;
|
||||
window->news.var_480 = -1;
|
||||
}
|
||||
|
||||
// sub_66E4BA:
|
||||
@@ -144,17 +144,17 @@ static void window_news_update(rct_window *w)
|
||||
int i, j, x, y, z;
|
||||
rct_news_item *newsItems;
|
||||
|
||||
if (w->var_480 == -1)
|
||||
if (w->news.var_480 == -1)
|
||||
return;
|
||||
if (--w->var_484 != 0)
|
||||
if (--w->news.var_484 != 0)
|
||||
return;
|
||||
|
||||
window_invalidate(w);
|
||||
sound_play_panned(SOUND_CLICK_2, w->x + (w->width / 2));
|
||||
|
||||
newsItems = RCT2_ADDRESS(RCT2_ADDRESS_NEWS_ITEM_LIST, rct_news_item);
|
||||
j = w->var_480;
|
||||
w->var_480 = -1;
|
||||
j = w->news.var_480;
|
||||
w->news.var_480 = -1;
|
||||
for (i = 11; i < 61; i++) {
|
||||
if (newsItems[i].type == NEWS_ITEM_NULL)
|
||||
return;
|
||||
@@ -162,10 +162,11 @@ static void window_news_update(rct_window *w)
|
||||
if (j == 0) {
|
||||
if (newsItems[i].flags & 1)
|
||||
return;
|
||||
if (w->var_482 == 1) {
|
||||
if (w->news.var_482 == 1) {
|
||||
news_item_open_subject(newsItems[i].type, newsItems[i].assoc);
|
||||
return;
|
||||
} else if (w->var_482 > 1) {
|
||||
}
|
||||
else if (w->news.var_482 > 1) {
|
||||
news_item_get_subject_location(newsItems[i].type, newsItems[i].assoc, &x, &y, &z);
|
||||
if (x != SPRITE_LOCATION_NULL)
|
||||
if ((w = window_get_main()) != NULL)
|
||||
@@ -250,9 +251,9 @@ static void window_news_scrollmousedown()
|
||||
}
|
||||
|
||||
if (buttonIndex != 0) {
|
||||
w->var_480 = i - 11;
|
||||
w->var_482 = buttonIndex;
|
||||
w->var_484 = 4;
|
||||
w->news.var_480 = i - 11;
|
||||
w->news.var_482 = buttonIndex;
|
||||
w->news.var_484 = 4;
|
||||
window_invalidate(w);
|
||||
sound_play_panned(SOUND_CLICK_1, w->x + (w->width / 2));
|
||||
}
|
||||
@@ -318,7 +319,7 @@ static void window_news_scrollpaint()
|
||||
// Item text
|
||||
char sz[400];// = (char*)0x09B5F2C;
|
||||
char* args[1];
|
||||
args[0] = &sz;
|
||||
args[0] = (char*)&sz;
|
||||
sprintf(sz, "%c%c%s", newsItem->colour, FORMAT_SMALLFONT, newsItem->text);
|
||||
gfx_draw_string_left_wrapped(dpi, args, 2, y + 10, 325, 1170, 14);
|
||||
|
||||
@@ -328,9 +329,9 @@ static void window_news_scrollpaint()
|
||||
yy = y + 14;
|
||||
|
||||
press = 0;
|
||||
if (w->var_480 != -1) {
|
||||
newsItem2 = &newsItems[11 + w->var_480];
|
||||
if (newsItem == newsItem2 && w->var_482 == 1)
|
||||
if (w->news.var_480 != -1) {
|
||||
newsItem2 = &newsItems[11 + w->news.var_480];
|
||||
if (newsItem == newsItem2 && w->news.var_482 == 1)
|
||||
press = 0x20;
|
||||
}
|
||||
gfx_fill_rect_inset(dpi, x, yy, x + 23, yy + 23, w->colours[2], press);
|
||||
@@ -369,9 +370,9 @@ static void window_news_scrollpaint()
|
||||
yy = y + 14;
|
||||
|
||||
press = 0;
|
||||
if (w->var_480 != -1) {
|
||||
newsItem2 = &newsItems[11 + w->var_480];
|
||||
if (newsItem == newsItem2 && w->var_482 == 2)
|
||||
if (w->news.var_480 != -1) {
|
||||
newsItem2 = &newsItems[11 + w->news.var_480];
|
||||
if (newsItem == newsItem2 && w->news.var_482 == 2)
|
||||
press = 0x20;
|
||||
}
|
||||
gfx_fill_rect_inset(dpi, x, yy, x + 23, yy + 23, w->colours[2], press);
|
||||
|
||||
@@ -574,7 +574,6 @@ static uint32 window_park_page_enabled_widgets[] = {
|
||||
#pragma endregion
|
||||
|
||||
static void window_park_init_viewport(rct_window *w);
|
||||
static void window_park_scroll_to_viewport(rct_window *w);
|
||||
static void window_park_set_page(rct_window *w, int page);
|
||||
static void window_park_anchor_border_widgets(rct_window *w);
|
||||
static void window_park_align_tabs(rct_window *w);
|
||||
@@ -594,7 +593,7 @@ rct_window *window_park_open()
|
||||
w->enabled_widgets = window_park_page_enabled_widgets[WINDOW_PARK_PAGE_ENTRANCE];
|
||||
w->number = 0;
|
||||
w->page = WINDOW_PARK_PAGE_ENTRANCE;
|
||||
w->var_482 = 0;
|
||||
w->viewport_focus_coordinates.y = 0;
|
||||
w->frame_no = 0;
|
||||
w->list_information_type = -1;
|
||||
w->var_48C = -1;
|
||||
@@ -620,8 +619,8 @@ void window_park_entrance_open()
|
||||
window = window_bring_to_front_by_id(WC_PARK_INFORMATION, 0);
|
||||
if (window == NULL) {
|
||||
window = window_park_open();
|
||||
window->var_482 = -1;
|
||||
window->var_484 = -1;
|
||||
window->viewport_focus_coordinates.y = -1;
|
||||
window->viewport_focus_coordinates.x = -1;
|
||||
}
|
||||
|
||||
window->page = WINDOW_PARK_PAGE_ENTRANCE;
|
||||
@@ -680,7 +679,7 @@ static void window_park_entrance_mouseup()
|
||||
RCT2_CALLPROC_X(0x00668393, 0, 0, 0, widgetIndex, (int)w, 0, 0);
|
||||
break;
|
||||
case WIDX_LOCATE:
|
||||
window_park_scroll_to_viewport(w);
|
||||
window_scroll_to_viewport(w);
|
||||
break;
|
||||
case WIDX_RENAME:
|
||||
RCT2_GLOBAL(0x013CE962, uint32) = RCT2_GLOBAL(0x013573D8, uint32);
|
||||
@@ -1022,10 +1021,11 @@ static void window_park_init_viewport(rct_window *w)
|
||||
// Call invalidate event
|
||||
RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, (int)w, 0, 0);
|
||||
|
||||
w->var_482 = x;
|
||||
w->var_484 = y;
|
||||
w->var_486 = z;
|
||||
w->var_488 = r << 8;
|
||||
w->viewport_focus_coordinates.x = x;
|
||||
w->viewport_focus_coordinates.y = y;
|
||||
w->viewport_focus_sprite.type |= VIEWPORT_FOCUS_TYPE_COORDINATE;
|
||||
w->viewport_focus_coordinates.z = z;
|
||||
w->viewport_focus_coordinates.rotation = r;
|
||||
|
||||
if (zr != 0xFFFF) {
|
||||
// Create viewport
|
||||
@@ -1037,11 +1037,11 @@ static void window_park_init_viewport(rct_window *w)
|
||||
w->y + viewportWidget->top + 1,
|
||||
(viewportWidget->right - viewportWidget->left) - 2,
|
||||
(viewportWidget->bottom - viewportWidget->top) - 2,
|
||||
zr&0xFF,
|
||||
0,
|
||||
x,
|
||||
y,
|
||||
z,
|
||||
xy&0xC0000000 >> 30,
|
||||
w->viewport_focus_sprite.type & VIEWPORT_FOCUS_TYPE_MASK,
|
||||
-1
|
||||
);
|
||||
w->flags |= (1 << 2);
|
||||
@@ -1054,30 +1054,6 @@ static void window_park_init_viewport(rct_window *w)
|
||||
window_invalidate(w);
|
||||
}
|
||||
|
||||
static void window_park_scroll_to_viewport(rct_window *w)
|
||||
{
|
||||
int x, y, z;
|
||||
rct_window *mainWindow;
|
||||
|
||||
if (w->viewport == NULL || *((sint32*)&w->var_482) == -1)
|
||||
return;
|
||||
|
||||
if (*((uint32*)&w->var_486) & 0x80000000) {
|
||||
rct_sprite *sprite = &(g_sprite_list[w->var_482]);
|
||||
x = sprite->unknown.x;
|
||||
y = sprite->unknown.y;
|
||||
z = sprite->unknown.z;
|
||||
} else {
|
||||
x = w->var_482;
|
||||
y = w->var_484;
|
||||
z = w->var_486;
|
||||
}
|
||||
|
||||
mainWindow = window_get_main();
|
||||
if (mainWindow != NULL)
|
||||
window_scroll_to_location(mainWindow, x, y, z);
|
||||
}
|
||||
|
||||
#pragma endregion
|
||||
|
||||
#pragma region Rating page
|
||||
@@ -1093,8 +1069,8 @@ void window_park_rating_open()
|
||||
window = window_bring_to_front_by_id(WC_PARK_INFORMATION, 0);
|
||||
if (window == NULL) {
|
||||
window = window_park_open();
|
||||
window->var_482 = -1;
|
||||
window->var_484 = -1;
|
||||
window->viewport_focus_coordinates.x = -1;
|
||||
window->viewport_focus_coordinates.y = -1;
|
||||
}
|
||||
|
||||
if (RCT2_GLOBAL(0x009DE518, uint32) & (1 << 3))
|
||||
@@ -1227,8 +1203,8 @@ void window_park_guests_open()
|
||||
window = window_bring_to_front_by_id(WC_PARK_INFORMATION, 0);
|
||||
if (window == NULL) {
|
||||
window = window_park_open();
|
||||
window->var_482 = -1;
|
||||
window->var_484 = -1;
|
||||
window->viewport_focus_coordinates.x = -1;
|
||||
window->viewport_focus_coordinates.y = -1;
|
||||
}
|
||||
|
||||
if (RCT2_GLOBAL(0x009DE518, uint32) & (1 << 3))
|
||||
@@ -1633,8 +1609,8 @@ void window_park_objective_open()
|
||||
window = window_bring_to_front_by_id(WC_PARK_INFORMATION, 0);
|
||||
if (window == NULL) {
|
||||
window = window_park_open();
|
||||
window->var_482 = -1;
|
||||
window->var_484 = -1;
|
||||
window->viewport_focus_coordinates.x = -1;
|
||||
window->viewport_focus_coordinates.y = -1;
|
||||
}
|
||||
|
||||
if (RCT2_GLOBAL(0x009DE518, uint32) & (1 << 3))
|
||||
@@ -1796,8 +1772,8 @@ void window_park_awards_open()
|
||||
window = window_bring_to_front_by_id(WC_PARK_INFORMATION, 0);
|
||||
if (window == NULL) {
|
||||
window = window_park_open();
|
||||
window->var_482 = -1;
|
||||
window->var_484 = -1;
|
||||
window->viewport_focus_coordinates.x = -1;
|
||||
window->viewport_focus_coordinates.y = -1;
|
||||
}
|
||||
|
||||
if (RCT2_GLOBAL(0x009DE518, uint32) & (1 << 3))
|
||||
|
||||
@@ -20,10 +20,13 @@
|
||||
|
||||
#include "addresses.h"
|
||||
#include "game.h"
|
||||
#include "map.h"
|
||||
#include "ride.h"
|
||||
#include "peep.h"
|
||||
#include "string_ids.h"
|
||||
#include "sprite.h"
|
||||
#include "sprites.h"
|
||||
#include "viewport.h"
|
||||
#include "widget.h"
|
||||
#include "window.h"
|
||||
#include "window_dropdown.h"
|
||||
@@ -48,6 +51,14 @@ enum WINDOW_PEEP_WIDGET_IDX {
|
||||
WIDX_TAB_4,
|
||||
WIDX_TAB_5,
|
||||
WIDX_TAB_6,
|
||||
|
||||
WIDX_MARQUEE = 10,
|
||||
WIDX_VIEWPORT,
|
||||
WIDX_ACTION_LBL,
|
||||
WIDX_PICKUP,
|
||||
WIDX_RENAME,
|
||||
WIDX_LOCATE,
|
||||
WIDX_TRACK
|
||||
};
|
||||
|
||||
void window_peep_emptysub(){};
|
||||
@@ -66,21 +77,36 @@ rct_widget window_peep_overview_widgets[] = {
|
||||
{ WWT_12, 1, 3, 166, 45, 56, 0x0FFFFFFFF, STR_NONE}, // Label Thought marquee
|
||||
{ WWT_VIEWPORT, 1, 3, 166, 57, 143, 0x0FFFFFFFF, STR_NONE }, // Viewport
|
||||
{ WWT_12, 1, 3, 166, 144, 154, 0x0FFFFFFFF, STR_NONE}, // Label Action
|
||||
{ WWT_FLATBTN, 1, 167, 190, 45, 68, SPR_RENAME, 1706}, // Rename Button
|
||||
{ WWT_FLATBTN, 1, 167, 190, 69, 92, 0x1430, 1055}, // Pickup Button
|
||||
{ WWT_FLATBTN, 1, 167, 190, 45, 68, SPR_RENAME, 1706}, // Pickup Button
|
||||
{ WWT_FLATBTN, 1, 167, 190, 69, 92, 0x1430, 1055}, // Rename Button
|
||||
{ WWT_FLATBTN, 1, 167, 190, 93, 116, SPR_LOCATE, STR_LOCATE_SUBJECT_TIP},// Locate Button
|
||||
{ WWT_FLATBTN, 1, 167, 190, 117, 140, SPR_TRACK_PEEP, 1930}, // Track Button
|
||||
{ WIDGETS_END },
|
||||
};
|
||||
|
||||
//0x981D0C
|
||||
rct_widget *window_peep_page_widgets[] = {
|
||||
window_peep_overview_widgets
|
||||
window_peep_overview_widgets,
|
||||
(rct_widget *)0x9AC45C,
|
||||
(rct_widget *)0x9ac500,
|
||||
(rct_widget *)0x9ac5b4,
|
||||
(rct_widget *)0x9ac658,
|
||||
(rct_widget *)0x9ac6FC
|
||||
};
|
||||
|
||||
void window_peep_set_page(rct_window* w, int page);
|
||||
void window_peep_disable_widgets(rct_window* w);
|
||||
void window_peep_viewport_init(rct_window* w);
|
||||
|
||||
void window_peep_close();
|
||||
void window_peep_resize();
|
||||
void window_peep_overview_mouse_up();
|
||||
void window_peep_overview_paint();
|
||||
|
||||
static void* window_peep_overview_events[] = {
|
||||
(void*)0x696A75,
|
||||
(void*)0x696A06,
|
||||
(void*)0x696FBE,
|
||||
window_peep_close,
|
||||
window_peep_overview_mouse_up,
|
||||
window_peep_resize,
|
||||
window_peep_emptysub,
|
||||
window_peep_emptysub,
|
||||
window_peep_emptysub,
|
||||
@@ -104,15 +130,67 @@ static void* window_peep_overview_events[] = {
|
||||
window_peep_emptysub,
|
||||
window_peep_emptysub,
|
||||
(void*)0x696749, //Invalidate
|
||||
(void*)0x696887, //Paint
|
||||
window_peep_overview_paint, //Paint
|
||||
(void*)0x69707C
|
||||
};
|
||||
|
||||
//0x981D24
|
||||
void* window_peep_page_events[] = {
|
||||
window_peep_overview_events
|
||||
window_peep_overview_events,
|
||||
(void*)0x982468,
|
||||
(void*)0x9824d8,
|
||||
(void*)0x982548,
|
||||
(void*)0x9825b8,
|
||||
(void*)0x982628
|
||||
};
|
||||
|
||||
//0x981D3C
|
||||
uint32 window_peep_page_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_RENAME)|
|
||||
(1 << WIDX_PICKUP)|
|
||||
(1 << WIDX_LOCATE)|
|
||||
(1 << WIDX_TRACK),
|
||||
|
||||
(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_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_?),
|
||||
|
||||
(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_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_CLOSE) |
|
||||
(1 << WIDX_TAB_1) |
|
||||
(1 << WIDX_TAB_2) |
|
||||
@@ -142,12 +220,12 @@ void window_peep_open(rct_peep* peep){
|
||||
window->enabled_widgets = window_peep_page_enabled_widgets[0];
|
||||
window->number = peep->sprite_index;
|
||||
window->page = 0;
|
||||
window->var_482 = 0;
|
||||
window->viewport_focus_coordinates.y = 0;
|
||||
window->frame_no = 0;
|
||||
window->list_information_type = 0;
|
||||
window->var_492 = 0;
|
||||
window->var_494 = 0;
|
||||
RCT2_CALLPROC_X(0x006987A6, 0, 0, 0, 0, (int)window, 0, 0);
|
||||
window_peep_disable_widgets(window);
|
||||
window->min_width = 192;
|
||||
window->min_height = 157;
|
||||
window->max_width = 500;
|
||||
@@ -158,19 +236,286 @@ void window_peep_open(rct_peep* peep){
|
||||
window->colours[0] = 1;
|
||||
window->colours[1] = 15;
|
||||
window->colours[2] = 15;
|
||||
window->var_482 = -1;
|
||||
window->viewport_focus_coordinates.y = -1;
|
||||
}
|
||||
|
||||
window->page = 0;
|
||||
window_invalidate(window);
|
||||
|
||||
window->widgets = RCT2_GLOBAL(0x981D0C, rct_widget*);
|
||||
window->enabled_widgets = RCT2_GLOBAL(0x981D3C,uint32);
|
||||
window->widgets = window_peep_page_widgets[WINDOW_PEEP_OVERVIEW];
|
||||
window->enabled_widgets = window_peep_page_enabled_widgets[WINDOW_PEEP_OVERVIEW];
|
||||
window->var_020 = RCT2_GLOBAL(0x981D54,uint32);
|
||||
window->event_handlers = RCT2_GLOBAL(0x981D24,uint32*);
|
||||
window->event_handlers = window_peep_page_events[WINDOW_PEEP_OVERVIEW];
|
||||
window->pressed_widgets = 0;
|
||||
|
||||
RCT2_CALLPROC_X(0x006987A6, 0, 0, 0, 0, (int)window, 0, 0);
|
||||
window_peep_disable_widgets(window);
|
||||
window_init_scroll_widgets(window);
|
||||
RCT2_CALLPROC_X(0x0069883C, 0, 0, 0, 0, (int)window, 0, 0);
|
||||
window_peep_viewport_init(window);
|
||||
}
|
||||
|
||||
/* rct2: 0x006987A6
|
||||
* Disables the finance tab when no money.
|
||||
* Disables peep pickup when in certain no pickup states.
|
||||
*/
|
||||
void window_peep_disable_widgets(rct_window* w){
|
||||
rct_peep* peep = &g_sprite_list[w->number].peep;
|
||||
uint64 disabled_widgets = 0;
|
||||
|
||||
if (peep_can_be_picked_up(peep)){
|
||||
if (w->disabled_widgets & (1 << WIDX_PICKUP))
|
||||
window_invalidate(w);
|
||||
}
|
||||
else{
|
||||
disabled_widgets = (1 << WIDX_PICKUP);
|
||||
if (!(w->disabled_widgets & (1 << WIDX_PICKUP)))
|
||||
window_invalidate(w);
|
||||
}
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_11){
|
||||
disabled_widgets |= (1 << WIDX_TAB_4); //Disable finance tab if no money
|
||||
}
|
||||
w->disabled_widgets = disabled_widgets;
|
||||
}
|
||||
|
||||
/* rct2: 0x00696A75 */
|
||||
void window_peep_close(){
|
||||
rct_window* w;
|
||||
|
||||
window_get_register(w);
|
||||
|
||||
if (RCT2_GLOBAL(0x9DE518,uint32) & (1<<3)){
|
||||
if (w->classification == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS,rct_windowclass) &&
|
||||
w->number == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWNUMBER,rct_windownumber))
|
||||
tool_cancel();
|
||||
}
|
||||
}
|
||||
|
||||
/* rct2: 0x00696FBE */
|
||||
void window_peep_resize(){
|
||||
rct_window* w;
|
||||
|
||||
window_get_register(w);
|
||||
|
||||
window_peep_disable_widgets(w);
|
||||
RCT2_CALLPROC_EBPSAFE(w->event_handlers[WE_INVALIDATE]);
|
||||
|
||||
window_invalidate_by_id(0xA97, w->number);
|
||||
|
||||
window_set_resize(w, 192, 159, 500, 450);
|
||||
|
||||
rct_viewport* view = w->viewport;
|
||||
|
||||
if (view){
|
||||
if ((w->width - 30) == view->width){
|
||||
if ((w->height - 72) == view->height){
|
||||
window_peep_viewport_init(w);
|
||||
return;
|
||||
}
|
||||
}
|
||||
uint8 zoom_amount = 1 << view->zoom;
|
||||
view->width = w->width - 30;
|
||||
view->height = w->height - 72;
|
||||
view->view_width = view->width / zoom_amount;
|
||||
view->view_height = view->height / zoom_amount;
|
||||
}
|
||||
window_peep_viewport_init(w);
|
||||
}
|
||||
|
||||
/* rct2: 0x00696A06 */
|
||||
void window_peep_overview_mouse_up(){
|
||||
short widgetIndex;
|
||||
rct_window* w;
|
||||
window_widget_get_registers(w, widgetIndex);
|
||||
|
||||
switch(widgetIndex){
|
||||
case WIDX_CLOSE:
|
||||
window_close(w);
|
||||
break;
|
||||
case WIDX_TAB_1:
|
||||
case WIDX_TAB_2:
|
||||
case WIDX_TAB_3:
|
||||
case WIDX_TAB_4:
|
||||
case WIDX_TAB_5:
|
||||
case WIDX_TAB_6:
|
||||
window_peep_set_page(w, widgetIndex - WIDX_TAB_1);
|
||||
break;
|
||||
case WIDX_PICKUP:
|
||||
//696ba6
|
||||
break;
|
||||
case WIDX_RENAME:
|
||||
//696e4d
|
||||
break;
|
||||
case WIDX_LOCATE:
|
||||
window_scroll_to_viewport(w);
|
||||
break;
|
||||
case WIDX_TRACK:
|
||||
g_sprite_list[w->number].peep.flags ^= PEEP_FLAGS_TRACKING;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void window_peep_set_page(rct_window* w, int page){
|
||||
if (RCT2_GLOBAL(0x9DE518,uint32) & (1 << 3))
|
||||
{
|
||||
if(w->number == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWNUMBER, rct_windownumber) &&
|
||||
w->classification == RCT2_GLOBAL(RCT2_ADDRESS_TOOL_WINDOWCLASS, rct_windowclass))
|
||||
tool_cancel();
|
||||
|
||||
}
|
||||
int listen = 0;
|
||||
if ( page == WINDOW_PEEP_OVERVIEW && w->page==WINDOW_PEEP_OVERVIEW && w->viewport){
|
||||
if(!(w->viewport->flags & VIEWPORT_FLAG_SOUND_ON))
|
||||
listen = 1;
|
||||
}
|
||||
|
||||
|
||||
w->page = page;
|
||||
w->frame_no = 0;
|
||||
w->no_list_items = 0;
|
||||
w->selected_list_item = -1;
|
||||
|
||||
rct_viewport* viewport = w->viewport;
|
||||
w->viewport = 0;
|
||||
if (viewport){
|
||||
viewport->width = 0;
|
||||
}
|
||||
|
||||
w->enabled_widgets = window_peep_page_enabled_widgets[page];
|
||||
w->var_020 = RCT2_ADDRESS(0x981D54,uint32)[page];
|
||||
w->event_handlers = window_peep_page_events[page];
|
||||
w->pressed_widgets = 0;
|
||||
w->widgets = window_peep_page_widgets[page];
|
||||
window_peep_disable_widgets(w);
|
||||
window_invalidate(w);
|
||||
|
||||
RCT2_CALLPROC_X(w->event_handlers[WE_RESIZE], 0, 0, 0, 0, (int)w, 0, 0);
|
||||
RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, (int)w, 0, 0);
|
||||
|
||||
window_init_scroll_widgets(w);
|
||||
window_invalidate(w);
|
||||
|
||||
if (listen && w->viewport) w->viewport->flags |= VIEWPORT_FLAG_SOUND_ON;
|
||||
}
|
||||
|
||||
/* rct2: 0x0069883C */
|
||||
void window_peep_viewport_init(rct_window* w){
|
||||
if (w->page != WINDOW_PEEP_OVERVIEW) return;
|
||||
|
||||
union{
|
||||
sprite_focus sprite;
|
||||
coordinate_focus coordinate;
|
||||
} focus; //The focus will be either a sprite or a coordinate.
|
||||
|
||||
focus.sprite.sprite_id = w->number;
|
||||
|
||||
rct_peep* peep = GET_PEEP(w->number);
|
||||
|
||||
if (peep->state == PEEP_STATE_PICKED){
|
||||
focus.sprite.sprite_id = -1;
|
||||
}
|
||||
else{
|
||||
uint8 final_check = 1;
|
||||
if (peep->state == PEEP_STATE_ON_RIDE
|
||||
|| peep->state == PEEP_STATE_ENTERING_RIDE
|
||||
|| (peep->state == PEEP_STATE_LEAVING_RIDE && peep->x == SPRITE_LOCATION_NULL)){
|
||||
|
||||
rct_ride* ride = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[peep->current_ride]);
|
||||
if (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_TRACK){
|
||||
rct_vehicle* train = GET_VEHICLE(ride->train_car_map[peep->current_train]);
|
||||
int car = peep->current_car;
|
||||
|
||||
for (; car != 0; car--){
|
||||
train = GET_VEHICLE(train->next_vehicle_on_train);
|
||||
}
|
||||
|
||||
focus.sprite.sprite_id = train->sprite_index;
|
||||
final_check = 0;
|
||||
}
|
||||
}
|
||||
if (peep->x == SPRITE_LOCATION_NULL && final_check){
|
||||
rct_ride* ride = &(RCT2_ADDRESS(RCT2_ADDRESS_RIDE_LIST, rct_ride)[peep->current_ride]);
|
||||
int x = ride->overall_view & 0xFF * 32 + 16;
|
||||
int y = (ride->overall_view >> 8) * 32 + 16;
|
||||
int height = map_element_height(x, y);
|
||||
height += 32;
|
||||
focus.coordinate.x = x;
|
||||
focus.coordinate.y = y;
|
||||
focus.coordinate.z = height;
|
||||
focus.sprite.type |= VIEWPORT_FOCUS_TYPE_COORDINATE;
|
||||
}
|
||||
else{
|
||||
focus.sprite.type |= VIEWPORT_FOCUS_TYPE_SPRITE | VIEWPORT_FOCUS_TYPE_COORDINATE;
|
||||
focus.sprite.pad_486 &= 0xFFFF;
|
||||
}
|
||||
focus.coordinate.rotation = RCT2_GLOBAL(RCT2_ADDRESS_CURRENT_ROTATION, uint8);
|
||||
}
|
||||
|
||||
uint16 viewport_flags;
|
||||
|
||||
if (w->viewport){
|
||||
//Check all combos, for now skipping y and rot
|
||||
if (focus.coordinate.x == w->viewport_focus_coordinates.x &&
|
||||
focus.coordinate.y == w->viewport_focus_coordinates.y &&
|
||||
focus.coordinate.z == w->viewport_focus_coordinates.z &&
|
||||
focus.coordinate.rotation == w->viewport_focus_coordinates.rotation)
|
||||
return;
|
||||
|
||||
viewport_flags = w->viewport->flags;
|
||||
w->viewport->width = 0;
|
||||
w->viewport = 0;
|
||||
|
||||
viewport_update_pointers();
|
||||
}
|
||||
else{
|
||||
viewport_flags = 0;
|
||||
if (RCT2_GLOBAL(RCT2_ADDRESS_CONFIG_FLAGS, uint8) & 0x1)
|
||||
viewport_flags |= VIEWPORT_FLAG_GRIDLINES;
|
||||
}
|
||||
|
||||
RCT2_CALLPROC_X(w->event_handlers[WE_INVALIDATE], 0, 0, 0, 0, (int)w, 0, 0);
|
||||
|
||||
w->viewport_focus_coordinates.x = focus.coordinate.x;
|
||||
w->viewport_focus_coordinates.y = focus.coordinate.y;
|
||||
w->viewport_focus_coordinates.z = focus.coordinate.z;
|
||||
w->viewport_focus_coordinates.rotation = focus.coordinate.rotation;
|
||||
|
||||
if (peep->state != PEEP_STATE_PICKED){
|
||||
if (!(w->viewport)){
|
||||
rct_widget* view_widget = &w->widgets[WIDX_VIEWPORT];
|
||||
|
||||
int x = view_widget->left + 1 + w->x;
|
||||
int y = view_widget->top + 1 + w->y;
|
||||
int width = view_widget->right - view_widget->left - 1;
|
||||
int height = view_widget->bottom - view_widget->top - 1;
|
||||
|
||||
viewport_create(w, x, y, width, height, 0, focus.coordinate.x, focus.coordinate.y, focus.coordinate.z, focus.sprite.type & VIEWPORT_FOCUS_TYPE_MASK, focus.sprite.sprite_id);
|
||||
w->flags |= WF_2;
|
||||
window_invalidate(w);
|
||||
}
|
||||
}
|
||||
|
||||
if (w->viewport)
|
||||
w->viewport->flags = viewport_flags;
|
||||
window_invalidate(w);
|
||||
}
|
||||
|
||||
/* rct2: 0x696887 */
|
||||
void window_peep_overview_paint(){
|
||||
rct_window *w;
|
||||
rct_drawpixelinfo *dpi;
|
||||
rct_widget *labelWidget;
|
||||
|
||||
window_paint_get_registers(w, dpi);
|
||||
RCT2_CALLPROC_X(0x696887, 0, 0, 0, 0, w, dpi, 0);
|
||||
return;
|
||||
|
||||
window_draw_widgets(w, dpi);
|
||||
//6983dd
|
||||
//698597
|
||||
//6985d8
|
||||
//69861f
|
||||
//69869b
|
||||
//698661
|
||||
if (w->viewport){
|
||||
window_draw_viewport(dpi, w);
|
||||
}
|
||||
}
|
||||
@@ -186,7 +186,7 @@ rct_window* sub_6BEF1B(rct_peep* peep)
|
||||
w->enabled_widgets = RCT2_GLOBAL(0x9929B0, uint32);
|
||||
w->number = peep->sprite_index;
|
||||
w->page = 0;
|
||||
w->var_482 = 0;
|
||||
w->viewport_focus_coordinates.y = 0;
|
||||
w->frame_no = 0;
|
||||
|
||||
RCT2_GLOBAL((int*)w + 0x496, uint16) = 0; // missing, var_494 should perhaps be uint16?
|
||||
|
||||
@@ -128,7 +128,7 @@ void window_scenarioselect_open()
|
||||
window->colours[0] = 1;
|
||||
window->colours[1] = 26;
|
||||
window->colours[2] = 26;
|
||||
window->var_480 = -1;
|
||||
window->viewport_focus_coordinates.var_480 = -1;
|
||||
window->var_494 = 0;
|
||||
|
||||
window_scenarioselect_init_tabs();
|
||||
|
||||
Reference in New Issue
Block a user