Ambient Control.c 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303
  1. #ifdef PRECOMPILEDHEADERS
  2. #include "TileEngine All.h"
  3. #else
  4. #include "stdio.h"
  5. #include "sgp.h"
  6. #include "Ambient types.h"
  7. #include "fileman.h"
  8. #include "environment.h"
  9. #include "Sound Control.h"
  10. #include "Game Events.h"
  11. #endif
  12. AMBIENTDATA_STRUCT gAmbData[ MAX_AMBIENT_SOUNDS ];
  13. INT16 gsNumAmbData = 0;
  14. UINT8 gubCurrentSteadyStateAmbience = SSA_NONE;
  15. UINT8 gubCurrentSteadyStateSound = 0;
  16. UINT32 guiCurrentSteadyStateSoundHandle = NO_SAMPLE;
  17. STEADY_STATE_AMBIENCE gSteadyStateAmbientTable[ NUM_STEADY_STATE_AMBIENCES ] =
  18. {
  19. // NONE
  20. "",
  21. "",
  22. "",
  23. "",
  24. // NIGHT
  25. "",
  26. "",
  27. "",
  28. "",
  29. // COUNTRYSIZE
  30. // DAY
  31. "SOUNDS\\SSA\\insects Day 01.wav",
  32. "",
  33. "",
  34. "",
  35. // NIGHT
  36. "SOUNDS\\SSA\\night_crickets_01D.wav",
  37. "SOUNDS\\SSA\\night_crickets_01B.wav",
  38. "SOUNDS\\SSA\\night_crickets_01C.wav",
  39. "SOUNDS\\SSA\\night_crickets_01A.wav",
  40. // NEAR WATER
  41. // DAY
  42. "SOUNDS\\SSA\\swamp_day_01a.wav",
  43. "SOUNDS\\SSA\\swamp_day_01b.wav",
  44. "SOUNDS\\SSA\\swamp_day_01c.wav",
  45. "SOUNDS\\SSA\\swamp_day_01d.wav",
  46. //NIGHT
  47. "SOUNDS\\SSA\\marsh_at_night_01a.wav",
  48. "SOUNDS\\SSA\\marsh_at_night_01b.wav",
  49. "SOUNDS\\SSA\\marsh_at_night_01c.wav",
  50. "SOUNDS\\SSA\\marsh_at_night_01d.wav",
  51. //INWATER
  52. //DAY
  53. "SOUNDS\\SSA\\middle_of_water_01d.wav",
  54. "SOUNDS\\SSA\\middle_of_water_01c.wav",
  55. "SOUNDS\\SSA\\middle_of_water_01b.wav",
  56. "SOUNDS\\SSA\\middle_of_water_01a.wav",
  57. // night
  58. "SOUNDS\\SSA\\middle_of_water_01d.wav",
  59. "SOUNDS\\SSA\\middle_of_water_01c.wav",
  60. "SOUNDS\\SSA\\middle_of_water_01b.wav",
  61. "SOUNDS\\SSA\\middle_of_water_01a.wav",
  62. // HEAVY FOREST
  63. // day
  64. "SOUNDS\\SSA\\JUNGLE_DAY_01a.wav",
  65. "SOUNDS\\SSA\\JUNGLE_DAY_01b.wav",
  66. "SOUNDS\\SSA\\JUNGLE_DAY_01c.wav",
  67. "SOUNDS\\SSA\\JUNGLE_DAY_01d.wav",
  68. // night
  69. "SOUNDS\\SSA\\night_crickets_03a.wav",
  70. "SOUNDS\\SSA\\night_crickets_03b.wav",
  71. "SOUNDS\\SSA\\night_crickets_03c.wav",
  72. "SOUNDS\\SSA\\night_crickets_03d.wav",
  73. // PINE FOREST
  74. // DAY
  75. "SOUNDS\\SSA\\pine_forest_01a.wav",
  76. "SOUNDS\\SSA\\pine_forest_01b.wav",
  77. "SOUNDS\\SSA\\pine_forest_01c.wav",
  78. "SOUNDS\\SSA\\pine_forest_01d.wav",
  79. // NIGHT
  80. "SOUNDS\\SSA\\night_crickets_02a.wav",
  81. "SOUNDS\\SSA\\night_crickets_02b.wav",
  82. "SOUNDS\\SSA\\night_crickets_02c.wav",
  83. "SOUNDS\\SSA\\night_crickets_02d.wav",
  84. // ABANDANDED
  85. // DAY
  86. "SOUNDS\\SSA\\metal_wind_01a.wav",
  87. "SOUNDS\\SSA\\metal_wind_01b.wav",
  88. "SOUNDS\\SSA\\metal_wind_01c.wav",
  89. "SOUNDS\\SSA\\metal_wind_01d.wav",
  90. // NIGHT
  91. "SOUNDS\\SSA\\night_insects_01a.wav",
  92. "SOUNDS\\SSA\\night_insects_01b.wav",
  93. "SOUNDS\\SSA\\night_insects_01c.wav",
  94. "SOUNDS\\SSA\\night_insects_01d.wav",
  95. // AIRPORT
  96. // DAY
  97. "SOUNDS\\SSA\\rotating radar dish.wav",
  98. "",
  99. "",
  100. "",
  101. // NIGHT
  102. "SOUNDS\\SSA\\rotating radar dish.wav",
  103. "",
  104. "",
  105. "",
  106. // WASTE LAND
  107. // DAY
  108. "SOUNDS\\SSA\\gentle_wind.wav",
  109. "",
  110. "",
  111. "",
  112. // NIGHT
  113. "SOUNDS\\SSA\\insects_at_night_04.wav",
  114. "",
  115. "",
  116. "",
  117. // UNDERGROUND
  118. // DAY
  119. "SOUNDS\\SSA\\low ominous ambience.wav",
  120. "",
  121. "",
  122. "",
  123. // NIGHT
  124. "SOUNDS\\SSA\\low ominous ambience.wav",
  125. "",
  126. "",
  127. "",
  128. // OCEAN
  129. // DAY
  130. "SOUNDS\\SSA\\sea_01a.wav",
  131. "SOUNDS\\SSA\\sea_01b.wav",
  132. "SOUNDS\\SSA\\sea_01c.wav",
  133. "SOUNDS\\SSA\\sea_01d.wav",
  134. // NIGHT
  135. "SOUNDS\\SSA\\ocean_waves_01a.wav",
  136. "SOUNDS\\SSA\\ocean_waves_01b.wav",
  137. "SOUNDS\\SSA\\ocean_waves_01c.wav",
  138. "SOUNDS\\SSA\\ocean_waves_01d.wav",
  139. };
  140. BOOLEAN LoadAmbientControlFile( UINT8 ubAmbientID )
  141. {
  142. SGPFILENAME zFilename;
  143. HWFILE hFile;
  144. INT32 cnt;
  145. // BUILD FILENAME
  146. sprintf( zFilename, "AMBIENT\\%d.bad", ubAmbientID );
  147. // OPEN, LOAD
  148. hFile = FileOpen( zFilename, FILE_ACCESS_READ, FALSE);
  149. if ( !hFile )
  150. {
  151. return( FALSE );
  152. }
  153. // READ #
  154. if( !FileRead( hFile, &gsNumAmbData, sizeof( INT16 ), NULL ) )
  155. {
  156. return( FALSE );
  157. }
  158. // LOOP FOR OTHERS
  159. for ( cnt = 0; cnt < gsNumAmbData; cnt++ )
  160. {
  161. if( !FileRead( hFile, &(gAmbData[ cnt ]), sizeof( AMBIENTDATA_STRUCT ), NULL ) )
  162. {
  163. return( FALSE );
  164. }
  165. sprintf( zFilename, "AMBIENT\\%s", gAmbData[ cnt ].zFilename );
  166. strcpy( gAmbData[ cnt ].zFilename, zFilename );
  167. }
  168. FileClose( hFile );
  169. return( TRUE );
  170. }
  171. void GetAmbientDataPtr( AMBIENTDATA_STRUCT **ppAmbData, UINT16 *pusNumData )
  172. {
  173. *ppAmbData = gAmbData;
  174. *pusNumData = gsNumAmbData;
  175. }
  176. void StopAmbients( )
  177. {
  178. SoundStopAllRandom( );
  179. }
  180. void HandleNewSectorAmbience( UINT8 ubAmbientID )
  181. {
  182. // OK, we could have just loaded a sector, erase all ambient sounds from queue, shutdown all ambient groupings
  183. SoundStopAllRandom( );
  184. DeleteAllStrategicEventsOfType( EVENT_AMBIENT );
  185. if( !gfBasement && !gfCaves )
  186. {
  187. if( LoadAmbientControlFile( ubAmbientID ) )
  188. {
  189. // OK, load them up!
  190. BuildDayAmbientSounds( );
  191. }
  192. else
  193. {
  194. DebugMsg(TOPIC_JA2, DBG_LEVEL_0, String("Cannot load Ambient data for tileset" ) );
  195. }
  196. }
  197. }
  198. void DeleteAllAmbients()
  199. {
  200. // JA2Gold: it seems that ambient sounds don't get unloaded when we exit a sector!?
  201. SoundStopAllRandom();
  202. DeleteAllStrategicEventsOfType( EVENT_AMBIENT );
  203. }
  204. UINT32 SetupNewAmbientSound( UINT32 uiAmbientID )
  205. {
  206. RANDOMPARMS rpParms;
  207. memset(&rpParms, 0xff, sizeof(RANDOMPARMS));
  208. rpParms.uiTimeMin = gAmbData[ uiAmbientID ].uiMinTime;
  209. rpParms.uiTimeMax = gAmbData[ uiAmbientID ].uiMaxTime;
  210. rpParms.uiVolMin = CalculateSoundEffectsVolume( gAmbData[ uiAmbientID ].uiVol );
  211. rpParms.uiVolMax = CalculateSoundEffectsVolume( gAmbData[ uiAmbientID ].uiVol );
  212. rpParms.uiPriority = GROUP_AMBIENT;
  213. return SoundPlayRandom( gAmbData[ uiAmbientID ].zFilename, &rpParms );
  214. }
  215. UINT32 StartSteadyStateAmbient( UINT32 ubVolume, UINT32 ubLoops)
  216. {
  217. SOUNDPARMS spParms;
  218. memset(&spParms, 0xff, sizeof(SOUNDPARMS));
  219. spParms.uiVolume = CalculateSoundEffectsVolume( ubVolume );
  220. spParms.uiLoop = ubLoops;
  221. spParms.uiPriority=GROUP_AMBIENT;
  222. return(SoundPlay( gSteadyStateAmbientTable[ gubCurrentSteadyStateAmbience ].zSoundNames[ gubCurrentSteadyStateSound ], &spParms ) );
  223. }
  224. BOOLEAN SetSteadyStateAmbience( UINT8 ubAmbience )
  225. {
  226. BOOLEAN fInNight = FALSE;
  227. INT32 cnt;
  228. UINT8 ubNumSounds = 0;
  229. UINT8 ubChosenSound;
  230. // Stop all ambients...
  231. if ( guiCurrentSteadyStateSoundHandle != NO_SAMPLE )
  232. {
  233. SoundStop( guiCurrentSteadyStateSoundHandle );
  234. guiCurrentSteadyStateSoundHandle = NO_SAMPLE;
  235. }
  236. // Determine what time of day we are in ( day/night)
  237. if( gubEnvLightValue >= LIGHT_DUSK_CUTOFF)
  238. {
  239. fInNight = TRUE;
  240. }
  241. // loop through listing to get num sounds...
  242. for ( cnt = ( fInNight * 4 ); cnt < ( NUM_SOUNDS_PER_TIMEFRAME / 2 ); cnt++ )
  243. {
  244. if ( gSteadyStateAmbientTable[ ubAmbience ].zSoundNames[ cnt ][ 0 ] == 0 )
  245. {
  246. break;
  247. }
  248. ubNumSounds++;
  249. }
  250. if ( ubNumSounds == 0 )
  251. {
  252. return( FALSE );
  253. }
  254. // Pick one
  255. ubChosenSound = (UINT8) Random( ubNumSounds );
  256. // Set!
  257. gubCurrentSteadyStateAmbience = ubAmbience;
  258. gubCurrentSteadyStateSound = ubChosenSound;
  259. guiCurrentSteadyStateSoundHandle = StartSteadyStateAmbient( LOWVOLUME, 0 );
  260. return( TRUE );
  261. }