1
0
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:
Ted John
2014-08-23 14:10:52 +01:00
15 changed files with 572 additions and 138 deletions

View File

@@ -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;
}

View File

@@ -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();

View File

@@ -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];

View File

@@ -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

View File

@@ -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;

View File

@@ -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

View File

@@ -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();

View File

@@ -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;

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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);

View File

@@ -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))

View File

@@ -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);
}
}

View File

@@ -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?

View File

@@ -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();