mirror of
https://github.com/1dot13/source.git
synced 2026-07-22 13:40:22 +02:00
* 2006/04/26 * * Little Alien * * Developed in VS 2003 * ********************************************************* Source: - Soundmanager v1.1 added - Some changes for international versions git-svn-id: https://ja2svn.mooo.com/source/ja2/trunk/GameSource/ja2_v1.13/Build@39 3b4a5df2-a311-0410-b5c6-a8a6f20db521
307 lines
7.5 KiB
C++
307 lines
7.5 KiB
C++
#ifdef PRECOMPILEDHEADERS
|
|
#include "TileEngine All.h"
|
|
#else
|
|
#include "stdio.h"
|
|
#include "sgp.h"
|
|
#include "Ambient types.h"
|
|
#include "fileman.h"
|
|
#include "environment.h"
|
|
#include "Sound Control.h"
|
|
#include "Game Events.h"
|
|
#endif
|
|
|
|
AMBIENTDATA_STRUCT gAmbData[ MAX_AMBIENT_SOUNDS ];
|
|
INT16 gsNumAmbData = 0;
|
|
|
|
|
|
UINT8 gubCurrentSteadyStateAmbience = SSA_NONE;
|
|
UINT8 gubCurrentSteadyStateSound = 0;
|
|
UINT32 guiCurrentSteadyStateSoundHandle = NO_SAMPLE;
|
|
STEADY_STATE_AMBIENCE gSteadyStateAmbientTable[ NUM_STEADY_STATE_AMBIENCES ] =
|
|
{
|
|
// NONE
|
|
"",
|
|
"",
|
|
"",
|
|
"",
|
|
// NIGHT
|
|
"",
|
|
"",
|
|
"",
|
|
"",
|
|
// COUNTRYSIZE
|
|
// DAY
|
|
"SOUNDS\\SSA\\insects Day 01.wav",
|
|
"",
|
|
"",
|
|
"",
|
|
// NIGHT
|
|
"SOUNDS\\SSA\\night_crickets_01D.wav",
|
|
"SOUNDS\\SSA\\night_crickets_01B.wav",
|
|
"SOUNDS\\SSA\\night_crickets_01C.wav",
|
|
"SOUNDS\\SSA\\night_crickets_01A.wav",
|
|
// NEAR WATER
|
|
// DAY
|
|
"SOUNDS\\SSA\\swamp_day_01a.wav",
|
|
"SOUNDS\\SSA\\swamp_day_01b.wav",
|
|
"SOUNDS\\SSA\\swamp_day_01c.wav",
|
|
"SOUNDS\\SSA\\swamp_day_01d.wav",
|
|
//NIGHT
|
|
"SOUNDS\\SSA\\marsh_at_night_01a.wav",
|
|
"SOUNDS\\SSA\\marsh_at_night_01b.wav",
|
|
"SOUNDS\\SSA\\marsh_at_night_01c.wav",
|
|
"SOUNDS\\SSA\\marsh_at_night_01d.wav",
|
|
//INWATER
|
|
//DAY
|
|
"SOUNDS\\SSA\\middle_of_water_01d.wav",
|
|
"SOUNDS\\SSA\\middle_of_water_01c.wav",
|
|
"SOUNDS\\SSA\\middle_of_water_01b.wav",
|
|
"SOUNDS\\SSA\\middle_of_water_01a.wav",
|
|
// night
|
|
"SOUNDS\\SSA\\middle_of_water_01d.wav",
|
|
"SOUNDS\\SSA\\middle_of_water_01c.wav",
|
|
"SOUNDS\\SSA\\middle_of_water_01b.wav",
|
|
"SOUNDS\\SSA\\middle_of_water_01a.wav",
|
|
// HEAVY FOREST
|
|
// day
|
|
"SOUNDS\\SSA\\JUNGLE_DAY_01a.wav",
|
|
"SOUNDS\\SSA\\JUNGLE_DAY_01b.wav",
|
|
"SOUNDS\\SSA\\JUNGLE_DAY_01c.wav",
|
|
"SOUNDS\\SSA\\JUNGLE_DAY_01d.wav",
|
|
// night
|
|
"SOUNDS\\SSA\\night_crickets_03a.wav",
|
|
"SOUNDS\\SSA\\night_crickets_03b.wav",
|
|
"SOUNDS\\SSA\\night_crickets_03c.wav",
|
|
"SOUNDS\\SSA\\night_crickets_03d.wav",
|
|
// PINE FOREST
|
|
// DAY
|
|
"SOUNDS\\SSA\\pine_forest_01a.wav",
|
|
"SOUNDS\\SSA\\pine_forest_01b.wav",
|
|
"SOUNDS\\SSA\\pine_forest_01c.wav",
|
|
"SOUNDS\\SSA\\pine_forest_01d.wav",
|
|
// NIGHT
|
|
"SOUNDS\\SSA\\night_crickets_02a.wav",
|
|
"SOUNDS\\SSA\\night_crickets_02b.wav",
|
|
"SOUNDS\\SSA\\night_crickets_02c.wav",
|
|
"SOUNDS\\SSA\\night_crickets_02d.wav",
|
|
// ABANDANDED
|
|
// DAY
|
|
"SOUNDS\\SSA\\metal_wind_01a.wav",
|
|
"SOUNDS\\SSA\\metal_wind_01b.wav",
|
|
"SOUNDS\\SSA\\metal_wind_01c.wav",
|
|
"SOUNDS\\SSA\\metal_wind_01d.wav",
|
|
// NIGHT
|
|
"SOUNDS\\SSA\\night_insects_01a.wav",
|
|
"SOUNDS\\SSA\\night_insects_01b.wav",
|
|
"SOUNDS\\SSA\\night_insects_01c.wav",
|
|
"SOUNDS\\SSA\\night_insects_01d.wav",
|
|
// AIRPORT
|
|
// DAY
|
|
"SOUNDS\\SSA\\rotating radar dish.wav",
|
|
"",
|
|
"",
|
|
"",
|
|
// NIGHT
|
|
"SOUNDS\\SSA\\rotating radar dish.wav",
|
|
"",
|
|
"",
|
|
"",
|
|
// WASTE LAND
|
|
// DAY
|
|
"SOUNDS\\SSA\\gentle_wind.wav",
|
|
"",
|
|
"",
|
|
"",
|
|
// NIGHT
|
|
"SOUNDS\\SSA\\insects_at_night_04.wav",
|
|
"",
|
|
"",
|
|
"",
|
|
// UNDERGROUND
|
|
// DAY
|
|
"SOUNDS\\SSA\\low ominous ambience.wav",
|
|
"",
|
|
"",
|
|
"",
|
|
// NIGHT
|
|
"SOUNDS\\SSA\\low ominous ambience.wav",
|
|
"",
|
|
"",
|
|
"",
|
|
// OCEAN
|
|
// DAY
|
|
"SOUNDS\\SSA\\sea_01a.wav",
|
|
"SOUNDS\\SSA\\sea_01b.wav",
|
|
"SOUNDS\\SSA\\sea_01c.wav",
|
|
"SOUNDS\\SSA\\sea_01d.wav",
|
|
// NIGHT
|
|
"SOUNDS\\SSA\\ocean_waves_01a.wav",
|
|
"SOUNDS\\SSA\\ocean_waves_01b.wav",
|
|
"SOUNDS\\SSA\\ocean_waves_01c.wav",
|
|
"SOUNDS\\SSA\\ocean_waves_01d.wav",
|
|
};
|
|
|
|
|
|
BOOLEAN LoadAmbientControlFile( UINT8 ubAmbientID )
|
|
{
|
|
SGPFILENAME zFilename;
|
|
HWFILE hFile;
|
|
INT32 cnt;
|
|
|
|
|
|
|
|
// BUILD FILENAME
|
|
sprintf( zFilename, "AMBIENT\\%d.bad", ubAmbientID );
|
|
|
|
// OPEN, LOAD
|
|
hFile = FileOpen( zFilename, FILE_ACCESS_READ, FALSE);
|
|
if ( !hFile )
|
|
{
|
|
return( FALSE );
|
|
}
|
|
|
|
// READ #
|
|
if( !FileRead( hFile, &gsNumAmbData, sizeof( INT16 ), NULL ) )
|
|
{
|
|
return( FALSE );
|
|
}
|
|
|
|
// LOOP FOR OTHERS
|
|
for ( cnt = 0; cnt < gsNumAmbData; cnt++ )
|
|
{
|
|
if( !FileRead( hFile, &(gAmbData[ cnt ]), sizeof( AMBIENTDATA_STRUCT ), NULL ) )
|
|
{
|
|
return( FALSE );
|
|
}
|
|
|
|
sprintf( zFilename, "AMBIENT\\%s", gAmbData[ cnt ].zFilename );
|
|
strcpy( gAmbData[ cnt ].zFilename, zFilename );
|
|
}
|
|
|
|
FileClose( hFile );
|
|
|
|
return( TRUE );
|
|
}
|
|
|
|
void GetAmbientDataPtr( AMBIENTDATA_STRUCT **ppAmbData, UINT16 *pusNumData )
|
|
{
|
|
*ppAmbData = gAmbData;
|
|
*pusNumData = gsNumAmbData;
|
|
}
|
|
|
|
|
|
void StopAmbients( )
|
|
{
|
|
SoundStopAllRandom( );
|
|
}
|
|
|
|
void HandleNewSectorAmbience( UINT8 ubAmbientID )
|
|
{
|
|
// OK, we could have just loaded a sector, erase all ambient sounds from queue, shutdown all ambient groupings
|
|
SoundStopAllRandom( );
|
|
|
|
DeleteAllStrategicEventsOfType( EVENT_AMBIENT );
|
|
|
|
if( !gfBasement && !gfCaves )
|
|
{
|
|
if( LoadAmbientControlFile( ubAmbientID ) )
|
|
{
|
|
// OK, load them up!
|
|
BuildDayAmbientSounds( );
|
|
}
|
|
else
|
|
{
|
|
DebugMsg(TOPIC_JA2, DBG_LEVEL_0, String("Cannot load Ambient data for tileset" ) );
|
|
}
|
|
}
|
|
}
|
|
|
|
void DeleteAllAmbients()
|
|
{
|
|
// JA2Gold: it seems that ambient sounds don't get unloaded when we exit a sector!?
|
|
SoundStopAllRandom();
|
|
DeleteAllStrategicEventsOfType( EVENT_AMBIENT );
|
|
}
|
|
|
|
UINT32 SetupNewAmbientSound( UINT32 uiAmbientID )
|
|
{
|
|
RANDOMPARMS rpParms;
|
|
|
|
//SoundLog((CHAR8 *)String(" SetupNewAmbientSound()1: uiAmbientID: '%d'", uiAmbientID ) );
|
|
|
|
memset(&rpParms, 0xff, sizeof(RANDOMPARMS));
|
|
|
|
rpParms.uiTimeMin = gAmbData[ uiAmbientID ].uiMinTime;
|
|
rpParms.uiTimeMax = gAmbData[ uiAmbientID ].uiMaxTime;
|
|
rpParms.uiVolMin = CalculateSoundEffectsVolume( gAmbData[ uiAmbientID ].uiVol );
|
|
rpParms.uiVolMax = CalculateSoundEffectsVolume( gAmbData[ uiAmbientID ].uiVol );
|
|
rpParms.uiPriority = GROUP_AMBIENT;
|
|
|
|
//SoundLog((CHAR8 *)String(" SetupNewAmbientSound()2: gAmbData[ uiAmbientID ].zFilename: '%s', Params: '%s'", gAmbData[ uiAmbientID ].zFilename, &rpParms ) );
|
|
|
|
return SoundPlayRandom( gAmbData[ uiAmbientID ].zFilename, &rpParms ); //bug Nr14
|
|
}
|
|
|
|
|
|
UINT32 StartSteadyStateAmbient( UINT32 ubVolume, UINT32 ubLoops)
|
|
{
|
|
SOUNDPARMS spParms;
|
|
|
|
memset(&spParms, 0xff, sizeof(SOUNDPARMS));
|
|
|
|
spParms.uiVolume = CalculateSoundEffectsVolume( ubVolume );
|
|
spParms.uiLoop = ubLoops;
|
|
spParms.uiPriority=GROUP_AMBIENT;
|
|
|
|
return(SoundPlay( gSteadyStateAmbientTable[ gubCurrentSteadyStateAmbience ].zSoundNames[ gubCurrentSteadyStateSound ], &spParms ) );
|
|
}
|
|
|
|
|
|
|
|
BOOLEAN SetSteadyStateAmbience( UINT8 ubAmbience )
|
|
{
|
|
BOOLEAN fInNight = FALSE;
|
|
INT32 cnt;
|
|
UINT8 ubNumSounds = 0;
|
|
UINT8 ubChosenSound;
|
|
|
|
// Stop all ambients...
|
|
if ( guiCurrentSteadyStateSoundHandle != NO_SAMPLE )
|
|
{
|
|
SoundStop( guiCurrentSteadyStateSoundHandle );
|
|
guiCurrentSteadyStateSoundHandle = NO_SAMPLE;
|
|
}
|
|
|
|
// Determine what time of day we are in ( day/night)
|
|
if( gubEnvLightValue >= LIGHT_DUSK_CUTOFF)
|
|
{
|
|
fInNight = TRUE;
|
|
}
|
|
|
|
// loop through listing to get num sounds...
|
|
for ( cnt = ( fInNight * 4 ); cnt < ( NUM_SOUNDS_PER_TIMEFRAME / 2 ); cnt++ )
|
|
{
|
|
if ( gSteadyStateAmbientTable[ ubAmbience ].zSoundNames[ cnt ][ 0 ] == 0 )
|
|
{
|
|
break;
|
|
}
|
|
|
|
ubNumSounds++;
|
|
}
|
|
|
|
if ( ubNumSounds == 0 )
|
|
{
|
|
return( FALSE );
|
|
}
|
|
|
|
// Pick one
|
|
ubChosenSound = (UINT8) Random( ubNumSounds );
|
|
|
|
// Set!
|
|
gubCurrentSteadyStateAmbience = ubAmbience;
|
|
gubCurrentSteadyStateSound = ubChosenSound;
|
|
|
|
guiCurrentSteadyStateSoundHandle = StartSteadyStateAmbient( LOWVOLUME, 0 );
|
|
|
|
return( TRUE );
|
|
} |