1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2026-01-24 07:14:31 +01:00

Added start of peep_update_patrolling

This commit is contained in:
Duncan Frost
2015-03-14 10:12:38 +00:00
parent 6b239bca4f
commit 356079834a
3 changed files with 107 additions and 1 deletions

View File

@@ -1974,6 +1974,101 @@ static void peep_update_answering(rct_peep* peep){
invalidate_sprite((rct_sprite*)peep);
}
/* rct2: 0x006BF322 */
static int peep_update_patrolling_find_grass(rct_peep* peep){
if (!(peep->staff_orders & STAFF_ORDERS_MOWING))
return 0;
if (peep->var_E2 < 12)return 0;
if ((peep->next_var_29 & 0x18) != 8) return 0;
rct_map_element* map_element = map_get_surface_element_at(peep->next_x / 32, peep->next_y / 32);
if ((map_element->properties.surface.terrain & MAP_ELEMENT_SURFACE_TERRAIN_MASK) != TERRAIN_GRASS)
return 0;
if (map_element->properties.surface.grass_length < GRASS_LENGTH_CLEAR_1)
return 0;
peep_decrement_num_riders(peep);
peep->state = PEEP_STATE_MOWING;
peep_window_state_update(peep);
peep->var_37 = 0;
peep->destination_x = peep->next_x + RCT2_ADDRESS(0x9929CA, uint16)[0 * 2];
peep->destination_y = peep->next_y + RCT2_ADDRESS(0x9929CA, uint16)[0 * 2];
peep->destination_tolerence = 3;
return 1;
}
/* rct2: 0x006BF295 */
static int peep_update_patrolling_find_sweeping(rct_peep* peep){
if (!(peep->staff_orders & STAFF_ORDERS_SWEEPING))
return 0;
uint16 sprite_id = RCT2_ADDRESS(0xF1EF60, uint16)[((peep->x & 0x1FE0) << 3) | (peep->y >> 5)];
for (rct_sprite* sprite = NULL;
sprite_id != 0xFFFF;
sprite_id = sprite->unknown.next_in_quadrant){
sprite = &g_sprite_list[sprite_id];
if (sprite->unknown.linked_list_type_offset != SPRITE_LINKEDLIST_OFFSET_LITTER)continue;
uint16 z_diff = abs(peep->z - sprite->litter.z);
if (z_diff >= 16)continue;
peep_decrement_num_riders(peep);
peep->state = PEEP_STATE_SWEEPING;
peep_window_state_update(peep);
peep->var_37 = 0;
peep->destination_x = sprite->litter.x;
peep->destination_y = sprite->litter.y;
peep->destination_tolerence = 5;
return 1;
}
return 0;
}
/* rct2: 0x006BF1FD */
static void peep_update_patroling(rct_peep* peep){
if (!sub_68F3AE(peep))return;
RCT2_CALLPROC_X(0x693C9E, 0, 0, 0, 0, (int)peep, 0, 0);
if (!(RCT2_GLOBAL(0xF1EE18, uint16) & 1))return;
if ((peep->next_var_29 & 0x18) == 8){
rct_map_element* map_element = map_get_surface_element_at(peep->next_x / 32, peep->next_y / 32);
if (map_element != NULL){
int water_height = map_element->properties.surface.terrain & MAP_ELEMENT_WATER_HEIGHT_MASK;
if (water_height){
invalidate_sprite((rct_sprite*)peep);
water_height *= 16;
sprite_move(peep->x, peep->y, water_height, (rct_sprite*)peep);
invalidate_sprite((rct_sprite*)peep);
peep_decrement_num_riders(peep);
peep->state = PEEP_STATE_FALLING;
peep_window_state_update(peep);
return;
}
}
}
if (peep->staff_type != STAFF_TYPE_HANDYMAN) return;
if (peep_update_patrolling_find_sweeping(peep))return;
if (peep_update_patrolling_find_grass(peep))return;
//0x006BF3A1
}
/* rct2: 0x0069030A */
static void peep_update_walking(rct_peep* peep){
//RCT2_CALLPROC_X(0x0069030A, 0, 0, 0, 0, (int)peep, 0, 0);

View File

@@ -40,6 +40,13 @@ enum STAFF_TYPE {
STAFF_TYPE_ENTERTAINER
};
enum STAFF_ORDERS{
STAFF_ORDERS_SWEEPING = (1 << 0),
STAFF_ORDERS_WATER_FLOWERS = (1 << 1),
STAFF_ORDERS_EMPTY_BINS = (1 << 2),
STAFF_ORDERS_MOWING = (1 << 3)
};
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);

View File

@@ -84,7 +84,11 @@ typedef struct {
uint8 linked_list_type_offset; // 0x08 Valid values are SPRITE_LINKEDLIST_OFFSET_...
uint8 pad_09;
uint16 sprite_index; // 0x0A
uint8 pad_0B[0x19];
uint16 pad_0C;
sint16 x; // 0x0E
sint16 y; // 0x10
sint16 z; // 0x12
uint8 pad_14[0x10];
uint32 var_24;
} rct_litter;