Merge pull request #11896 from hdpoliveira/update_flags

Update flags
This commit is contained in:
Michael Steenbeek 2020-06-07 23:03:48 +02:00 committed by GitHub
commit 7646f1b7e4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 66 additions and 58 deletions

View File

@ -4145,7 +4145,7 @@ static void window_ride_maintenance_dropdown(rct_window* w, rct_widgetindex widg
while (spriteId != SPRITE_INDEX_NULL)
{
vehicle = GET_VEHICLE(spriteId);
vehicle->update_flags &= ~(
vehicle->ClearUpdateFlag(
VEHICLE_UPDATE_FLAG_BROKEN_CAR | VEHICLE_UPDATE_FLAG_ZERO_VELOCITY
| VEHICLE_UPDATE_FLAG_BROKEN_TRAIN);
spriteId = vehicle->next_vehicle_on_train;
@ -4157,11 +4157,11 @@ static void window_ride_maintenance_dropdown(rct_window* w, rct_widgetindex widg
case BREAKDOWN_DOORS_STUCK_CLOSED:
case BREAKDOWN_DOORS_STUCK_OPEN:
vehicle = &(get_sprite(ride->vehicles[ride->broken_vehicle])->vehicle);
vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_BROKEN_CAR;
vehicle->ClearUpdateFlag(VEHICLE_UPDATE_FLAG_BROKEN_CAR);
break;
case BREAKDOWN_VEHICLE_MALFUNCTION:
vehicle = &(get_sprite(ride->vehicles[ride->broken_vehicle])->vehicle);
vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_BROKEN_TRAIN;
vehicle->ClearUpdateFlag(VEHICLE_UPDATE_FLAG_BROKEN_TRAIN);
break;
}
ride->lifecycle_flags &= ~(RIDE_LIFECYCLE_BREAKDOWN_PENDING | RIDE_LIFECYCLE_BROKEN_DOWN);

View File

@ -2267,7 +2267,7 @@ bool Staff::UpdateFixingFixVehicle(bool firstRun, Ride* ride)
return true;
}
vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_BROKEN_CAR;
vehicle->ClearUpdateFlag(VEHICLE_UPDATE_FLAG_BROKEN_CAR);
return false;
}
@ -2308,7 +2308,7 @@ bool Staff::UpdateFixingFixVehicleMalfunction(bool firstRun, Ride* ride)
return true;
}
vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_BROKEN_TRAIN;
vehicle->ClearUpdateFlag(VEHICLE_UPDATE_FLAG_BROKEN_TRAIN);
return false;
}

View File

