1
0
mirror of https://github.com/OpenRCT2/OpenRCT2 synced 2025-12-24 00:03:11 +01:00

implement peep_easter_egg_peep_interactions

This commit is contained in:
IntelOrca
2016-01-17 00:57:37 +00:00
parent f6841bd3dc
commit 88ae952db2
4 changed files with 151 additions and 14 deletions

View File

@@ -80,7 +80,7 @@ static void peep_chose_not_to_go_on_ride(rct_peep *peep, int rideIndex, bool pee
static void peep_tried_to_enter_full_queue(rct_peep *peep, int rideIndex);
static bool peep_should_go_to_shop(rct_peep *peep, int rideIndex, bool peepAtShop);
static void peep_reset_pathfind_goal(rct_peep *peep);
static void sub_68FD3A(rct_peep *peep);
static void peep_easter_egg_peep_interactions(rct_peep *peep);
static bool sub_690B99(rct_peep *peep, int edge, uint8 *rideToView, uint8 *rideSeatToView);
static int peep_get_height_on_slope(rct_peep *peep, int x, int y);
static void peep_pick_ride_to_go_on(rct_peep *peep);
@@ -3955,7 +3955,7 @@ static int peep_update_walking_find_bench(rct_peep* peep){
for (; !(edges & (1 << chosen_edge));)chosen_edge = (chosen_edge + 1) & 0x3;
uint16 sprite_id = RCT2_ADDRESS(0xF1EF60, uint16)[((peep->x & 0x1FE0) << 3) | (peep->y >> 5)];
uint16 sprite_id = sprite_get_first_in_quadrant(peep->x, peep->y);
uint8 free_edge = 3;
for (rct_sprite* sprite; sprite_id != SPRITE_INDEX_NULL; sprite_id = sprite->unknown.next_in_quadrant){
@@ -4739,7 +4739,7 @@ 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)];
uint16 sprite_id = sprite_get_first_in_quadrant(peep->x, peep->y);
for (rct_sprite* sprite = NULL;
sprite_id != 0xFFFF;
@@ -4983,7 +4983,7 @@ static void peep_update_walking(rct_peep* peep){
if (!sub_690B99(peep, chosen_edge, &ride_to_view, &ride_seat_to_view))
return;
uint16 sprite_id = RCT2_ADDRESS(0xF1EF60, uint16)[((peep->x & 0x1FE0) << 3) | (peep->y >> 5)];
uint16 sprite_id = sprite_get_first_in_quadrant(peep->x, peep->y);
for (rct_sprite* sprite; sprite_id != SPRITE_INDEX_NULL; sprite_id = sprite->unknown.next_in_quadrant){
sprite = &g_sprite_list[sprite_id];
@@ -5110,8 +5110,7 @@ static void peep_update(rct_peep *peep)
unsigned int carryCheck = peep->var_73 + stepsToTake;
peep->var_73 = carryCheck;
if (carryCheck <= 255) {
// loc_68FD3A
sub_68FD3A(peep);
peep_easter_egg_peep_interactions(peep);
} else {
// loc_68FD2F
switch (peep->state) {
@@ -6532,7 +6531,7 @@ static int peep_footpath_move_forward(rct_peep* peep, sint16 x, sint16 y, rct_ma
uint16 crowded = 0;
uint8 litter_count = 0;
uint8 sick_count = 0;
uint16 sprite_id = RCT2_ADDRESS(0xF1EF60, uint16)[((x & 0x1FE0) << 3) | (y >> 5)];
uint16 sprite_id = sprite_get_first_in_quadrant(x, y);
for (rct_sprite* sprite; sprite_id != 0xFFFF; sprite_id = sprite->unknown.next_in_quadrant){
sprite = &g_sprite_list[sprite_id];
if (sprite->unknown.sprite_identifier == SPRITE_IDENTIFIER_PEEP){
@@ -8530,13 +8529,149 @@ static void peep_reset_pathfind_goal(rct_peep *peep)
peep->pathfind_goal.direction = 0xFF;
}
static bool peep_has_valid_xy(rct_peep *peep)
{
if (peep->x != (sint16)0x8000) {
if (peep->x < (256 * 32) && peep->y < (256 * 32)) {
return true;
}
}
return false;
}
static void peep_give_passing_peeps_purple_clothes(rct_peep *peep)
{
if (peep_has_valid_xy(peep)) {
rct_peep *otherPeep;
uint16 spriteIndex = sprite_get_first_in_quadrant(peep->x, peep->y);
for (; spriteIndex != SPRITE_INDEX_NULL; spriteIndex = otherPeep->next_in_quadrant) {
otherPeep = GET_PEEP(spriteIndex);
if (otherPeep->type == PEEP_TYPE_GUEST) {
int zDiff = abs(otherPeep->z - peep->z);
if (zDiff <= 32) {
otherPeep->tshirt_colour = COLOUR_BRIGHT_PURPLE;
otherPeep->trousers_colour = COLOUR_BRIGHT_PURPLE;
invalidate_sprite_2((rct_sprite*)peep);
}
}
}
}
}
static void peep_give_passing_peeps_pizza(rct_peep *peep)
{
if (peep_has_valid_xy(peep)) {
rct_peep *otherPeep;
uint16 spriteIndex = sprite_get_first_in_quadrant(peep->x, peep->y);
for (; spriteIndex != SPRITE_INDEX_NULL; spriteIndex = otherPeep->next_in_quadrant) {
otherPeep = GET_PEEP(spriteIndex);
if (otherPeep->type == PEEP_TYPE_GUEST) {
int zDiff = abs(otherPeep->z - peep->z);
if (zDiff <= 32) {
if (!(otherPeep->item_standard_flags & PEEP_ITEM_PIZZA)) {
otherPeep->item_standard_flags |= PEEP_ITEM_PIZZA;
int peepDirection = (peep->sprite_direction >> 3) ^ 2;
int otherPeepOppositeDirection = otherPeep->sprite_direction >> 3;
if (peepDirection == otherPeepOppositeDirection) {
if (otherPeep->action == PEEP_ACTION_NONE_1 || otherPeep->action == PEEP_ACTION_NONE_2) {
invalidate_sprite_2((rct_sprite*)peep);
otherPeep->action = PEEP_ACTION_WAVE_2;
otherPeep->action_frame = 0;
otherPeep->action_sprite_image_offset = 0;
sub_693B58(otherPeep);
invalidate_sprite_2((rct_sprite*)otherPeep);
}
}
invalidate_sprite_2((rct_sprite*)otherPeep);
}
}
}
}
}
}
static void peep_make_passing_peeps_sick(rct_peep *peep)
{
if (peep_has_valid_xy(peep)) {
rct_peep *otherPeep;
uint16 spriteIndex = sprite_get_first_in_quadrant(peep->x, peep->y);
for (; spriteIndex != SPRITE_INDEX_NULL; spriteIndex = otherPeep->next_in_quadrant) {
otherPeep = GET_PEEP(spriteIndex);
if (otherPeep->type == PEEP_TYPE_GUEST) {
int zDiff = abs(otherPeep->z - peep->z);
if (zDiff <= 32) {
if (peep != otherPeep) {
if (otherPeep->action == PEEP_ACTION_NONE_1 || otherPeep->action == PEEP_ACTION_NONE_2) {
otherPeep->action = PEEP_ACTION_THROW_UP;
otherPeep->action_frame = 0;
otherPeep->action_sprite_image_offset = 0;
sub_693B58(otherPeep);
invalidate_sprite_2((rct_sprite*)otherPeep);
}
}
}
}
}
}
}
static void peep_give_passing_peeps_ice_cream(rct_peep *peep)
{
if (peep_has_valid_xy(peep)) {
rct_peep *otherPeep;
uint16 spriteIndex = sprite_get_first_in_quadrant(peep->x, peep->y);
for (; spriteIndex != SPRITE_INDEX_NULL; spriteIndex = otherPeep->next_in_quadrant) {
otherPeep = GET_PEEP(spriteIndex);
if (otherPeep->type == PEEP_TYPE_GUEST) {
int zDiff = abs(otherPeep->z - peep->z);
if (zDiff <= 32) {
if (peep != otherPeep) {
if (!(otherPeep->item_standard_flags & PEEP_ITEM_ICE_CREAM)) {
otherPeep->item_standard_flags |= PEEP_ITEM_ICE_CREAM;
peep_update_sprite_type(otherPeep);
}
}
}
}
}
}
}
/**
*
* rct2: 0x0068FD3A
*/
static void sub_68FD3A(rct_peep *peep)
static void peep_easter_egg_peep_interactions(rct_peep *peep)
{
RCT2_CALLPROC_X(0x0068FD3A, 0, 0, 0, 0, (int)peep, 0, 0);
if (peep->flags & PEEP_FLAGS_PURPLE) {
peep_give_passing_peeps_purple_clothes(peep);
}
if (peep->flags & PEEP_FLAGS_PIZZA) {
peep_give_passing_peeps_pizza(peep);
}
if (peep->flags & PEEP_FLAGS_CONTAGIOUS) {
peep_make_passing_peeps_sick(peep);
}
if (peep->flags & PEEP_FLAGS_JOY) {
if (scenario_rand() <= 1456) {
if (peep->action == PEEP_ACTION_NONE_1 || peep->action == PEEP_ACTION_NONE_2) {
peep->action = PEEP_ACTION_JOY;
peep->action_frame = 0;
peep->action_sprite_image_offset = 0;
sub_693B58(peep);
invalidate_sprite_2((rct_sprite*)peep);
}
}
}
if (peep->flags & PEEP_FLAGS_ICE_CREAM) {
peep_give_passing_peeps_ice_cream(peep);
}
}
/**
@@ -9579,9 +9714,9 @@ money32 set_peep_name(int flags, int state, uint16 sprite_index, uint8* text_1,
peep->flags |= PEEP_FLAGS_PURPLE;
}
peep->flags &= ~PEEP_FLAGS_EATING;
peep->flags &= ~PEEP_FLAGS_PIZZA;
if (peep_check_easteregg_name(EASTEREGG_PEEP_NAME_JOANNE_BARTON, peep)) {
peep->flags |= PEEP_FLAGS_EATING;
peep->flags |= PEEP_FLAGS_PIZZA;
}
peep->flags &= ~PEEP_FLAGS_CONTAGIOUS;

View File

@@ -232,6 +232,7 @@ enum PEEP_ACTION_EVENTS {
PEEP_ACTION_STAFF_FIX_2 = 16,
PEEP_ACTION_STAFF_FIX_GROUND = 17,
PEEP_ACTION_STAFF_WATERING = 19,
PEEP_ACTION_JOY = 20,
PEEP_ACTION_READ_MAP = 21,
PEEP_ACTION_WAVE = 22,
PEEP_ACTION_STAFF_EMPTY_BIN = 23,
@@ -265,7 +266,7 @@ enum PEEP_FLAGS {
PEEP_FLAGS_HAPPINESS = (1 << 14), // The peep will start increasing happiness
PEEP_FLAGS_NAUSEA = (1 << 15), // Makes the peep feel sick (e.g. after an extreme ride)
PEEP_FLAGS_PURPLE = (1 << 16), // Makes surrounding peeps purple
PEEP_FLAGS_EATING = (1 << 17), // Reduces hunger
PEEP_FLAGS_PIZZA = (1 << 17), // Gives passing peeps pizza
PEEP_FLAGS_EXPLODE = (1 << 18),
PEEP_FLAGS_RIDE_SHOULD_BE_MARKED_AS_FAVOURITE = (1 << 19),
PEEP_FLAGS_PARK_ENTRANCE_CHOSEN = (1 << 20), //Set when the nearest park entrance has been chosen
@@ -273,7 +274,7 @@ enum PEEP_FLAGS {
PEEP_FLAGS_CONTAGIOUS = (1 << 22), // Makes any peeps in surrounding tiles sick
PEEP_FLAGS_JOY = (1 << 23), // Makes the peep jump in joy
PEEP_FLAGS_ANGRY = (1 << 24),
PEEP_FLAGS_ICE_CREAM = (1 << 25), // Gives the peeps infront of them in queue ice cream
PEEP_FLAGS_ICE_CREAM = (1 << 25), // Gives passing peeps ice cream and they wave back
PEEP_FLAGS_NICE_RIDE = (1 << 26), // Makes the peep think "Nice ride! But not as good as the Phoenix..." on exiting a ride
PEEP_FLAGS_INTAMIN = (1 << 27), // Makes the peep think "I'm so excited - It's an Intamin ride!" while riding on a Intamin
PEEP_FLAGS_HERE_WE_ARE = (1 << 28), // Makes the peep think "...and here we are on X!" while riding a ride

View File

@@ -31,7 +31,7 @@ rct_sprite* g_sprite_list = RCT2_ADDRESS(RCT2_ADDRESS_SPRITE_LIST, rct_sprite);
rct_sprite_entry* g_sprite_entries = RCT2_ADDRESS(RCT2_ADDRESS_SPRITE_ENTRIES, rct_sprite_entry);
static uint16 sprite_get_first_in_quadrant(int x, int y)
uint16 sprite_get_first_in_quadrant(int x, int y)
{
int offset = ((x & 0x1FE0) << 3) | (y >> 5);
return RCT2_ADDRESS(0x00F1EF60, uint16)[offset];

View File

@@ -382,6 +382,7 @@ void litter_create(int x, int y, int z, int direction, int type);
void litter_remove_at(int x, int y, int z);
void sprite_misc_3_create(int x, int y, int z);
void sprite_misc_5_create(int x, int y, int z);
uint16 sprite_get_first_in_quadrant(int x, int y);
///////////////////////////////////////////////////////////////
// Balloon