diff --git a/src/peep/peep.h b/src/peep/peep.h index 7fe9943a2c..e9e665e9bb 100644 --- a/src/peep/peep.h +++ b/src/peep/peep.h @@ -332,9 +332,9 @@ typedef struct { uint8 pad_2C; uint8 sprite_type; // 0x2D uint8 type; // 0x2E - union{ // 0x2F - uint8 staff_type; - uint8 no_of_rides; + union{ + uint8 staff_type; // 0x2F + uint8 no_of_rides; // 0x2F }; uint8 tshirt_colour; // 0x30 uint8 trousers_colour; // 0x31 diff --git a/src/sprites.h b/src/sprites.h index 78116c46d0..0ab9a63981 100644 --- a/src/sprites.h +++ b/src/sprites.h @@ -122,6 +122,14 @@ enum { SPR_PEEP_LARGE_FACE_ANGRY = 5314, + SPR_TAB_STAFF_OPTIONS_0 = 5319, + SPR_TAB_STAFF_OPTIONS_1 = SPR_TAB_STAFF_OPTIONS_0 + 1, + SPR_TAB_STAFF_OPTIONS_2 = SPR_TAB_STAFF_OPTIONS_0 + 2, + SPR_TAB_STAFF_OPTIONS_3 = SPR_TAB_STAFF_OPTIONS_0 + 3, + SPR_TAB_STAFF_OPTIONS_4 = SPR_TAB_STAFF_OPTIONS_0 + 4, + SPR_TAB_STAFF_OPTIONS_5 = SPR_TAB_STAFF_OPTIONS_0 + 5, + SPR_TAB_STAFF_OPTIONS_6 = SPR_TAB_STAFF_OPTIONS_0 + 6, + SPR_TAB_FINANCES_RESEARCH_0 = 5327, SPR_TAB_SHOPS_AND_STALLS_0 = 5351, diff --git a/src/windows/staff.c b/src/windows/staff.c index eeba5e8f3d..1179c8d447 100644 --- a/src/windows/staff.c +++ b/src/windows/staff.c @@ -133,14 +133,22 @@ void window_staff_overview_resize(); void window_staff_overview_mousedown(int widgetIndex, rct_window* w, rct_widget* widget); void window_staff_overview_dropdown(); void window_staff_overview_update(rct_window* w); +void window_staff_overview_invalidate(); +void window_staff_overview_paint(); +void window_staff_overview_tab_paint(rct_window* w, rct_drawpixelinfo* dpi); -void window_staff_orders_mouseup(); -void window_staff_orders_update(rct_window* w); +void window_staff_options_mouseup(); +void window_staff_options_update(rct_window* w); +void window_staff_options_invalidate(); +void window_staff_options_paint(); +void window_staff_options_tab_paint(rct_window* w, rct_drawpixelinfo* dpi); void window_staff_stats_mouseup(); void window_staff_stats_resize(); void window_staff_stats_update(rct_window* w); void window_staff_stats_invalidate(); +void window_staff_stats_paint(); +void window_staff_stats_tab_paint(rct_window* w, rct_drawpixelinfo* dpi); // 0x992AEC static void* window_staff_overview_events[] = { @@ -169,20 +177,20 @@ static void* window_staff_overview_events[] = { window_staff_emptysub, window_staff_emptysub, window_staff_emptysub, - (void*)0x6BDD91, //Invalidate - (void*)0x6BDEAF, //Paint + window_staff_overview_invalidate, //Invalidate + window_staff_overview_paint, //Paint window_staff_emptysub }; // 0x992B5C -static void* window_staff_orders_events[] = { +static void* window_staff_options_events[] = { window_staff_emptysub, - window_staff_orders_mouseup, + window_staff_options_mouseup, window_staff_stats_resize, (void*)0x6BE802, (void*)0x6BE809, window_staff_unknown_05, - window_staff_orders_update, + window_staff_options_update, window_staff_emptysub, window_staff_emptysub, window_staff_emptysub, @@ -201,8 +209,8 @@ static void* window_staff_orders_events[] = { window_staff_emptysub, window_staff_emptysub, window_staff_emptysub, - (void*)0x6BE62B, //Invalidate - (void*)0x6BE7C6, //Paint + window_staff_options_invalidate, //Invalidate + window_staff_options_paint, //Paint window_staff_emptysub }; @@ -234,13 +242,13 @@ static void* window_staff_stats_events[] = { window_staff_emptysub, window_staff_emptysub, window_staff_stats_invalidate, //Invalidate - (void*)0x6BEA86, //Paint + window_staff_stats_paint, //Paint window_staff_emptysub }; void* window_staff_page_events[] = { window_staff_overview_events, - window_staff_orders_events, + window_staff_options_events, window_staff_stats_events }; @@ -599,7 +607,7 @@ void window_staff_set_order(rct_window* w, int order_id) } /** rct2: 0x006BE7DB */ -void window_staff_orders_mouseup() +void window_staff_options_mouseup() { short widgetIndex; rct_window* w; @@ -624,7 +632,7 @@ void window_staff_orders_mouseup() } /** rct2: 0x006BE960 */ -void window_staff_orders_update(rct_window* w) +void window_staff_options_update(rct_window* w) { w->frame_no++; widget_invalidate(WC_PEEP, w->number, WIDX_TAB_2); @@ -731,4 +739,318 @@ void window_staff_stats_invalidate(){ window_staff_stats_widgets[WIDX_CLOSE].right = w->width - 3; window_align_tabs(w, WIDX_TAB_1, WIDX_TAB_3); +} + + +/* rct2: 0x006BE62B */ +void window_staff_options_invalidate(){ + rct_window* w; + window_get_register(w); + + if (window_staff_page_widgets[w->page] != w->widgets){ + w->widgets = window_staff_page_widgets[w->page]; + window_init_scroll_widgets(w); + } + + w->pressed_widgets |= 1ULL << (w->page + WIDX_TAB_1); + + rct_peep* peep = GET_PEEP(w->number); + + RCT2_GLOBAL(0x13CE952, uint16) = peep->name_string_idx; + RCT2_GLOBAL(0x13CE954, uint32) = peep->id; + + switch (peep->staff_type){ + case STAFF_TYPE_ENTERTAINER: + window_staff_options_widgets[WIDX_CHECKBOX_1].type = WWT_EMPTY; + window_staff_options_widgets[WIDX_CHECKBOX_2].type = WWT_EMPTY; + window_staff_options_widgets[WIDX_CHECKBOX_3].type = WWT_EMPTY; + window_staff_options_widgets[WIDX_CHECKBOX_4].type = WWT_EMPTY; + window_staff_options_widgets[WIDX_COSTUME_BOX].type = WWT_DROPDOWN; + window_staff_options_widgets[WIDX_COSTUME_BTN].type = WWT_DROPDOWN_BUTTON; + window_staff_options_widgets[WIDX_COSTUME_BOX].image = 1779 + peep->sprite_type - 4; + break; + case STAFF_TYPE_HANDYMAN: + window_staff_options_widgets[WIDX_CHECKBOX_1].type = WWT_CHECKBOX; + window_staff_options_widgets[WIDX_CHECKBOX_1].image = 1712; + window_staff_options_widgets[WIDX_CHECKBOX_2].type = WWT_CHECKBOX; + window_staff_options_widgets[WIDX_CHECKBOX_2].image = 1713; + window_staff_options_widgets[WIDX_CHECKBOX_3].type = WWT_CHECKBOX; + window_staff_options_widgets[WIDX_CHECKBOX_3].image = 1714; + window_staff_options_widgets[WIDX_CHECKBOX_4].type = WWT_CHECKBOX; + window_staff_options_widgets[WIDX_CHECKBOX_4].image = 1715; + window_staff_options_widgets[WIDX_COSTUME_BOX].type = WWT_EMPTY; + window_staff_options_widgets[WIDX_COSTUME_BTN].type = WWT_EMPTY; + w->pressed_widgets &= ~((1 << WIDX_CHECKBOX_1) | (1 << WIDX_CHECKBOX_2) | (1 << WIDX_CHECKBOX_3) | (1 << WIDX_CHECKBOX_4)); + w->pressed_widgets |= peep->staff_orders << WIDX_CHECKBOX_1; + break; + case STAFF_TYPE_MECHANIC: + window_staff_options_widgets[WIDX_CHECKBOX_1].type = WWT_CHECKBOX; + window_staff_options_widgets[WIDX_CHECKBOX_1].image = 1876; + window_staff_options_widgets[WIDX_CHECKBOX_2].type = WWT_CHECKBOX; + window_staff_options_widgets[WIDX_CHECKBOX_2].image = 1877; + window_staff_options_widgets[WIDX_CHECKBOX_3].type = WWT_EMPTY; + window_staff_options_widgets[WIDX_CHECKBOX_4].type = WWT_EMPTY; + window_staff_options_widgets[WIDX_COSTUME_BOX].type = WWT_EMPTY; + window_staff_options_widgets[WIDX_COSTUME_BTN].type = WWT_EMPTY; + w->pressed_widgets &= ~((1 << WIDX_CHECKBOX_1) | (1 << WIDX_CHECKBOX_2)); + w->pressed_widgets |= peep->staff_orders << WIDX_CHECKBOX_1; + break; + case STAFF_TYPE_SECURITY: + // Security guards don't have an options screen. + break; + } + + window_staff_options_widgets[WIDX_BACKGROUND].right = w->width - 1; + window_staff_options_widgets[WIDX_BACKGROUND].bottom = w->height - 1; + + window_staff_options_widgets[WIDX_RESIZE].right = w->width - 1; + window_staff_options_widgets[WIDX_RESIZE].bottom = w->height - 1; + + window_staff_options_widgets[WIDX_TITLE].right = w->width - 2; + + window_staff_options_widgets[WIDX_CLOSE].left = w->width - 13; + window_staff_options_widgets[WIDX_CLOSE].right = w->width - 3; + + window_align_tabs(w, WIDX_TAB_1, WIDX_TAB_3); +} + +/* rct2: 0x006BDD91 */ +void window_staff_overview_invalidate(){ + rct_window* w; + window_get_register(w); + + if (window_staff_page_widgets[w->page] != w->widgets){ + w->widgets = window_staff_page_widgets[w->page]; + window_init_scroll_widgets(w); + } + + w->pressed_widgets |= 1ULL << (w->page + WIDX_TAB_1); + + rct_peep* peep = GET_PEEP(w->number); + + RCT2_GLOBAL(0x13CE952, uint16) = peep->name_string_idx; + RCT2_GLOBAL(0x13CE954, uint32) = peep->id; + + window_staff_overview_widgets[WIDX_BACKGROUND].right = w->width - 1; + window_staff_overview_widgets[WIDX_BACKGROUND].bottom = w->height - 1; + + window_staff_overview_widgets[WIDX_RESIZE].right = w->width - 1; + window_staff_overview_widgets[WIDX_RESIZE].bottom = w->height - 1; + + window_staff_overview_widgets[WIDX_TITLE].right = w->width - 2; + + window_staff_overview_widgets[WIDX_VIEWPORT].right = w->width - 26; + window_staff_overview_widgets[WIDX_VIEWPORT].bottom = w->height - 14; + + window_staff_overview_widgets[WIDX_BTM_LABEL].right = w->width - 26; + window_staff_overview_widgets[WIDX_BTM_LABEL].top = w->height - 13; + window_staff_overview_widgets[WIDX_BTM_LABEL].bottom = w->height - 3; + + window_staff_overview_widgets[WIDX_CLOSE].left = w->width - 13; + window_staff_overview_widgets[WIDX_CLOSE].right = w->width - 3; + + window_staff_overview_widgets[WIDX_PICKUP].left = w->width - 25; + window_staff_overview_widgets[WIDX_PICKUP].right = w->width - 2; + + window_staff_overview_widgets[WIDX_PATROL].left = w->width - 25; + window_staff_overview_widgets[WIDX_PATROL].right = w->width - 2; + + window_staff_overview_widgets[WIDX_RENAME].left = w->width - 25; + window_staff_overview_widgets[WIDX_RENAME].right = w->width - 2; + + window_staff_overview_widgets[WIDX_LOCATE].left = w->width - 25; + window_staff_overview_widgets[WIDX_LOCATE].right = w->width - 2; + + window_staff_overview_widgets[WIDX_FIRE].left = w->width - 25; + window_staff_overview_widgets[WIDX_FIRE].right = w->width - 2; + + window_align_tabs(w, WIDX_TAB_1, WIDX_TAB_3); +} + +/* rct2: 0x6BDEAF */ +void window_staff_overview_paint(){ + rct_window *w; + rct_drawpixelinfo *dpi; + + window_paint_get_registers(w, dpi); + + window_draw_widgets(w, dpi); + window_staff_overview_tab_paint(w, dpi); + window_staff_options_tab_paint(w, dpi); + window_staff_stats_tab_paint(w, dpi); + + + // Draw the viewport no sound sprite + if (w->viewport){ + window_draw_viewport(dpi, w); + rct_viewport* viewport = w->viewport; + if (viewport->flags & VIEWPORT_FLAG_SOUND_ON){ + gfx_draw_sprite(dpi, SPR_HEARING_VIEWPORT, w->x + 2, w->y + 2, 0); + } + } + + // Draw the centered label + uint32 argument1, argument2; + rct_peep* peep = GET_PEEP(w->number); + get_arguments_from_action(peep, &argument1, &argument2); + RCT2_GLOBAL(0x13CE952, uint32) = argument1; + RCT2_GLOBAL(0x13CE952 + 4, uint32) = argument2; + rct_widget* widget = &w->widgets[WIDX_BTM_LABEL]; + int x = (widget->left + widget->right) / 2 + w->x; + int y = w->y + widget->top - 1; + int width = widget->right - widget->left; + gfx_draw_string_centred_clipped(dpi, 1191, (void*)0x13CE952, 0, x, y, width); +} + +/* rct2: 0x6BEC8F */ +void window_staff_options_tab_paint(rct_window* w, rct_drawpixelinfo* dpi){ + if (w->disabled_widgets & (1 << WIDX_TAB_2)) return; + + rct_widget* widget = &w->widgets[WIDX_TAB_2]; + int x = widget->left + w->x; + int y = widget->top + w->y; + + int image_id = SPR_TAB_STAFF_OPTIONS_0; + + if (w->page == WINDOW_STAFF_OPTIONS){ + image_id += (w->frame_no / 2) % 7; + } + + gfx_draw_sprite(dpi, image_id, x, y, 0); +} + +/* rct2: 0x6BECD3 */ +void window_staff_stats_tab_paint(rct_window* w, rct_drawpixelinfo* dpi){ + if (w->disabled_widgets & (1 << WIDX_TAB_3)) return; + + rct_widget* widget = &w->widgets[WIDX_TAB_3]; + int x = widget->left + w->x; + int y = widget->top + w->y; + + int image_id = SPR_TAB_STATS_0; + + if (w->page == WINDOW_STAFF_STATISTICS){ + image_id += (w->frame_no / 4) % 7; + } + + gfx_draw_sprite(dpi, image_id, x, y, 0); +} + +/** +* Based on rct2: 0x6983dd in window_guest to be remerged into one when peep file added. +*/ +void window_staff_overview_tab_paint(rct_window* w, rct_drawpixelinfo* dpi){ + if (w->disabled_widgets & (1 << WIDX_TAB_1)) + return; + + rct_widget* widget = &w->widgets[WIDX_TAB_1]; + int width = widget->right - widget->left - 1; + int height = widget->bottom - widget->top - 1; + int x = widget->left + 1 + w->x; + int y = widget->top + 1 + w->y; + if (w->page == WINDOW_STAFF_OVERVIEW) height++; + + rct_drawpixelinfo* clip_dpi = clip_drawpixelinfo(dpi, x, width, y, height); + if (!clip_dpi) return; + + x = 14; + y = 20; + + rct_peep* peep = GET_PEEP(w->number); + + if (peep->type == PEEP_TYPE_STAFF && peep->staff_type == STAFF_TYPE_ENTERTAINER) + y++; + + int ebx = *(RCT2_ADDRESS(0x982708, uint32*)[peep->sprite_type * 2]) + 1; + + int eax = 0; + + if (w->page == WINDOW_STAFF_OVERVIEW){ + eax = w->var_494 >> 16; + eax &= 0xFFFC; + } + ebx += eax; + + int sprite_id = ebx | (peep->tshirt_colour << 19) | (peep->trousers_colour << 24) | 0xA0000000; + gfx_draw_sprite(clip_dpi, sprite_id, x, y, 0); + + // If holding a balloon + if (ebx >= 0x2A1D && ebx < 0x2A3D){ + ebx += 32; + ebx |= (peep->balloon_colour << 19) | 0x20000000; + gfx_draw_sprite(clip_dpi, ebx, x, y, 0); + } + + // If holding umbrella + if (ebx >= 0x2BBD && ebx < 0x2BDD){ + ebx += 32; + ebx |= (peep->umbrella_colour << 19) | 0x20000000; + gfx_draw_sprite(clip_dpi, ebx, x, y, 0); + } + + // If wearing hat + if (ebx >= 0x29DD && ebx < 0x29FD){ + ebx += 32; + ebx |= (peep->hat_colour << 19) | 0x20000000; + gfx_draw_sprite(clip_dpi, ebx, x, y, 0); + } +} + +/* rct2: 0x6BE7C6 */ +void window_staff_options_paint(){ + rct_window *w; + rct_drawpixelinfo *dpi; + + window_paint_get_registers(w, dpi); + + window_draw_widgets(w, dpi); + window_staff_overview_tab_paint(w, dpi); + window_staff_options_tab_paint(w, dpi); + window_staff_stats_tab_paint(w, dpi); +} + +/* rct2: 0x6BEA86 */ +void window_staff_stats_paint(){ + rct_window *w; + rct_drawpixelinfo *dpi; + + window_paint_get_registers(w, dpi); + + window_draw_widgets(w, dpi); + window_staff_overview_tab_paint(w, dpi); + window_staff_options_tab_paint(w, dpi); + window_staff_stats_tab_paint(w, dpi); + + rct_peep* peep = GET_PEEP(w->number); + + int x = w->x + window_staff_stats_widgets[WIDX_RESIZE].left + 4; + int y = w->y + window_staff_stats_widgets[WIDX_RESIZE].top + 4; + + if (!(RCT2_GLOBAL(RCT2_ADDRESS_PARK_FLAGS, uint32) & PARK_FLAGS_NO_MONEY)){ + + RCT2_GLOBAL(0x13CE952,uint32) = RCT2_ADDRESS(0x992A00,uint16)[peep->staff_type]; + gfx_draw_string_left(dpi, 2349, (void*)0x013CE952, 0,x, y); + + y += 10; + } + + gfx_draw_string_left(dpi, 2350, (void*)&peep->time_in_park, 0, x, y); + y += 10; + + switch (peep->staff_type){ + case STAFF_TYPE_HANDYMAN: + gfx_draw_string_left(dpi, 2351, (void*)&peep->paid_to_enter, 0, x, y); + y += 10; + gfx_draw_string_left(dpi, 2352, (void*)&peep->paid_on_rides, 0, x, y); + y += 10; + gfx_draw_string_left(dpi, 2353, (void*)&peep->paid_on_food, 0, x, y); + y += 10; + gfx_draw_string_left(dpi, 2354, (void*)&peep->paid_on_souvenirs, 0, x, y); + break; + case STAFF_TYPE_MECHANIC: + gfx_draw_string_left(dpi, 2356, (void*)&peep->paid_on_rides, 0, x, y); + y += 10; + gfx_draw_string_left(dpi, 2355, (void*)&peep->paid_to_enter, 0, x, y); + break; + } } \ No newline at end of file