@ -2487,7 +2487,7 @@ void ride_prepare_breakdown(Ride* ride, int32_t breakdownReason)
}
}
if (vehicle != nullptr)
vehicle->update_flags |= VEHICLE_UPDATE_FLAG_BROKEN_CAR;
vehicle->SetUpdateFlag(VEHICLE_UPDATE_FLAG_BROKEN_CAR);
}
}
break;
@ -2501,7 +2501,7 @@ void ride_prepare_breakdown(Ride* ride, int32_t breakdownReason)
if (vehicleSpriteIdx != SPRITE_INDEX_NULL)
{
vehicle = GET_VEHICLE(vehicleSpriteIdx);
vehicle->update_flags |= VEHICLE_UPDATE_FLAG_BROKEN_TRAIN;
vehicle->SetUpdateFlag(VEHICLE_UPDATE_FLAG_BROKEN_TRAIN);
}
break;
case BREAKDOWN_BRAKES_FAILURE:
@ -4504,7 +4504,7 @@ static Vehicle* vehicle_create_car(
{
if (tileElement->AsTrack()->IsInverted())
{
vehicle->update_flags |= VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES;
vehicle->SetUpdateFlag(VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES);
}
}
vehicle->SetState(VEHICLE_STATUS_MOVING_TO_END_OF_STATION);
@ -4604,7 +4604,7 @@ static void vehicle_unset_update_flag_b1(Vehicle* head)
Vehicle* vehicle = head;
while (true)
{
vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_1;
vehicle->ClearUpdateFlag(VEHICLE_UPDATE_FLAG_1);
uint16_t spriteIndex = vehicle->next_vehicle_on_train;
if (spriteIndex == SPRITE_INDEX_NULL)
{
@ -4810,7 +4810,7 @@ void loc_6DDF9C(Ride* ride, TileElement* tileElement)
car = train;
while (true)
{
car->update_flags &= ~VEHICLE_UPDATE_FLAG_1;
car->ClearUpdateFlag(VEHICLE_UPDATE_FLAG_1);
car->SetState(VEHICLE_STATUS_TRAVELLING, car->sub_state);
if ((car->GetTrackType()) == TRACK_ELEM_END_STATION)
{
@ -6355,7 +6355,7 @@ void invalidate_test_results(Ride* ride)
if (spriteIndex != SPRITE_INDEX_NULL)
{
Vehicle* vehicle = GET_VEHICLE(spriteIndex);
vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_TESTING;
vehicle->ClearUpdateFlag(VEHICLE_UPDATE_FLAG_TESTING);
}
}
}
@ -6384,9 +6384,9 @@ void ride_fix_breakdown(Ride* ride, int32_t reliabilityIncreaseFactor)
while (spriteIndex != SPRITE_INDEX_NULL)
{
Vehicle* vehicle = GET_VEHICLE(spriteIndex);
vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_ZERO_VELOCITY;
vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_BROKEN_CAR;
vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_BROKEN_TRAIN;
vehicle->ClearUpdateFlag(VEHICLE_UPDATE_FLAG_ZERO_VELOCITY);
vehicle->ClearUpdateFlag(VEHICLE_UPDATE_FLAG_BROKEN_CAR);
vehicle->ClearUpdateFlag(VEHICLE_UPDATE_FLAG_BROKEN_TRAIN);
spriteIndex = vehicle->next_vehicle_on_train;
}
}

View File

@ -273,7 +273,7 @@ static void ride_race_init_vehicle_speeds(Ride* ride)
continue;
Vehicle* vehicle = GET_VEHICLE(vehicleSpriteIdx);
vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_6;
vehicle->ClearUpdateFlag(VEHICLE_UPDATE_FLAG_6);
rct_ride_entry* rideEntry = get_ride_entry(vehicle->ride_subtype);

View File

@ -1590,7 +1590,7 @@ void Vehicle::UpdateMeasurements()
curRide->lifecycle_flags |= RIDE_LIFECYCLE_TESTED;
curRide->lifecycle_flags |= RIDE_LIFECYCLE_NO_RAW_STATS;
curRide->lifecycle_flags &= ~RIDE_LIFECYCLE_TEST_IN_PROGRESS;
update_flags &= ~VEHICLE_UPDATE_FLAG_TESTING;
ClearUpdateFlag(VEHICLE_UPDATE_FLAG_TESTING);
window_invalidate_by_number(WC_RIDE, ride);
return;
}
@ -2020,7 +2020,7 @@ void Vehicle::Update()
{
if (!(vehicleEntry->flags & VEHICLE_ENTRY_FLAG_WATER_RIDE) || (vehicle_sprite_type == 2 && velocity <= 0x20000))
{
update_flags |= VEHICLE_UPDATE_FLAG_ZERO_VELOCITY;
SetUpdateFlag(VEHICLE_UPDATE_FLAG_ZERO_VELOCITY);
}
}
}
@ -2332,7 +2332,7 @@ void Vehicle::UpdateWaitingForPassengers()
if (time_waiting != 0xFFFF)
time_waiting++;
update_flags &= ~VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART;
ClearUpdateFlag(VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART);
// 0xF64E31, 0xF64E32, 0xF64E33
uint8_t num_peeps_on_train = 0, num_used_seats_on_train = 0, num_seats_on_train = 0;
@ -2381,7 +2381,7 @@ void Vehicle::UpdateWaitingForPassengers()
{
if (curRide->max_waiting_time * 32 < time_waiting)
{
update_flags |= VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART;
SetUpdateFlag(VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART);
TrainReadyToDepart(num_peeps_on_train, num_used_seats_on_train);
return;
}
@ -2405,7 +2405,7 @@ void Vehicle::UpdateWaitingForPassengers()
{
if (train->current_station == current_station)
{
update_flags |= VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART;
SetUpdateFlag(VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART);
TrainReadyToDepart(num_peeps_on_train, num_used_seats_on_train);
return;
}
@ -2418,7 +2418,7 @@ void Vehicle::UpdateWaitingForPassengers()
{
if (num_peeps_on_train == num_seats_on_train)
{
update_flags |= VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART;
SetUpdateFlag(VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART);
TrainReadyToDepart(num_peeps_on_train, num_used_seats_on_train);
return;
}
@ -2435,13 +2435,13 @@ void Vehicle::UpdateWaitingForPassengers()
peepTarget = 1;
if (num_peeps_on_train >= peepTarget)
update_flags |= VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART;
SetUpdateFlag(VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART);
TrainReadyToDepart(num_peeps_on_train, num_used_seats_on_train);
return;
}
update_flags |= VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART;
SetUpdateFlag(VEHICLE_UPDATE_FLAG_TRAIN_READY_DEPART);
TrainReadyToDepart(num_peeps_on_train, num_used_seats_on_train);
return;
}
@ -2450,11 +2450,11 @@ void Vehicle::UpdateWaitingForPassengers()
return;
velocity = 0;
update_flags &= ~VEHICLE_UPDATE_FLAG_WAIT_ON_ADJACENT;
ClearUpdateFlag(VEHICLE_UPDATE_FLAG_WAIT_ON_ADJACENT);
if (curRide->depart_flags & RIDE_DEPART_SYNCHRONISE_WITH_ADJACENT_STATIONS)
{
update_flags |= VEHICLE_UPDATE_FLAG_WAIT_ON_ADJACENT;
SetUpdateFlag(VEHICLE_UPDATE_FLAG_WAIT_ON_ADJACENT);
}
SetState(VEHICLE_STATUS_WAITING_TO_DEPART);
@ -3027,7 +3027,7 @@ static bool ride_station_can_depart_synchronised(ride_id_t curRideId, StationInd
if (sv->vehicle_id != SPRITE_INDEX_NULL)
{
Vehicle* v = GET_VEHICLE(sv->vehicle_id);
v->update_flags &= ~VEHICLE_UPDATE_FLAG_WAIT_ON_ADJACENT;
v->ClearUpdateFlag(VEHICLE_UPDATE_FLAG_WAIT_ON_ADJACENT);
}
}
@ -3105,7 +3105,7 @@ void Vehicle::UpdateTestFinish()
if (!test_finish(ride))
return;
update_flags &= ~VEHICLE_UPDATE_FLAG_TESTING;
ClearUpdateFlag(VEHICLE_UPDATE_FLAG_TESTING);
}
/**
@ -3155,7 +3155,7 @@ static void test_reset(ride_id_t rideId, StationIndex curStation)
void Vehicle::TestReset()
{
update_flags |= VEHICLE_UPDATE_FLAG_TESTING;
SetUpdateFlag(VEHICLE_UPDATE_FLAG_TESTING);
test_reset(ride, current_station);
}
@ -3382,12 +3382,12 @@ void Vehicle::UpdateDeparting()
{
if (_vehicleBreakdown == BREAKDOWN_SAFETY_CUT_OUT)
{
update_flags |= VEHICLE_UPDATE_FLAG_ZERO_VELOCITY;
update_flags &= ~VEHICLE_UPDATE_FLAG_1;
SetUpdateFlag(VEHICLE_UPDATE_FLAG_ZERO_VELOCITY);
ClearUpdateFlag(VEHICLE_UPDATE_FLAG_1);
}
}
else
update_flags &= ~VEHICLE_UPDATE_FLAG_1;
ClearUpdateFlag(VEHICLE_UPDATE_FLAG_1);
}
}
else
@ -3400,12 +3400,12 @@ void Vehicle::UpdateDeparting()
{
if (_vehicleBreakdown == BREAKDOWN_SAFETY_CUT_OUT)
{
update_flags |= VEHICLE_UPDATE_FLAG_ZERO_VELOCITY;
update_flags &= ~VEHICLE_UPDATE_FLAG_1;
SetUpdateFlag(VEHICLE_UPDATE_FLAG_ZERO_VELOCITY);
ClearUpdateFlag(VEHICLE_UPDATE_FLAG_1);
}
}
else
update_flags &= ~VEHICLE_UPDATE_FLAG_1;
ClearUpdateFlag(VEHICLE_UPDATE_FLAG_1);
}
}
}
@ -3839,7 +3839,7 @@ void Vehicle::UpdateTravelling()
if (_vehicleBreakdown == 0)
{
sound2_flags &= ~VEHICLE_SOUND2_FLAGS_LIFT_HILL;
update_flags |= VEHICLE_UPDATE_FLAG_ZERO_VELOCITY;
SetUpdateFlag(VEHICLE_UPDATE_FLAG_ZERO_VELOCITY);
}
}
}
@ -3855,7 +3855,7 @@ void Vehicle::UpdateTravelling()
{
if (_vehicleBreakdown == 0)
{
update_flags |= VEHICLE_UPDATE_FLAG_ZERO_VELOCITY;
SetUpdateFlag(VEHICLE_UPDATE_FLAG_ZERO_VELOCITY);
sound2_flags &= ~VEHICLE_SOUND2_FLAGS_LIFT_HILL;
}
}
@ -3914,7 +3914,7 @@ void Vehicle::UpdateArriving()
case RIDE_MODE_SPACE_RINGS:
case RIDE_MODE_HAUNTED_HOUSE:
case RIDE_MODE_CROOKED_HOUSE:
update_flags &= ~VEHICLE_UPDATE_FLAG_12;
ClearUpdateFlag(VEHICLE_UPDATE_FLAG_12);
velocity = 0;
acceleration = 0;
SetState(VEHICLE_STATUS_UNLOADING_PASSENGERS);
@ -4003,7 +4003,7 @@ void Vehicle::UpdateArriving()
if (RideTypeDescriptors[curRide->type].Flags & RIDE_TYPE_FLAG_ALLOW_MULTIPLE_CIRCUITS
&& curRide->mode != RIDE_MODE_SHUTTLE && curRide->mode != RIDE_MODE_POWERED_LAUNCH)
{
update_flags |= VEHICLE_UPDATE_FLAG_12;
SetUpdateFlag(VEHICLE_UPDATE_FLAG_12);
}
else
{
@ -4088,7 +4088,7 @@ loc_6D8E36:
return;
}
update_flags &= ~VEHICLE_UPDATE_FLAG_12;
ClearUpdateFlag(VEHICLE_UPDATE_FLAG_12);
velocity = 0;
acceleration = 0;
SetState(VEHICLE_STATUS_UNLOADING_PASSENGERS);
@ -6741,7 +6741,7 @@ void Vehicle::UpdateVelocity()
vertical_drop_countdown--;
if (vertical_drop_countdown == -70)
{
update_flags &= ~VEHICLE_UPDATE_FLAG_ON_BREAK_FOR_DROP;
ClearUpdateFlag(VEHICLE_UPDATE_FLAG_ON_BREAK_FOR_DROP);
}
if (vertical_drop_countdown >= 0)
{
@ -7509,7 +7509,7 @@ static void VehicleUpdateGoKartAttemptSwitchLanes(Vehicle* vehicle)
uint16_t probability = 0x8000;
if (vehicle->UpdateFlag(VEHICLE_UPDATE_FLAG_6))
{
vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_6;
vehicle->ClearUpdateFlag(VEHICLE_UPDATE_FLAG_6);
}
else
{
@ -7789,7 +7789,7 @@ static bool vehicle_update_motion_collision_detection(
vehicle->var_C4++;
if (vehicle->var_C4 < 200)
{
vehicle->update_flags |= VEHICLE_UPDATE_FLAG_6;
vehicle->SetUpdateFlag(VEHICLE_UPDATE_FLAG_6);
if (otherVehicleIndex != nullptr)
*otherVehicleIndex = collideId;
return true;
@ -7835,7 +7835,7 @@ static bool vehicle_update_motion_collision_detection(
return false;
}
vehicle->update_flags |= VEHICLE_UPDATE_FLAG_6;
vehicle->SetUpdateFlag(VEHICLE_UPDATE_FLAG_6);
if (otherVehicleIndex != nullptr)
*otherVehicleIndex = collideId;
return true;
@ -8056,14 +8056,14 @@ loc_6DB358:
}
// Update VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES flag
vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES;
vehicle->ClearUpdateFlag(VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES);
{
int32_t rideType = get_ride(tileElement->AsTrack()->GetRideIndex())->type;
if (RideTypeDescriptors[rideType].Flags & RIDE_TYPE_FLAG_HAS_ALTERNATIVE_TRACK_TYPE)
{
if (tileElement->AsTrack()->IsInverted())
{
vehicle->update_flags |= VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES;
vehicle->SetUpdateFlag(VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES);
}
}
}
@ -8111,10 +8111,10 @@ loc_6DB41D:
// loc_6DB500
// Update VEHICLE_UPDATE_FLAG_ON_LIFT_HILL
vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_ON_LIFT_HILL;
vehicle->ClearUpdateFlag(VEHICLE_UPDATE_FLAG_ON_LIFT_HILL);
if (tileElement->AsTrack()->HasChain())
{
vehicle->update_flags |= VEHICLE_UPDATE_FLAG_ON_LIFT_HILL;
vehicle->SetUpdateFlag(VEHICLE_UPDATE_FLAG_ON_LIFT_HILL);
}
trackType = tileElement->AsTrack()->GetTrackType();
@ -8221,7 +8221,7 @@ loc_6DAEB9:
acceleration = -_vehicleVelocityF64E08 * 16;
if (track_progress >= 24)
{
update_flags |= VEHICLE_UPDATE_FLAG_ON_BREAK_FOR_DROP;
SetUpdateFlag(VEHICLE_UPDATE_FLAG_ON_BREAK_FOR_DROP);
vertical_drop_countdown = 90;
}
}
@ -8447,12 +8447,12 @@ static bool vehicle_update_track_motion_backwards_get_new_track(
}
// Update VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES
vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES;
vehicle->ClearUpdateFlag(VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES);
if (RideTypeDescriptors[ride->type].Flags & RIDE_TYPE_FLAG_HAS_ALTERNATIVE_TRACK_TYPE)
{
if (tileElement->AsTrack()->IsInverted())
{
vehicle->update_flags |= VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES;
vehicle->SetUpdateFlag(VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES);
}
}
@ -8507,14 +8507,14 @@ static bool vehicle_update_track_motion_backwards_get_new_track(
_vehicleMotionTrackFlags |= VEHICLE_UPDATE_MOTION_TRACK_FLAG_9;
}
}
vehicle->update_flags |= VEHICLE_UPDATE_FLAG_ON_LIFT_HILL;
vehicle->SetUpdateFlag(VEHICLE_UPDATE_FLAG_ON_LIFT_HILL);
}
}
else
{
if (vehicle->UpdateFlag(VEHICLE_UPDATE_FLAG_ON_LIFT_HILL))
{
vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_ON_LIFT_HILL;
vehicle->ClearUpdateFlag(VEHICLE_UPDATE_FLAG_ON_LIFT_HILL);
if (vehicle->next_vehicle_on_train == SPRITE_INDEX_NULL)
{
if (_vehicleVelocityF64E08 < 0)
@ -8868,12 +8868,12 @@ loc_6DC476:
{
int32_t rideType = get_ride(tileElement->AsTrack()->GetRideIndex())->type;
vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES;
vehicle->ClearUpdateFlag(VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES);
if (RideTypeDescriptors[rideType].Flags & RIDE_TYPE_FLAG_HAS_ALTERNATIVE_TRACK_TYPE)
{
if (tileElement->AsTrack()->IsInverted())
{
vehicle->update_flags |= VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES;
vehicle->SetUpdateFlag(VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES);
}
}
}
@ -8891,7 +8891,7 @@ loc_6DC476:
vehicle->TrackSubposition = regs.al;
}
vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_ON_LIFT_HILL;
vehicle->ClearUpdateFlag(VEHICLE_UPDATE_FLAG_ON_LIFT_HILL);
vehicle->track_type = (tileElement->AsTrack()->GetTrackType() << 2) | (direction & 3);
vehicle->var_CF = tileElement->AsTrack()->GetBrakeBoosterSpeed();
regs.ax = 0;
@ -9114,12 +9114,12 @@ loc_6DCA9A:
{
int32_t rideType = get_ride(tileElement->AsTrack()->GetRideIndex())->type;
vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES;
vehicle->ClearUpdateFlag(VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES);
if (RideTypeDescriptors[rideType].Flags & RIDE_TYPE_FLAG_HAS_ALTERNATIVE_TRACK_TYPE)
{
if (tileElement->AsTrack()->IsInverted())
{
vehicle->update_flags |= VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES;
vehicle->SetUpdateFlag(VEHICLE_UPDATE_FLAG_USE_INVERTED_SPRITES);
}
}
}
@ -9128,7 +9128,7 @@ loc_6DCA9A:
if (vehicle->UpdateFlag(VEHICLE_UPDATE_FLAG_ON_LIFT_HILL))
{
vehicle->update_flags &= ~VEHICLE_UPDATE_FLAG_ON_LIFT_HILL;
vehicle->ClearUpdateFlag(VEHICLE_UPDATE_FLAG_ON_LIFT_HILL);
if (vehicle->next_vehicle_on_train == SPRITE_INDEX_NULL)
{
if (_vehicleVelocityF64E08 < 0)

View File

@ -330,6 +330,14 @@ struct Vehicle : SpriteBase
{
return update_flags & flag;
}
void ClearUpdateFlag(uint32_t flag)
{
update_flags &= ~flag;
}
void SetUpdateFlag(uint32_t flag)
{
update_flags |= flag;
}
private:
bool SoundCanPlay() const;