diff --git a/projects/openrct2.vcxproj b/projects/openrct2.vcxproj
index 55b64865eb..ce7c4ed569 100644
--- a/projects/openrct2.vcxproj
+++ b/projects/openrct2.vcxproj
@@ -123,6 +123,7 @@
+
diff --git a/projects/openrct2.vcxproj.filters b/projects/openrct2.vcxproj.filters
index 65ac515497..6ae0ef6755 100644
--- a/projects/openrct2.vcxproj.filters
+++ b/projects/openrct2.vcxproj.filters
@@ -368,6 +368,9 @@
Windows
+
+ Windows
+
diff --git a/src/window_peep.c b/src/window_peep.c
index ca67c1e58d..570e8cddcf 100644
--- a/src/window_peep.c
+++ b/src/window_peep.c
@@ -112,38 +112,6 @@ void* window_peep_page_events[] = {
window_peep_overview_events
};
-// 0x992AEC
-static void* window_peep_staff_events[] = {
- (void*)0x6BDFF8,
- (void*)0x6BDF55,
- (void*)0x6BE558,
- (void*)0x6BDF98,
- (void*)0x6BDFA3,
- window_peep_emptysub,
- (void*)0x6BE602,
- window_peep_emptysub,
- window_peep_emptysub,
- (void*)0x6BDFD8,
- (void*)0x6BDFC3,
- window_peep_emptysub,
- window_peep_emptysub,
- (void*)0x6BDFAE,
- window_peep_emptysub,
- window_peep_emptysub,
- window_peep_emptysub,
- window_peep_emptysub,
- window_peep_emptysub,
- (void*)0x6BDFED,
- (void*)0x6BE5FC,
- window_peep_emptysub,
- window_peep_emptysub,
- window_peep_emptysub,
- window_peep_emptysub,
- (void*)0x6BDD91,
- (void*)0x6BDEAF,
- window_peep_emptysub
-};
-
uint32 window_peep_page_enabled_widgets[] = {
(1 << WIDX_CLOSE) |
(1 << WIDX_TAB_1) |
@@ -161,7 +129,8 @@ uint32 window_peep_page_enabled_widgets[] = {
void window_peep_open(rct_peep* peep){
if (peep->type == PEEP_TYPE_STAFF){
- RCT2_CALLPROC_X(0x006989E9, 0, 0, 0, (int)peep, 0, 0, 0);
+ window_staff_peep_open(peep);
+ return;
}
rct_window* window;
@@ -205,122 +174,3 @@ void window_peep_open(rct_peep* peep){
window_init_scroll_widgets(window);
RCT2_CALLPROC_X(0x0069883C, 0, 0, 0, 0, (int)window, 0, 0);
}
-
-/**
- * rct2: 0x006BED21
- *
- */
-void sub_6BED21(rct_window* w, rct_peep* peep)
-{
- int eax = 0 | 0x80;
-
- if (peep->staff_type == 2) {
- eax |= 0x20;
- }
-
- //RCT2_CALLFUNC_X(0x698827, 0, 0, 0, 0, 0, 0, 0);
- // sub_698827
- // This is here due to needing the Carry Flag.
-
- int CF = 0;
- int res = RCT2_GLOBAL(0x982004 + peep->state, uint8) & 1;
-
- if (res == 0) {
- CF = 1;
- } else {
- eax = eax & eax;
- }
-
- // end sub_698827
-
- int a = 0;
-
- // pop esi
- if (CF == 1 && w->page == 0) {
- eax |= 0x400; //or eax, 400h
-
- a = w->disabled_widgets & (1 << 0xA); //bt dword ptr[esi + 10h], 0Ah
-
- }
-
- if (a == 0) {
- CF = w->disabled_widgets & (1 << 0xA); //bt dword ptr [esi+10h], 0Ah
- if (CF == 1) {
- window_invalidate(w);
- }
- }
-
- w->disabled_widgets = eax;
-}
-
-/**
- * Create the window for a specific peep.
- *
- * rct2: 0x006BEF1B
- */
-rct_window* sub_6BEF1B(rct_peep* peep)
-{
- int eax = peep->sprite_index;
- int ecx = 0x38ae7; // class and flags
-
- rct_window* w = window_create_auto_pos(190, 180, (uint32*)window_peep_staff_events, ecx, 0);
-
- w->widgets = RCT2_GLOBAL(0x9AF81C, rct_widget*);
- w->enabled_widgets = RCT2_GLOBAL(0x9929B0, uint32);
- w->number = eax;
- w->page = 0;
- w->var_482 = 0;
- w->frame_no = 0;
-
- RCT2_GLOBAL((int*)w + 0x496, uint16) = 0; // missing, var_494 should perhaps be uint16?
-
- sub_6BED21(w, peep);
-
- w->min_width = 190;
- w->min_height = 180;
- w->max_width = 500;
- w->max_height = 450;
-
- w->flags = 8;
-
- w->colours[0] = 1;
- w->colours[1] = 4;
- w->colours[2] = 4;
-
- return w;
-}
-
-/**
-*
-* rct2: 0x006BEE98
-*/
-void window_staff_peep_open(rct_peep* peep)
-{
- rct_window* w = window_bring_to_front_by_id(WC_PEEP, peep->sprite_index);
- if (!w) {
- //int eax, ebx, ecx, edx, esi, edi;
-
- //eax = peep->sprite_index;
- //ecx = WC_PEEP;
- //edx = peep->sprite_index;
-
- //RCT2_CALLFUNC_X(0x006BEF1B, &eax, &ebx, &ecx, &edx, &esi, &edi, (int*)peep);
- //w = (rct_window*)esi;
-
- w = sub_6BEF1B(peep);
- }
-
- int PEEP_BACKGROUND_IDX = 0;
- w->widgets = RCT2_GLOBAL(0x992998, rct_widget*);
- w->enabled_widgets = RCT2_GLOBAL(0x9929B0, uint32);
- w->var_020 = RCT2_GLOBAL(0x9929BC, uint32);
- w->event_handlers = (uint32*)RCT2_GLOBAL(0x9929A4, uint32);
- w->pressed_widgets = 0;
- sub_6BED21(w, peep);
- //RCT2_CALLPROC_X(0x006BED21, 0, 0, 0, 0, (int)w, 0, 0);
- window_init_scroll_widgets(w);
- RCT2_CALLPROC_X(0x006BEDA3, 0, 0, 0, 0, (int)w, 0, 0);
- if (g_sprite_list[w->number].peep.state == PEEP_STATE_PICKED) {
- RCT2_CALLPROC_X(w->event_handlers[1], 0, 0, 0, 10, (int)w, 0, 0);
- }
-}
\ No newline at end of file
diff --git a/src/window_staff_peep.c b/src/window_staff_peep.c
new file mode 100644
index 0000000000..8c5832334a
--- /dev/null
+++ b/src/window_staff_peep.c
@@ -0,0 +1,247 @@
+/*****************************************************************************
+* Copyright (c) 2014 Ted John, Duncan Frost
+* OpenRCT2, an open source clone of Roller Coaster Tycoon 2.
+*
+* This file is part of OpenRCT2.
+*
+* OpenRCT2 is free software: you can redistribute it and/or modify
+* it under the terms of the GNU General Public License as published by
+* the Free Software Foundation, either version 3 of the License, or
+* (at your option) any later version.
+
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+
+* You should have received a copy of the GNU General Public License
+* along with this program. If not, see .
+*****************************************************************************/
+
+#include "addresses.h"
+#include "game.h"
+#include "peep.h"
+#include "string_ids.h"
+#include "sprite.h"
+#include "sprites.h"
+#include "widget.h"
+#include "window.h"
+#include "window_dropdown.h"
+
+enum WINDOW_STAFF_PEEP_PAGE {
+ WINDOW_STAFF_PEEP_OVERVIEW,
+ WINDOW_STAFF_PEEP_OPTIONS,
+ WINDOW_STAFF_PEEP_STATISTICS,
+};
+
+enum WINDOW_STAFF_PEEP_WIDGET_IDX {
+ WIDX_BACKGROUND,
+ WIDX_TITLE,
+ WIDX_CLOSE,
+ WIDX_RESIZE,
+ WIDX_TAB_1,
+ WIDX_TAB_2,
+ WIDX_TAB_3,
+ WIDX_TAB_4,
+ WIDX_VIEWPORT,
+ WIDX_BTM_LABEL,
+ WIDX_PATROL,
+ WIDX_RENAME,
+ WIDX_LOCATE,
+ WIDX_FIRE
+};
+
+void window_staff_peep_emptysub(){};
+
+rct_widget window_staff_peep_overview_widgets[] = {
+ { WWT_FRAME, 0, 0, 189, 0, 179, 0x0FFFFFFFF, STR_NONE }, // Panel / Background
+ { WWT_CAPTION, 0, 1, 188, 1, 14, 0x361, STR_WINDOW_TITLE_TIP }, // Title
+ { WWT_CLOSEBOX, 0, 177, 187, 2, 13, 0x338, STR_CLOSE_WINDOW_TIP }, // Close x button
+ { WWT_RESIZE, 1, 0, 189, 43, 179, 0x0FFFFFFFF, STR_NONE }, // Resize
+ { WWT_TAB, 1, 3, 33, 17, 43, 0x2000144E, 1939 }, // Tab 1
+ { WWT_TAB, 1, 34, 64, 17, 43, 0x2000144E, 1945}, // Tab 2
+ { WWT_TAB, 1, 65, 95, 17, 43, 0x2000144E, 2348}, // Tab 3
+ { WWT_TAB, 1, 96, 126, 17, 43, 0x2000144E, STR_NONE}, // Tab 4
+ { WWT_VIEWPORT, 1, 3, 164, 47, 166, 0x0FFFFFFFF, STR_NONE}, // Viewport
+ { WWT_12, 1, 3, 164, 167, 177, 0x0FFFFFFFF, STR_NONE }, // Label at bottom of viewport
+ { WWT_FLATBTN, 1, 165, 188, 45, 68, 0x1436, 1706}, // Pickup Button
+ { WWT_FLATBTN, 1, 165, 188, 69, 92, 0x1437, 1708}, // Patrol Button
+ { WWT_FLATBTN, 1, 165, 188, 93, 116, 0x1430, 1056}, // Rename Button
+ { WWT_FLATBTN, 1, 165, 188, 117, 140, 0x142F, 1027}, // Locate Button
+ { WWT_FLATBTN, 1, 165, 188, 141, 164, 0x142D, 1705}, // Fire Button
+ { WIDGETS_END },
+};
+
+rct_widget *window_staff_peep_page_widgets[] = {
+ window_staff_peep_overview_widgets
+};
+
+// 0x992AEC
+static void* window_staff_peep_overview_events[] = {
+ (void*)0x6BDFF8,
+ (void*)0x6BDF55,
+ (void*)0x6BE558,
+ (void*)0x6BDF98,
+ (void*)0x6BDFA3,
+ window_staff_peep_emptysub,
+ (void*)0x6BE602,
+ window_staff_peep_emptysub,
+ window_staff_peep_emptysub,
+ (void*)0x6BDFD8,
+ (void*)0x6BDFC3,
+ window_staff_peep_emptysub,
+ window_staff_peep_emptysub,
+ (void*)0x6BDFAE,
+ window_staff_peep_emptysub,
+ window_staff_peep_emptysub,
+ window_staff_peep_emptysub,
+ window_staff_peep_emptysub,
+ window_staff_peep_emptysub,
+ (void*)0x6BDFED,
+ (void*)0x6BE5FC,
+ window_staff_peep_emptysub,
+ window_staff_peep_emptysub,
+ window_staff_peep_emptysub,
+ window_staff_peep_emptysub,
+ (void*)0x6BDD91, //Invalidate
+ (void*)0x6BDEAF, //Paint
+ (void*)0x6BE62A
+};
+
+void* window_staff_peep_page_events[] = {
+ window_staff_peep_overview_events
+};
+
+uint32 window_staff_peep_page_enabled_widgets[] = {
+ (1 << WIDX_CLOSE) |
+ (1 << WIDX_TAB_1) |
+ (1 << WIDX_TAB_2) |
+ (1 << WIDX_TAB_3) |
+ (1 << WIDX_PATROL) |
+ (1 << WIDX_RENAME) |
+ (1 << WIDX_LOCATE) |
+ (1 << WIDX_FIRE) |
+ (1 << 14)
+};
+
+
+/**
+* rct2: 0x006BED21
+*
+*/
+void sub_6BED21(rct_window* w, rct_peep* peep)
+{
+ int eax = 0 | 0x80;
+
+ if (peep->staff_type == 2) {
+ eax |= 0x20;
+ }
+
+ //RCT2_CALLFUNC_X(0x698827, 0, 0, 0, 0, 0, 0, 0);
+ // sub_698827
+ // This is here due to needing the Carry Flag.
+
+ int CF = 0;
+ int res = RCT2_GLOBAL(0x982004 + peep->state, uint8) & 1;
+
+ if (res == 0) {
+ CF = 1;
+ }
+ else {
+ eax = eax & eax;
+ }
+
+ // end sub_698827
+
+ int a = 0;
+
+ // pop esi
+ if (CF == 1 && w->page == 0) {
+ eax |= 0x400; //or eax, 400h
+
+ a = w->disabled_widgets & (1 << 0xA); //bt dword ptr[esi + 10h], 0Ah
+
+ }
+
+ if (a == 0) {
+ CF = w->disabled_widgets & (1 << 0xA); //bt dword ptr [esi+10h], 0Ah
+ if (CF == 1) {
+ window_invalidate(w);
+ }
+ }
+
+ w->disabled_widgets = eax;
+}
+
+/**
+* Create the window for a specific peep.
+*
+* rct2: 0x006BEF1B
+*/
+rct_window* sub_6BEF1B(rct_peep* peep)
+{
+ int eax = peep->sprite_index;
+ int ecx = 0x38ae7; // class and flags
+
+ rct_window* w = window_create_auto_pos(190, 180, (uint32*)window_staff_peep_overview_events, ecx, 0);
+
+ w->widgets = RCT2_GLOBAL(0x9AF81C, rct_widget*);
+ w->enabled_widgets = RCT2_GLOBAL(0x9929B0, uint32);
+ w->number = eax;
+ w->page = 0;
+ w->var_482 = 0;
+ w->frame_no = 0;
+
+ RCT2_GLOBAL((int*)w + 0x496, uint16) = 0; // missing, var_494 should perhaps be uint16?
+
+ sub_6BED21(w, peep);
+
+ w->min_width = 190;
+ w->min_height = 180;
+ w->max_width = 500;
+ w->max_height = 450;
+
+ w->flags = 8;
+
+ w->colours[0] = 1;
+ w->colours[1] = 4;
+ w->colours[2] = 4;
+
+ return w;
+}
+
+/**
+*
+* rct2: 0x006BEE98
+*/
+void window_staff_peep_open(rct_peep* peep)
+{
+ rct_window* w = window_bring_to_front_by_id(WC_PEEP, peep->sprite_index);
+ if (!w) {
+ //int eax, ebx, ecx, edx, esi, edi;
+
+ //eax = peep->sprite_index;
+ //ecx = WC_PEEP;
+ //edx = peep->sprite_index;
+
+ //RCT2_CALLFUNC_X(0x006BEF1B, &eax, &ebx, &ecx, &edx, &esi, &edi, (int*)peep);
+ //w = (rct_window*)esi;
+
+ w = sub_6BEF1B(peep);
+ }
+ w->page = 0;
+ window_invalidate(w);
+
+ w->widgets = window_staff_peep_overview_widgets;
+ w->enabled_widgets = window_staff_peep_page_enabled_widgets[0];
+ w->var_020 = RCT2_GLOBAL(0x9929BC, uint32);
+ w->event_handlers = window_staff_peep_page_events[0];
+ w->pressed_widgets = 0;
+ //RCT2_CALLPROC_X(0x006BED21, 0, 0, 0, 0, (int)w, 0, 0);
+ sub_6BED21(w, peep);
+ window_init_scroll_widgets(w);
+ RCT2_CALLPROC_X(0x006BEDA3, 0, 0, 0, 0, (int)w, 0, 0);
+ if (g_sprite_list[w->number].peep.state == PEEP_STATE_PICKED) {
+ RCT2_CALLPROC_X(w->event_handlers[WE_MOUSE_UP], 0, 0, 0, 10, (int)w, 0, 0);
+ }
+}
\ No newline at end of file