diff --git a/src/addresses.h b/src/addresses.h index 9f020bbb07..4b9487fa20 100644 --- a/src/addresses.h +++ b/src/addresses.h @@ -215,10 +215,6 @@ #define RCT2_ADDRESS_PEEP_SPAWNS 0x013573F2 -#define RCT2_ADDRESS_HANDYMAN_COLOUR 0x01357BCD -#define RCT2_ADDRESS_MECHANIC_COLOUR 0x01357BCE -#define RCT2_ADDRESS_SECURITY_COLOUR 0x01357BCF - #define RCT2_ADDRESS_MAP_SIZE_UNITS 0x01358830 #define RCT2_ADDRESS_MAP_SIZE_MINUS_2 0x01358832 #define RCT2_ADDRESS_MAP_SIZE 0x01358834 @@ -244,7 +240,6 @@ #define RCT2_ADDRESS_RIDE_MEASUREMENTS 0x0138B60C #define RCT2_ADDRESS_GRASS_SCENERY_TILEPOS 0x013B0E70 -#define RCT2_ADDRESS_STAFF_PATROL_AREAS 0x013B0E72 #define RCT2_ADDRESS_NEWS_ITEM_LIST 0x013CA754 @@ -328,8 +323,6 @@ #define RCT2_ADDRESS_AUDIO_INFO 0x01425B40 -#define RCT2_ADDRESS_STAFF_MODE_ARRAY 0x013CA672 - #pragma endregion #pragma region Obsolete @@ -538,6 +531,9 @@ #define RCT2_ADDRESS_PARK_ENTRANCE_FEE 0x013573E8 #define RCT2_ADDRESS_GUESTS_IN_PARK 0x01357844 #define RCT2_ADDRESS_GUESTS_HEADING_FOR_PARK 0x01357846 +#define RCT2_ADDRESS_HANDYMAN_COLOUR 0x01357BCD +#define RCT2_ADDRESS_MECHANIC_COLOUR 0x01357BCE +#define RCT2_ADDRESS_SECURITY_COLOUR 0x01357BCF #define RCT2_ADDRESS_CURRENT_PARK_RATING 0x01357CB0 #define RCT2_ADDRESS_PARK_RATING_HISTORY 0x01357CB2 #define RCT2_ADDRESS_GUESTS_IN_PARK_HISTORY 0x01357CD2 @@ -589,6 +585,9 @@ #define RCT2_ADDRESS_SAVED_AGE 0x01388698 #define RCT2_ADDRESS_NUM_MAP_ANIMATIONS 0x0138B580 +#define RCT2_ADDRESS_STAFF_PATROL_AREAS 0x013B0E72 +#define RCT2_ADDRESS_STAFF_MODE_ARRAY 0x013CA672 + #define RCT2_ADDRESS_CLIMATE 0x013CA746 #define RCT2_ADDRESS_CURRENT_WEATHER 0x013CA74A #define RCT2_ADDRESS_NEXT_WEATHER 0x013CA74B diff --git a/src/paint/map_element/path.c b/src/paint/map_element/path.c index 30f33f5f04..d6b98d807a 100644 --- a/src/paint/map_element/path.c +++ b/src/paint/map_element/path.c @@ -740,12 +740,7 @@ void path_paint(uint8 direction, uint16 height, rct_map_element * map_element) staffType = staff->staff_type; } - x = (x & 0x1F80) >> 7; - y = (y & 0x1F80) >> 1; - int offset = (x | y) >> 5; - int bitIndex = (x | y) & 0x1F; - int ebx = (staffType + 200) * 512; - if (RCT2_ADDRESS(RCT2_ADDRESS_STAFF_PATROL_AREAS + ebx, uint32)[offset] & (1 << bitIndex)) { + if (staff_is_patrol_area_set(200 + staffType, x, y)) { uint32 imageId = 2618; int height = map_element->base_height * 8; if (footpath_element_is_sloped(map_element)) { diff --git a/src/paint/map_element/surface.c b/src/paint/map_element/surface.c index a0395eb63e..318c650e62 100644 --- a/src/paint/map_element/surface.c +++ b/src/paint/map_element/surface.c @@ -1133,12 +1133,7 @@ void surface_paint(uint8 direction, uint16 height, rct_map_element * mapElement) staffType = staff->staff_type; } - x = (x & 0x1F80) >> 7; - y = (y & 0x1F80) >> 1; - int offset = (x | y) >> 5; - int bitIndex = (x | y) & 0x1F; - int ebx = (staffType + 200) * 512; - if (RCT2_ADDRESS(RCT2_ADDRESS_STAFF_PATROL_AREAS + ebx, uint32)[offset] & (1 << bitIndex)) { + if (staff_is_patrol_area_set(200 + staffType, x, y)) { assert(surfaceShape < countof(byte_97B444)); image_id |= SPR_TERRAIN_SELECTION_PATROL_AREA + byte_97B444[surfaceShape]; diff --git a/src/peep/peep.c b/src/peep/peep.c index 4b4dd85ea9..9ad1e31d12 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -1851,7 +1851,7 @@ void peep_sprite_remove(rct_peep* peep){ else{ window_invalidate_by_class(WC_STAFF_LIST); - RCT2_ADDRESS(RCT2_ADDRESS_STAFF_MODE_ARRAY, uint8)[peep->staff_id] = 0; + gStaffModes[peep->staff_id] = 0; peep->type = 0xFF; staff_update_greyed_patrol_areas(); peep->type = PEEP_TYPE_STAFF; diff --git a/src/peep/staff.c b/src/peep/staff.c index 1182024e2b..883d3606e7 100644 --- a/src/peep/staff.c +++ b/src/peep/staff.c @@ -28,8 +28,12 @@ #include "peep.h" #include "staff.h" -uint32 *gStaffPatrolAreas = RCT2_ADDRESS(RCT2_ADDRESS_STAFF_PATROL_AREAS, uint32); -uint8 *gStaffModes = RCT2_ADDRESS(RCT2_ADDRESS_STAFF_MODE_ARRAY, uint8); +uint32 gStaffPatrolAreas[204 * 128]; +uint8 gStaffModes[204]; +uint16 gStaffDrawPatrolAreas; +colour_t gStaffHandymanColour; +colour_t gStaffMechanicColour; +colour_t gStaffSecurityColour; /** * @@ -38,10 +42,10 @@ uint8 *gStaffModes = RCT2_ADDRESS(RCT2_ADDRESS_STAFF_MODE_ARRAY, uint8); void staff_reset_modes() { for (int i = 0; i < 200; i++) - RCT2_ADDRESS(RCT2_ADDRESS_STAFF_MODE_ARRAY, uint8)[i] = STAFF_MODE_NONE; + gStaffModes[i] = STAFF_MODE_NONE; for (int i = 200; i < 204; i++) - RCT2_ADDRESS(RCT2_ADDRESS_STAFF_MODE_ARRAY, uint8)[i] = STAFF_MODE_WALK; + gStaffModes[i] = STAFF_MODE_WALK; staff_update_greyed_patrol_areas(); } @@ -60,7 +64,7 @@ void game_command_update_staff_colour(int *eax, int *ebx, int *ecx, int *edx, in colour = (*edx >> 8) & 0xFF; if (*ebx & GAME_COMMAND_FLAG_APPLY) { - gStaffColours[staffType] = colour; + staff_set_colour(staffType, colour); FOR_ALL_PEEPS(spriteIndex, peep) { if (peep->type == PEEP_TYPE_STAFF && peep->staff_type == staffType) { @@ -165,7 +169,7 @@ static money32 staff_hire_new_staff_member(uint8 staff_type, uint8 flags, sint16 int i; for (i = 0; i < STAFF_MAX_COUNT; ++i) { - if (!(RCT2_ADDRESS(RCT2_ADDRESS_STAFF_MODE_ARRAY, uint8)[i] & 1)) + if (!(gStaffModes[i] & 1)) break; } @@ -279,7 +283,7 @@ static money32 staff_hire_new_staff_member(uint8 staff_type, uint8 flags, sint16 newPeep->pathfind_goal.z = 0xFF; newPeep->pathfind_goal.direction = 0xFF; - uint8 colour = gStaffColours[clamp(STAFF_TYPE_HANDYMAN, staff_type, STAFF_TYPE_SECURITY)]; + uint8 colour = staff_get_colour(staff_type); newPeep->tshirt_colour = colour; newPeep->trousers_colour = colour; @@ -292,11 +296,11 @@ static money32 staff_hire_new_staff_member(uint8 staff_type, uint8 flags, sint16 newPeep->staff_id = newStaffId; - RCT2_ADDRESS(RCT2_ADDRESS_STAFF_MODE_ARRAY, uint8)[newStaffId] = STAFF_MODE_WALK; + gStaffModes[newStaffId] = STAFF_MODE_WALK; - for (int i = 0; i < 0x80; ++i) { - int addr = RCT2_ADDRESS_STAFF_PATROL_AREAS + (newStaffId << 9) + i * 4; - RCT2_GLOBAL(addr, uint32) = 0; + for (int i = 0; i < 128; i++) { + uint32 *addr = (uint32*)((uintptr_t)gStaffPatrolAreas + (newStaffId << 9) + i * 4); + *addr = 0; } } @@ -407,21 +411,17 @@ void game_command_set_staff_patrol(int *eax, int *ebx, int *ecx, int *edx, int * } rct_peep *peep = &sprite->peep; int patrolOffset = peep->staff_id * (64 * 64 / 8); - int patrolIndex = ((x & 0x1F80) >> 7) | ((y & 0x1F80) >> 1); - int mask = 1u << (patrolIndex & 0x1F); - int base = patrolIndex >> 5; - uint32 *patrolBits = RCT2_ADDRESS(RCT2_ADDRESS_STAFF_PATROL_AREAS + patrolOffset + (base * 4), uint32); - *patrolBits ^= mask; + staff_toggle_patrol_area(peep->staff_id, x, y); int ispatrolling = 0; for(int i = 0; i < 128; i++){ - ispatrolling |= RCT2_GLOBAL(RCT2_ADDRESS_STAFF_PATROL_AREAS + patrolOffset + (i * 4), uint32); + ispatrolling |= *((uint32*)((uintptr_t)gStaffPatrolAreas + patrolOffset + (i * 4))); } - RCT2_ADDRESS(RCT2_ADDRESS_STAFF_MODE_ARRAY, uint8)[peep->staff_id] &= ~2; + gStaffModes[peep->staff_id] &= ~2; if(ispatrolling){ - RCT2_ADDRESS(RCT2_ADDRESS_STAFF_MODE_ARRAY, uint8)[peep->staff_id] |= 2; + gStaffModes[peep->staff_id] |= 2; } for(int y2 = 0; y2 < 4; y2++){ @@ -502,8 +502,10 @@ void staff_update_greyed_patrol_areas() for (int staff_type = 0; staff_type < STAFF_TYPE_COUNT; ++staff_type) { - for (int i = 0; i < 128; ++i) - RCT2_ADDRESS(RCT2_ADDRESS_STAFF_PATROL_AREAS + ((staff_type + STAFF_MAX_COUNT) * 512), uint32)[i] = 0; + uint32 *addr = (uint32*)((uintptr_t)gStaffPatrolAreas + ((staff_type + STAFF_MAX_COUNT) * 512)); + for (int i = 0; i < 128; i++) { + addr[i] = 0; + } for (uint16 sprite_index = gSpriteListHead[SPRITE_LIST_PEEP]; sprite_index != SPRITE_INDEX_NULL; sprite_index = peep->next) { @@ -511,9 +513,10 @@ void staff_update_greyed_patrol_areas() if (peep->type == PEEP_TYPE_STAFF && staff_type == peep->staff_type) { - for (int i = 0; i < 128; ++i) - RCT2_ADDRESS(RCT2_ADDRESS_STAFF_PATROL_AREAS + ((staff_type + STAFF_MAX_COUNT) * 512), uint32)[i] |= RCT2_ADDRESS(RCT2_ADDRESS_STAFF_PATROL_AREAS + (peep->staff_id * 512), uint32)[i]; - + uint32 *addr2 = (uint32*)((uintptr_t)gStaffPatrolAreas + (peep->staff_id * 512)); + for (int i = 0; i < 128; i++) { + addr[i] |= addr2[i]; + } } } } @@ -524,13 +527,7 @@ static int staff_is_location_in_patrol_area(rct_peep *peep, int x, int y) // Patrol quads are stored in a bit map (8 patrol quads per byte) // Each patrol quad is 4x4 // Therefore there are in total 64 x 64 patrol quads in the 256 x 256 map - int patrolOffset = peep->staff_id * (64 * 64 / 8); - int patrolIndex = ((x & 0x1F80) >> 7) | ((y & 0x1F80) >> 1); - int mask = 1u << (patrolIndex & 0x1F); - int base = patrolIndex >> 5; - - uint32 *patrolBits = RCT2_ADDRESS(RCT2_ADDRESS_STAFF_PATROL_AREAS + patrolOffset + (base * 4), uint32); - return (*patrolBits & mask) != 0; + return staff_is_patrol_area_set(peep->staff_id, x, y); } /** @@ -544,7 +541,7 @@ int staff_is_location_in_patrol(rct_peep *staff, int x, int y) return 0; // Check if staff has patrol area - if (!(RCT2_ADDRESS(RCT2_ADDRESS_STAFF_MODE_ARRAY, uint8)[staff->staff_id] & 2)) + if (!(gStaffModes[staff->staff_id] & 2)) return 1; return staff_is_location_in_patrol_area(staff, x, y); @@ -616,6 +613,33 @@ bool staff_is_patrol_area_set(int staffIndex, int x, int y) return gStaffPatrolAreas[peepOffset + offset] & (1 << bitIndex); } +void staff_set_patrol_area(int staffIndex, int x, int y, bool value) +{ + x = (x & 0x1F80) >> 7; + y = (y & 0x1F80) >> 1; + + int peepOffset = staffIndex * 128; + int offset = (x | y) >> 5; + int bitIndex = (x | y) & 0x1F; + uint32 *addr = &gStaffPatrolAreas[peepOffset + offset]; + if (value) { + *addr |= (1 << bitIndex); + } else { + *addr &= ~(1 << bitIndex); + } +} + +void staff_toggle_patrol_area(int staffIndex, int x, int y) +{ + x = (x & 0x1F80) >> 7; + y = (y & 0x1F80) >> 1; + + int peepOffset = staffIndex * 128; + int offset = (x | y) >> 5; + int bitIndex = (x | y) & 0x1F; + gStaffPatrolAreas[peepOffset + offset] ^= (1 << bitIndex); +} + /** * * rct2: 0x006BFBE8 @@ -1293,3 +1317,33 @@ void game_command_set_staff_name(int *eax, int *ebx, int *ecx, int *edx, int *es (uint8*)edi ); } + +colour_t staff_get_colour(uint8 staffType) +{ + switch (staffType) { + case STAFF_TYPE_HANDYMAN: return gStaffHandymanColour; + case STAFF_TYPE_MECHANIC: return gStaffMechanicColour; + case STAFF_TYPE_SECURITY: return gStaffSecurityColour; + default: + assert(false); + return 0; + } +} + +void staff_set_colour(uint8 staffType, colour_t value) +{ + switch (staffType) { + case STAFF_TYPE_HANDYMAN: + gStaffHandymanColour = value; + break; + case STAFF_TYPE_MECHANIC: + gStaffMechanicColour = value; + break; + case STAFF_TYPE_SECURITY: + gStaffSecurityColour = value; + break; + default: + assert(false); + break; + } +} diff --git a/src/peep/staff.h b/src/peep/staff.h index 9a6fbfd24a..402c6db575 100644 --- a/src/peep/staff.h +++ b/src/peep/staff.h @@ -20,8 +20,8 @@ #include "../common.h" #include "peep.h" -#define STAFF_MAX_COUNT 0xC8 -#define STAFF_TYPE_COUNT 0x04 +#define STAFF_MAX_COUNT 200 +#define STAFF_TYPE_COUNT 4 enum STAFF_MODE { STAFF_MODE_NONE, @@ -45,14 +45,12 @@ enum STAFF_ORDERS{ STAFF_ORDERS_FIX_RIDES = (1 << 1) }; -extern uint32 *gStaffPatrolAreas; -extern uint8 *gStaffModes; -#define gStaffDrawPatrolAreas RCT2_GLOBAL(0x009DEA50, uint16) - -#define gStaffColours RCT2_ADDRESS(RCT2_ADDRESS_HANDYMAN_COLOUR, colour_t) -#define gStaffHandymanColour RCT2_GLOBAL(RCT2_ADDRESS_HANDYMAN_COLOUR, colour_t) -#define gStaffMechanicColour RCT2_GLOBAL(RCT2_ADDRESS_MECHANIC_COLOUR, colour_t) -#define gStaffSecurityColour RCT2_GLOBAL(RCT2_ADDRESS_SECURITY_COLOUR, colour_t) +extern uint32 gStaffPatrolAreas[204 * 128]; +extern uint8 gStaffModes[204]; +extern uint16 gStaffDrawPatrolAreas; +extern colour_t gStaffHandymanColour; +extern colour_t gStaffMechanicColour; +extern colour_t gStaffSecurityColour; void game_command_update_staff_colour(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); void game_command_hire_new_staff_member(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp); @@ -69,5 +67,9 @@ int staff_is_location_in_patrol(rct_peep *mechanic, int x, int y); int staff_path_finding(rct_peep* peep); void staff_reset_stats(); bool staff_is_patrol_area_set(int staffIndex, int x, int y); +void staff_set_patrol_area(int staffIndex, int x, int y, bool value); +void staff_toggle_patrol_area(int staffIndex, int x, int y); +colour_t staff_get_colour(uint8 staffType); +void staff_set_colour(uint8 staffType, colour_t value); #endif diff --git a/src/windows/staff.c b/src/windows/staff.c index 43c8ade0f7..3f2f33f1da 100644 --- a/src/windows/staff.c +++ b/src/windows/staff.c @@ -550,7 +550,7 @@ void window_staff_overview_mousedown(int widgetIndex, rct_window* w, rct_widget* rct_peep* peep = GET_PEEP(w->number); // Disable clear patrol area if no area is set. - if (!(RCT2_ADDRESS(RCT2_ADDRESS_STAFF_MODE_ARRAY, uint8)[peep->staff_id] & 2)) { + if (!(gStaffModes[peep->staff_id] & 2)) { gDropdownItemsDisabled |= (1ULL << 1); } } @@ -568,12 +568,11 @@ void window_staff_overview_dropdown(rct_window *w, int widgetIndex, int dropdown // Clear patrol if (dropdownIndex == 1) { rct_peep* peep = GET_PEEP(w->number); - - for (int i = 0; i < 128; i++) - { - RCT2_ADDRESS(RCT2_ADDRESS_STAFF_PATROL_AREAS + (peep->staff_id * 512), uint32)[i] = 0; + uint32 *addr = (uint32*)((uintptr_t)gStaffPatrolAreas + (peep->staff_id * 512)); + for (int i = 0; i < 128; i++) { + addr[i] = 0; } - RCT2_ADDRESS(RCT2_ADDRESS_STAFF_MODE_ARRAY, uint8)[peep->staff_id] &= ~2; + gStaffModes[peep->staff_id] &= ~2; gfx_invalidate_screen(); staff_update_greyed_patrol_areas(); diff --git a/src/windows/staff_list.c b/src/windows/staff_list.c index 3601ee0ec1..1018a71109 100644 --- a/src/windows/staff_list.c +++ b/src/windows/staff_list.c @@ -287,7 +287,7 @@ static void window_staff_list_mousedown(int widgetIndex, rct_window* w, rct_widg window_staff_list_cancel_tools(w); break; case WIDX_STAFF_LIST_UNIFORM_COLOUR_PICKER: - window_dropdown_show_colour(w, widget, w->colours[1], gStaffColours[_windowStaffListSelectedTab]); + window_dropdown_show_colour(w, widget, w->colours[1], staff_get_colour(_windowStaffListSelectedTab)); break; } @@ -504,7 +504,7 @@ void window_staff_list_invalidate(rct_window *w) if (tabIndex < 3) { window_staff_list_widgets[WIDX_STAFF_LIST_UNIFORM_COLOUR_PICKER].type = WWT_COLOURBTN; window_staff_list_widgets[WIDX_STAFF_LIST_UNIFORM_COLOUR_PICKER].image = - ((uint32)gStaffColours[tabIndex] << 19) | 0x60000000 | SPR_PALETTE_BTN; + ((uint32)staff_get_colour(tabIndex) << 19) | 0x60000000 | SPR_PALETTE_BTN; } if (_quick_fire_mode) w->pressed_widgets |= (1ULL << WIDX_STAFF_LIST_QUICK_FIRE); @@ -678,7 +678,7 @@ void window_staff_list_scrollpaint(rct_window *w, rct_drawpixelinfo *dpi, int sc gfx_draw_string_left_clipped(dpi, format, gCommonFormatArgs, 0, 175, y - 1, 305); // True if a patrol path is set for the worker - if (RCT2_ADDRESS(RCT2_ADDRESS_STAFF_MODE_ARRAY, uint8)[peep->staff_id] & 2) { + if (gStaffModes[peep->staff_id] & 2) { gfx_draw_sprite(dpi, SPR_STAFF_PATROL_PATH, 110, y - 1, 0); }