From 054d91f0ce950e5644a9ffc7df8d5bdbd347cb2f Mon Sep 17 00:00:00 2001 From: Duncan Frost Date: Thu, 26 Feb 2015 19:02:26 +0000 Subject: [PATCH] Started implementing track_save --- src/ride/track.c | 64 +++++++++++++++++++++++++++++++++++++++++++----- src/ride/track.h | 12 +++++++++ 2 files changed, 70 insertions(+), 6 deletions(-) diff --git a/src/ride/track.c b/src/ride/track.c index 8b364ff68f..f385f594d1 100644 --- a/src/ride/track.c +++ b/src/ride/track.c @@ -713,12 +713,12 @@ void load_track_scenery_objects(){ if (track_design->type == RIDE_TYPE_MAZE){ // Skip all of the maze track elements - while (*(uint32*)track_elements != 0)track_elements += 4; - track_elements += 4; + while (*(uint32*)track_elements != 0)track_elements += sizeof(rct_maze_element); + track_elements += sizeof(rct_maze_element); } else{ // Skip track_elements - while (*track_elements != 255) track_elements += 2; + while (*track_elements != 255) track_elements += sizeof(rct_track_element); track_elements++; // Skip entrance exit elements @@ -727,11 +727,13 @@ void load_track_scenery_objects(){ } while (*track_elements != 255){ - if (!find_object_in_entry_group((rct_object_entry*)track_elements, &entry_type, &entry_index)){ - object_load(-1, (rct_object_entry*)track_elements, 0); + rct_track_scenery* scenery_entry = (rct_track_scenery*)track_elements; + + if (!find_object_in_entry_group(&scenery_entry->scenery_object, &entry_type, &entry_index)){ + object_load(-1, &scenery_entry->scenery_object, 0); } // Skip object and location/direction/colour - track_elements += sizeof(rct_object_entry) + 6; + scenery_entry += sizeof(rct_track_scenery); } sub_6A9FC0(); @@ -1166,3 +1168,53 @@ int track_is_connected_by_shape(rct_map_element *a, rct_map_element *b) return aBank == bBank && aAngle == bAngle; } + + +void sub_6D2804(int al, rct_window* w){ + + if (al == 0){ + //6d2808 + return; + } + + rct_ride* ride = GET_RIDE(w->number); + + if (!(ride->lifecycle_flags & RIDE_LIFECYCLE_TESTED)){ + //6d2ad4 + return; + } + + if (ride->ratings.excitement == 0xFFFF){ + //6d2ad4 + return; + } + + if (!(RCT2_ADDRESS(0x0097CF40, uint32)[ride->type] & 0x10000000)){ + //6d2ad4 + return; + } + + if (RCT2_CALLPROC_X(0x006CE44F, 0, 0, 0, w->number, 0, 0, 0) & 0x100){ + //6d2ad4 + return; + } + + rct_track_scenery* edi = (rct_track_scenery*)(RCT2_GLOBAL(0x00F44058, uint8*)--); + rct_track_scenery* esi = RCT2_ADDRESS(0x009DA193, rct_track_scenery); + + while (1){ + int ebx = 0; + memcpy(edi, esi, sizeof(rct_track_scenery)); + if ((edi->scenery_object.flags & 0xFF) == 0xFF) break; + if ((edi->scenery_object.flags & 0xF) == 5){ + //6d28F4 + } + else if ((edi->scenery_object.flags & 0xF) == 3){ + //6d28dd + } + else { + //6d28ba + } + //6d292f + } +} diff --git a/src/ride/track.h b/src/ride/track.h index fca8678206..528697c297 100644 --- a/src/ride/track.h +++ b/src/ride/track.h @@ -69,6 +69,17 @@ typedef struct{ uint8 flags; }rct_track_element; +/* Track Scenery entry size: 0x16 */ +typedef struct{ + rct_object_entry scenery_object; // 0x00 + uint8 x; // 0x10 + uint8 y; // 0x11 + uint8 z; // 0x12 + uint8 flags; // 0x13 direction quadrant tertiary colour + uint8 primary_colour; // 0x14 + uint8 secondary_colour; // 0x15 +}rct_track_scenery; + enum{ TRACK_ELEMENT_FLAG_CHAIN_LIFT = (1<<7), TRACK_ELEMENT_FLAG_INVERTED = (1<<6), @@ -216,5 +227,6 @@ int track_delete(); void reset_track_list_cache(); int track_is_connected_by_shape(rct_map_element *a, rct_map_element *b); int sub_6D01B3(int bl, int x, int y, int z); +void sub_6D2804(int al, rct_window* w); #endif