From b9a4ef86dfc21b8bff62dbfcf586f38a28e2cd3d Mon Sep 17 00:00:00 2001 From: Marijn van der Werf Date: Tue, 16 Aug 2016 11:55:38 +0200 Subject: [PATCH] Integrate litter data 0x0097EF6C 0x0097EFCC 0x0097EFE8 --- src/paint/sprite/litter.c | 51 ++++++++++++++++++++++++- src/peep/peep.c | 78 +++++++++++++++++++++++++++++++++++---- src/world/sprite.h | 15 ++++++++ 3 files changed, 135 insertions(+), 9 deletions(-) diff --git a/src/paint/sprite/litter.c b/src/paint/sprite/litter.c index 8d5a1fbf7c..4898a5b7b0 100644 --- a/src/paint/sprite/litter.c +++ b/src/paint/sprite/litter.c @@ -19,6 +19,53 @@ #include "../../interface/viewport.h" #include "../paint.h" +enum { + SPR_LITTER_SICK = 23101, + + SPR_LITTER_SICK_ALT = 23103, + + SPR_LITTER_EMPTY_CAN = 23105, + + SPR_LITTER_RUBBISH = 23107, + + SPR_LITTER_EMPTY_BURGER_BOX = 23109, + + SPR_LITTER_EMPTY_CUP = 23111, + + SPR_LITTER_EMPTY_BOX = 23113, + + SPR_LITTER_EMPTY_BOTTLE = 23115, + + SPR_LITTER_EMPTY_BOWL_RED = 23117, + + SPR_LITTER_EMPTY_DRINK_CART = 23121, + + SPR_LITTER_EMPTY_JUICE_CUP = 23125, + + SPR_LITTER_EMPTY_BOWL_BLUE = 23129, +}; + +typedef struct litter_sprite { + uint16 base_id; + uint8 direction_mask; +} litter_sprite; + +/** rct2: 0x0097EF6C */ +static const litter_sprite litter_sprites[] = { + { SPR_LITTER_SICK, 0x1 }, + { SPR_LITTER_SICK_ALT, 0x1 }, + { SPR_LITTER_EMPTY_CAN, 0x1 }, + { SPR_LITTER_RUBBISH, 0x1 }, + { SPR_LITTER_EMPTY_BURGER_BOX, 0x1 }, + { SPR_LITTER_EMPTY_CUP, 0x1 }, + { SPR_LITTER_EMPTY_BOX, 0x1 }, + { SPR_LITTER_EMPTY_BOTTLE, 0x1 }, + { SPR_LITTER_EMPTY_BOWL_RED, 0x3 }, + { SPR_LITTER_EMPTY_DRINK_CART, 0x3 }, + { SPR_LITTER_EMPTY_JUICE_CUP, 0x3 }, + { SPR_LITTER_EMPTY_BOWL_BLUE, 0x3 }, +}; + /** * Litter Paint Setup * rct2: 0x006736FC @@ -34,9 +81,9 @@ void litter_paint(rct_litter *litter, int imageDirection) imageDirection >>= 3; // Some litter types have only 1 direction so remove // anything that isn't required. - imageDirection &= RCT2_ADDRESS(0x97EF6C, uint32)[litter->type * 2 + 1]; + imageDirection &= litter_sprites[litter->type].direction_mask; - uint32 image_id = imageDirection + RCT2_ADDRESS(0x97EF6C, uint32)[litter->type * 2]; + uint32 image_id = imageDirection + litter_sprites[litter->type].base_id; sub_98197C(image_id, 0, 0, 4, 4, -1, litter->z, -4, -4, litter->z + 2, get_current_rotation()); } diff --git a/src/peep/peep.c b/src/peep/peep.c index 1b99171bce..93a81529ba 100644 --- a/src/peep/peep.c +++ b/src/peep/peep.c @@ -1586,7 +1586,7 @@ static int peep_update_action(sint16* x, sint16* y, sint16* xy_distance, rct_pee peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_2; // Create sick at location - litter_create(peep->x, peep->y, peep->z, peep->sprite_direction, peep->sprite_index & 1); + litter_create(peep->x, peep->y, peep->z, peep->sprite_direction, (peep->sprite_index & 1) ? LITTER_TYPE_SICK_ALT: LITTER_TYPE_SICK); int sound_id = SOUND_COUGH_1 + (scenario_rand() & 3); audio_play_sound_at_location(sound_id, peep->x, peep->y, peep->z); @@ -5454,6 +5454,64 @@ static void peep_update_buying(rct_peep* peep) return; } +/** rct2: 0x0097EFCC */ +static const uint8 item_standard_litter[32] = { + LITTER_TYPE_RUBBISH, // PEEP_ITEM_BALLOON + LITTER_TYPE_RUBBISH, // PEEP_ITEM_TOY + LITTER_TYPE_RUBBISH, // PEEP_ITEM_MAP + LITTER_TYPE_RUBBISH, // PEEP_ITEM_PHOTO + LITTER_TYPE_RUBBISH, // PEEP_ITEM_UMBRELLA + LITTER_TYPE_RUBBISH, // PEEP_ITEM_DRINK + LITTER_TYPE_RUBBISH, // PEEP_ITEM_BURGER + LITTER_TYPE_RUBBISH, // PEEP_ITEM_FRIES + LITTER_TYPE_RUBBISH, // PEEP_ITEM_ICE_CREAM + LITTER_TYPE_RUBBISH, // PEEP_ITEM_COTTON_CANDY + LITTER_TYPE_EMPTY_CAN, // PEEP_ITEM_EMPTY_CAN + LITTER_TYPE_RUBBISH, // PEEP_ITEM_RUBBISH + LITTER_TYPE_EMPTY_BURGER_BOX, // PEEP_ITEM_EMPTY_BURGER_BOX + LITTER_TYPE_RUBBISH, // PEEP_ITEM_PIZZA + LITTER_TYPE_RUBBISH, // PEEP_ITEM_VOUCHER + LITTER_TYPE_RUBBISH, // PEEP_ITEM_POPCORN + LITTER_TYPE_RUBBISH, // PEEP_ITEM_HOT_DOG + LITTER_TYPE_RUBBISH, // PEEP_ITEM_TENTACLE + LITTER_TYPE_RUBBISH, // PEEP_ITEM_HAT + LITTER_TYPE_RUBBISH, // PEEP_ITEM_CANDY_APPLE + LITTER_TYPE_RUBBISH, // PEEP_ITEM_TSHIRT + LITTER_TYPE_RUBBISH, // PEEP_ITEM_DONUT + LITTER_TYPE_RUBBISH, // PEEP_ITEM_COFFEE + LITTER_TYPE_EMPTY_CUP, // PEEP_ITEM_EMPTY_CUP + LITTER_TYPE_EMPTY_BOX, // PEEP_ITEM_CHICKEN + LITTER_TYPE_EMPTY_BOTTLE, // PEEP_ITEM_LEMONADE + LITTER_TYPE_EMPTY_BOX, // PEEP_ITEM_EMPTY_BOX + LITTER_TYPE_EMPTY_BOTTLE, // PEEP_ITEM_EMPTY_BOTTLE +}; + +/** rct2: 0x0097EFE8 */ +static const uint8 item_extra_litter[32] = { + LITTER_TYPE_RUBBISH, // PEEP_ITEM_PHOTO2 + LITTER_TYPE_RUBBISH, // PEEP_ITEM_PHOTO3 + LITTER_TYPE_RUBBISH, // PEEP_ITEM_PHOTO4 + LITTER_TYPE_RUBBISH, // PEEP_ITEM_PRETZEL + LITTER_TYPE_RUBBISH, // PEEP_ITEM_CHOCOLATE + LITTER_TYPE_RUBBISH, // PEEP_ITEM_ICED_TEA + LITTER_TYPE_RUBBISH, // PEEP_ITEM_FUNNEL_CAKE + LITTER_TYPE_RUBBISH, // PEEP_ITEM_SUNGLASSES + LITTER_TYPE_RUBBISH, // PEEP_ITEM_BEEF_NOODLES + LITTER_TYPE_RUBBISH, // PEEP_ITEM_FRIED_RICE_NOODLES + LITTER_TYPE_RUBBISH, // PEEP_ITEM_WONTON_SOUP + LITTER_TYPE_RUBBISH, // PEEP_ITEM_MEATBALL_SOUP + LITTER_TYPE_RUBBISH, // PEEP_ITEM_FRUIT_JUICE + LITTER_TYPE_RUBBISH, // PEEP_ITEM_SOYBEAN_MILK + LITTER_TYPE_RUBBISH, // PEEP_ITEM_SU_JONGKWA + LITTER_TYPE_RUBBISH, // PEEP_ITEM_SUB_SANDWICH + LITTER_TYPE_RUBBISH, // PEEP_ITEM_COOKIE + LITTER_TYPE_EMPTY_BOWL_RED, // PEEP_ITEM_EMPTY_BOWL_RED + LITTER_TYPE_EMPTY_DRINK_CARTON, // PEEP_ITEM_EMPTY_DRINK_CARTON + LITTER_TYPE_EMPTY_JUICE_CUP, // PEEP_ITEM_EMPTY_JUICE_CUP + LITTER_TYPE_RUBBISH, // PEEP_ITEM_ROAST_SAUSAGE + LITTER_TYPE_EMPTY_BOWL_BLUE, // PEEP_ITEM_EMPTY_BOWL_BLUE +}; + /** * * rct2: 0x00691089 @@ -5531,7 +5589,7 @@ static void peep_update_using_bin(rct_peep* peep){ peep_update_sprite_type(peep); continue; } - uint8 bp = RCT2_ADDRESS(0x97EFCC, uint8)[cur_container]; + uint8 bp = item_standard_litter[cur_container]; int x, y; x = peep->x + (scenario_rand() & 7) - 3; @@ -5562,7 +5620,7 @@ static void peep_update_using_bin(rct_peep* peep){ peep_update_sprite_type(peep); continue; } - uint8 bp = RCT2_ADDRESS(0x97EFE8, uint8)[cur_container]; + uint8 bp = item_extra_litter[cur_container]; int x, y; x = peep->x + (scenario_rand() & 7) - 3; @@ -6137,7 +6195,13 @@ static void peep_update_walking(rct_peep* peep){ if (peep->peep_flags & PEEP_FLAGS_LITTER){ if (!(peep->next_var_29 & 0x18)){ if ((0xFFFF & scenario_rand()) <= 4096){ - int ebp = (scenario_rand() & 0x3) + 2; + static const uint8 litter_types[] = { + LITTER_TYPE_EMPTY_CAN, + LITTER_TYPE_RUBBISH, + LITTER_TYPE_EMPTY_BURGER_BOX, + LITTER_TYPE_EMPTY_CUP, + }; + int ebp = litter_types[scenario_rand() & 0x3]; int x = peep->x + (scenario_rand() & 0x7) - 3; int y = peep->y + (scenario_rand() & 0x7) - 3; int direction = (scenario_rand() & 0x3); @@ -6160,7 +6224,7 @@ static void peep_update_walking(rct_peep* peep){ if (pos_stnd != 32){ peep->item_standard_flags &= ~(1u << pos_stnd); - bp = RCT2_ADDRESS(0x97EFCC, uint8)[pos_stnd]; + bp = item_standard_litter[pos_stnd]; } else{ uint8 pos_extr = 0; @@ -6168,7 +6232,7 @@ static void peep_update_walking(rct_peep* peep){ if (container & (1u << pos_extr)) break; peep->item_extra_flags &= ~(1u << pos_extr); - bp = RCT2_ADDRESS(0x97EFE8, uint8)[pos_extr]; + bp = item_extra_litter[pos_extr]; } peep->window_invalidate_flags |= PEEP_INVALIDATE_PEEP_INVENTORY; @@ -7931,7 +7995,7 @@ static int peep_footpath_move_forward(rct_peep* peep, sint16 x, sint16 y, rct_ma continue; litter_count++; - if (litter->type > 1) + if (litter->type != LITTER_TYPE_SICK && litter->type != LITTER_TYPE_SICK_ALT) continue; litter_count--; diff --git a/src/world/sprite.h b/src/world/sprite.h index 61a0b5ccf3..150b4af8a5 100644 --- a/src/world/sprite.h +++ b/src/world/sprite.h @@ -384,6 +384,21 @@ enum { SPRITE_FLAGS_PEEP_FLASHING = 1 << 9, // Peep belongs to highlighted group (flashes red on map) }; +enum { + LITTER_TYPE_SICK, + LITTER_TYPE_SICK_ALT, + LITTER_TYPE_EMPTY_CAN, + LITTER_TYPE_RUBBISH, + LITTER_TYPE_EMPTY_BURGER_BOX, + LITTER_TYPE_EMPTY_CUP, + LITTER_TYPE_EMPTY_BOX, + LITTER_TYPE_EMPTY_BOTTLE, + LITTER_TYPE_EMPTY_BOWL_RED, + LITTER_TYPE_EMPTY_DRINK_CARTON, + LITTER_TYPE_EMPTY_JUICE_CUP, + LITTER_TYPE_EMPTY_BOWL_BLUE, +}; + rct_sprite *get_sprite(size_t sprite_idx); // rct2: 0x00982708