Merge pull request #961 from duncanspumpkin/peep

Peep
This commit is contained in:
Ted John 2015-03-25 18:54:22 +00:00
commit 76358fdf31
20 changed files with 2870 additions and 229 deletions

View File

@ -751,20 +751,55 @@ void sub_688485(){
}
int sub_0x686806(rct_sprite* sprite, int eax, int ecx, int edx){
int sub_0x686806(rct_sprite* sprite, int eax, int image_id, int ecx, int edx){
int ebp = (eax >> 8) & 0xFF;
edx <<= 16;
ebp += RCT2_GLOBAL(0x9DEA56, uint16);
RCT2_GLOBAL(0xF1AD28, uint32) = 0;
RCT2_GLOBAL(0xF1AD2C, uint32) = 0;
edx = (edx >> 16) | (ebp << 16);
ebp = RCT2_GLOBAL(0xEE7888, uint32);
if ((uint32)ebp >= RCT2_GLOBAL(0xEE7880, uint32)) return 1;
//686840 not finished
//Not a paint struct but something similar
paint_struct* ps = RCT2_GLOBAL(0xEE7888, paint_struct*);
if ((uint32)ps >= RCT2_GLOBAL(0xEE7880, uint32)) return 1;
ps->image_id = image_id;
rct_g1_element *g1Element = &RCT2_ADDRESS(RCT2_ADDRESS_G1_ELEMENTS, rct_g1_element)[image_id & 0x7FFFF];
eax = (eax & 0xFF) + RCT2_GLOBAL(0x9DE568, uint16);
ecx = (ecx & 0xFF) + RCT2_GLOBAL(0x9DE56C, uint16);
int x = ecx - eax;
int y = (ecx + eax) / 2 - (edx & 0xFFFF);
ps->x = x;
ps->y = y;
int left = x + g1Element->x_offset;
int bottom = y + g1Element->y_offset;
int right = left + g1Element->width;
int top = bottom + g1Element->height;
RCT2_GLOBAL(0xF1AD1C, uint16) = left;
RCT2_GLOBAL(0xF1AD1E, uint16) = bottom;
rct_drawpixelinfo* dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*);
if (right <= dpi->x)return 1;
if (top <= dpi->y)return 1;
if (left > dpi->x + dpi->width) return 1;
if (bottom > dpi->y + dpi->height) return 1;
RCT2_GLOBAL(0x9DE568, uint16);
//686918 not finished
return 0;
}
/**
* Litter Paint Setup??
* rct2: 0x006736FC
@ -829,8 +864,8 @@ void sub_0x69E8B0(uint32 eax, uint32 ecx){
eax = (eax & 0x1FE0) << 3 | (ecx >> 5);
int sprite_idx = RCT2_ADDRESS(0xF1EF60, uint16)[eax];
if (sprite_idx == SPRITE_INDEX_NULL) return;
for (rct_sprite* spr = &g_sprite_list[sprite_idx]; sprite_idx != SPRITE_INDEX_NULL; sprite_idx = spr->unknown.var_02){
for (rct_sprite* spr = &g_sprite_list[sprite_idx]; sprite_idx != SPRITE_INDEX_NULL; sprite_idx = spr->unknown.next_in_quadrant){
spr = &g_sprite_list[sprite_idx];
dpi = RCT2_GLOBAL(0x140E9A8, rct_drawpixelinfo*);

View File

@ -67,7 +67,7 @@ int viewport_interaction_get_item_left(int x, int y, viewport_interaction_info *
switch (sprite->unknown.sprite_identifier) {
case SPRITE_IDENTIFIER_VEHICLE:
vehicle = &(sprite->vehicle);
if (vehicle->var_D6 != 255)
if (vehicle->ride_subtype != 255)
vehicle_set_map_toolbar(vehicle);
else
info->type = VIEWPORT_INTERACTION_ITEM_NONE;

View File

@ -644,7 +644,7 @@ int paint_ride_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dp
no_positions = *((uint16*)peep_loading_positions);
peep_loading_positions += 2;
}
rideVehicleEntry->var_61 = (uint32)peep_loading_positions;
rideVehicleEntry->peep_loading_positions = peep_loading_positions;
peep_loading_positions += no_positions;
}
}
@ -718,7 +718,7 @@ int paint_ride_entry(int flags, int ebx, int ecx, int edx, rct_drawpixelinfo* dp
}
rideVehicleEntry->var_02 = 0;
rideVehicleEntry->var_03 = 0;
rideVehicleEntry->var_61 = 0;
rideVehicleEntry->peep_loading_positions = 0;
}
ride_type->var_1AE = 0;

File diff suppressed because it is too large Load Diff

View File

@ -209,6 +209,7 @@ enum PEEP_STATE {
};
enum PEEP_ACTION_EVENTS {
PEEP_ACTION_CHECK_TIME = 0,
// If no food then check watch
PEEP_ACTION_EAT_FOOD = 1,
PEEP_ACTION_SHAKE_HEAD = 2,
@ -344,18 +345,21 @@ typedef struct {
typedef struct {
uint8 sprite_identifier; // 0x00
uint8 var_01;
uint16 var_02; // 0x02
uint16 next_in_quadrant; // 0x02
uint16 next; // 0x04
uint16 previous; // 0x06
uint8 linked_list_type_offset; // 0x08 Valid values are SPRITE_LINKEDLIST_OFFSET_...
uint8 var_09; // 0x09
// Height from center of sprite to bottom
uint8 sprite_height_negative; // 0x09
uint16 sprite_index; // 0x0A
uint16 var_0C;
sint16 x; // 0x0E
sint16 y; // 0x10
sint16 z; // 0x12
uint8 var_14; // 0x14
uint8 var_15; // 0x15
// Width from center of sprite to edge
uint8 sprite_width; // 0x14
// Height from center of sprite to top
uint8 sprite_height_positive; // 0x15
sint16 sprite_left; // 0x16
sint16 sprite_top; // 0x18
sint16 sprite_right; // 0x1A
@ -391,12 +395,13 @@ typedef struct {
uint8 hunger; // 0x3E
uint8 thirst; // 0x3F
uint8 bathroom; // 0x40
uint8 pad_41[0x2];
uint8 var_41;
uint8 var_42;
uint8 intensity; // 0x43
uint8 nausea_tolerance; // 0x44
uint8 var_45; // Some sort of flags?
money16 paid_on_drink; // 0x46
uint8 pad_48[0x10];
uint8 var_48[16];
uint32 item_extra_flags; // 0x58
uint8 photo2_ride_ref; // 0x5C
uint8 photo3_ride_ref; // 0x5D
@ -407,28 +412,34 @@ typedef struct {
uint8 current_train; // 0x6A
union{
struct{
uint8 current_car; // 0x6B
uint8 current_seat; // 0x6C
uint8 current_car; // 0x6B
uint8 current_seat; // 0x6C
};
uint16 time_to_sitdown; //0x6B
uint16 time_to_sitdown; //0x6B
struct{
uint8 time_to_stand; //0x6B
uint8 standing_flags; //0x6C
};
};
uint8 var_6D; // 0x6D
uint8 var_6E; // 0x6E
uint8 action_sprite_type; // 0x6E
uint8 var_6F;
uint8 var_70;
uint8 action_sprite_image_offset; // 0x70
uint8 action; // 0x71
uint8 action_frame; // 0x72
uint8 var_73;
uint16 var_74;
union {
uint16 var_74; // time getting to ride to fix
uint16 next_in_queue; // 0x74
};
uint8 var_76;
uint8 pad_77;
uint8 var_78;
uint8 pad_79;
uint16 var_7A; // time waiting in line possibly
union{
uint8 maze_last_edge; // 0x78
uint8 var_78;
};
uint8 var_79;
uint16 time_in_queue; // 0x7A
uint8 rides_been_on[32]; // 0x7C
// 255 bit bitmap of every ride the peep has been on see
// window_peep_rides_update for how to use.
@ -436,7 +447,7 @@ typedef struct {
money32 cash_in_pocket; // 0xA0
money32 cash_spent; // 0xA4
sint32 time_in_park; // 0xA8
uint8 var_AC; // 0xAC
sint8 var_AC; // 0xAC
uint8 previous_ride; // 0xAD
uint16 previous_ride_time_out; // 0xAE
rct_peep_thought thoughts[PEEP_MAX_THOUGHTS]; // 0xB0
@ -454,7 +465,7 @@ typedef struct {
uint32 flags; // 0xC8
uint32 var_CC;
uint8 pad_D0[0x10];
uint8 var_E0; // 0xE0
uint8 no_action_frame_no; // 0xE0
uint8 var_E1;
uint8 var_E2; // 0xE2
uint8 var_E3;
@ -479,10 +490,10 @@ typedef struct {
uint8 no_of_food; // 0xEC
uint8 no_of_drinks; // 0xED
uint8 no_of_souvenirs; // 0xEE
uint8 pad_EF;
uint8 var_EF;
uint8 voucher_type; // 0xF0
uint8 voucher_arguments; // 0xF1 ride_id or string_offset_id
uint8 pad_F2;
uint8 var_F2;
uint8 var_F3;
uint8 var_F4;
uint8 days_in_queue; // 0xF5
@ -490,7 +501,8 @@ typedef struct {
uint8 umbrella_colour; // 0xF7
uint8 hat_colour; // 0xF8
uint8 favourite_ride; // 0xF9
uint16 pad_FA;
uint8 var_FA;
uint8 pad_FB;
uint32 item_standard_flags; // 0xFC
} rct_peep;

View File

@ -107,9 +107,9 @@ void game_command_hire_new_staff_member(int* eax, int* ebx, int* ecx, int* edx,
move_sprite_to_list((rct_sprite *)newPeep, SPRITE_LINKEDLIST_OFFSET_PEEP);
newPeep->sprite_identifier = 1;
newPeep->var_09 = 0x0F;
newPeep->var_15 = 5;
newPeep->var_14 = 8;
newPeep->sprite_height_negative = 0x0F;
newPeep->sprite_height_positive = 5;
newPeep->sprite_width = 8;
newPeep->sprite_direction = 0;
sprite_move(_ax, *ecx, _dx, (rct_sprite*)newPeep);
@ -122,9 +122,9 @@ void game_command_hire_new_staff_member(int* eax, int* ebx, int* ecx, int* edx,
newPeep->var_45 = 0;
newPeep->action = 0xFF;
newPeep->var_6D = 0;
newPeep->var_70 = 0;
newPeep->var_E0 = 0;
newPeep->var_6E = 0;
newPeep->action_sprite_image_offset = 0;
newPeep->no_action_frame_no = 0;
newPeep->action_sprite_type = 0;
newPeep->var_C4 = 0;
newPeep->type = PEEP_TYPE_STAFF;
newPeep->var_2A = 0;
@ -176,9 +176,9 @@ void game_command_hire_new_staff_member(int* eax, int* ebx, int* ecx, int* edx,
newPeep->sprite_type = _eax;
_edx = RCT2_ADDRESS(0x0098270C, uint32)[_eax * 2];
newPeep->var_14 = *((uint8*)_edx);
newPeep->var_09 = *((uint8*)(_edx + 1));
newPeep->var_15 = *((uint8*)(_edx + 2));
newPeep->sprite_width = *((uint8*)_edx);
newPeep->sprite_height_negative = *((uint8*)(_edx + 1));
newPeep->sprite_height_positive = *((uint8*)(_edx + 2));
sprite_move( newPeep->x, newPeep->y, newPeep->z, (rct_sprite*)newPeep);
invalidate_sprite((rct_sprite*)newPeep);

View File

@ -40,6 +40,13 @@ enum STAFF_TYPE {
STAFF_TYPE_ENTERTAINER
};
enum STAFF_ORDERS{
STAFF_ORDERS_SWEEPING = (1 << 0),
STAFF_ORDERS_WATER_FLOWERS = (1 << 1),
STAFF_ORDERS_EMPTY_BINS = (1 << 2),
STAFF_ORDERS_MOWING = (1 << 3)
};
void game_command_update_staff_colour(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp);
void game_command_hire_new_staff_member(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp);

View File

@ -1884,7 +1884,7 @@ void ride_measurement_update(rct_ride_measurement *measurement)
return;
measurement->flags &= ~RIDE_MEASUREMENT_FLAG_UNLOADING;
if (measurement->var_0B == vehicle->var_4B)
if (measurement->current_station == vehicle->current_station)
measurement->current_item = 0;
}
@ -1968,7 +1968,7 @@ void ride_measurements_update()
vehicle = &(g_sprite_list[spriteIndex].vehicle);
if (vehicle->status == VEHICLE_STATUS_DEPARTING || vehicle->status == VEHICLE_STATUS_STOPPING) {
measurement->vehicle_index = j;
measurement->var_0B = vehicle->var_4B;
measurement->current_station = vehicle->current_station;
measurement->flags |= RIDE_MEASUREMENT_FLAG_RUNNING;
measurement->flags &= ~RIDE_MEASUREMENT_FLAG_UNLOADING;
ride_measurement_update(measurement);

View File

@ -82,12 +82,14 @@ typedef struct{
uint32 var_4C; // 0x4C , 0x66
uint32 no_vehicle_images; // 0x50 , 0x6A
uint8 no_seating_rows; // 0x54 , 0x6E
uint8 pad_55[0x7];
uint8 pad_55[0x5];
uint8 var_5A; // 0x5A , 0x74
uint8 pad_5B; // 0x5B , 0x75
uint8 var_5C; // 0x5C , 0x76
uint8 var_5D; // 0x5D , 0x77
uint8 pad_5E[0x2];
uint8 var_60; // 0x60 , 0x7A
uint32 var_61; // 0x61 , 0x7B
uint8* peep_loading_positions; // 0x61 , 0x7B
} rct_ride_type_vehicle;
/**
@ -103,12 +105,13 @@ typedef struct {
uint8 var_00C;
uint8 var_00D;
uint8 var_00E;
uint8 var_00F;
uint8 var_010;
uint8 min_cars_in_train; // 0x00F
uint8 max_cars_in_train; // 0x010
uint8 var_011;
uint8 var_012;
uint8 var_013;
uint8 pad_014[0x6];
uint8 var_014;
uint8 pad_015[0x5];
rct_ride_type_vehicle vehicles[4]; // 0x1A
uint32 var_1AE;
sint8 excitement_multipler; // 0x1B2
@ -148,7 +151,8 @@ typedef struct {
uint8 var_066[4];
uint16 entrances[4]; // 0x06A
uint16 exits[4]; // 0x072
uint8 pad_07A[0x0C];
uint16 first_peep_in_queue[4]; // 0x07A
uint8 pad_082[4];
uint16 vehicles[32]; // 0x086 Points to the first car in the train
uint8 depart_flags; // 0x0C6
@ -224,7 +228,7 @@ typedef struct {
uint8 satisfaction_time_out; // 0x14B
uint8 satisfaction_next; // 0x14C
// Various flags stating whether a window needs to be refreshed
uint8 window_invalidate_flags;
uint8 window_invalidate_flags; // 0x14D
uint8 pad_14E[0x02];
uint32 total_customers; // 0x150
money32 total_profit; // 0x154
@ -238,7 +242,9 @@ typedef struct {
uint16 slide_peep; // 0x15E
uint16 maze_tiles; // 0x15E
};
uint8 pad_160[0x16];
uint8 pad_160[0xE];
uint8 slide_peep_t_shirt_colour;// 0x16E
uint8 pad_16F[0x7];
uint8 var_176;
uint8 pad_177[0x9];
sint16 build_date; // 0x180
@ -314,7 +320,7 @@ typedef struct {
uint16 num_items; // 0x0006
uint16 current_item; // 0x0008
uint8 vehicle_index; // 0x000A
uint8 var_0B;
uint8 current_station; // 0x000B
sint8 vertical[RIDE_MEASUREMENT_MAX_ITEMS]; // 0x000C
sint8 lateral[RIDE_MEASUREMENT_MAX_ITEMS]; // 0x12CC
uint8 velocity[RIDE_MEASUREMENT_MAX_ITEMS]; // 0x258C
@ -363,7 +369,7 @@ enum {
RIDE_TYPE_MINI_SUSPENDED_COASTER,
RIDE_TYPE_BUMPER_BOATS,
RIDE_TYPE_WOODEN_WILD_MOUSE,
RIDE_TYPE_STEEPLECHASE,
RIDE_TYPE_STEEPLECHASE = 10,
RIDE_TYPE_CAR_RIDE,
RIDE_TYPE_LAUNCHED_FREEFALL,
RIDE_TYPE_BOBSLEIGH_COASTER,
@ -373,7 +379,7 @@ enum {
RIDE_TYPE_MINE_TRAIN_COASTER,
RIDE_TYPE_CHAIRLIFT,
RIDE_TYPE_CORKSCREW_ROLLER_COASTER,
RIDE_TYPE_MAZE,
RIDE_TYPE_MAZE = 20,
RIDE_TYPE_SPIRAL_SLIDE,
RIDE_TYPE_GO_KARTS,
RIDE_TYPE_LOG_FLUME,
@ -383,7 +389,7 @@ enum {
RIDE_TYPE_SWINGING_INVERTER_SHIP,
RIDE_TYPE_FOOD_STALL,
RIDE_TYPE_1D,
RIDE_TYPE_DRINK_STALL,
RIDE_TYPE_DRINK_STALL = 30,
RIDE_TYPE_1F,
RIDE_TYPE_SHOP,
RIDE_TYPE_MERRY_GO_ROUND,
@ -393,7 +399,7 @@ enum {
RIDE_TYPE_FERRIS_WHEEL,
RIDE_TYPE_MOTION_SIMULATOR,
RIDE_TYPE_3D_CINEMA,
RIDE_TYPE_TOP_SPIN,
RIDE_TYPE_TOP_SPIN = 40,
RIDE_TYPE_SPACE_RINGS,
RIDE_TYPE_REVERSE_FREEFALL_COASTER,
RIDE_TYPE_ELEVATOR,
@ -403,7 +409,7 @@ enum {
RIDE_TYPE_HAUNTED_HOUSE,
RIDE_TYPE_FIRST_AID,
RIDE_TYPE_CIRCUS_SHOW,
RIDE_TYPE_GHOST_TRAIN,
RIDE_TYPE_GHOST_TRAIN = 50,
RIDE_TYPE_TWISTER_ROLLER_COASTER,
RIDE_TYPE_WOODEN_ROLLER_COASTER,
RIDE_TYPE_SIDE_FRICTION_ROLLER_COASTER,
@ -413,7 +419,7 @@ enum {
RIDE_TYPE_FLYING_ROLLER_COASTER,
RIDE_TYPE_3A,
RIDE_TYPE_VIRGINIA_REEL,
RIDE_TYPE_SPLASH_BOATS,
RIDE_TYPE_SPLASH_BOATS = 60,
RIDE_TYPE_MINI_HELICOPTERS,
RIDE_TYPE_LAY_DOWN_ROLLER_COASTER,
RIDE_TYPE_SUSPENDED_MONORAIL,
@ -423,7 +429,7 @@ enum {
RIDE_TYPE_MINI_GOLF,
RIDE_TYPE_GIGA_COASTER,
RIDE_TYPE_ROTO_DROP,
RIDE_TYPE_FLYING_SAUCERS,
RIDE_TYPE_FLYING_SAUCERS = 70,
RIDE_TYPE_CROOKED_HOUSE,
RIDE_TYPE_MONORAIL_CYCLES,
RIDE_TYPE_COMPACT_INVERTED_COASTER,
@ -433,7 +439,7 @@ enum {
RIDE_TYPE_MAGIC_CARPET,
RIDE_TYPE_SUBMARINE_RIDE,
RIDE_TYPE_RIVER_RAFTS,
RIDE_TYPE_50,
RIDE_TYPE_50 = 80,
RIDE_TYPE_ENTERPRISE,
RIDE_TYPE_52,
RIDE_TYPE_53,
@ -443,7 +449,7 @@ enum {
RIDE_TYPE_MINI_ROLLER_COASTER,
RIDE_TYPE_MINE_RIDE,
RIDE_TYPE_LIM_LAUNCHED_ROLLER_COASTER,
RIDE_TYPE_90
RIDE_TYPE_90 = 90
};
enum {
@ -737,7 +743,8 @@ int sub_6C683D(int* x, int* y, int z, int direction, int type, int esi, int edi,
void ride_set_map_tooltip(rct_map_element *mapElement);
int ride_music_params_update(sint16 x, sint16 y, sint16 z, uint8 rideIndex, uint16 sampleRate, uint32 position, uint8 *tuneId);
void ride_music_update_final();
rct_map_element *ride_get_station_start_track_element(rct_ride *ride, int stationIndex);
rct_map_element *ride_get_station_exit_element(rct_ride *ride, int x, int y, int z);
void ride_set_status(int rideIndex, int status);
void game_command_set_ride_status(int *eax, int *ebx, int *ecx, int *edx, int *esi, int *edi, int *ebp);
void ride_set_name(int rideIndex, const char *name);

View File

@ -234,9 +234,9 @@ static void ride_race_init_vehicle_speeds(rct_ride *ride)
vehicle = &g_sprite_list[ride->vehicles[i]].vehicle;
vehicle->var_48 &= ~(1 << 6);
rideEntry = GET_RIDE_ENTRY(vehicle->var_D6);
rideEntry = GET_RIDE_ENTRY(vehicle->ride_subtype);
vehicle->speed = (scenario_rand() & 16) - 8 + rideEntry->vehicles[vehicle->var_31].var_5C;
vehicle->speed = (scenario_rand() & 16) - 8 + rideEntry->vehicles[vehicle->vehicle_type].var_5C;
if (vehicle->num_peeps != 0) {
rct_peep *peep = &g_sprite_list[vehicle->peep[0]].peep;

View File

@ -99,9 +99,8 @@ void vehicle_update_sound_params(rct_vehicle* vehicle)
sint32 v19 = vehicle->velocity;
int testaddr = (vehicle->var_31 * 0x65);
testaddr += (int)RCT2_ADDRESS(0x009ACFA4, rct_ride_type*)[vehicle->var_D6];
uint8 test = ((uint8*)testaddr)[0x74];
rct_ride_type* ride_type = GET_RIDE_ENTRY(vehicle->ride_subtype);
uint8 test = ride_type->vehicles[vehicle->vehicle_type].var_5A;
if (test & 1) {
v19 *= 2;
@ -633,4 +632,9 @@ rct_vehicle *vehicle_get_head(rct_vehicle *vehicle)
}
return vehicle;
}
int vehicle_is_used_in_pairs(rct_vehicle *vehicle)
{
return vehicle->num_seats & VEHICLE_SEAT_PAIR_FLAG;
}

View File

@ -26,31 +26,41 @@
typedef struct {
uint8 sprite_identifier; // 0x00
uint8 var_01;
uint8 pad_02[0x02];
uint16 next_in_quadrant; // 0x02
uint16 next; // 0x04
uint16 previous; // 0x06
uint8 linked_list_type_offset; // 0x08 Valid values are SPRITE_LINKEDLIST_OFFSET_...
uint8 pad_09;
// Height from center of sprite to bottom
uint8 sprite_height_negative; // 0x09
uint16 sprite_index; // 0x0A
uint8 pad_0C[2];
sint16 x; // 0x0E
sint16 y; // 0x10
sint16 z; // 0x12
uint8 pad_14[0x02];
// Width from center of sprite to edge
uint8 sprite_width; // 0x14
// Height from center of sprite to top
uint8 sprite_height_positive; // 0x15
sint16 sprite_left; // 0x16
sint16 sprite_top; // 0x18
sint16 sprite_right; // 0x1A
sint16 sprite_bottom; // 0x1C
uint8 sprite_direction; // 0x1E
uint8 pad_1F[0x09];
uint8 var_1F;
uint8 pad_20[0x08];
sint32 velocity; // 0x28
uint8 pad_2C[0x04];
uint8 ride; // 0x30
uint8 var_31;
uint8 vehicle_type; // 0x31
uint8 pad_32[0x02];
uint16 var_34;
sint16 var_36;
uint8 pad_38[0x06];
//x related
uint16 var_38;
// y related
uint16 var_3A;
// z related
uint16 var_3C;
uint16 next_vehicle_on_train; // 0x3E
uint16 prev_vehicle_on_train; // 0x40
uint16 pad_42;
@ -58,14 +68,16 @@ typedef struct {
uint16 var_46;
uint16 var_48;
uint8 pad_4A;
uint8 var_4B;
uint8 current_station; // 0x4B
uint8 pad_4C[0x4];
uint8 status; // 0x50
uint8 var_51;
uint16 peep[32]; // 0x52
uint8 pad_92[0x21];
uint8 peep_tshirt_colours[32]; // 0x92
uint8 num_seats; // 0xB2
uint8 num_peeps; // 0xB3
uint8 pad_B4[0x07];
uint8 next_free_seat; // 0xB4
uint8 pad_B5[0x06];
uint8 sound1_id; // 0xBB
uint8 sound1_volume; // 0xBC
uint8 sound2_id; // 0xBD
@ -78,10 +90,11 @@ typedef struct {
uint8 var_CD;
union {
uint8 var_CE;
uint8 num_laps; // 0xCE
uint8 num_laps; // 0xCE
};
uint8 pad_CF[0x07];
uint8 var_D6;
uint8 pad_CF[0x06];
uint8 var_D5;
uint8 ride_subtype; // 0xD6
} rct_vehicle;
enum {
@ -118,13 +131,16 @@ enum {
VEHICLE_STATUS_STOPPED_BY_BLOCK_BRAKES
};
#define VEHICLE_SEAT_PAIR_FLAG 0x80
#define VEHICLE_SEAT_NUM_MASK 0x7F
void vehicle_update_all();
int sub_6BC2F3(rct_vehicle* vehicle);
void sub_6BB9FF(rct_vehicle* vehicle);
void vehicle_sounds_update();
void vehicle_get_g_forces(rct_vehicle *vehicle, int *verticalG, int *lateralG);
void vehicle_set_map_toolbar(rct_vehicle *vehicle);
int vehicle_is_used_in_pairs(rct_vehicle *vehicle);
rct_vehicle *vehicle_get_head(rct_vehicle *vehicle);
/** Helper macro until rides are stored in this module. */

