Browse Source

Sound patch from Ubuntux #4 - sounds for hero movement
(vcmi_sound_hero_moving.diff)

Michał W. Urbańczyk 16 years ago
parent
commit
992ce92ae5
4 changed files with 50 additions and 14 deletions
  1. 27 0
      CPlayerInterface.cpp
  2. 7 2
      hch/CMusicHandler.cpp
  3. 5 1
      hch/CMusicHandler.h
  4. 11 11
      hch/CSoundBase.h

+ 27 - 0
CPlayerInterface.cpp

@@ -2593,8 +2593,32 @@ bool CPlayerInterface::moveHero( const CGHeroInstance *h, CPath path )
 	boost::unique_lock<boost::mutex> un(stillMoveHero.mx);
 	stillMoveHero.data = CONTINUE_MOVE;
 
+	enum EterrainType currentTerrain = border; // not init yet
+	enum EterrainType newTerrain;
+	int sh = -1;
+
 	for(int i=path.nodes.size()-1; i>0 && stillMoveHero.data == CONTINUE_MOVE; i--)
 	{
+		// Start a new sound for the hero movement or let the existing one carry on.
+#if 0
+		// TODO
+		if (hero is flying && sh == -1)
+			sh = CGI->mush->playSound(soundBase::horseFlying, -1);
+		} 
+		else if (hero is in a boat && sh = -1) {
+			sh = CGI->mush->playSound(soundBase::sound_todo, -1);
+		} else
+#endif
+		{
+			newTerrain = CGI->mh->map->terrain[path.nodes[i].coord.x][path.nodes[i].coord.y][path.nodes[i].coord.z].tertype;
+
+			if (newTerrain != currentTerrain) {
+				CGI->mush->stopSound(sh);
+				sh = CGI->mush->playSound(CGI->mush->horseSounds[newTerrain], -1);
+				currentTerrain = newTerrain;
+			}
+		}
+
 		stillMoveHero.data = WAITING_MOVE;
 
 		int3 endpos(path.nodes[i-1].coord.x, path.nodes[i-1].coord.y, h->pos.z);
@@ -2602,6 +2626,9 @@ bool CPlayerInterface::moveHero( const CGHeroInstance *h, CPath path )
 		while(stillMoveHero.data != STOP_MOVE  &&  stillMoveHero.data != CONTINUE_MOVE)
 			stillMoveHero.cond.wait(un);
 	}
+
+	CGI->mush->stopSound(sh);
+
 	//stillMoveHero = false;
 	return result;
 }

+ 7 - 2
hch/CMusicHandler.cpp

@@ -40,6 +40,11 @@ void CMusicHandler::initMusics()
 	// Vectors for helper(s)
 	pickup_sounds += soundBase::pickup01, soundBase::pickup02, soundBase::pickup03,
 		soundBase::pickup04, soundBase::pickup05, soundBase::pickup06, soundBase::pickup07;
+	horseSounds +=  // must be the same order as terrains (see EtrrainType);
+		soundBase::horseDirt, soundBase::horseSand, soundBase::horseGrass,
+		soundBase::horseSnow, soundBase::horseSwamp, soundBase::horseRough,
+		soundBase::horseSubterranean, soundBase::horseLava,
+		soundBase::horseWater, soundBase::horseRock;
 
 	//AITheme0 = Mix_LoadMUS(DATA_DIR "MP3" PATHSEPARATOR "AITheme0.mp3");
 	//AITheme1 = Mix_LoadMUS(DATA_DIR "MP3" PATHSEPARATOR "AITHEME1.mp3");
@@ -110,7 +115,7 @@ Mix_Chunk *CMusicHandler::GetSoundChunk(std::string srcName)
 }
   
 // Plays a sound, and return its channel so we can fade it out later
