Merge pull request #11724 from Gymnasiast/refactor/shop-item

Refactor shop items
This commit is contained in:
Michael Steenbeek 2020-05-11 20:10:34 +02:00 committed by GitHub
commit 89011b105f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 219 additions and 304 deletions

View File

@ -172,8 +172,8 @@ static void window_new_campaign_get_shop_items()
auto rideEntry = ride.GetRideEntry();
if (rideEntry != nullptr)
{
auto itemType = rideEntry->shop_item;
if (itemType != SHOP_ITEM_NONE && shop_item_is_food_or_drink(itemType))
auto itemType = rideEntry->shop_item[0];
if (itemType != SHOP_ITEM_NONE && ShopItems[itemType].IsFoodOrDrink())
{
items |= 1ULL << itemType;
}

View File

@ -5019,7 +5019,7 @@ static void window_ride_colour_paint(rct_window* w, rct_drawpixelinfo* dpi)
//
auto rideEntry = ride->GetRideEntry();
if (rideEntry == nullptr || rideEntry->shop_item == SHOP_ITEM_NONE)
if (rideEntry == nullptr || rideEntry->shop_item[0] == SHOP_ITEM_NONE)
{
int32_t x = w->windowPos.x + widget->left;
int32_t y = w->windowPos.y + widget->top;
@ -5053,8 +5053,7 @@ static void window_ride_colour_paint(rct_window* w, rct_drawpixelinfo* dpi)
int32_t x = w->windowPos.x + (widget->left + widget->right) / 2 - 8;
int32_t y = w->windowPos.y + (widget->bottom + widget->top) / 2 - 6;
uint8_t shopItem = rideEntry->shop_item_secondary == SHOP_ITEM_NONE ? rideEntry->shop_item
: rideEntry->shop_item_secondary;
uint8_t shopItem = rideEntry->shop_item[1] == SHOP_ITEM_NONE ? rideEntry->shop_item[0] : rideEntry->shop_item[1];
int32_t spriteIndex = ShopItems[shopItem].Image;
spriteIndex |= SPRITE_ID_PALETTE_COLOUR_1(ride->track_colour[0].main);
@ -6349,7 +6348,7 @@ static void update_same_price_throughout_flags(uint32_t shop_item)
{
uint64_t newFlags;
if (shop_item_is_photo(shop_item))
if (ShopItems[shop_item].IsPhoto())
{
newFlags = gSamePriceThroughoutPark;
newFlags ^= (1ULL << SHOP_ITEM_PHOTO) | (1ULL << SHOP_ITEM_PHOTO2) | (1ULL << SHOP_ITEM_PHOTO3)
@ -6386,7 +6385,7 @@ static void window_ride_income_toggle_primary_price(rct_window* w)
auto rideEntry = get_ride_entry(ride->subtype);
if (rideEntry != nullptr)
{
shop_item = rideEntry->shop_item;
shop_item = rideEntry->shop_item[0];
if (shop_item == 0xFFFF)
return;
}
@ -6398,7 +6397,7 @@ static void window_ride_income_toggle_primary_price(rct_window* w)
update_same_price_throughout_flags(shop_item);
auto rideSetPriceAction = RideSetPriceAction(w->number, ride->price, true);
auto rideSetPriceAction = RideSetPriceAction(w->number, ride->price[0], true);
GameActions::Execute(&rideSetPriceAction);
}
@ -6416,13 +6415,13 @@ static void window_ride_income_toggle_secondary_price(rct_window* w)
if (rideEntry == nullptr)
return;
auto shop_item = rideEntry->shop_item_secondary;
auto shop_item = rideEntry->shop_item[1];
if (shop_item == SHOP_ITEM_NONE)
shop_item = RideTypeDescriptors[ride->type].PhotoItem;
update_same_price_throughout_flags(shop_item);
auto rideSetPriceAction = RideSetPriceAction(w->number, ride->price_secondary, false);
auto rideSetPriceAction = RideSetPriceAction(w->number, ride->price[1], false);
GameActions::Execute(&rideSetPriceAction);
}
@ -6445,7 +6444,7 @@ static void window_ride_income_increase_primary_price(rct_window* w)
if (ride == nullptr)
return;
money16 price = ride->price;
money16 price = ride->price[0];
if (price < MONEY(20, 00))
price++;
@ -6465,7 +6464,7 @@ static void window_ride_income_decrease_primary_price(rct_window* w)
if (ride == nullptr)
return;
money16 price = ride->price;
money16 price = ride->price[0];
if (price > MONEY(0, 00))
price--;
@ -6478,7 +6477,7 @@ static money16 window_ride_income_get_secondary_price(rct_window* w)
if (ride == nullptr)
return 0;
money16 price = ride->price_secondary;
money16 price = ride->price[1];
return price;
}
@ -6496,7 +6495,7 @@ static bool window_ride_income_can_modify_primary_price(rct_window* w)
auto rideEntry = ride->GetRideEntry();
return park_ride_prices_unlocked() || ride->type == RIDE_TYPE_TOILETS
|| (rideEntry != nullptr && rideEntry->shop_item != SHOP_ITEM_NONE);
|| (rideEntry != nullptr && rideEntry->shop_item[0] != SHOP_ITEM_NONE);
}
/**
@ -6558,7 +6557,7 @@ static void window_ride_income_mouseup(rct_window* w, rct_widgetindex widgetInde
auto ride = get_ride(w->number);
if (ride != nullptr)
{
money_to_string(static_cast<money32>(ride->price), _moneyInputText, MONEY_STRING_MAXLENGTH, true);
money_to_string(static_cast<money32>(ride->price[0]), _moneyInputText, MONEY_STRING_MAXLENGTH, true);
window_text_input_raw_open(
w, WIDX_PRIMARY_PRICE, STR_ENTER_NEW_VALUE, STR_ENTER_NEW_VALUE, _moneyInputText, MONEY_STRING_MAXLENGTH);
}
@ -6690,7 +6689,7 @@ static void window_ride_income_invalidate(rct_window* w)
window_ride_income_widgets[WIDX_PRIMARY_PRICE].tooltip = STR_NONE;
// If ride prices are locked, do not allow setting the price, unless we're dealing with a shop or toilet.
if (!park_ride_prices_unlocked() && rideEntry->shop_item == SHOP_ITEM_NONE && ride->type != RIDE_TYPE_TOILETS)
if (!park_ride_prices_unlocked() && rideEntry->shop_item[0] == SHOP_ITEM_NONE && ride->type != RIDE_TYPE_TOILETS)
{
w->disabled_widgets |= (1 << WIDX_PRIMARY_PRICE);
window_ride_income_widgets[WIDX_PRIMARY_PRICE_LABEL].tooltip = STR_RIDE_INCOME_ADMISSION_PAY_FOR_ENTRY_TIP;
@ -6708,7 +6707,7 @@ static void window_ride_income_invalidate(rct_window* w)
window_ride_income_widgets[WIDX_PRIMARY_PRICE].text = STR_FREE;
uint8_t primaryItem = SHOP_ITEM_ADMISSION;
if (ride->type == RIDE_TYPE_TOILETS || ((primaryItem = rideEntry->shop_item) != SHOP_ITEM_NONE))
if (ride->type == RIDE_TYPE_TOILETS || ((primaryItem = rideEntry->shop_item[0]) != SHOP_ITEM_NONE))
{
window_ride_income_widgets[WIDX_PRIMARY_PRICE_SAME_THROUGHOUT_PARK].type = WWT_CHECKBOX;
@ -6722,7 +6721,7 @@ static void window_ride_income_invalidate(rct_window* w)
auto secondaryItem = RideTypeDescriptors[ride->type].PhotoItem;
if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_ON_RIDE_PHOTO))
{
if ((secondaryItem = rideEntry->shop_item_secondary) != SHOP_ITEM_NONE)
if ((secondaryItem = rideEntry->shop_item[1]) != SHOP_ITEM_NONE)
{
window_ride_income_widgets[WIDX_SECONDARY_PRICE_LABEL].text = ShopItems[secondaryItem].Naming.PriceLabel;
}
@ -6753,8 +6752,8 @@ static void window_ride_income_invalidate(rct_window* w)
// Set secondary item price
window_ride_income_widgets[WIDX_SECONDARY_PRICE].text = STR_RIDE_SECONDARY_PRICE_VALUE;
set_format_arg(10, money32, ride->price_secondary);
if (ride->price_secondary == 0)
set_format_arg(10, money32, ride->price[1]);
if (ride->price[1] == 0)
window_ride_income_widgets[WIDX_SECONDARY_PRICE].text = STR_FREE;
}
@ -6787,10 +6786,10 @@ static void window_ride_income_paint(rct_window* w, rct_drawpixelinfo* dpi)
y = w->windowPos.y + window_ride_income_widgets[WIDX_PAGE_BACKGROUND].top + 33;
// Primary item profit / loss per item sold
primaryItem = rideEntry->shop_item;
primaryItem = rideEntry->shop_item[0];
if (primaryItem != SHOP_ITEM_NONE)
{
profit = ride->price;
profit = ride->price[0];
stringId = STR_PROFIT_PER_ITEM_SOLD;
profit -= ShopItems[primaryItem].Cost;
@ -6807,11 +6806,11 @@ static void window_ride_income_paint(rct_window* w, rct_drawpixelinfo* dpi)
// Secondary item profit / loss per item sold
secondaryItem = RideTypeDescriptors[ride->type].PhotoItem;
if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_ON_RIDE_PHOTO))
secondaryItem = rideEntry->shop_item_secondary;
secondaryItem = rideEntry->shop_item[1];
if (secondaryItem != SHOP_ITEM_NONE)
{
profit = ride->price_secondary;
profit = ride->price[1];
stringId = STR_PROFIT_PER_ITEM_SOLD;
profit -= ShopItems[secondaryItem].Cost;
@ -7045,7 +7044,7 @@ static void window_ride_customer_paint(rct_window* w, rct_drawpixelinfo* dpi)
}
// Primary shop items sold
shopItem = ride->GetRideEntry()->shop_item;
shopItem = ride->GetRideEntry()->shop_item[0];
if (shopItem != SHOP_ITEM_NONE)
{
set_format_arg(0, rct_string_id, ShopItems[shopItem].Naming.Plural);
@ -7056,7 +7055,7 @@ static void window_ride_customer_paint(rct_window* w, rct_drawpixelinfo* dpi)
// Secondary shop items sold / on-ride photos sold
shopItem = (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_RIDE_PHOTO) ? RideTypeDescriptors[ride->type].PhotoItem
: ride->GetRideEntry()->shop_item_secondary;
: ride->GetRideEntry()->shop_item[1];
if (shopItem != SHOP_ITEM_NONE)
{
set_format_arg(0, rct_string_id, ShopItems[shopItem].Naming.Plural);

View File

@ -201,32 +201,37 @@ public:
ride->num_customers_timeout = 0;
ride->chairlift_bullwheel_rotation = 0;
ride->price = 0;
ride->price_secondary = 0;
for (auto& price : ride->price)
{
price = 0;
}
if (!(gParkFlags & PARK_FLAGS_NO_MONEY))
{
ride->price = RideData4[ride->type].price;
ride->price_secondary = RideData4[ride->type].price_secondary;
for (auto i = 0; i < NUM_SHOP_ITEMS_PER_RIDE; i++)
{
ride->price[i] = RideData4[ride->type].price[i];
}
if (rideEntry->shop_item == SHOP_ITEM_NONE)
if (rideEntry->shop_item[0] == SHOP_ITEM_NONE)
{
if (!park_ride_prices_unlocked())
{
ride->price = 0;
ride->price[0] = 0;
}
}
else
{
ride->price = ShopItems[rideEntry->shop_item].DefaultPrice;
ride->price[0] = ShopItems[rideEntry->shop_item[0]].DefaultPrice;
}
if (rideEntry->shop_item_secondary != SHOP_ITEM_NONE)
if (rideEntry->shop_item[1] != SHOP_ITEM_NONE)
{
ride->price_secondary = ShopItems[rideEntry->shop_item_secondary].DefaultPrice;
ride->price[1] = ShopItems[rideEntry->shop_item[1]].DefaultPrice;
}
if (gScenarioObjectiveType == OBJECTIVE_BUILD_THE_BEST)
{
ride->price = 0;
ride->price[0] = 0;
}
if (ride->type == RIDE_TYPE_TOILETS)
@ -236,31 +241,22 @@ public:
money32 price = ride_get_common_price(ride);
if (price != MONEY32_UNDEFINED)
{
ride->price = static_cast<money16>(price);
ride->price[0] = static_cast<money16>(price);
}
}
}
if (rideEntry->shop_item != SHOP_ITEM_NONE)
for (auto i = 0; i < NUM_SHOP_ITEMS_PER_RIDE; i++)
{
if (shop_item_has_common_price(rideEntry->shop_item))
if (rideEntry->shop_item[i] != SHOP_ITEM_NONE)
{
money32 price = shop_item_get_common_price(ride, rideEntry->shop_item);
if (price != MONEY32_UNDEFINED)
if (shop_item_has_common_price(rideEntry->shop_item[i]))
{
ride->price = static_cast<money16>(price);
}
}
}
if (rideEntry->shop_item_secondary != SHOP_ITEM_NONE)
{
if (shop_item_has_common_price(rideEntry->shop_item_secondary))
{
money32 price = shop_item_get_common_price(ride, rideEntry->shop_item_secondary);
if (price != MONEY32_UNDEFINED)
{
ride->price_secondary = static_cast<money16>(price);
money32 price = shop_item_get_common_price(ride, rideEntry->shop_item[i]);
if (price != MONEY32_UNDEFINED)
{
ride->price[i] = static_cast<money16>(price);
}
}
}
}
@ -271,7 +267,7 @@ public:
money32 price = shop_item_get_common_price(ride, SHOP_ITEM_PHOTO);
if (price != MONEY32_UNDEFINED)
{
ride->price_secondary = static_cast<money16>(price);
ride->price[1] = static_cast<money16>(price);
}
}
}

View File

@ -112,10 +112,10 @@ public:
shopItem = SHOP_ITEM_ADMISSION;
if (ride->type != RIDE_TYPE_TOILETS)
{
shopItem = rideEntry->shop_item;
shopItem = rideEntry->shop_item[0];
if (shopItem == SHOP_ITEM_NONE)
{
ride->price = _price;
ride->price[0] = _price;
window_invalidate_by_class(WC_RIDE);
return res;
}
@ -123,20 +123,20 @@ public:
// Check same price in park flags
if (!shop_item_has_common_price(shopItem))
{
ride->price = _price;
ride->price[0] = _price;
window_invalidate_by_class(WC_RIDE);
return res;
}
}
else
{
shopItem = rideEntry->shop_item_secondary;
shopItem = rideEntry->shop_item[1];
if (shopItem == SHOP_ITEM_NONE)
{
shopItem = RideTypeDescriptors[ride->type].PhotoItem;
if ((ride->lifecycle_flags & RIDE_LIFECYCLE_ON_RIDE_PHOTO) == 0)
{
ride->price_secondary = _price;
ride->price[1] = _price;
window_invalidate_by_class(WC_RIDE);
return res;
}
@ -144,7 +144,7 @@ public:
// Check same price in park flags
if (!shop_item_has_common_price(shopItem))
{
ride->price_secondary = _price;
ride->price[1] = _price;
window_invalidate_by_class(WC_RIDE);
return res;
}
@ -165,29 +165,29 @@ private:
auto rideEntry = get_ride_entry(ride.subtype);
if (ride.type == RIDE_TYPE_TOILETS && shopItem == SHOP_ITEM_ADMISSION)
{
if (ride.price != _price)
if (ride.price[0] != _price)
{
ride.price = _price;
ride.price[0] = _price;
invalidate = true;
}
}
else if (rideEntry != nullptr && rideEntry->shop_item == shopItem)
else if (rideEntry != nullptr && rideEntry->shop_item[0] == shopItem)
{
if (ride.price != _price)
if (ride.price[0] != _price)
{
ride.price = _price;
ride.price[0] = _price;
invalidate = true;
}
}
if (rideEntry != nullptr)
{
// If the shop item is the same or an on-ride photo
if (rideEntry->shop_item_secondary == shopItem
|| (rideEntry->shop_item_secondary == SHOP_ITEM_NONE && shop_item_is_photo(shopItem)))
if (rideEntry->shop_item[1] == shopItem
|| (rideEntry->shop_item[1] == SHOP_ITEM_NONE && ShopItems[shopItem].IsPhoto()))
{
if (ride.price_secondary != _price)
if (ride.price[1] != _price)
{
ride.price_secondary = _price;
ride.price[1] = _price;
invalidate = true;
}
}

View File

@ -320,9 +320,9 @@ static bool award_is_deserved_best_food(int32_t activeAwardTypes)
auto rideEntry = get_ride_entry(ride.subtype);
if (rideEntry != nullptr)
{
if (!(shopTypes & (1ULL << rideEntry->shop_item)))
if (!(shopTypes & (1ULL << rideEntry->shop_item[0])))
{
shopTypes |= (1ULL << rideEntry->shop_item);
shopTypes |= (1ULL << rideEntry->shop_item[0]);
uniqueShops++;
}
}
@ -366,9 +366,9 @@ static bool award_is_deserved_worst_food(int32_t activeAwardTypes)
auto rideEntry = ride.GetRideEntry();
if (rideEntry != nullptr)
{
if (!(shopTypes & (1ULL << rideEntry->shop_item)))
if (!(shopTypes & (1ULL << rideEntry->shop_item[0])))
{
shopTypes |= (1ULL << rideEntry->shop_item);
shopTypes |= (1ULL << rideEntry->shop_item[0]);
uniqueShops++;
}
}

View File

@ -57,7 +57,7 @@ uint16_t marketing_get_campaign_guest_generation_probability(int32_t campaignTyp
case ADVERTISING_CAMPAIGN_RIDE_FREE:
{
auto ride = get_ride(campaign->RideId);
if (ride == nullptr || ride->price < MONEY(0, 30))
if (ride == nullptr || ride->price[0] < MONEY(0, 30))
probability /= 8;
break;
}
@ -196,10 +196,12 @@ bool marketing_is_campaign_type_applicable(int32_t campaignType)
auto rideEntry = ride.GetRideEntry();
if (rideEntry != nullptr)
{
if (shop_item_is_food_or_drink(rideEntry->shop_item)
|| shop_item_is_food_or_drink(rideEntry->shop_item_secondary))
for (auto& item : rideEntry->shop_item)
{
return true;
if (ShopItems[item].IsFoodOrDrink())
{
return true;
}
}
}
}

View File

@ -62,8 +62,8 @@ void RideObject::ReadLegacy(IReadObjectContext* context, IStream* stream)
_legacyType.max_height = stream->ReadValue<uint8_t>();
// Skipping a uint64_t for the enabled track pieces and two uint8_ts for the categories.
stream->Seek(10, STREAM_SEEK_CURRENT);
_legacyType.shop_item = stream->ReadValue<uint8_t>();
_legacyType.shop_item_secondary = stream->ReadValue<uint8_t>();
_legacyType.shop_item[0] = stream->ReadValue<uint8_t>();
_legacyType.shop_item[1] = stream->ReadValue<uint8_t>();
GetStringTable().Read(context, stream, OBJ_STRING_ID_NAME);
GetStringTable().Read(context, stream, OBJ_STRING_ID_DESCRIPTION);
@ -549,8 +549,10 @@ void RideObject::ReadJson(IReadObjectContext* context, const json_t* root)
_legacyType.max_height = ObjectJsonHelpers::GetInteger(properties, "maxHeight");
// This needs to be set for both shops/facilities _and_ regular rides.
_legacyType.shop_item = SHOP_ITEM_NONE;
_legacyType.shop_item_secondary = SHOP_ITEM_NONE;
for (auto& item : _legacyType.shop_item)
{
item = SHOP_ITEM_NONE;
}
_presetColours = ReadJsonCarColours(json_object_get(properties, "carColours"));
@ -571,7 +573,8 @@ void RideObject::ReadJson(IReadObjectContext* context, const json_t* root)
// Shop item
auto rideSells = ObjectJsonHelpers::GetJsonStringArray(json_object_get(json_object_get(root, "properties"), "sells"));
for (size_t i = 0; i < rideSells.size(); i++)
auto numShopItems = std::min(static_cast<size_t>(NUM_SHOP_ITEMS_PER_RIDE), rideSells.size());
for (size_t i = 0; i < numShopItems; i++)
{
auto shopItem = ParseShopItem(rideSells[i]);
if (shopItem == SHOP_ITEM_NONE)
@ -579,18 +582,7 @@ void RideObject::ReadJson(IReadObjectContext* context, const json_t* root)
context->LogWarning(OBJECT_ERROR_INVALID_PROPERTY, "Unknown shop item");
}
if (i == 0)
{
_legacyType.shop_item = ParseShopItem(rideSells[0]);
}
else if (i == 1)
{
_legacyType.shop_item_secondary = ParseShopItem(rideSells[1]);
}
else
{
// More than 2 shop items not supported yet!
}
_legacyType.shop_item[i] = ParseShopItem(rideSells[i]);
}
}
else

View File

@ -1493,7 +1493,7 @@ bool Guest::DecideAndBuyItem(Ride* ride, int32_t shopItem, money32 price)
return false;
}
if (shop_item_is_food_or_drink(shopItem))
if (ShopItems[shopItem].IsFoodOrDrink())
{
int32_t food = -1;
if ((food = HasFoodStandardFlag()) != 0)
@ -1523,13 +1523,13 @@ bool Guest::DecideAndBuyItem(Ride* ride, int32_t shopItem, money32 price)
return false;
}
if (shop_item_is_food(shopItem) && (hunger > 75))
if (ShopItems[shopItem].IsFood() && (hunger > 75))
{
InsertNewThought(PEEP_THOUGHT_TYPE_NOT_HUNGRY, PEEP_THOUGHT_ITEM_NONE);
return false;
}
if (shop_item_is_drink(shopItem) && (thirst > 75))
if (ShopItems[shopItem].IsDrink() && (thirst > 75))
{
InsertNewThought(PEEP_THOUGHT_TYPE_NOT_THIRSTY, PEEP_THOUGHT_ITEM_NONE);
return false;
@ -1538,7 +1538,7 @@ bool Guest::DecideAndBuyItem(Ride* ride, int32_t shopItem, money32 price)
if (shopItem == SHOP_ITEM_UMBRELLA && climate_is_raining())
goto loc_69B119;
if ((shopItem != SHOP_ITEM_MAP) && shop_item_is_souvenir(shopItem) && !hasVoucher)
if ((shopItem != SHOP_ITEM_MAP) && ShopItems[shopItem].IsSouvenir() && !hasVoucher)
{
if (((scenario_rand() & 0x7F) + 0x73) > happiness)
return false;
@ -1695,25 +1695,25 @@ loc_69B221:
}
}
if (shop_item_is_food(shopItem))
if (ShopItems[shopItem].IsFood())
no_of_food++;
if (shop_item_is_drink(shopItem))
if (ShopItems[shopItem].IsDrink())
no_of_drinks++;
if (shop_item_is_souvenir(shopItem))
if (ShopItems[shopItem].IsSouvenir())
no_of_souvenirs++;
money16* expend_type = &paid_on_souvenirs;
ExpenditureType expenditure = ExpenditureType::ShopStock;
if (shop_item_is_food(shopItem))
if (ShopItems[shopItem].IsFood())
{
expend_type = &paid_on_food;
expenditure = ExpenditureType::FoodDrinkStock;
}
if (shop_item_is_drink(shopItem))
if (ShopItems[shopItem].IsDrink())
{
expend_type = &paid_on_drink;
expenditure = ExpenditureType::FoodDrinkStock;
@ -3417,22 +3417,22 @@ void Guest::UpdateBuying()
{
return;
}
if (ride_type->shop_item_secondary != SHOP_ITEM_NONE)
if (ride_type->shop_item[1] != SHOP_ITEM_NONE)
{
money16 price = ride->price_secondary;
money16 price = ride->price[1];
item_bought = DecideAndBuyItem(ride, ride_type->shop_item_secondary, price);
item_bought = DecideAndBuyItem(ride, ride_type->shop_item[1], price);
if (item_bought)
{
ride->no_secondary_items_sold++;
}
}
if (!item_bought && ride_type->shop_item != SHOP_ITEM_NONE)
if (!item_bought && ride_type->shop_item[0] != SHOP_ITEM_NONE)
{
money16 price = ride->price;
money16 price = ride->price[0];
item_bought = DecideAndBuyItem(ride, ride_type->shop_item, price);
item_bought = DecideAndBuyItem(ride, ride_type->shop_item[0], price);
if (item_bought)
{
ride->no_primary_items_sold++;
@ -4398,7 +4398,7 @@ void Guest::UpdateRideInExit()
if (ride->lifecycle_flags & RIDE_LIFECYCLE_ON_RIDE_PHOTO)
{
uint8_t secondaryItem = RideTypeDescriptors[ride->type].PhotoItem;
if (DecideAndBuyItem(ride, secondaryItem, ride->price_secondary))
if (DecideAndBuyItem(ride, secondaryItem, ride->price[1]))
{
ride->no_secondary_items_sold++;
}

View File

@ -2958,7 +2958,7 @@ static bool peep_interact_with_shop(Peep* peep, int16_t x, int16_t y, TileElemen
return true;
}
money16 cost = ride->price;
money16 cost = ride->price[0];
if (cost != 0 && !(gParkFlags & PARK_FLAGS_NO_MONEY))
{
ride->total_profit += cost;

View File

@ -937,8 +937,8 @@ private:
// Finance / customers
dst->upkeep_cost = src->upkeep_cost;
dst->price = src->price;
dst->price_secondary = src->price_secondary;
dst->price[0] = src->price;
dst->price[1] = src->price_secondary;
dst->income_per_hour = src->income_per_hour;
dst->total_customers = src->total_customers;
dst->profit = src->profit;

View File

@ -664,7 +664,7 @@ void S6Exporter::ExportRide(rct2_ride* dst, const Ride* src)
dst->num_customers[i] = src->num_customers[i];
}
dst->price = src->price;
dst->price = src->price[0];
for (uint8_t i = 0; i < 2; i++)
{
@ -714,7 +714,7 @@ void S6Exporter::ExportRide(rct2_ride* dst, const Ride* src)
dst->broken_car = src->broken_car;
dst->breakdown_reason = src->breakdown_reason;
dst->price_secondary = src->price_secondary;
dst->price_secondary = src->price[1];
dst->reliability = src->reliability;
dst->unreliability_factor = src->unreliability_factor;

View File

@ -657,7 +657,7 @@ public:
dst->num_customers[i] = src->num_customers[i];
}
dst->price = src->price;
dst->price[0] = src->price;
for (uint8_t i = 0; i < 2; i++)
{
@ -708,7 +708,7 @@ public:
dst->broken_car = src->broken_car;
dst->breakdown_reason = src->breakdown_reason;
dst->price_secondary = src->price_secondary;
dst->price[1] = src->price_secondary;
dst->reliability = src->reliability;
dst->unreliability_factor = src->unreliability_factor;

View File

@ -353,21 +353,21 @@ money32 Ride::CalculateIncomePerHour() const
money32 customersPerHour = ride_customers_per_hour(this);
money32 priceMinusCost = ride_get_price(this);
int32_t currentShopItem = entry->shop_item;
int32_t currentShopItem = entry->shop_item[0];
if (currentShopItem != SHOP_ITEM_NONE)
{
priceMinusCost -= ShopItems[currentShopItem].Cost;
}
currentShopItem = (lifecycle_flags & RIDE_LIFECYCLE_ON_RIDE_PHOTO) ? RideTypeDescriptors[type].PhotoItem
: entry->shop_item_secondary;
: entry->shop_item[1];
if (currentShopItem != SHOP_ITEM_NONE)
{
priceMinusCost += price_secondary;
priceMinusCost += price[1];
priceMinusCost -= ShopItems[currentShopItem].Cost;
if (entry->shop_item != SHOP_ITEM_NONE)
if (entry->shop_item[0] != SHOP_ITEM_NONE)
priceMinusCost /= 2;
}
@ -5571,7 +5571,7 @@ money32 ride_get_common_price(Ride* forRide)
{
if (ride.type == forRide->type && &ride != forRide)
{
return ride.price;
return ride.price[0];
}
}
@ -7175,7 +7175,7 @@ money16 ride_get_price(const Ride* ride)
return 0;
}
}
return ride->price;
return ride->price[0];
}
/**

View File

@ -52,6 +52,8 @@ constexpr uint16_t const MAZE_CLEARANCE_HEIGHT = 4 * COORDS_Z_STEP;
constexpr const ObjectEntryIndex RIDE_ENTRY_INDEX_NULL = OBJECT_ENTRY_INDEX_NULL;
constexpr const uint8_t NUM_SHOP_ITEMS_PER_RIDE = 2;
#pragma pack(push, 1)
struct TrackColour
{
@ -122,8 +124,7 @@ struct rct_ride_entry
int8_t intensity_multiplier;
int8_t nausea_multiplier;
uint8_t max_height;
uint8_t shop_item;
uint8_t shop_item_secondary;
uint8_t shop_item[NUM_SHOP_ITEMS_PER_RIDE];
rct_string_id capacity;
void* obj;
@ -271,7 +272,7 @@ struct Ride
uint16_t num_customers_timeout;
// Customer count in the last 10 * 960 game ticks (sliding window)
uint16_t num_customers[CUSTOMER_HISTORY_SIZE];
money16 price;
money16 price[NUM_SHOP_ITEMS_PER_RIDE];
TileCoordsXYZ ChairliftBullwheelLocation[2];
union
{
@ -316,7 +317,6 @@ struct Ride
uint8_t broken_vehicle;
uint8_t broken_car;
uint8_t breakdown_reason;
money16 price_secondary;
union
{
struct

View File

@ -56,8 +56,7 @@ struct RideNameConvention
struct rct_ride_data_4
{
uint8_t price;
uint8_t price_secondary;
uint8_t price[NUM_SHOP_ITEMS_PER_RIDE];
uint8_t default_music;
};

View File

@ -19,64 +19,64 @@ uint64_t gSamePriceThroughoutPark;
/** rct2: 0x00982164 (cost, base value, hot and cold value); 0x00982358 (default price) */
const ShopItemDescriptor ShopItems[SHOP_ITEM_COUNT] = {
// Item, Cost, Base value, Hot value, Cold value, Default price, Image, Price label, Singular, Plural, Indefinite, Display (in guest inventory)
/* SHOP_ITEM_BALLOON */ { 3, 14, 14, 14, MONEY(0, 90), SPR_SHOP_ITEM_BALLOON, { STR_SHOP_ITEM_PRICE_LABEL_BALLOON, STR_SHOP_ITEM_SINGULAR_BALLOON, STR_SHOP_ITEM_PLURAL_BALLOON, STR_SHOP_ITEM_INDEFINITE_BALLOON, STR_SHOP_ITEM_DISPLAY_BALLOON } },
/* SHOP_ITEM_TOY */ { 15, 30, 30, 30, MONEY(2, 50), SPR_SHOP_ITEM_TOY, { STR_SHOP_ITEM_PRICE_LABEL_CUDDLY_TOY, STR_SHOP_ITEM_SINGULAR_CUDDLY_TOY, STR_SHOP_ITEM_PLURAL_CUDDLY_TOY, STR_SHOP_ITEM_INDEFINITE_CUDDLY_TOY, STR_SHOP_ITEM_DISPLAY_CUDDLY_TOY } },
/* SHOP_ITEM_MAP */ { 1, 7, 7, 8, MONEY(0, 60), SPR_SHOP_ITEM_MAP, { STR_SHOP_ITEM_PRICE_LABEL_PARK_MAP, STR_SHOP_ITEM_SINGULAR_PARK_MAP, STR_SHOP_ITEM_PLURAL_PARK_MAP, STR_SHOP_ITEM_INDEFINITE_PARK_MAP, STR_SHOP_ITEM_DISPLAY_PARK_MAP } },
/* SHOP_ITEM_PHOTO */ { 2, 30, 30, 30, MONEY(0, 00), SPR_SHOP_ITEM_PHOTO, { STR_SHOP_ITEM_PRICE_LABEL_ON_RIDE_PHOTO, STR_SHOP_ITEM_SINGULAR_ON_RIDE_PHOTO, STR_SHOP_ITEM_PLURAL_ON_RIDE_PHOTO, STR_SHOP_ITEM_INDEFINITE_ON_RIDE_PHOTO, STR_SHOP_ITEM_DISPLAY_ON_RIDE_PHOTO } },
/* SHOP_ITEM_UMBRELLA */ { 20, 35, 25, 50, MONEY(2, 50), SPR_SHOP_ITEM_UMBRELLA, { STR_SHOP_ITEM_PRICE_LABEL_UMBRELLA, STR_SHOP_ITEM_SINGULAR_UMBRELLA, STR_SHOP_ITEM_PLURAL_UMBRELLA, STR_SHOP_ITEM_INDEFINITE_UMBRELLA, STR_SHOP_ITEM_DISPLAY_UMBRELLA } },
/* SHOP_ITEM_DRINK */ { 3, 12, 20, 10, MONEY(1, 20), SPR_SHOP_ITEM_DRINK, { STR_SHOP_ITEM_PRICE_LABEL_DRINK, STR_SHOP_ITEM_SINGULAR_DRINK, STR_SHOP_ITEM_PLURAL_DRINK, STR_SHOP_ITEM_INDEFINITE_DRINK, STR_SHOP_ITEM_DISPLAY_DRINK } },
/* SHOP_ITEM_BURGER */ { 5, 19, 19, 22, MONEY(1, 50), SPR_SHOP_ITEM_BURGER, { STR_SHOP_ITEM_PRICE_LABEL_BURGER, STR_SHOP_ITEM_SINGULAR_BURGER, STR_SHOP_ITEM_PLURAL_BURGER, STR_SHOP_ITEM_INDEFINITE_BURGER, STR_SHOP_ITEM_DISPLAY_BURGER } },
/* SHOP_ITEM_CHIPS */ { 4, 16, 16, 18, MONEY(1, 50), SPR_SHOP_ITEM_CHIPS, { STR_SHOP_ITEM_PRICE_LABEL_CHIPS, STR_SHOP_ITEM_SINGULAR_CHIPS, STR_SHOP_ITEM_PLURAL_CHIPS, STR_SHOP_ITEM_INDEFINITE_CHIPS, STR_SHOP_ITEM_DISPLAY_CHIPS } },
/* SHOP_ITEM_ICE_CREAM */ { 4, 10, 15, 6, MONEY(0, 90), SPR_SHOP_ITEM_ICE_CREAM, { STR_SHOP_ITEM_PRICE_LABEL_ICE_CREAM, STR_SHOP_ITEM_SINGULAR_ICE_CREAM, STR_SHOP_ITEM_PLURAL_ICE_CREAM, STR_SHOP_ITEM_INDEFINITE_ICE_CREAM, STR_SHOP_ITEM_DISPLAY_ICE_CREAM } },
/* SHOP_ITEM_CANDYFLOSS */ { 3, 9, 9, 6, MONEY(0, 80), SPR_SHOP_ITEM_CANDYFLOSS, { STR_SHOP_ITEM_PRICE_LABEL_CANDYFLOSS, STR_SHOP_ITEM_SINGULAR_CANDYFLOSS, STR_SHOP_ITEM_PLURAL_CANDYFLOSS, STR_SHOP_ITEM_INDEFINITE_CANDYFLOSS, STR_SHOP_ITEM_DISPLAY_CANDYFLOSS } },
/* SHOP_ITEM_EMPTY_CAN */ { 0, 0, 0, 0, MONEY(0, 00), SPR_SHOP_ITEM_EMPTY_CAN, { STR_SHOP_ITEM_PRICE_LABEL_EMPTY_CAN, STR_SHOP_ITEM_SINGULAR_EMPTY_CAN, STR_SHOP_ITEM_PLURAL_EMPTY_CAN, STR_SHOP_ITEM_INDEFINITE_EMPTY_CAN, STR_SHOP_ITEM_DISPLAY_EMPTY_CAN } },
/* SHOP_ITEM_RUBBISH */ { 0, 0, 0, 0, MONEY(0, 00), SPR_SHOP_ITEM_RUBBISH, { STR_SHOP_ITEM_PRICE_LABEL_RUBBISH, STR_SHOP_ITEM_SINGULAR_RUBBISH, STR_SHOP_ITEM_PLURAL_RUBBISH, STR_SHOP_ITEM_INDEFINITE_RUBBISH, STR_SHOP_ITEM_DISPLAY_RUBBISH } },
/* SHOP_ITEM_EMPTY_BURGER_BOX */ { 0, 0, 0, 0, MONEY(0, 00), SPR_SHOP_ITEM_EMPTY_BURGER_BOX, { STR_SHOP_ITEM_PRICE_LABEL_EMPTY_BURGER_BOX, STR_SHOP_ITEM_SINGULAR_EMPTY_BURGER_BOX, STR_SHOP_ITEM_PLURAL_EMPTY_BURGER_BOX, STR_SHOP_ITEM_INDEFINITE_EMPTY_BURGER_BOX, STR_SHOP_ITEM_DISPLAY_EMPTY_BURGER_BOX } },
/* SHOP_ITEM_PIZZA */ { 6, 21, 21, 25, MONEY(1, 60), SPR_SHOP_ITEM_PIZZA, { STR_SHOP_ITEM_PRICE_LABEL_PIZZA, STR_SHOP_ITEM_SINGULAR_PIZZA, STR_SHOP_ITEM_PLURAL_PIZZA, STR_SHOP_ITEM_INDEFINITE_PIZZA, STR_SHOP_ITEM_DISPLAY_PIZZA } },
/* SHOP_ITEM_VOUCHER */ { 0, 0, 0, 0, MONEY(0, 00), SPR_SHOP_ITEM_VOUCHER, { STR_SHOP_ITEM_PRICE_LABEL_VOUCHER, STR_SHOP_ITEM_SINGULAR_VOUCHER, STR_SHOP_ITEM_PLURAL_VOUCHER, STR_SHOP_ITEM_INDEFINITE_VOUCHER, STR_SHOP_ITEM_DISPLAY_VOUCHER } },
/* SHOP_ITEM_POPCORN */ { 5, 13, 13, 11, MONEY(1, 20), SPR_SHOP_ITEM_POPCORN, { STR_SHOP_ITEM_PRICE_LABEL_POPCORN, STR_SHOP_ITEM_SINGULAR_POPCORN, STR_SHOP_ITEM_PLURAL_POPCORN, STR_SHOP_ITEM_INDEFINITE_POPCORN, STR_SHOP_ITEM_DISPLAY_POPCORN } },
/* SHOP_ITEM_HOT_DOG */ { 5, 17, 17, 20, MONEY(1, 00), SPR_SHOP_ITEM_HOT_DOG, { STR_SHOP_ITEM_PRICE_LABEL_HOT_DOG, STR_SHOP_ITEM_SINGULAR_HOT_DOG, STR_SHOP_ITEM_PLURAL_HOT_DOG, STR_SHOP_ITEM_INDEFINITE_HOT_DOG, STR_SHOP_ITEM_DISPLAY_HOT_DOG } },
/* SHOP_ITEM_TENTACLE */ { 11, 22, 20, 18, MONEY(1, 50), SPR_SHOP_ITEM_TENTACLE, { STR_SHOP_ITEM_PRICE_LABEL_TENTACLE, STR_SHOP_ITEM_SINGULAR_TENTACLE, STR_SHOP_ITEM_PLURAL_TENTACLE, STR_SHOP_ITEM_INDEFINITE_TENTACLE, STR_SHOP_ITEM_DISPLAY_TENTACLE } },
/* SHOP_ITEM_HAT */ { 9, 27, 32, 24, MONEY(1, 50), SPR_SHOP_ITEM_HAT, { STR_SHOP_ITEM_PRICE_LABEL_HAT, STR_SHOP_ITEM_SINGULAR_HAT, STR_SHOP_ITEM_PLURAL_HAT, STR_SHOP_ITEM_INDEFINITE_HAT, STR_SHOP_ITEM_DISPLAY_HAT } },
/* SHOP_ITEM_TOFFEE_APPLE */ { 4, 10, 10, 10, MONEY(0, 70), SPR_SHOP_ITEM_TOFFEE_APPLE, { STR_SHOP_ITEM_PRICE_LABEL_TOFFEE_APPLE, STR_SHOP_ITEM_SINGULAR_TOFFEE_APPLE, STR_SHOP_ITEM_PLURAL_TOFFEE_APPLE, STR_SHOP_ITEM_INDEFINITE_TOFFEE_APPLE, STR_SHOP_ITEM_DISPLAY_TOFFEE_APPLE } },
/* SHOP_ITEM_TSHIRT */ { 20, 37, 37, 37, MONEY(3, 00), SPR_SHOP_ITEM_TSHIRT, { STR_SHOP_ITEM_PRICE_LABEL_T_SHIRT, STR_SHOP_ITEM_SINGULAR_T_SHIRT, STR_SHOP_ITEM_PLURAL_T_SHIRT, STR_SHOP_ITEM_INDEFINITE_T_SHIRT, STR_SHOP_ITEM_DISPLAY_T_SHIRT } },
/* SHOP_ITEM_DOUGHNUT */ { 4, 8, 7, 10, MONEY(0, 70), SPR_SHOP_ITEM_DOUGHNUT, { STR_SHOP_ITEM_PRICE_LABEL_DOUGHNUT, STR_SHOP_ITEM_SINGULAR_DOUGHNUT, STR_SHOP_ITEM_PLURAL_DOUGHNUT, STR_SHOP_ITEM_INDEFINITE_DOUGHNUT, STR_SHOP_ITEM_DISPLAY_DOUGHNUT } },
/* SHOP_ITEM_COFFEE */ { 3, 11, 15, 20, MONEY(1, 20), SPR_SHOP_ITEM_COFFEE, { STR_SHOP_ITEM_PRICE_LABEL_COFFEE, STR_SHOP_ITEM_SINGULAR_COFFEE, STR_SHOP_ITEM_PLURAL_COFFEE, STR_SHOP_ITEM_INDEFINITE_COFFEE, STR_SHOP_ITEM_DISPLAY_COFFEE } },
/* SHOP_ITEM_EMPTY_CUP */ { 0, 0, 0, 0, MONEY(0, 00), SPR_SHOP_ITEM_EMPTY_CUP, { STR_SHOP_ITEM_PRICE_LABEL_EMPTY_CUP, STR_SHOP_ITEM_SINGULAR_EMPTY_CUP, STR_SHOP_ITEM_PLURAL_EMPTY_CUP, STR_SHOP_ITEM_INDEFINITE_EMPTY_CUP, STR_SHOP_ITEM_DISPLAY_EMPTY_CUP } },
/* SHOP_ITEM_CHICKEN */ { 5, 19, 19, 22, MONEY(1, 50), SPR_SHOP_ITEM_CHICKEN, { STR_SHOP_ITEM_PRICE_LABEL_FRIED_CHICKEN, STR_SHOP_ITEM_SINGULAR_FRIED_CHICKEN, STR_SHOP_ITEM_PLURAL_FRIED_CHICKEN, STR_SHOP_ITEM_INDEFINITE_FRIED_CHICKEN, STR_SHOP_ITEM_DISPLAY_FRIED_CHICKEN } },
/* SHOP_ITEM_LEMONADE */ { 4, 11, 21, 10, MONEY(1, 20), SPR_SHOP_ITEM_LEMONADE, { STR_SHOP_ITEM_PRICE_LABEL_LEMONADE, STR_SHOP_ITEM_SINGULAR_LEMONADE, STR_SHOP_ITEM_PLURAL_LEMONADE, STR_SHOP_ITEM_INDEFINITE_LEMONADE, STR_SHOP_ITEM_DISPLAY_LEMONADE } },
/* SHOP_ITEM_EMPTY_BOX */ { 0, 0, 0, 0, MONEY(0, 00), SPR_SHOP_ITEM_EMPTY_BOX, { STR_SHOP_ITEM_PRICE_LABEL_EMPTY_BOX, STR_SHOP_ITEM_SINGULAR_EMPTY_BOX, STR_SHOP_ITEM_PLURAL_EMPTY_BOX, STR_SHOP_ITEM_INDEFINITE_EMPTY_BOX, STR_SHOP_ITEM_DISPLAY_EMPTY_BOX } },
/* SHOP_ITEM_EMPTY_BOTTLE */ { 0, 0, 0, 0, MONEY(0, 00), SPR_SHOP_ITEM_EMPTY_BOTTLE, { STR_SHOP_ITEM_PRICE_LABEL_EMPTY_BOTTLE, STR_SHOP_ITEM_SINGULAR_EMPTY_BOTTLE, STR_SHOP_ITEM_PLURAL_EMPTY_BOTTLE, STR_SHOP_ITEM_INDEFINITE_EMPTY_BOTTLE, STR_SHOP_ITEM_DISPLAY_EMPTY_BOTTLE } },
/* 28 */ { 0, 0, 0, 0, MONEY(0, 00), 0, { STR_NONE, STR_NONE, STR_NONE, STR_NONE, STR_NONE } },
/* 29 */ { 0, 0, 0, 0, MONEY(0, 00), 0, { STR_NONE, STR_NONE, STR_NONE, STR_NONE, STR_NONE } },
/* 30 */ { 0, 0, 0, 0, MONEY(0, 00), 0, { STR_NONE, STR_NONE, STR_NONE, STR_NONE, STR_NONE } },
/* SHOP_ITEM_ADMISSION */ { 0, 0, 0, 0, MONEY(0, 00), 0, { STR_NONE, STR_NONE, STR_NONE, STR_NONE, STR_NONE } },
/* SHOP_ITEM_PHOTO2 */ { 2, 30, 30, 30, MONEY(0, 00), SPR_SHOP_ITEM_PHOTO2, { STR_SHOP_ITEM_PRICE_LABEL_ON_RIDE_PHOTO, STR_SHOP_ITEM_SINGULAR_ON_RIDE_PHOTO, STR_SHOP_ITEM_PLURAL_ON_RIDE_PHOTO, STR_SHOP_ITEM_INDEFINITE_ON_RIDE_PHOTO, STR_SHOP_ITEM_DISPLAY_ON_RIDE_PHOTO } },
/* SHOP_ITEM_PHOTO3 */ { 2, 30, 30, 30, MONEY(0, 00), SPR_SHOP_ITEM_PHOTO3, { STR_SHOP_ITEM_PRICE_LABEL_ON_RIDE_PHOTO, STR_SHOP_ITEM_SINGULAR_ON_RIDE_PHOTO, STR_SHOP_ITEM_PLURAL_ON_RIDE_PHOTO, STR_SHOP_ITEM_INDEFINITE_ON_RIDE_PHOTO, STR_SHOP_ITEM_DISPLAY_ON_RIDE_PHOTO } },
/* SHOP_ITEM_PHOTO4 */ { 2, 30, 30, 30, MONEY(0, 00), SPR_SHOP_ITEM_PHOTO4, { STR_SHOP_ITEM_PRICE_LABEL_ON_RIDE_PHOTO, STR_SHOP_ITEM_SINGULAR_ON_RIDE_PHOTO, STR_SHOP_ITEM_PLURAL_ON_RIDE_PHOTO, STR_SHOP_ITEM_INDEFINITE_ON_RIDE_PHOTO, STR_SHOP_ITEM_DISPLAY_ON_RIDE_PHOTO } },
/* SHOP_ITEM_PRETZEL */ { 5, 11, 11, 11, MONEY(1, 10), SPR_SHOP_ITEM_PRETZEL, { STR_SHOP_ITEM_PRICE_LABEL_PRETZEL, STR_SHOP_ITEM_SINGULAR_PRETZEL, STR_SHOP_ITEM_PLURAL_PRETZEL, STR_SHOP_ITEM_INDEFINITE_PRETZEL, STR_SHOP_ITEM_DISPLAY_PRETZEL } },
/* SHOP_ITEM_CHOCOLATE */ { 4, 13, 13, 20, MONEY(1, 20), SPR_SHOP_ITEM_CHOCOLATE, { STR_SHOP_ITEM_PRICE_LABEL_HOT_CHOCOLATE, STR_SHOP_ITEM_SINGULAR_HOT_CHOCOLATE, STR_SHOP_ITEM_PLURAL_HOT_CHOCOLATE, STR_SHOP_ITEM_INDEFINITE_HOT_CHOCOLATE, STR_SHOP_ITEM_DISPLAY_HOT_CHOCOLATE } },
/* SHOP_ITEM_ICED_TEA */ { 3, 10, 20, 10, MONEY(1, 10), SPR_SHOP_ITEM_ICED_TEA, { STR_SHOP_ITEM_PRICE_LABEL_ICED_TEA, STR_SHOP_ITEM_SINGULAR_ICED_TEA, STR_SHOP_ITEM_PLURAL_ICED_TEA, STR_SHOP_ITEM_INDEFINITE_ICED_TEA, STR_SHOP_ITEM_DISPLAY_ICED_TEA } },
/* SHOP_ITEM_FUNNEL_CAKE */ { 5, 13, 11, 14, MONEY(1, 20), SPR_SHOP_ITEM_FUNNEL_CAKE, { STR_SHOP_ITEM_PRICE_LABEL_FUNNEL_CAKE, STR_SHOP_ITEM_SINGULAR_FUNNEL_CAKE, STR_SHOP_ITEM_PLURAL_FUNNEL_CAKE, STR_SHOP_ITEM_INDEFINITE_FUNNEL_CAKE, STR_SHOP_ITEM_DISPLAY_FUNNEL_CAKE } },
/* SHOP_ITEM_SUNGLASSES */ { 8, 15, 20, 12, MONEY(1, 50), SPR_SHOP_ITEM_SUNGLASSES, { STR_SHOP_ITEM_PRICE_LABEL_SUNGLASSES, STR_SHOP_ITEM_SINGULAR_SUNGLASSES, STR_SHOP_ITEM_PLURAL_SUNGLASSES, STR_SHOP_ITEM_INDEFINITE_SUNGLASSES, STR_SHOP_ITEM_DISPLAY_SUNGLASSES } },
/* SHOP_ITEM_BEEF_NOODLES */ { 7, 17, 17, 20, MONEY(1, 50), SPR_SHOP_ITEM_BEEF_NOODLES, { STR_SHOP_ITEM_PRICE_LABEL_BEEF_NOODLES, STR_SHOP_ITEM_SINGULAR_BEEF_NOODLES, STR_SHOP_ITEM_PLURAL_BEEF_NOODLES, STR_SHOP_ITEM_INDEFINITE_BEEF_NOODLES, STR_SHOP_ITEM_DISPLAY_BEEF_NOODLES } },
/* SHOP_ITEM_FRIED_RICE_NOODLES */ { 6, 17, 17, 20, MONEY(1, 50), SPR_SHOP_ITEM_FRIED_RICE_NOODLES, { STR_SHOP_ITEM_PRICE_LABEL_FRIED_RICE_NOODLES, STR_SHOP_ITEM_SINGULAR_FRIED_RICE_NOODLES, STR_SHOP_ITEM_PLURAL_FRIED_RICE_NOODLES, STR_SHOP_ITEM_INDEFINITE_FRIED_RICE_NOODLES, STR_SHOP_ITEM_DISPLAY_FRIED_RICE_NOODLES } },
/* SHOP_ITEM_WONTON_SOUP */ { 4, 13, 13, 15, MONEY(1, 50), SPR_SHOP_ITEM_WONTON_SOUP, { STR_SHOP_ITEM_PRICE_LABEL_WONTON_SOUP, STR_SHOP_ITEM_SINGULAR_WONTON_SOUP, STR_SHOP_ITEM_PLURAL_WONTON_SOUP, STR_SHOP_ITEM_INDEFINITE_WONTON_SOUP, STR_SHOP_ITEM_DISPLAY_WONTON_SOUP } },
/* SHOP_ITEM_MEATBALL_SOUP */ { 5, 14, 14, 16, MONEY(1, 50), SPR_SHOP_ITEM_MEATBALL_SOUP, { STR_SHOP_ITEM_PRICE_LABEL_MEATBALL_SOUP, STR_SHOP_ITEM_SINGULAR_MEATBALL_SOUP, STR_SHOP_ITEM_PLURAL_MEATBALL_SOUP, STR_SHOP_ITEM_INDEFINITE_MEATBALL_SOUP, STR_SHOP_ITEM_DISPLAY_MEATBALL_SOUP } },
/* SHOP_ITEM_FRUIT_JUICE */ { 4, 11, 19, 11, MONEY(1, 20), SPR_SHOP_ITEM_FRUIT_JUICE, { STR_SHOP_ITEM_PRICE_LABEL_FRUIT_JUICE, STR_SHOP_ITEM_SINGULAR_FRUIT_JUICE, STR_SHOP_ITEM_PLURAL_FRUIT_JUICE, STR_SHOP_ITEM_INDEFINITE_FRUIT_JUICE, STR_SHOP_ITEM_DISPLAY_FRUIT_JUICE } },
/* SHOP_ITEM_SOYBEAN_MILK */ { 4, 10, 14, 10, MONEY(1, 20), SPR_SHOP_ITEM_SOYBEAN_MILK, { STR_SHOP_ITEM_PRICE_LABEL_SOYBEAN_MILK, STR_SHOP_ITEM_SINGULAR_SOYBEAN_MILK, STR_SHOP_ITEM_PLURAL_SOYBEAN_MILK, STR_SHOP_ITEM_INDEFINITE_SOYBEAN_MILK, STR_SHOP_ITEM_DISPLAY_SOYBEAN_MILK } },
/* SHOP_ITEM_SUJEONGGWA */ { 3, 11, 14, 11, MONEY(1, 20), SPR_SHOP_ITEM_SUJEONGGWA, { STR_SHOP_ITEM_PRICE_LABEL_SUJONGKWA, STR_SHOP_ITEM_SINGULAR_SUJONGKWA, STR_SHOP_ITEM_PLURAL_SUJONGKWA, STR_SHOP_ITEM_INDEFINITE_SUJONGKWA, STR_SHOP_ITEM_DISPLAY_SUJONGKWA } },
/* SHOP_ITEM_SUB_SANDWICH */ { 5, 19, 19, 17, MONEY(1, 50), SPR_SHOP_ITEM_SUB_SANDWICH, { STR_SHOP_ITEM_PRICE_LABEL_SUB_SANDWICH, STR_SHOP_ITEM_SINGULAR_SUB_SANDWICH, STR_SHOP_ITEM_PLURAL_SUB_SANDWICH, STR_SHOP_ITEM_INDEFINITE_SUB_SANDWICH, STR_SHOP_ITEM_DISPLAY_SUB_SANDWICH } },
/* SHOP_ITEM_COOKIE */ { 4, 8, 8, 8, MONEY(0, 70), SPR_SHOP_ITEM_COOKIE, { STR_SHOP_ITEM_PRICE_LABEL_COOKIE, STR_SHOP_ITEM_SINGULAR_COOKIE, STR_SHOP_ITEM_PLURAL_COOKIE, STR_SHOP_ITEM_INDEFINITE_COOKIE, STR_SHOP_ITEM_DISPLAY_COOKIE } },
/* SHOP_ITEM_EMPTY_BOWL_RED */ { 0, 0, 0, 0, MONEY(0, 00), SPR_SHOP_ITEM_EMPTY_BOWL_RED, { STR_SHOP_ITEM_PRICE_LABEL_EMPTY_BOWL_RED, STR_SHOP_ITEM_SINGULAR_EMPTY_BOWL_RED, STR_SHOP_ITEM_PLURAL_EMPTY_BOWL_RED, STR_SHOP_ITEM_INDEFINITE_EMPTY_BOWL_RED, STR_SHOP_ITEM_DISPLAY_EMPTY_BOWL_RED } },
/* SHOP_ITEM_EMPTY_DRINK_CARTON */ { 0, 0, 0, 0, MONEY(0, 00), SPR_SHOP_ITEM_EMPTY_DRINK_CARTON, { STR_SHOP_ITEM_PRICE_LABEL_EMPTY_DRINK_CARTON, STR_SHOP_ITEM_SINGULAR_EMPTY_DRINK_CARTON, STR_SHOP_ITEM_PLURAL_EMPTY_DRINK_CARTON, STR_SHOP_ITEM_INDEFINITE_EMPTY_DRINK_CARTON, STR_SHOP_ITEM_DISPLAY_EMPTY_DRINK_CARTON } },
/* SHOP_ITEM_EMPTY_JUICE_CUP */ { 0, 0, 0, 0, MONEY(0, 00), SPR_SHOP_ITEM_EMPTY_JUICE_CUP, { STR_SHOP_ITEM_PRICE_LABEL_EMPTY_JUICE_CUP, STR_SHOP_ITEM_SINGULAR_EMPTY_JUICE_CUP, STR_SHOP_ITEM_PLURAL_EMPTY_JUICE_CUP, STR_SHOP_ITEM_INDEFINITE_EMPTY_JUICE_CUP, STR_SHOP_ITEM_DISPLAY_EMPTY_JUICE_CUP } },
/* SHOP_ITEM_ROAST_SAUSAGE */ { 5, 16, 16, 20, MONEY(1, 50), SPR_SHOP_ITEM_ROAST_SAUSAGE, { STR_SHOP_ITEM_PRICE_LABEL_ROAST_SAUSAGE, STR_SHOP_ITEM_SINGULAR_ROAST_SAUSAGE, STR_SHOP_ITEM_PLURAL_ROAST_SAUSAGE, STR_SHOP_ITEM_INDEFINITE_ROAST_SAUSAGE, STR_SHOP_ITEM_DISPLAY_ROAST_SAUSAGE } },
/* SHOP_ITEM_EMPTY_BOWL_BLUE */ { 0, 0, 0, 0, MONEY(0, 00), SPR_SHOP_ITEM_EMPTY_BOWL_BLUE, { STR_SHOP_ITEM_PRICE_LABEL_EMPTY_BOWL_BLUE, STR_SHOP_ITEM_SINGULAR_EMPTY_BOWL_BLUE, STR_SHOP_ITEM_PLURAL_EMPTY_BOWL_BLUE, STR_SHOP_ITEM_INDEFINITE_EMPTY_BOWL_BLUE, STR_SHOP_ITEM_DISPLAY_EMPTY_BOWL_BLUE } },
/* SHOP_ITEM_BALLOON */ { 3, 14, 14, 14, MONEY(0, 90), SPR_SHOP_ITEM_BALLOON, { STR_SHOP_ITEM_PRICE_LABEL_BALLOON, STR_SHOP_ITEM_SINGULAR_BALLOON, STR_SHOP_ITEM_PLURAL_BALLOON, STR_SHOP_ITEM_INDEFINITE_BALLOON, STR_SHOP_ITEM_DISPLAY_BALLOON }, SHOP_ITEM_FLAG_IS_SOUVENIR },
/* SHOP_ITEM_TOY */ { 15, 30, 30, 30, MONEY(2, 50), SPR_SHOP_ITEM_TOY, { STR_SHOP_ITEM_PRICE_LABEL_CUDDLY_TOY, STR_SHOP_ITEM_SINGULAR_CUDDLY_TOY, STR_SHOP_ITEM_PLURAL_CUDDLY_TOY, STR_SHOP_ITEM_INDEFINITE_CUDDLY_TOY, STR_SHOP_ITEM_DISPLAY_CUDDLY_TOY }, SHOP_ITEM_FLAG_IS_SOUVENIR },
/* SHOP_ITEM_MAP */ { 1, 7, 7, 8, MONEY(0, 60), SPR_SHOP_ITEM_MAP, { STR_SHOP_ITEM_PRICE_LABEL_PARK_MAP, STR_SHOP_ITEM_SINGULAR_PARK_MAP, STR_SHOP_ITEM_PLURAL_PARK_MAP, STR_SHOP_ITEM_INDEFINITE_PARK_MAP, STR_SHOP_ITEM_DISPLAY_PARK_MAP }, SHOP_ITEM_FLAG_IS_SOUVENIR },
/* SHOP_ITEM_PHOTO */ { 2, 30, 30, 30, MONEY(0, 00), SPR_SHOP_ITEM_PHOTO, { STR_SHOP_ITEM_PRICE_LABEL_ON_RIDE_PHOTO, STR_SHOP_ITEM_SINGULAR_ON_RIDE_PHOTO, STR_SHOP_ITEM_PLURAL_ON_RIDE_PHOTO, STR_SHOP_ITEM_INDEFINITE_ON_RIDE_PHOTO, STR_SHOP_ITEM_DISPLAY_ON_RIDE_PHOTO }, SHOP_ITEM_FLAG_IS_PHOTO | SHOP_ITEM_FLAG_IS_SOUVENIR },
/* SHOP_ITEM_UMBRELLA */ { 20, 35, 25, 50, MONEY(2, 50), SPR_SHOP_ITEM_UMBRELLA, { STR_SHOP_ITEM_PRICE_LABEL_UMBRELLA, STR_SHOP_ITEM_SINGULAR_UMBRELLA, STR_SHOP_ITEM_PLURAL_UMBRELLA, STR_SHOP_ITEM_INDEFINITE_UMBRELLA, STR_SHOP_ITEM_DISPLAY_UMBRELLA }, SHOP_ITEM_FLAG_IS_SOUVENIR },
/* SHOP_ITEM_DRINK */ { 3, 12, 20, 10, MONEY(1, 20), SPR_SHOP_ITEM_DRINK, { STR_SHOP_ITEM_PRICE_LABEL_DRINK, STR_SHOP_ITEM_SINGULAR_DRINK, STR_SHOP_ITEM_PLURAL_DRINK, STR_SHOP_ITEM_INDEFINITE_DRINK, STR_SHOP_ITEM_DISPLAY_DRINK }, SHOP_ITEM_FLAG_IS_DRINK },
/* SHOP_ITEM_BURGER */ { 5, 19, 19, 22, MONEY(1, 50), SPR_SHOP_ITEM_BURGER, { STR_SHOP_ITEM_PRICE_LABEL_BURGER, STR_SHOP_ITEM_SINGULAR_BURGER, STR_SHOP_ITEM_PLURAL_BURGER, STR_SHOP_ITEM_INDEFINITE_BURGER, STR_SHOP_ITEM_DISPLAY_BURGER }, SHOP_ITEM_FLAG_IS_FOOD },
/* SHOP_ITEM_CHIPS */ { 4, 16, 16, 18, MONEY(1, 50), SPR_SHOP_ITEM_CHIPS, { STR_SHOP_ITEM_PRICE_LABEL_CHIPS, STR_SHOP_ITEM_SINGULAR_CHIPS, STR_SHOP_ITEM_PLURAL_CHIPS, STR_SHOP_ITEM_INDEFINITE_CHIPS, STR_SHOP_ITEM_DISPLAY_CHIPS }, SHOP_ITEM_FLAG_IS_FOOD },
/* SHOP_ITEM_ICE_CREAM */ { 4, 10, 15, 6, MONEY(0, 90), SPR_SHOP_ITEM_ICE_CREAM, { STR_SHOP_ITEM_PRICE_LABEL_ICE_CREAM, STR_SHOP_ITEM_SINGULAR_ICE_CREAM, STR_SHOP_ITEM_PLURAL_ICE_CREAM, STR_SHOP_ITEM_INDEFINITE_ICE_CREAM, STR_SHOP_ITEM_DISPLAY_ICE_CREAM }, SHOP_ITEM_FLAG_IS_FOOD },
/* SHOP_ITEM_CANDYFLOSS */ { 3, 9, 9, 6, MONEY(0, 80), SPR_SHOP_ITEM_CANDYFLOSS, { STR_SHOP_ITEM_PRICE_LABEL_CANDYFLOSS, STR_SHOP_ITEM_SINGULAR_CANDYFLOSS, STR_SHOP_ITEM_PLURAL_CANDYFLOSS, STR_SHOP_ITEM_INDEFINITE_CANDYFLOSS, STR_SHOP_ITEM_DISPLAY_CANDYFLOSS }, SHOP_ITEM_FLAG_IS_FOOD },
/* SHOP_ITEM_EMPTY_CAN */ { 0, 0, 0, 0, MONEY(0, 00), SPR_SHOP_ITEM_EMPTY_CAN, { STR_SHOP_ITEM_PRICE_LABEL_EMPTY_CAN, STR_SHOP_ITEM_SINGULAR_EMPTY_CAN, STR_SHOP_ITEM_PLURAL_EMPTY_CAN, STR_SHOP_ITEM_INDEFINITE_EMPTY_CAN, STR_SHOP_ITEM_DISPLAY_EMPTY_CAN }, 0 },
/* SHOP_ITEM_RUBBISH */ { 0, 0, 0, 0, MONEY(0, 00), SPR_SHOP_ITEM_RUBBISH, { STR_SHOP_ITEM_PRICE_LABEL_RUBBISH, STR_SHOP_ITEM_SINGULAR_RUBBISH, STR_SHOP_ITEM_PLURAL_RUBBISH, STR_SHOP_ITEM_INDEFINITE_RUBBISH, STR_SHOP_ITEM_DISPLAY_RUBBISH }, 0 },
/* SHOP_ITEM_EMPTY_BURGER_BOX */ { 0, 0, 0, 0, MONEY(0, 00), SPR_SHOP_ITEM_EMPTY_BURGER_BOX, { STR_SHOP_ITEM_PRICE_LABEL_EMPTY_BURGER_BOX, STR_SHOP_ITEM_SINGULAR_EMPTY_BURGER_BOX, STR_SHOP_ITEM_PLURAL_EMPTY_BURGER_BOX, STR_SHOP_ITEM_INDEFINITE_EMPTY_BURGER_BOX, STR_SHOP_ITEM_DISPLAY_EMPTY_BURGER_BOX }, 0 },
/* SHOP_ITEM_PIZZA */ { 6, 21, 21, 25, MONEY(1, 60), SPR_SHOP_ITEM_PIZZA, { STR_SHOP_ITEM_PRICE_LABEL_PIZZA, STR_SHOP_ITEM_SINGULAR_PIZZA, STR_SHOP_ITEM_PLURAL_PIZZA, STR_SHOP_ITEM_INDEFINITE_PIZZA, STR_SHOP_ITEM_DISPLAY_PIZZA }, SHOP_ITEM_FLAG_IS_FOOD },
/* SHOP_ITEM_VOUCHER */ { 0, 0, 0, 0, MONEY(0, 00), SPR_SHOP_ITEM_VOUCHER, { STR_SHOP_ITEM_PRICE_LABEL_VOUCHER, STR_SHOP_ITEM_SINGULAR_VOUCHER, STR_SHOP_ITEM_PLURAL_VOUCHER, STR_SHOP_ITEM_INDEFINITE_VOUCHER, STR_SHOP_ITEM_DISPLAY_VOUCHER }, 0 },
/* SHOP_ITEM_POPCORN */ { 5, 13, 13, 11, MONEY(1, 20), SPR_SHOP_ITEM_POPCORN, { STR_SHOP_ITEM_PRICE_LABEL_POPCORN, STR_SHOP_ITEM_SINGULAR_POPCORN, STR_SHOP_ITEM_PLURAL_POPCORN, STR_SHOP_ITEM_INDEFINITE_POPCORN, STR_SHOP_ITEM_DISPLAY_POPCORN }, SHOP_ITEM_FLAG_IS_FOOD },
/* SHOP_ITEM_HOT_DOG */ { 5, 17, 17, 20, MONEY(1, 00), SPR_SHOP_ITEM_HOT_DOG, { STR_SHOP_ITEM_PRICE_LABEL_HOT_DOG, STR_SHOP_ITEM_SINGULAR_HOT_DOG, STR_SHOP_ITEM_PLURAL_HOT_DOG, STR_SHOP_ITEM_INDEFINITE_HOT_DOG, STR_SHOP_ITEM_DISPLAY_HOT_DOG }, SHOP_ITEM_FLAG_IS_FOOD },
/* SHOP_ITEM_TENTACLE */ { 11, 22, 20, 18, MONEY(1, 50), SPR_SHOP_ITEM_TENTACLE, { STR_SHOP_ITEM_PRICE_LABEL_TENTACLE, STR_SHOP_ITEM_SINGULAR_TENTACLE, STR_SHOP_ITEM_PLURAL_TENTACLE, STR_SHOP_ITEM_INDEFINITE_TENTACLE, STR_SHOP_ITEM_DISPLAY_TENTACLE }, SHOP_ITEM_FLAG_IS_FOOD },
/* SHOP_ITEM_HAT */ { 9, 27, 32, 24, MONEY(1, 50), SPR_SHOP_ITEM_HAT, { STR_SHOP_ITEM_PRICE_LABEL_HAT, STR_SHOP_ITEM_SINGULAR_HAT, STR_SHOP_ITEM_PLURAL_HAT, STR_SHOP_ITEM_INDEFINITE_HAT, STR_SHOP_ITEM_DISPLAY_HAT }, SHOP_ITEM_FLAG_IS_SOUVENIR },
/* SHOP_ITEM_TOFFEE_APPLE */ { 4, 10, 10, 10, MONEY(0, 70), SPR_SHOP_ITEM_TOFFEE_APPLE, { STR_SHOP_ITEM_PRICE_LABEL_TOFFEE_APPLE, STR_SHOP_ITEM_SINGULAR_TOFFEE_APPLE, STR_SHOP_ITEM_PLURAL_TOFFEE_APPLE, STR_SHOP_ITEM_INDEFINITE_TOFFEE_APPLE, STR_SHOP_ITEM_DISPLAY_TOFFEE_APPLE }, SHOP_ITEM_FLAG_IS_FOOD },
/* SHOP_ITEM_TSHIRT */ { 20, 37, 37, 37, MONEY(3, 00), SPR_SHOP_ITEM_TSHIRT, { STR_SHOP_ITEM_PRICE_LABEL_T_SHIRT, STR_SHOP_ITEM_SINGULAR_T_SHIRT, STR_SHOP_ITEM_PLURAL_T_SHIRT, STR_SHOP_ITEM_INDEFINITE_T_SHIRT, STR_SHOP_ITEM_DISPLAY_T_SHIRT }, SHOP_ITEM_FLAG_IS_SOUVENIR },
/* SHOP_ITEM_DOUGHNUT */ { 4, 8, 7, 10, MONEY(0, 70), SPR_SHOP_ITEM_DOUGHNUT, { STR_SHOP_ITEM_PRICE_LABEL_DOUGHNUT, STR_SHOP_ITEM_SINGULAR_DOUGHNUT, STR_SHOP_ITEM_PLURAL_DOUGHNUT, STR_SHOP_ITEM_INDEFINITE_DOUGHNUT, STR_SHOP_ITEM_DISPLAY_DOUGHNUT }, SHOP_ITEM_FLAG_IS_FOOD },
/* SHOP_ITEM_COFFEE */ { 3, 11, 15, 20, MONEY(1, 20), SPR_SHOP_ITEM_COFFEE, { STR_SHOP_ITEM_PRICE_LABEL_COFFEE, STR_SHOP_ITEM_SINGULAR_COFFEE, STR_SHOP_ITEM_PLURAL_COFFEE, STR_SHOP_ITEM_INDEFINITE_COFFEE, STR_SHOP_ITEM_DISPLAY_COFFEE }, SHOP_ITEM_FLAG_IS_DRINK },
/* SHOP_ITEM_EMPTY_CUP */ { 0, 0, 0, 0, MONEY(0, 00), SPR_SHOP_ITEM_EMPTY_CUP, { STR_SHOP_ITEM_PRICE_LABEL_EMPTY_CUP, STR_SHOP_ITEM_SINGULAR_EMPTY_CUP, STR_SHOP_ITEM_PLURAL_EMPTY_CUP, STR_SHOP_ITEM_INDEFINITE_EMPTY_CUP, STR_SHOP_ITEM_DISPLAY_EMPTY_CUP }, 0 },
/* SHOP_ITEM_CHICKEN */ { 5, 19, 19, 22, MONEY(1, 50), SPR_SHOP_ITEM_CHICKEN, { STR_SHOP_ITEM_PRICE_LABEL_FRIED_CHICKEN, STR_SHOP_ITEM_SINGULAR_FRIED_CHICKEN, STR_SHOP_ITEM_PLURAL_FRIED_CHICKEN, STR_SHOP_ITEM_INDEFINITE_FRIED_CHICKEN, STR_SHOP_ITEM_DISPLAY_FRIED_CHICKEN }, SHOP_ITEM_FLAG_IS_FOOD },
/* SHOP_ITEM_LEMONADE */ { 4, 11, 21, 10, MONEY(1, 20), SPR_SHOP_ITEM_LEMONADE, { STR_SHOP_ITEM_PRICE_LABEL_LEMONADE, STR_SHOP_ITEM_SINGULAR_LEMONADE, STR_SHOP_ITEM_PLURAL_LEMONADE, STR_SHOP_ITEM_INDEFINITE_LEMONADE, STR_SHOP_ITEM_DISPLAY_LEMONADE }, SHOP_ITEM_FLAG_IS_DRINK },
/* SHOP_ITEM_EMPTY_BOX */ { 0, 0, 0, 0, MONEY(0, 00), SPR_SHOP_ITEM_EMPTY_BOX, { STR_SHOP_ITEM_PRICE_LABEL_EMPTY_BOX, STR_SHOP_ITEM_SINGULAR_EMPTY_BOX, STR_SHOP_ITEM_PLURAL_EMPTY_BOX, STR_SHOP_ITEM_INDEFINITE_EMPTY_BOX, STR_SHOP_ITEM_DISPLAY_EMPTY_BOX }, 0 },
/* SHOP_ITEM_EMPTY_BOTTLE */ { 0, 0, 0, 0, MONEY(0, 00), SPR_SHOP_ITEM_EMPTY_BOTTLE, { STR_SHOP_ITEM_PRICE_LABEL_EMPTY_BOTTLE, STR_SHOP_ITEM_SINGULAR_EMPTY_BOTTLE, STR_SHOP_ITEM_PLURAL_EMPTY_BOTTLE, STR_SHOP_ITEM_INDEFINITE_EMPTY_BOTTLE, STR_SHOP_ITEM_DISPLAY_EMPTY_BOTTLE }, 0 },
/* 28 */ { 0, 0, 0, 0, MONEY(0, 00), 0, { STR_NONE, STR_NONE, STR_NONE, STR_NONE, STR_NONE }, 0 },
/* 29 */ { 0, 0, 0, 0, MONEY(0, 00), 0, { STR_NONE, STR_NONE, STR_NONE, STR_NONE, STR_NONE }, 0 },
/* 30 */ { 0, 0, 0, 0, MONEY(0, 00), 0, { STR_NONE, STR_NONE, STR_NONE, STR_NONE, STR_NONE }, 0 },
/* SHOP_ITEM_ADMISSION */ { 0, 0, 0, 0, MONEY(0, 00), 0, { STR_NONE, STR_NONE, STR_NONE, STR_NONE, STR_NONE }, 0 },
/* SHOP_ITEM_PHOTO2 */ { 2, 30, 30, 30, MONEY(0, 00), SPR_SHOP_ITEM_PHOTO2, { STR_SHOP_ITEM_PRICE_LABEL_ON_RIDE_PHOTO, STR_SHOP_ITEM_SINGULAR_ON_RIDE_PHOTO, STR_SHOP_ITEM_PLURAL_ON_RIDE_PHOTO, STR_SHOP_ITEM_INDEFINITE_ON_RIDE_PHOTO, STR_SHOP_ITEM_DISPLAY_ON_RIDE_PHOTO }, SHOP_ITEM_FLAG_IS_PHOTO | SHOP_ITEM_FLAG_IS_SOUVENIR },
/* SHOP_ITEM_PHOTO3 */ { 2, 30, 30, 30, MONEY(0, 00), SPR_SHOP_ITEM_PHOTO3, { STR_SHOP_ITEM_PRICE_LABEL_ON_RIDE_PHOTO, STR_SHOP_ITEM_SINGULAR_ON_RIDE_PHOTO, STR_SHOP_ITEM_PLURAL_ON_RIDE_PHOTO, STR_SHOP_ITEM_INDEFINITE_ON_RIDE_PHOTO, STR_SHOP_ITEM_DISPLAY_ON_RIDE_PHOTO }, SHOP_ITEM_FLAG_IS_PHOTO | SHOP_ITEM_FLAG_IS_SOUVENIR },
/* SHOP_ITEM_PHOTO4 */ { 2, 30, 30, 30, MONEY(0, 00), SPR_SHOP_ITEM_PHOTO4, { STR_SHOP_ITEM_PRICE_LABEL_ON_RIDE_PHOTO, STR_SHOP_ITEM_SINGULAR_ON_RIDE_PHOTO, STR_SHOP_ITEM_PLURAL_ON_RIDE_PHOTO, STR_SHOP_ITEM_INDEFINITE_ON_RIDE_PHOTO, STR_SHOP_ITEM_DISPLAY_ON_RIDE_PHOTO }, SHOP_ITEM_FLAG_IS_PHOTO | SHOP_ITEM_FLAG_IS_SOUVENIR },
/* SHOP_ITEM_PRETZEL */ { 5, 11, 11, 11, MONEY(1, 10), SPR_SHOP_ITEM_PRETZEL, { STR_SHOP_ITEM_PRICE_LABEL_PRETZEL, STR_SHOP_ITEM_SINGULAR_PRETZEL, STR_SHOP_ITEM_PLURAL_PRETZEL, STR_SHOP_ITEM_INDEFINITE_PRETZEL, STR_SHOP_ITEM_DISPLAY_PRETZEL }, SHOP_ITEM_FLAG_IS_FOOD },
/* SHOP_ITEM_CHOCOLATE */ { 4, 13, 13, 20, MONEY(1, 20), SPR_SHOP_ITEM_CHOCOLATE, { STR_SHOP_ITEM_PRICE_LABEL_HOT_CHOCOLATE, STR_SHOP_ITEM_SINGULAR_HOT_CHOCOLATE, STR_SHOP_ITEM_PLURAL_HOT_CHOCOLATE, STR_SHOP_ITEM_INDEFINITE_HOT_CHOCOLATE, STR_SHOP_ITEM_DISPLAY_HOT_CHOCOLATE }, SHOP_ITEM_FLAG_IS_DRINK },
/* SHOP_ITEM_ICED_TEA */ { 3, 10, 20, 10, MONEY(1, 10), SPR_SHOP_ITEM_ICED_TEA, { STR_SHOP_ITEM_PRICE_LABEL_ICED_TEA, STR_SHOP_ITEM_SINGULAR_ICED_TEA, STR_SHOP_ITEM_PLURAL_ICED_TEA, STR_SHOP_ITEM_INDEFINITE_ICED_TEA, STR_SHOP_ITEM_DISPLAY_ICED_TEA }, SHOP_ITEM_FLAG_IS_DRINK },
/* SHOP_ITEM_FUNNEL_CAKE */ { 5, 13, 11, 14, MONEY(1, 20), SPR_SHOP_ITEM_FUNNEL_CAKE, { STR_SHOP_ITEM_PRICE_LABEL_FUNNEL_CAKE, STR_SHOP_ITEM_SINGULAR_FUNNEL_CAKE, STR_SHOP_ITEM_PLURAL_FUNNEL_CAKE, STR_SHOP_ITEM_INDEFINITE_FUNNEL_CAKE, STR_SHOP_ITEM_DISPLAY_FUNNEL_CAKE }, SHOP_ITEM_FLAG_IS_FOOD },
/* SHOP_ITEM_SUNGLASSES */ { 8, 15, 20, 12, MONEY(1, 50), SPR_SHOP_ITEM_SUNGLASSES, { STR_SHOP_ITEM_PRICE_LABEL_SUNGLASSES, STR_SHOP_ITEM_SINGULAR_SUNGLASSES, STR_SHOP_ITEM_PLURAL_SUNGLASSES, STR_SHOP_ITEM_INDEFINITE_SUNGLASSES, STR_SHOP_ITEM_DISPLAY_SUNGLASSES }, SHOP_ITEM_FLAG_IS_SOUVENIR },
/* SHOP_ITEM_BEEF_NOODLES */ { 7, 17, 17, 20, MONEY(1, 50), SPR_SHOP_ITEM_BEEF_NOODLES, { STR_SHOP_ITEM_PRICE_LABEL_BEEF_NOODLES, STR_SHOP_ITEM_SINGULAR_BEEF_NOODLES, STR_SHOP_ITEM_PLURAL_BEEF_NOODLES, STR_SHOP_ITEM_INDEFINITE_BEEF_NOODLES, STR_SHOP_ITEM_DISPLAY_BEEF_NOODLES }, SHOP_ITEM_FLAG_IS_FOOD },
/* SHOP_ITEM_FRIED_RICE_NOODLES */ { 6, 17, 17, 20, MONEY(1, 50), SPR_SHOP_ITEM_FRIED_RICE_NOODLES, { STR_SHOP_ITEM_PRICE_LABEL_FRIED_RICE_NOODLES, STR_SHOP_ITEM_SINGULAR_FRIED_RICE_NOODLES, STR_SHOP_ITEM_PLURAL_FRIED_RICE_NOODLES, STR_SHOP_ITEM_INDEFINITE_FRIED_RICE_NOODLES, STR_SHOP_ITEM_DISPLAY_FRIED_RICE_NOODLES }, SHOP_ITEM_FLAG_IS_FOOD },
/* SHOP_ITEM_WONTON_SOUP */ { 4, 13, 13, 15, MONEY(1, 50), SPR_SHOP_ITEM_WONTON_SOUP, { STR_SHOP_ITEM_PRICE_LABEL_WONTON_SOUP, STR_SHOP_ITEM_SINGULAR_WONTON_SOUP, STR_SHOP_ITEM_PLURAL_WONTON_SOUP, STR_SHOP_ITEM_INDEFINITE_WONTON_SOUP, STR_SHOP_ITEM_DISPLAY_WONTON_SOUP }, SHOP_ITEM_FLAG_IS_FOOD },
/* SHOP_ITEM_MEATBALL_SOUP */ { 5, 14, 14, 16, MONEY(1, 50), SPR_SHOP_ITEM_MEATBALL_SOUP, { STR_SHOP_ITEM_PRICE_LABEL_MEATBALL_SOUP, STR_SHOP_ITEM_SINGULAR_MEATBALL_SOUP, STR_SHOP_ITEM_PLURAL_MEATBALL_SOUP, STR_SHOP_ITEM_INDEFINITE_MEATBALL_SOUP, STR_SHOP_ITEM_DISPLAY_MEATBALL_SOUP }, SHOP_ITEM_FLAG_IS_FOOD },
/* SHOP_ITEM_FRUIT_JUICE */ { 4, 11, 19, 11, MONEY(1, 20), SPR_SHOP_ITEM_FRUIT_JUICE, { STR_SHOP_ITEM_PRICE_LABEL_FRUIT_JUICE, STR_SHOP_ITEM_SINGULAR_FRUIT_JUICE, STR_SHOP_ITEM_PLURAL_FRUIT_JUICE, STR_SHOP_ITEM_INDEFINITE_FRUIT_JUICE, STR_SHOP_ITEM_DISPLAY_FRUIT_JUICE }, SHOP_ITEM_FLAG_IS_DRINK },
/* SHOP_ITEM_SOYBEAN_MILK */ { 4, 10, 14, 10, MONEY(1, 20), SPR_SHOP_ITEM_SOYBEAN_MILK, { STR_SHOP_ITEM_PRICE_LABEL_SOYBEAN_MILK, STR_SHOP_ITEM_SINGULAR_SOYBEAN_MILK, STR_SHOP_ITEM_PLURAL_SOYBEAN_MILK, STR_SHOP_ITEM_INDEFINITE_SOYBEAN_MILK, STR_SHOP_ITEM_DISPLAY_SOYBEAN_MILK }, SHOP_ITEM_FLAG_IS_DRINK },
/* SHOP_ITEM_SUJEONGGWA */ { 3, 11, 14, 11, MONEY(1, 20), SPR_SHOP_ITEM_SUJEONGGWA, { STR_SHOP_ITEM_PRICE_LABEL_SUJONGKWA, STR_SHOP_ITEM_SINGULAR_SUJONGKWA, STR_SHOP_ITEM_PLURAL_SUJONGKWA, STR_SHOP_ITEM_INDEFINITE_SUJONGKWA, STR_SHOP_ITEM_DISPLAY_SUJONGKWA }, SHOP_ITEM_FLAG_IS_DRINK },
/* SHOP_ITEM_SUB_SANDWICH */ { 5, 19, 19, 17, MONEY(1, 50), SPR_SHOP_ITEM_SUB_SANDWICH, { STR_SHOP_ITEM_PRICE_LABEL_SUB_SANDWICH, STR_SHOP_ITEM_SINGULAR_SUB_SANDWICH, STR_SHOP_ITEM_PLURAL_SUB_SANDWICH, STR_SHOP_ITEM_INDEFINITE_SUB_SANDWICH, STR_SHOP_ITEM_DISPLAY_SUB_SANDWICH }, SHOP_ITEM_FLAG_IS_FOOD },
/* SHOP_ITEM_COOKIE */ { 4, 8, 8, 8, MONEY(0, 70), SPR_SHOP_ITEM_COOKIE, { STR_SHOP_ITEM_PRICE_LABEL_COOKIE, STR_SHOP_ITEM_SINGULAR_COOKIE, STR_SHOP_ITEM_PLURAL_COOKIE, STR_SHOP_ITEM_INDEFINITE_COOKIE, STR_SHOP_ITEM_DISPLAY_COOKIE }, SHOP_ITEM_FLAG_IS_FOOD },
/* SHOP_ITEM_EMPTY_BOWL_RED */ { 0, 0, 0, 0, MONEY(0, 00), SPR_SHOP_ITEM_EMPTY_BOWL_RED, { STR_SHOP_ITEM_PRICE_LABEL_EMPTY_BOWL_RED, STR_SHOP_ITEM_SINGULAR_EMPTY_BOWL_RED, STR_SHOP_ITEM_PLURAL_EMPTY_BOWL_RED, STR_SHOP_ITEM_INDEFINITE_EMPTY_BOWL_RED, STR_SHOP_ITEM_DISPLAY_EMPTY_BOWL_RED }, 0 },
/* SHOP_ITEM_EMPTY_DRINK_CARTON */ { 0, 0, 0, 0, MONEY(0, 00), SPR_SHOP_ITEM_EMPTY_DRINK_CARTON, { STR_SHOP_ITEM_PRICE_LABEL_EMPTY_DRINK_CARTON, STR_SHOP_ITEM_SINGULAR_EMPTY_DRINK_CARTON, STR_SHOP_ITEM_PLURAL_EMPTY_DRINK_CARTON, STR_SHOP_ITEM_INDEFINITE_EMPTY_DRINK_CARTON, STR_SHOP_ITEM_DISPLAY_EMPTY_DRINK_CARTON }, 0 },
/* SHOP_ITEM_EMPTY_JUICE_CUP */ { 0, 0, 0, 0, MONEY(0, 00), SPR_SHOP_ITEM_EMPTY_JUICE_CUP, { STR_SHOP_ITEM_PRICE_LABEL_EMPTY_JUICE_CUP, STR_SHOP_ITEM_SINGULAR_EMPTY_JUICE_CUP, STR_SHOP_ITEM_PLURAL_EMPTY_JUICE_CUP, STR_SHOP_ITEM_INDEFINITE_EMPTY_JUICE_CUP, STR_SHOP_ITEM_DISPLAY_EMPTY_JUICE_CUP }, 0 },
/* SHOP_ITEM_ROAST_SAUSAGE */ { 5, 16, 16, 20, MONEY(1, 50), SPR_SHOP_ITEM_ROAST_SAUSAGE, { STR_SHOP_ITEM_PRICE_LABEL_ROAST_SAUSAGE, STR_SHOP_ITEM_SINGULAR_ROAST_SAUSAGE, STR_SHOP_ITEM_PLURAL_ROAST_SAUSAGE, STR_SHOP_ITEM_INDEFINITE_ROAST_SAUSAGE, STR_SHOP_ITEM_DISPLAY_ROAST_SAUSAGE }, SHOP_ITEM_FLAG_IS_FOOD },
/* SHOP_ITEM_EMPTY_BOWL_BLUE */ { 0, 0, 0, 0, MONEY(0, 00), SPR_SHOP_ITEM_EMPTY_BOWL_BLUE, { STR_SHOP_ITEM_PRICE_LABEL_EMPTY_BOWL_BLUE, STR_SHOP_ITEM_SINGULAR_EMPTY_BOWL_BLUE, STR_SHOP_ITEM_PLURAL_EMPTY_BOWL_BLUE, STR_SHOP_ITEM_INDEFINITE_EMPTY_BOWL_BLUE, STR_SHOP_ITEM_DISPLAY_EMPTY_BOWL_BLUE }, 0 },
};
// clang-format on
money32 shop_item_get_common_price(Ride* forRide, int32_t shopItem)
money32 shop_item_get_common_price(Ride* forRide, const int32_t shopItem)
{
for (const auto& ride : GetRideManager())
{
@ -87,17 +87,17 @@ money32 shop_item_get_common_price(Ride* forRide, int32_t shopItem)
{
continue;
}
if (rideEntry->shop_item == shopItem)
if (rideEntry->shop_item[0] == shopItem)
{
return ride.price;
return ride.price[0];
}
if (rideEntry->shop_item_secondary == shopItem)
if (rideEntry->shop_item[1] == shopItem)
{
return ride.price_secondary;
return ride.price[1];
}
if (shop_item_is_photo(shopItem) && (ride.lifecycle_flags & RIDE_LIFECYCLE_ON_RIDE_PHOTO))
if (ShopItems[shopItem].IsPhoto() && (ride.lifecycle_flags & RIDE_LIFECYCLE_ON_RIDE_PHOTO))
{
return ride.price_secondary;
return ride.price[1];
}
}
}
@ -105,121 +105,37 @@ money32 shop_item_get_common_price(Ride* forRide, int32_t shopItem)
return MONEY32_UNDEFINED;
}
bool shop_item_is_photo(int32_t shopItem)
{
return (
shopItem == SHOP_ITEM_PHOTO || shopItem == SHOP_ITEM_PHOTO2 || shopItem == SHOP_ITEM_PHOTO3
|| shopItem == SHOP_ITEM_PHOTO4);
}
bool shop_item_has_common_price(int32_t shopItem)
bool shop_item_has_common_price(const int32_t shopItem)
{
return (gSamePriceThroughoutPark & (1ULL << shopItem)) != 0;
}
bool shop_item_is_food_or_drink(int32_t shopItem)
bool ShopItemDescriptor::HasFlag(const uint16_t flag) const
{
switch (shopItem)
{
case SHOP_ITEM_DRINK:
case SHOP_ITEM_BURGER:
case SHOP_ITEM_CHIPS:
case SHOP_ITEM_ICE_CREAM:
case SHOP_ITEM_CANDYFLOSS:
case SHOP_ITEM_PIZZA:
case SHOP_ITEM_POPCORN:
case SHOP_ITEM_HOT_DOG:
case SHOP_ITEM_TENTACLE:
case SHOP_ITEM_TOFFEE_APPLE:
case SHOP_ITEM_DOUGHNUT:
case SHOP_ITEM_COFFEE:
case SHOP_ITEM_CHICKEN:
case SHOP_ITEM_LEMONADE:
case SHOP_ITEM_PRETZEL:
case SHOP_ITEM_CHOCOLATE:
case SHOP_ITEM_ICED_TEA:
case SHOP_ITEM_FUNNEL_CAKE:
case SHOP_ITEM_BEEF_NOODLES:
case SHOP_ITEM_FRIED_RICE_NOODLES:
case SHOP_ITEM_WONTON_SOUP:
case SHOP_ITEM_MEATBALL_SOUP:
case SHOP_ITEM_FRUIT_JUICE:
case SHOP_ITEM_SOYBEAN_MILK:
case SHOP_ITEM_SUJEONGGWA:
case SHOP_ITEM_SUB_SANDWICH:
case SHOP_ITEM_COOKIE:
case SHOP_ITEM_ROAST_SAUSAGE:
return true;
default:
return false;
}
return (Flags & flag) != 0;
}
bool shop_item_is_food(int32_t shopItem)
bool ShopItemDescriptor::IsFood() const
{
switch (shopItem)
{
case SHOP_ITEM_BURGER:
case SHOP_ITEM_CHIPS:
case SHOP_ITEM_ICE_CREAM:
case SHOP_ITEM_CANDYFLOSS:
case SHOP_ITEM_PIZZA:
case SHOP_ITEM_POPCORN:
case SHOP_ITEM_HOT_DOG:
case SHOP_ITEM_TENTACLE:
case SHOP_ITEM_TOFFEE_APPLE:
case SHOP_ITEM_DOUGHNUT:
case SHOP_ITEM_CHICKEN:
case SHOP_ITEM_PRETZEL:
case SHOP_ITEM_FUNNEL_CAKE:
case SHOP_ITEM_BEEF_NOODLES:
case SHOP_ITEM_FRIED_RICE_NOODLES:
case SHOP_ITEM_WONTON_SOUP:
case SHOP_ITEM_MEATBALL_SOUP:
case SHOP_ITEM_SUB_SANDWICH:
case SHOP_ITEM_COOKIE:
case SHOP_ITEM_ROAST_SAUSAGE:
return true;
default:
return false;
}
return HasFlag(SHOP_ITEM_FLAG_IS_FOOD);
}
bool shop_item_is_drink(int32_t shopItem)
bool ShopItemDescriptor::IsDrink() const
{
switch (shopItem)
{
case SHOP_ITEM_DRINK:
case SHOP_ITEM_COFFEE:
case SHOP_ITEM_LEMONADE:
case SHOP_ITEM_CHOCOLATE:
case SHOP_ITEM_ICED_TEA:
case SHOP_ITEM_FRUIT_JUICE:
case SHOP_ITEM_SOYBEAN_MILK:
case SHOP_ITEM_SUJEONGGWA:
return true;
default:
return false;
}
return HasFlag(SHOP_ITEM_FLAG_IS_DRINK);
}
bool shop_item_is_souvenir(int32_t shopItem)
bool ShopItemDescriptor::IsFoodOrDrink() const
{
switch (shopItem)
{
case SHOP_ITEM_BALLOON:
case SHOP_ITEM_TOY:
case SHOP_ITEM_MAP:
case SHOP_ITEM_PHOTO:
case SHOP_ITEM_UMBRELLA:
case SHOP_ITEM_HAT:
case SHOP_ITEM_TSHIRT:
case SHOP_ITEM_PHOTO2:
case SHOP_ITEM_PHOTO3:
case SHOP_ITEM_PHOTO4:
case SHOP_ITEM_SUNGLASSES:
return true;
default:
return false;
}
return HasFlag(SHOP_ITEM_FLAG_IS_FOOD | SHOP_ITEM_FLAG_IS_DRINK);
}
bool ShopItemDescriptor::IsSouvenir() const
{
return HasFlag(SHOP_ITEM_FLAG_IS_SOUVENIR);
}
bool ShopItemDescriptor::IsPhoto() const
{
return HasFlag(SHOP_ITEM_FLAG_IS_PHOTO);
}