View File

@ -266,7 +266,6 @@ static void DrawOpenRCT2(int x, int y)
void game_handle_input();
void title_update()
{
screenshot_check();
title_handle_keyboard_input();

View File

@ -1235,8 +1235,8 @@ void window_guest_overview_tool_down(){
peep_window_state_update(peep);
peep->action = 0xFF;
peep->var_6D = 0;
peep->var_70 = 0;
peep->var_6E = 0xFF;
peep->action_sprite_image_offset = 0;
peep->action_sprite_type = 0xFF;
peep->var_C4 = 0;
peep->happiness_growth_rate -= 10;
@ -1268,8 +1268,8 @@ void window_guest_overview_tool_abort(){
peep_window_state_update(peep);
peep->action = 0xFF;
peep->var_6D = 0;
peep->var_70 = 0;
peep->var_6E = 0;
peep->action_sprite_image_offset = 0;
peep->action_sprite_type = 0;
peep->var_C4 = 0;
}

View File

@ -2070,7 +2070,7 @@ static rct_string_id window_ride_get_status_vehicle(rct_window *w, void *argumen
stringId += 23;
RCT2_GLOBAL((int)arguments + 4, uint16) = RideNameConvention[ride->type].station_name;
RCT2_GLOBAL((int)arguments + 6, uint16) = vehicle->var_4B + 1;
RCT2_GLOBAL((int)arguments + 6, uint16) = vehicle->current_station + 1;
if (ride->num_stations > 1)
RCT2_GLOBAL((int)arguments + 4, uint16) += 6;
@ -2390,7 +2390,7 @@ static void window_ride_vehicle_dropdown()
break;
case WIDX_VEHICLE_CARS_PER_TRAIN_DROPDOWN:
RCT2_GLOBAL(RCT2_ADDRESS_GAME_COMMAND_ERROR_TITLE, rct_string_id) = 1019;
game_do_command(0, (1 << 8) | 1, 0, ((rideEntry->var_00F + dropdownIndex) << 8) | w->number, GAME_COMMAND_9, 0, 0);
game_do_command(0, (1 << 8) | 1, 0, ((rideEntry->min_cars_in_train + dropdownIndex) << 8) | w->number, GAME_COMMAND_9, 0, 0);
break;
}
}
@ -2461,7 +2461,7 @@ static void window_ride_vehicle_invalidate()
}
// Cars per train
if (rideEntry->var_012 + 1 < rideEntry->var_010) {
if (rideEntry->var_012 + 1 < rideEntry->max_cars_in_train) {
window_ride_vehicle_widgets[WIDX_VEHICLE_CARS_PER_TRAIN].image = carsPerTrain > 1 ? 1023 : 1022;
window_ride_vehicle_widgets[WIDX_VEHICLE_CARS_PER_TRAIN].type = WWT_DROPDOWN;
window_ride_vehicle_widgets[WIDX_VEHICLE_CARS_PER_TRAIN_DROPDOWN].type = WWT_DROPDOWN_BUTTON;
@ -3739,7 +3739,7 @@ static void window_ride_colour_mousedown(int widgetIndex, rct_window *w, rct_wid
dropdownWidget->bottom - dropdownWidget->top + 1,
w->colours[1],
0,
rideEntry->var_010 > 1 ? 3 : 2,
rideEntry->max_cars_in_train > 1 ? 3 : 2,
widget->right - dropdownWidget->left
);

View File

@ -1158,8 +1158,8 @@ void window_staff_overview_tool_down(){
peep_window_state_update(peep);
peep->action = 0xFF;
peep->var_6D = 0;
peep->var_70 = 0;
peep->var_6E = 0;
peep->action_sprite_image_offset = 0;
peep->action_sprite_type = 0;
peep->var_C4 = 0;
tool_cancel();
@ -1196,8 +1196,8 @@ void window_staff_overview_tool_abort(){
peep_window_state_update(peep);
peep->action = 0xFF;
peep->var_6D = 0;
peep->var_70 = 0;
peep->var_6E = 0;
peep->action_sprite_image_offset = 0;
peep->action_sprite_type = 0;
peep->var_C4 = 0;
}

View File

@ -39,8 +39,13 @@ typedef struct {
typedef struct {
uint8 type; //4
uint8 sequence; //5
uint8 colour; //6
union{
struct{
uint8 sequence; //5
uint8 colour; //6
};
uint16 maze_entry; // 5
};
uint8 ride_index; //7
} rct_map_element_track_properties;

View File

@ -194,7 +194,7 @@ static bool map_animation_invalidate_small_scenery(int x, int y, int baseZ)
int y2 = y - TileDirectionDelta[direction].y;
uint16 spriteIdx = RCT2_ADDRESS(0x00F1EF60, uint16)[((x2 & 0x1FE0) << 3) | (y2 >> 5)];
for (; spriteIdx != 0xFFFF; spriteIdx = sprite->unknown.var_02) {
for (; spriteIdx != 0xFFFF; spriteIdx = sprite->unknown.next_in_quadrant) {
sprite = &g_sprite_list[spriteIdx];
if (sprite->unknown.linked_list_type_offset != SPRITE_LINKEDLIST_OFFSET_PEEP)
continue;
@ -207,9 +207,9 @@ static bool map_animation_invalidate_small_scenery(int x, int y, int baseZ)
if (peep->action < PEEP_ACTION_NONE_1)
continue;
peep->action = 0;
peep->action = PEEP_ACTION_CHECK_TIME;
peep->action_frame = 0;
peep->var_70 = 0;
peep->action_sprite_image_offset = 0;
sub_693B58(peep);
RCT2_CALLPROC_X(0x006EC53F, 0, 0, 0, 0, (int)peep, 0, 0);
break;

View File

@ -31,7 +31,7 @@ rct_sprite* g_sprite_list = RCT2_ADDRESS(RCT2_ADDRESS_SPRITE_LIST, rct_sprite);
*
* rct2: 0x006736C7
*/
void create_balloon(int x, int y, int z, int colour)
void create_balloon(int x, int y, int z, int colour, uint8 bl)
{
rct_sprite* sprite = create_sprite(2);
if (sprite != NULL)
@ -44,7 +44,7 @@ void create_balloon(int x, int y, int z, int colour)
sprite->balloon.misc_identifier = SPRITE_MISC_BALLOON;
sprite->balloon.var_26 = 0;
sprite->balloon.colour = colour;
sprite->balloon.popped = 0;
sprite->balloon.popped = bl;
}
}
@ -288,7 +288,7 @@ void reset_0x69EBE4(){
}
uint16 ax = RCT2_ADDRESS(0xF1EF60,uint16)[edi];
RCT2_ADDRESS(0xF1EF60,uint16)[edi] = spr->unknown.sprite_index;
spr->unknown.var_02 = ax;
spr->unknown.next_in_quadrant = ax;
}
}
}
@ -325,14 +325,14 @@ rct_sprite *create_sprite(uint8 bl)
sprite->y = SPRITE_LOCATION_NULL;
sprite->z = 0;
sprite->name_string_idx = 0;
sprite->var_14 = 0x10;
sprite->var_09 = 0x14;
sprite->var_15 = 0x8;
sprite->pad_0C[0] = 0x0;
sprite->sprite_width = 0x10;
sprite->sprite_height_negative = 0x14;
sprite->sprite_height_positive = 0x8;
sprite->var_0C = 0;
sprite->sprite_left = SPRITE_LOCATION_NULL;
sprite->var_02 = RCT2_GLOBAL(0xF3EF60, uint16);
RCT2_GLOBAL(0xF3EF60, uint16) = sprite->sprite_index;
sprite->next_in_quadrant = RCT2_ADDRESS(0xF1EF60, uint16)[0x10000];
RCT2_ADDRESS(0xF1EF60, uint16)[0x10000] = sprite->sprite_index;
return (rct_sprite*)sprite;
}
@ -470,14 +470,14 @@ void sprite_move(int x, int y, int z, rct_sprite* sprite){
uint16* sprite_idx = &RCT2_ADDRESS(0xF1EF60, uint16)[current_position];
rct_sprite* sprite2 = &g_sprite_list[*sprite_idx];
while (sprite != sprite2){
sprite_idx = &sprite2->unknown.var_02;
sprite_idx = &sprite2->unknown.next_in_quadrant;
sprite2 = &g_sprite_list[*sprite_idx];
}
*sprite_idx = sprite->unknown.var_02;
*sprite_idx = sprite->unknown.next_in_quadrant;
int temp_sprite_idx = RCT2_ADDRESS(0xF1EF60, uint16)[new_position];
RCT2_ADDRESS(0xF1EF60, uint16)[new_position] = sprite->unknown.sprite_index;
sprite->unknown.var_02 = temp_sprite_idx;
sprite->unknown.next_in_quadrant = temp_sprite_idx;
}
if (x == 0x8000){
@ -507,10 +507,10 @@ void sprite_move(int x, int y, int z, rct_sprite* sprite){
break;
}
sprite->unknown.sprite_left = new_x - sprite->unknown.var_14;
sprite->unknown.sprite_right = new_x + sprite->unknown.var_14;
sprite->unknown.sprite_top = new_y - sprite->unknown.var_09;
sprite->unknown.sprite_bottom = new_y + sprite->unknown.var_15;
sprite->unknown.sprite_left = new_x - sprite->unknown.sprite_width;
sprite->unknown.sprite_right = new_x + sprite->unknown.sprite_width;
sprite->unknown.sprite_top = new_y - sprite->unknown.sprite_height_negative;
sprite->unknown.sprite_bottom = new_y + sprite->unknown.sprite_height_positive;
sprite->unknown.x = x;
sprite->unknown.y = y;
sprite->unknown.z = z;

View File

@ -47,18 +47,21 @@ typedef enum {
typedef struct {
uint8 sprite_identifier; // 0x00
uint8 misc_identifier; // 0x01
uint16 var_02;
uint16 next_in_quadrant; // 0x02
uint16 next; // 0x04
uint16 previous; // 0x06
uint8 linked_list_type_offset; // 0x08 Valid values are SPRITE_LINKEDLIST_OFFSET_...
uint8 var_09;
// Height from center of sprite to bottom
uint8 sprite_height_negative; // 0x09
uint16 sprite_index; // 0x0A
uint8 pad_0C[2];
uint16 var_0C;
sint16 x; // 0x0E
sint16 y; // 0x10
sint16 z; // 0x12
uint8 var_14; // 0x14
uint8 var_15; // 0x15
// Width from center of sprite to edge
uint8 sprite_width; // 0x14
// Height from center of sprite to top
uint8 sprite_height_positive; // 0x15
sint16 sprite_left; // 0x16
sint16 sprite_top; // 0x18
sint16 sprite_right; // 0x1A
@ -75,20 +78,24 @@ typedef struct {
typedef struct {
uint8 sprite_identifier; // 0x00
uint8 var_01; // 0x01
uint16 var_02; // 0x02
uint16 next_in_quadrant; // 0x02
uint16 next; // 0x04
uint16 previous; // 0x06
uint8 linked_list_type_offset; // 0x08 Valid values are SPRITE_LINKEDLIST_OFFSET_...
uint8 pad_09;
uint16 sprite_index; // 0x0A
uint8 pad_0B[0x19];
uint16 pad_0C;
sint16 x; // 0x0E
sint16 y; // 0x10
sint16 z; // 0x12
uint8 pad_14[0x10];
uint32 var_24;
} rct_litter;
typedef struct {
uint8 sprite_identifier; // 0x00
uint8 misc_identifier; // 0x01
uint16 var_02; // 0x02
uint16 next_in_quadrant; // 0x02
uint16 next; // 0x04
uint16 previous; // 0x06
uint8 linked_list_type_offset; // 0x08 Valid values are SPRITE_LINKEDLIST_OFFSET_...
@ -115,7 +122,7 @@ typedef struct {
typedef struct {
uint8 sprite_identifier; // 0x00
uint8 misc_identifier; // 0x01
uint16 var_02; // 0x02
uint16 next_in_quadrant; // 0x02
uint16 next; // 0x04
uint16 previous; // 0x06
uint8 linked_list_type_offset; // 0x08 Valid values are SPRITE_LINKEDLIST_OFFSET_...
@ -137,7 +144,7 @@ typedef struct {
typedef struct {
uint8 sprite_identifier; // 0x00
uint8 misc_identifier; // 0x01
uint16 var_02; // 0x02
uint16 next_in_quadrant; // 0x02
uint16 next; // 0x04
uint16 previous; // 0x06
uint8 linked_list_type_offset; // 0x08 Valid values are SPRITE_LINKEDLIST_OFFSET_...
@ -218,7 +225,7 @@ enum {
// rct2: 0x010E63BC
extern rct_sprite* g_sprite_list;
void create_balloon(int x, int y, int z, int colour);
void create_balloon(int x, int y, int z, int colour, uint8 bl);
void create_duck(int targetX, int targetY);
rct_sprite *create_sprite(uint8 bl);
void reset_sprite_list();