From 70f6f638caa5a6c4f178f16c320444e590215dbe Mon Sep 17 00:00:00 2001 From: Gymnasiast Date: Sun, 8 Jan 2017 18:49:26 +0100 Subject: [PATCH] Fix negative queue lengths, fix guests thoughts, import litter, import more fields, fix monorail, fix chairlift crashes --- src/openrct2/rct1.h | 33 ++++++---- src/openrct2/rct1/S4Importer.cpp | 101 ++++++++++++++++++++++--------- 2 files changed, 95 insertions(+), 39 deletions(-) diff --git a/src/openrct2/rct1.h b/src/openrct2/rct1.h index 2b0d850e02..4d8b906463 100644 --- a/src/openrct2/rct1.h +++ b/src/openrct2/rct1.h @@ -74,10 +74,10 @@ typedef struct rct1_ride { uint8 num_stations; uint8 num_trains; uint8 num_cars_per_train; - uint8 unk_7A; - uint8 unk_7B; + uint8 proposed_num_vehicles; // 0x7A + uint8 proposed_num_cars_per_train; // 0x7B uint8 max_trains; - uint8 unk_7D; + uint8 min_max_cars_per_train; // 0x7D uint8 min_waiting_time; uint8 max_waiting_time; uint8 operation_option; @@ -88,13 +88,25 @@ typedef struct rct1_ride { uint16 unk_86; sint32 max_speed; sint32 average_speed; - uint8 pad_090[4]; + uint8 current_test_segment; // 0x90 + uint8 average_speed_test_timeout; // 0x91 + uint8 pad_0E2[0x2]; // 0x92 sint32 length[4]; uint16 time[4]; fixed16_2dp max_positive_vertical_g; fixed16_2dp max_negative_vertical_g; fixed16_2dp max_lateral_g; - uint8 unk_B2[18]; + fixed16_2dp previous_vertical_g;// 0xB2 + fixed16_2dp previous_lateral_g; // 0xB4 + uint8 pad_106[0x2]; + uint32 testing_flags; // 0xB8 + // x y map location of the current track piece during a test + // this is to prevent counting special tracks multiple times + rct_xy8 cur_test_track_location; // 0xBC + // Next 3 variables are related (XXXX XYYY ZZZa aaaa) + uint16 turn_count_default; // 0xBE X = current turn count + uint16 turn_count_banked; // 0xC0 + uint16 turn_count_sloped; // 0xC2 X = number turns > 3 elements union { uint8 num_inversions; uint8 num_holes; @@ -105,7 +117,8 @@ typedef struct rct1_ride { sint32 sheltered_length; uint8 unk_CC[2]; uint8 num_sheltered_sections; - uint8 unk_CF; + // see cur_test_track_location + uint8 cur_test_track_z; // 0xCF sint16 unk_D0; sint16 unk_D2; sint16 customers_per_hour; @@ -119,10 +132,8 @@ typedef struct rct1_ride { sint16 unk_E4; sint16 unk_E6; money16 price; - sint16 var_EA; - sint16 var_EC; - uint8 var_EE; - uint8 var_EF; + rct_xy8 chairlift_bullwheel_location[2]; // 0xEA + uint8 chairlift_bullwheel_z[2]; // 0xEE union { rating_tuple ratings; struct { @@ -132,7 +143,7 @@ typedef struct rct1_ride { }; }; uint16 value; - uint16 var_F8; + uint16 chairlift_bullwheel_rotation; // 0xF8 uint8 satisfaction; uint8 satisfaction_time_out; uint8 satisfaction_next; diff --git a/src/openrct2/rct1/S4Importer.cpp b/src/openrct2/rct1/S4Importer.cpp index f9ef72febd..39d93f42fc 100644 --- a/src/openrct2/rct1/S4Importer.cpp +++ b/src/openrct2/rct1/S4Importer.cpp @@ -146,7 +146,6 @@ public: ImportRides(); ImportRideMeasurements(); ImportSprites(); - //FixNumPeepsInQueue(); ImportMapElements(); ImportMapAnimations(); ImportPeepSpawns(); @@ -615,6 +614,7 @@ private: dst->proposed_num_cars_per_train = src->num_cars_per_train + rideEntry->zero_cars; dst->special_track_elements = src->special_track_elements; dst->num_sheltered_sections = src->num_sheltered_sections; + dst->sheltered_length = src->sheltered_length; // Operation dst->depart_flags = src->depart_flags; @@ -694,14 +694,6 @@ private: } } - // Fix other Z - // if (dst->cur_test_track_z != 255) - // { - // dst->cur_test_track_z /= 2; - // } - // dst->chairlift_bullwheel_z[0] /= 2; - // dst->chairlift_bullwheel_z[1] /= 2; - // Maintenance dst->build_date = src->build_date; dst->inspection_interval = src->inspection_interval; @@ -724,11 +716,30 @@ private: dst->max_positive_vertical_g = src->max_positive_vertical_g; dst->max_negative_vertical_g = src->max_negative_vertical_g; dst->max_lateral_g = src->max_lateral_g; + dst->previous_lateral_g = src->previous_lateral_g; + dst->previous_vertical_g = src->previous_vertical_g; + dst->turn_count_banked = src->turn_count_banked; + dst->turn_count_default = src->turn_count_default; + dst->turn_count_sloped = src->turn_count_sloped; dst->drops = src->num_drops; dst->start_drop_height = src->start_drop_height / 2; dst->highest_drop_height = src->highest_drop_height / 2; dst->inversions = src->num_inversions; - dst->measurement_index = 255; + dst->boat_hire_return_direction = src->boat_hire_return_direction; + dst->boat_hire_return_position = src->boat_hire_return_position; + dst->measurement_index = src->data_logging_index; + dst->chairlift_bullwheel_rotation = src->chairlift_bullwheel_rotation; + for (int i = 0; i < 2; i++) + { + dst->chairlift_bullwheel_location[i] = src->chairlift_bullwheel_location[i]; + dst->chairlift_bullwheel_z[i] = src->chairlift_bullwheel_z[i] / 2; + } + dst->cur_test_track_z = src->cur_test_track_z / 2; + dst->cur_test_track_location = src->cur_test_track_location; + dst->testing_flags = src->testing_flags; + dst->current_test_segment = src->current_test_segment; + dst->current_test_station = 0xFF; + dst->average_speed_test_timeout = src->average_speed_test_timeout; // Finance / customers dst->upkeep_cost = src->upkeep_cost; @@ -746,6 +757,8 @@ private: dst->popularity_next = src->popularity_next; dst->popularity_time_out = src->popularity_time_out; + dst->num_riders = src->num_riders; + dst->music_tune_id = 255; } @@ -785,6 +798,7 @@ private: void ImportSprites() { ImportPeeps(); + ImportLitter(); } void ImportPeeps() @@ -810,11 +824,13 @@ private: dst->sprite_identifier = SPRITE_IDENTIFIER_PEEP; // Peep vs. staff (including which kind) dst->sprite_type = RCT1::GetPeepSpriteType(src->sprite_type); - dst->action = PEEP_ACTION_NONE_2; - dst->special_sprite = 0; - dst->action_sprite_image_offset = 0; - dst->no_action_frame_no = 0; - dst->action_sprite_type = 0; + dst->action = src->action; + dst->special_sprite = src->special_sprite; + dst->next_action_sprite_type = src->next_action_sprite_type; + dst->action_sprite_image_offset = src->action_sprite_image_offset; + dst->no_action_frame_no = src->no_action_frame_no; + dst->action_sprite_type = src->action_sprite_type; + dst->action_frame = src->action_frame; const rct_sprite_bounds* spriteBounds = g_sprite_entries[dst->sprite_type].sprite_bounds; dst->sprite_width = spriteBounds[dst->action_sprite_type].sprite_width; @@ -874,6 +890,11 @@ private: dst->current_ride = src->current_ride; dst->current_ride_station = src->current_ride_station; + dst->current_train = src->current_train; + dst->current_car = src->current_car; + dst->current_seat = src->current_seat; + dst->time_on_ride = src->time_on_ride; + dst->days_in_queue = src->days_in_queue; dst->interactionRideIndex = 0xFF; @@ -913,12 +934,12 @@ private: dst->previous_ride = 0xFF; - dst->thoughts->type = PEEP_THOUGHT_TYPE_NONE; - dst->var_C4 = 0; dst->guest_heading_to_ride_id = src->guest_heading_to_ride_id; // Doubles as staff orders dst->peep_is_lost_countdown = src->peep_is_lost_countdown; + // The ID is fixed later + dst->next_in_queue = src->next_in_queue; dst->peep_flags = 0; dst->pathfind_goal.x = 0xFF; @@ -939,26 +960,50 @@ private: } } + void FixRidePeepLinks(rct_ride * ride, const uint16 * spriteIndexMap) + { + for (int i = 0; i < RCT1_MAX_STATIONS; i++) + { + uint16 originalSpriteIndex = ride->last_peep_in_queue[i]; + if (originalSpriteIndex != SPRITE_INDEX_NULL) + { + ride->last_peep_in_queue[i] = spriteIndexMap[originalSpriteIndex]; + } + } + } + + void FixPeepNextInQueue(rct_peep * peep, const uint16 * spriteIndexMap) + { + uint16 originalSpriteIndex = peep->next_in_queue; + if (originalSpriteIndex != SPRITE_INDEX_NULL) + { + peep->next_in_queue = spriteIndexMap[originalSpriteIndex]; + } + } + void ImportLitter() { for (int i = 0; i < RCT1_MAX_SPRITES; i++) { if (_s4.sprites[i].unknown.sprite_identifier == SPRITE_IDENTIFIER_LITTER) { rct_litter *srcLitter = &_s4.sprites[i].litter; - if (srcLitter->x != (sint16) 0x8000) { - rct_litter *litter = (rct_litter *) create_sprite(SPRITE_IDENTIFIER_LITTER); - move_sprite_to_list((rct_sprite *) litter, SPRITE_LIST_LITTER * 2); - litter->x = srcLitter->x; - litter->y = srcLitter->y; - litter->z = srcLitter->z; + rct_litter *litter = (rct_litter *) create_sprite(SPRITE_IDENTIFIER_LITTER); + move_sprite_to_list((rct_sprite *) litter, SPRITE_LIST_LITTER * 2); - sprite_move(srcLitter->x, srcLitter->y, srcLitter->z, (rct_sprite *) litter); - invalidate_sprite_2((rct_sprite *) litter); + litter->sprite_identifier = srcLitter->sprite_identifier; + litter->type = srcLitter->type; - litter->sprite_direction = srcLitter->sprite_direction; - litter->type = srcLitter->type; - } + litter->x = srcLitter->x; + litter->y = srcLitter->y; + litter->z = srcLitter->z; + litter->sprite_direction = srcLitter->sprite_direction; + litter->sprite_width = srcLitter->sprite_width; + litter->sprite_height_positive = srcLitter->sprite_height_positive; + litter->sprite_height_negative = srcLitter->sprite_height_negative; + + sprite_move(srcLitter->x, srcLitter->y, srcLitter->z, (rct_sprite *) litter); + invalidate_sprite_2((rct_sprite *) litter); } } }