mirror of https://github.com/OpenTTD/OpenTTD
(svn r27507) -Add: [NewGRF] Allow custom sound IDs in RV property 0x12, ship property 0x10 and aircraft property 0x12.
parent
8f621dc506
commit
f6577b6ad7
|
@ -1402,7 +1402,7 @@ static ChangeInfoResult RoadVehicleChangeInfo(uint engine, int numinfo, int prop
|
|||
break;
|
||||
|
||||
case 0x12: // SFX
|
||||
rvi->sfx = buf->ReadByte();
|
||||
rvi->sfx = GetNewGRFSoundID(_cur.grffile, buf->ReadByte());
|
||||
break;
|
||||
|
||||
case PROP_ROADVEH_POWER: // Power in units of 10 HP.
|
||||
|
@ -1590,7 +1590,7 @@ static ChangeInfoResult ShipVehicleChangeInfo(uint engine, int numinfo, int prop
|
|||
break;
|
||||
|
||||
case 0x10: // SFX
|
||||
svi->sfx = buf->ReadByte();
|
||||
svi->sfx = GetNewGRFSoundID(_cur.grffile, buf->ReadByte());
|
||||
break;
|
||||
|
||||
case 0x11: { // Cargoes available for refitting
|
||||
|
@ -1758,7 +1758,7 @@ static ChangeInfoResult AircraftVehicleChangeInfo(uint engine, int numinfo, int
|
|||
break;
|
||||
|
||||
case 0x12: // SFX
|
||||
avi->sfx = buf->ReadByte();
|
||||
avi->sfx = GetNewGRFSoundID(_cur.grffile, buf->ReadByte());
|
||||
break;
|
||||
|
||||
case 0x13: { // Cargoes available for refitting
|
||||
|
|
|
@ -161,6 +161,22 @@ bool LoadNewGRFSound(SoundEntry *sound)
|
|||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve NewGRF sound ID.
|
||||
* @param file NewGRF to get sound from.
|
||||
* @param sound_id GRF-specific sound ID. (GRF-local for IDs above ORIGINAL_SAMPLE_COUNT)
|
||||
* @return Translated (global) sound ID, or INVALID_SOUND.
|
||||
*/
|
||||
SoundID GetNewGRFSoundID(const GRFFile *file, SoundID sound_id)
|
||||
{
|
||||
/* Global sound? */
|
||||
if (sound_id < ORIGINAL_SAMPLE_COUNT) return sound_id;
|
||||
|
||||
sound_id -= ORIGINAL_SAMPLE_COUNT;
|
||||
if (file == NULL || sound_id >= file->num_sounds) return INVALID_SOUND;
|
||||
|
||||
return file->sound_offset + sound_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks whether a NewGRF wants to play a different vehicle sound effect.
|
||||
|
@ -185,14 +201,10 @@ bool PlayVehicleSound(const Vehicle *v, VehicleSoundEvent event)
|
|||
/* Play default sound if callback fails */
|
||||
if (callback == CALLBACK_FAILED) return false;
|
||||
|
||||
if (callback >= ORIGINAL_SAMPLE_COUNT) {
|
||||
callback -= ORIGINAL_SAMPLE_COUNT;
|
||||
callback = GetNewGRFSoundID(file, callback);
|
||||
|
||||
/* Play no sound if result is out of range */
|
||||
if (callback > file->num_sounds) return true;
|
||||
|
||||
callback += file->sound_offset;
|
||||
}
|
||||
/* Play no sound, if result is invalid */
|
||||
if (callback == INVALID_SOUND) return true;
|
||||
|
||||
assert(callback < GetNumSounds());
|
||||
SndPlayVehicleFx(callback, v);
|
||||
|
@ -207,11 +219,8 @@ bool PlayVehicleSound(const Vehicle *v, VehicleSoundEvent event)
|
|||
*/
|
||||
void PlayTileSound(const GRFFile *file, SoundID sound_id, TileIndex tile)
|
||||
{
|
||||
if (sound_id >= ORIGINAL_SAMPLE_COUNT) {
|
||||
sound_id -= ORIGINAL_SAMPLE_COUNT;
|
||||
if (sound_id > file->num_sounds) return;
|
||||
sound_id += file->sound_offset;
|
||||
}
|
||||
sound_id = GetNewGRFSoundID(file, sound_id);
|
||||
if (sound_id == INVALID_SOUND) return;
|
||||
|
||||
assert(sound_id < GetNumSounds());
|
||||
SndPlayTileFx(sound_id, tile);
|
||||
|
|
|
@ -33,6 +33,7 @@ enum VehicleSoundEvent {
|
|||
SoundEntry *AllocateSound(uint num);
|
||||
void InitializeSoundPool();
|
||||
bool LoadNewGRFSound(SoundEntry *sound);
|
||||
SoundID GetNewGRFSoundID(const struct GRFFile *file, SoundID sound_id);
|
||||
SoundEntry *GetSound(SoundID sound_id);
|
||||
uint GetNumSounds();
|
||||
bool PlayVehicleSound(const Vehicle *v, VehicleSoundEvent event);
|
||||
|
|
|
@ -119,4 +119,6 @@ static const uint ORIGINAL_SAMPLE_COUNT = 73;
|
|||
|
||||
typedef uint16 SoundID;
|
||||
|
||||
static const SoundID INVALID_SOUND = 0xFFFF;
|
||||
|
||||
#endif /* SOUND_TYPE_H */
|
||||
|
|
Loading…
Reference in New Issue