View File

@ -88,15 +88,26 @@ struct ShopItemDescriptor
money8 DefaultPrice;
uint32_t Image;
ShopItemStrings Naming;
uint16_t Flags;
bool HasFlag(const uint16_t flag) const;
bool IsFood() const;
bool IsDrink() const;
bool IsFoodOrDrink() const;
bool IsSouvenir() const;
bool IsPhoto() const;
};
enum
{
SHOP_ITEM_FLAG_IS_FOOD = (1 << 0),
SHOP_ITEM_FLAG_IS_DRINK = (1 << 1),
SHOP_ITEM_FLAG_IS_SOUVENIR = (1 << 2),
SHOP_ITEM_FLAG_IS_PHOTO = (1 << 3),
};
extern const ShopItemDescriptor ShopItems[SHOP_ITEM_COUNT];
extern uint64_t gSamePriceThroughoutPark;
money32 shop_item_get_common_price(Ride* forRide, int32_t shopItem);
bool shop_item_is_photo(int32_t shopItem);
bool shop_item_has_common_price(int32_t shopItem);
bool shop_item_is_food_or_drink(int32_t shopItem);
bool shop_item_is_food(int32_t shopItem);
bool shop_item_is_drink(int32_t shopItem);
bool shop_item_is_souvenir(int32_t shopItem);
money32 shop_item_get_common_price(Ride* forRide, const int32_t shopItem);
bool shop_item_has_common_price(const int32_t shopItem);

View File

@ -887,7 +887,7 @@ namespace OpenRCT2::Scripting
auto entry = GetLegacyData();
if (entry != nullptr)
{
return entry->shop_item;
return entry->shop_item[0];
}
return 0;
}
@ -897,7 +897,7 @@ namespace OpenRCT2::Scripting
auto entry = GetLegacyData();
if (entry != nullptr)
{
return entry->shop_item_secondary;
return entry->shop_item[1];
}
return 0;
}

View File

@ -540,7 +540,7 @@ money16 Park::CalculateTotalRideValueForMoney() const
// Add ride value
if (ride.value != RIDE_VALUE_UNDEFINED)
{
money16 rideValue = static_cast<money16>(ride.value - ride.price);
money16 rideValue = static_cast<money16>(ride.value - ride.price[0]);
if (rideValue > 0)
{
totalRideValue += rideValue * 2;