-int CMusicHandler::playSound(soundBase::soundNames soundID)
+int CMusicHandler::playSound(soundBase::soundNames soundID, int repeats)
 {
 	int channel;
 
@@ -131,7 +136,7 @@ int CMusicHandler::playSound(soundBase::soundNames soundID)
 
 	if (sound.chunk)
 	{
-		channel = Mix_PlayChannel(-1, sound.chunk, 0);
+		channel = Mix_PlayChannel(-1, sound.chunk, repeats);
 		if(channel == -1)
 		{
 			fprintf(stderr, "Unable to play WAV file("DATA_DIR "Data" PATHSEPARATOR "Heroes3.wav::%s): %s\n",

+ 5 - 1
hch/CMusicHandler.h

@@ -1,6 +1,8 @@
 #ifndef __CMUSICHANDLER_H__
 #define __CMUSICHANDLER_H__
 
+#include <SDL_mixer.h>
+
 #include "CSoundBase.h"
 
 /*
@@ -41,11 +43,13 @@ public:
 	void initMusics();
 
 	// Sounds
-	int playSound(soundBase::soundNames soundID); // plays sound wavs from Heroes3.snd
+	int playSound(soundBase::soundNames soundID, int repeats=0);
 	int playSoundFromSet(std::vector<soundBase::soundNames> &sound_vec);
+	void stopSound(int handler) { Mix_HaltChannel(handler); };
 
 	// Sets
 	std::vector<soundBase::soundNames> pickup_sounds;
+	std::vector<soundBase::soundNames> horseSounds;
 };
 
 #endif // __CMUSICHANDLER_H__

+ 11 - 11
hch/CSoundBase.h

@@ -466,17 +466,17 @@ VCMI_SOUND_NAME(HHNDDefend) VCMI_SOUND_FILE(HHNDDFND.wav) \
 VCMI_SOUND_NAME(HHNDKill) VCMI_SOUND_FILE(HHNDKILL.wav) \
 VCMI_SOUND_NAME(HHNDMove) VCMI_SOUND_FILE(HHNDMOVE.wav) \
 VCMI_SOUND_NAME(HHNDWNCE) VCMI_SOUND_FILE(HHNDWNCE.wav) \
-VCMI_SOUND_NAME(horse00) VCMI_SOUND_FILE(HORSE00.wav) \
-VCMI_SOUND_NAME(horse01) VCMI_SOUND_FILE(HORSE01.wav) \
-VCMI_SOUND_NAME(horse02) VCMI_SOUND_FILE(HORSE02.wav) \
-VCMI_SOUND_NAME(horse03) VCMI_SOUND_FILE(HORSE03.wav) \
-VCMI_SOUND_NAME(horse04) VCMI_SOUND_FILE(HORSE04.wav) \
-VCMI_SOUND_NAME(horse05) VCMI_SOUND_FILE(HORSE05.wav) \
-VCMI_SOUND_NAME(horse06) VCMI_SOUND_FILE(HORSE06.wav) \
-VCMI_SOUND_NAME(horse07) VCMI_SOUND_FILE(HORSE07.wav) \
-VCMI_SOUND_NAME(horse08) VCMI_SOUND_FILE(HORSE08.wav) \
-VCMI_SOUND_NAME(horse09) VCMI_SOUND_FILE(HORSE09.wav) \
-VCMI_SOUND_NAME(horse10) VCMI_SOUND_FILE(HORSE10.wav) \
+VCMI_SOUND_NAME(horseDirt) VCMI_SOUND_FILE(HORSE00.wav) \
+VCMI_SOUND_NAME(horseSand) VCMI_SOUND_FILE(HORSE01.wav) \
+VCMI_SOUND_NAME(horseGrass) VCMI_SOUND_FILE(HORSE02.wav) \
+VCMI_SOUND_NAME(horseSnow) VCMI_SOUND_FILE(HORSE03.wav) \
+VCMI_SOUND_NAME(horseSwamp) VCMI_SOUND_FILE(HORSE04.wav) \
+VCMI_SOUND_NAME(horseRough) VCMI_SOUND_FILE(HORSE05.wav) \
+VCMI_SOUND_NAME(horseSubterranean) VCMI_SOUND_FILE(HORSE06.wav) \
+VCMI_SOUND_NAME(horseLava) VCMI_SOUND_FILE(HORSE07.wav) \
+VCMI_SOUND_NAME(horseWater) VCMI_SOUND_FILE(HORSE08.wav) \
+VCMI_SOUND_NAME(horseRock) VCMI_SOUND_FILE(HORSE09.wav) \
+VCMI_SOUND_NAME(horseFly) VCMI_SOUND_FILE(HORSE10.wav) \
 VCMI_SOUND_NAME(horse20) VCMI_SOUND_FILE(HORSE20.wav) \
 VCMI_SOUND_NAME(horse21) VCMI_SOUND_FILE(HORSE21.wav) \
 VCMI_SOUND_NAME(horse22) VCMI_SOUND_FILE(HORSE22.wav) \