1
0
mirror of https://github.com/vcmi/vcmi.git synced 2025-01-12 02:28:11 +02:00

Sound patch from Ubuntux #2

(vcmi_sounds.diff)
This commit is contained in:
Michał W. Urbańczyk 2009-04-22 18:48:56 +00:00
parent d625066449
commit ade4b46edd
16 changed files with 2229 additions and 71 deletions

View File

@ -1,5 +1,7 @@
#include "../../AI_Base.h" #include "../../AI_Base.h"
#include "../../CCallback.h" #include "../../CCallback.h"
#include "../../hch/CSoundBase.h"
class CEmptyAI : public CGlobalAI class CEmptyAI : public CGlobalAI
{ {
ICallback * cb; ICallback * cb;
@ -13,7 +15,7 @@ public:
void showSelDialog(std::string text, std::vector<CSelectableComponent*> & components, int askID){}; void showSelDialog(std::string text, std::vector<CSelectableComponent*> & components, int askID){};
void tileRevealed(int3 pos){}; void tileRevealed(int3 pos){};
void tileHidden(int3 pos){}; void tileHidden(int3 pos){};
void showBlockingDialog(const std::string &text, const std::vector<Component> &components, ui32 askID, bool selection, bool cancel){}; void showBlockingDialog(const std::string &text, const std::vector<Component> &components, ui32 askID, soundBase::soundNames soundID, bool selection, bool cancel){};
void showGarrisonDialog(const CArmedInstance *up, const CGHeroInstance *down, boost::function<void()> &onEnd){}; void showGarrisonDialog(const CArmedInstance *up, const CGHeroInstance *down, boost::function<void()> &onEnd){};
void heroGotLevel(const CGHeroInstance *hero, int pskill, std::vector<ui16> &skills, boost::function<void(ui32)> &callback); void heroGotLevel(const CGHeroInstance *hero, int pskill, std::vector<ui16> &skills, boost::function<void(ui32)> &callback);
}; };

View File

@ -69,7 +69,7 @@ void GeniusAI::CGeniusAI::showGarrisonDialog( const CArmedInstance *up, const CG
onEnd(); onEnd();
} }
void CGeniusAI::showBlockingDialog( const std::string &text, const std::vector<Component> &components, ui32 askID, bool selection, bool cancel ) void CGeniusAI::showBlockingDialog( const std::string &text, const std::vector<Component> &components, ui32 askID, soundBase::soundNames soundID, bool selection, bool cancel )
{ {
m_cb->selectionMade(cancel ? 0 : 1, askID); m_cb->selectionMade(cancel ? 0 : 1, askID);
} }

View File

@ -190,7 +190,7 @@ public:
virtual void heroMoved(const HeroMoveDetails &); virtual void heroMoved(const HeroMoveDetails &);
virtual void heroPrimarySkillChanged(const CGHeroInstance * hero, int which, int val) {}; virtual void heroPrimarySkillChanged(const CGHeroInstance * hero, int which, int val) {};
virtual void showSelDialog(std::string text, std::vector<CSelectableComponent*> & components, int askID){}; virtual void showSelDialog(std::string text, std::vector<CSelectableComponent*> & components, int askID){};
virtual void showBlockingDialog(const std::string &text, const std::vector<Component> &components, ui32 askID, bool selection, bool cancel); virtual void showBlockingDialog(const std::string &text, const std::vector<Component> &components, ui32 askID, soundBase::soundNames soundID, bool selection, bool cancel);
virtual void tileRevealed(int3 pos){}; virtual void tileRevealed(int3 pos){};
virtual void tileHidden(int3 pos){}; virtual void tileHidden(int3 pos){};
virtual void heroGotLevel(const CGHeroInstance *hero, int pskill, std::vector<ui16> &skills, boost::function<void(ui32)> &callback); virtual void heroGotLevel(const CGHeroInstance *hero, int pskill, std::vector<ui16> &skills, boost::function<void(ui32)> &callback);

View File

@ -271,12 +271,12 @@ void CHeroGSlot::clickLeft(boost::logic::tribool down)
{ {
std::string tmp = CGI->generaltexth->allTexts[18]; //You already have %d adventuring heroes under your command. std::string tmp = CGI->generaltexth->allTexts[18]; //You already have %d adventuring heroes under your command.
boost::algorithm::replace_first(tmp,"%d",boost::lexical_cast<std::string>(LOCPLINT->cb->howManyHeroes(false))); boost::algorithm::replace_first(tmp,"%d",boost::lexical_cast<std::string>(LOCPLINT->cb->howManyHeroes(false)));
LOCPLINT->showInfoDialog(tmp,std::vector<SComponent*>()); LOCPLINT->showInfoDialog(tmp,std::vector<SComponent*>(), soundBase::sound_todo);
allow = false; allow = false;
} }
else if(!other->hero->army.slots.size()) //hero has no creatures - strange, but if we have appropriate error message... else if(!other->hero->army.slots.size()) //hero has no creatures - strange, but if we have appropriate error message...
{ {
LOCPLINT->showInfoDialog(CGI->generaltexth->allTexts[19],std::vector<SComponent*>()); //This hero has no creatures. A hero must have creatures before he can brave the dangers of the countryside. LOCPLINT->showInfoDialog(CGI->generaltexth->allTexts[19],std::vector<SComponent*>(), soundBase::sound_todo); //This hero has no creatures. A hero must have creatures before he can brave the dangers of the countryside.
allow = false; allow = false;
} }
} }
@ -523,7 +523,7 @@ void CCastleInterface::buildingClicked(int building)
{ {
if(LOCPLINT->cb->getResourceAmount(6) < 500) //not enough gold to buy spellbook if(LOCPLINT->cb->getResourceAmount(6) < 500) //not enough gold to buy spellbook
{ {
LOCPLINT->showInfoDialog(CGI->generaltexth->allTexts[213],std::vector<SComponent*>()); LOCPLINT->showInfoDialog(CGI->generaltexth->allTexts[213],std::vector<SComponent*>(), soundBase::sound_todo);
} }
else else
{ {
@ -563,7 +563,7 @@ void CCastleInterface::buildingClicked(int building)
} }
case 15: //resource silo case 15: //resource silo
{ {
LOCPLINT->showInfoDialog(CGI->buildh->buildings[town->subID][15]->description,std::vector<SComponent*>()); LOCPLINT->showInfoDialog(CGI->buildh->buildings[town->subID][15]->description,std::vector<SComponent*>(), soundBase::sound_todo);
break; break;
} }
case 16: //blacksmith case 16: //blacksmith
@ -573,7 +573,7 @@ void CCastleInterface::buildingClicked(int building)
{ {
std::string pom = CGI->generaltexth->allTexts[273]; std::string pom = CGI->generaltexth->allTexts[273];
boost::algorithm::replace_first(pom,"%s",CGI->buildh->buildings[town->subID][16]->Name()); boost::algorithm::replace_first(pom,"%s",CGI->buildh->buildings[town->subID][16]->Name());
LOCPLINT->showInfoDialog(pom,std::vector<SComponent*>()); LOCPLINT->showInfoDialog(pom,std::vector<SComponent*>(), soundBase::sound_todo);
return; return;
} }
int aid = town->town->warMachine; int aid = town->town->warMachine;
@ -1535,7 +1535,7 @@ void CMageGuildScreen::Scroll::clickLeft (tribool down)
std::vector<SComponent*> comps(1, std::vector<SComponent*> comps(1,
new CCustomImgComponent(SComponent::spell,spell->id,0,graphics->spellscr->ourImages[spell->id].bitmap,false) new CCustomImgComponent(SComponent::spell,spell->id,0,graphics->spellscr->ourImages[spell->id].bitmap,false)
); );
LOCPLINT->showInfoDialog(spell->descriptions[0],comps); LOCPLINT->showInfoDialog(spell->descriptions[0],comps, soundBase::sound_todo);
} }
} }

View File

@ -5,6 +5,7 @@
#include <vector> #include <vector>
#include "lib/BattleAction.h" #include "lib/BattleAction.h"
#include "client/FunctionList.h" #include "client/FunctionList.h"
#include "hch/CMusicHandler.h"
/* /*
* CGameInterface.h, part of VCMI engine * CGameInterface.h, part of VCMI engine
@ -79,10 +80,10 @@ public:
virtual void heroVisitsTown(const CGHeroInstance* hero, const CGTownInstance * town){}; virtual void heroVisitsTown(const CGHeroInstance* hero, const CGTownInstance * town){};
virtual void init(ICallback * CB){}; virtual void init(ICallback * CB){};
virtual void receivedResource(int type, int val){}; virtual void receivedResource(int type, int val){};
virtual void showInfoDialog(const std::string &text, const std::vector<Component*> &components){}; virtual void showInfoDialog(const std::string &text, const std::vector<Component*> &components, soundBase::soundNames soundID){};
//virtual void showSelDialog(const std::string &text, const std::vector<Component*> &components, ui32 askID){}; //virtual void showSelDialog(const std::string &text, const std::vector<Component*> &components, ui32 askID){};
//virtual void showYesNoDialog(const std::string &text, const std::vector<Component*> &components, ui32 askID){}; //virtual void showYesNoDialog(const std::string &text, const std::vector<Component*> &components, ui32 askID){};
virtual void showBlockingDialog(const std::string &text, const std::vector<Component> &components, ui32 askID, bool selection, bool cancel) = 0; //Show a dialog, player must take decision. If selection then he has to choose between one of given components, if cancel he is allowed to not choose. After making choice, CCallback::selectionMade should be called with number of selected component (1 - n) or 0 for cancel (if allowed) and askID. virtual void showBlockingDialog(const std::string &text, const std::vector<Component> &components, ui32 askID, const soundBase::soundNames soundID, bool selection, bool cancel) = 0; //Show a dialog, player must take decision. If selection then he has to choose between one of given components, if cancel he is allowed to not choose. After making choice, CCallback::selectionMade should be called with number of selected component (1 - n) or 0 for cancel (if allowed) and askID.
virtual void showGarrisonDialog(const CArmedInstance *up, const CGHeroInstance *down, boost::function<void()> &onEnd) = 0; //all stacks operations between these objects become allowed, interface has to call onEnd when done virtual void showGarrisonDialog(const CArmedInstance *up, const CGHeroInstance *down, boost::function<void()> &onEnd) = 0; //all stacks operations between these objects become allowed, interface has to call onEnd when done
virtual void tileHidden(const std::set<int3> &pos){}; virtual void tileHidden(const std::set<int3> &pos){};
virtual void tileRevealed(const std::set<int3> &pos){}; virtual void tileRevealed(const std::set<int3> &pos){};

View File

@ -855,7 +855,7 @@ void LRClickableAreaWText::clickLeft(boost::logic::tribool down)
{ {
if(!down && pressedL) if(!down && pressedL)
{ {
LOCPLINT->showInfoDialog(text, std::vector<SComponent*>()); LOCPLINT->showInfoDialog(text, std::vector<SComponent*>(), soundBase::sound_todo);
} }
ClickableL::clickLeft(down); ClickableL::clickLeft(down);
} }
@ -901,7 +901,7 @@ void LRClickableAreaWTextComp::clickLeft(boost::logic::tribool down)
if((!down) && pressedL) if((!down) && pressedL)
{ {
std::vector<SComponent*> comp(1, new SComponent(SComponent::Etype(baseType), type, bonus)); std::vector<SComponent*> comp(1, new SComponent(SComponent::Etype(baseType), type, bonus));
LOCPLINT->showInfoDialog(text, comp); LOCPLINT->showInfoDialog(text, comp, soundBase::sound_todo);
} }
ClickableL::clickLeft(down); ClickableL::clickLeft(down);
} }

View File

@ -1173,7 +1173,15 @@ void CPlayerInterface::yourTurn()
graphics->heroWins.insert(std::pair<int,SDL_Surface*>(hh[i]->subID,pom)); graphics->heroWins.insert(std::pair<int,SDL_Surface*>(hh[i]->subID,pom));
} }
adventureInt->infoBar.newDay(cb->getDate(1)); /* TODO: This isn't quite right. First day in game should play
* NEWDAY. And we don't play NEWMONTH. */
int day = cb->getDate(1);
if (day != 1)
CGI->mush->playSound(soundBase::newDay);
else
CGI->mush->playSound(soundBase::newWeek);
adventureInt->infoBar.newDay(day);
//select first hero if available. //select first hero if available.
//TODO: check if hero is slept //TODO: check if hero is slept
@ -2071,6 +2079,9 @@ void CPlayerInterface::heroGotLevel(const CGHeroInstance *hero, int pskill, std:
while(showingDialog->data) while(showingDialog->data)
showingDialog->cond.wait(un); showingDialog->cond.wait(un);
} }
CGI->mush->playSound(soundBase::heroNewLevel);
boost::unique_lock<boost::recursive_mutex> un(*pim); boost::unique_lock<boost::recursive_mutex> un(*pim);
CLevelWindow *lw = new CLevelWindow(hero,pskill,skills,callback); CLevelWindow *lw = new CLevelWindow(hero,pskill,skills,callback);
LOCPLINT->pushInt(lw); LOCPLINT->pushInt(lw);
@ -2170,6 +2181,7 @@ void CPlayerInterface::buildChanged(const CGTownInstance *town, int buildingID,
switch(what) switch(what)
{ {
case 1: case 1:
CGI->mush->playSound(soundBase::newBuilding);
castleInt->addBuilding(buildingID); castleInt->addBuilding(buildingID);
break; break;
case 2: case 2:
@ -2394,15 +2406,15 @@ void CPlayerInterface::showComp(SComponent comp)
adventureInt->infoBar.showComp(&comp,4000); adventureInt->infoBar.showComp(&comp,4000);
} }
void CPlayerInterface::showInfoDialog(const std::string &text, const std::vector<Component*> &components) void CPlayerInterface::showInfoDialog(const std::string &text, const std::vector<Component*> &components, soundBase::soundNames soundID)
{ {
std::vector<SComponent*> intComps; std::vector<SComponent*> intComps;
for(int i=0;i<components.size();i++) for(int i=0;i<components.size();i++)
intComps.push_back(new SComponent(*components[i])); intComps.push_back(new SComponent(*components[i]));
showInfoDialog(text,intComps); showInfoDialog(text,intComps,soundID);
} }
void CPlayerInterface::showInfoDialog(const std::string &text, const std::vector<SComponent*> & components) void CPlayerInterface::showInfoDialog(const std::string &text, const std::vector<SComponent*> & components, soundBase::soundNames soundID)
{ {
{ {
boost::unique_lock<boost::mutex> un(showingDialog->mx); boost::unique_lock<boost::mutex> un(showingDialog->mx);
@ -2421,6 +2433,7 @@ void CPlayerInterface::showInfoDialog(const std::string &text, const std::vector
if(makingTurn && listInt.size()) if(makingTurn && listInt.size())
{ {
CGI->mush->playSound(soundID);
showingDialog->set(true); showingDialog->set(true);
pushInt(temp); pushInt(temp);
} }
@ -2447,10 +2460,11 @@ void CPlayerInterface::showYesNoDialog(const std::string &text, const std::vecto
LOCPLINT->pushInt(temp); LOCPLINT->pushInt(temp);
} }
void CPlayerInterface::showBlockingDialog( const std::string &text, const std::vector<Component> &components, ui32 askID, bool selection, bool cancel ) void CPlayerInterface::showBlockingDialog( const std::string &text, const std::vector<Component> &components, ui32 askID, soundBase::soundNames soundID, bool selection, bool cancel )
{ {
boost::unique_lock<boost::recursive_mutex> un(*pim); boost::unique_lock<boost::recursive_mutex> un(*pim);
CGI->mush->playSound(soundID);
if(!selection && cancel) //simple yes/no dialog if(!selection && cancel) //simple yes/no dialog
{ {

View File

@ -592,10 +592,10 @@ public:
void heroMovePointsChanged(const CGHeroInstance * hero); void heroMovePointsChanged(const CGHeroInstance * hero);
void heroVisitsTown(const CGHeroInstance* hero, const CGTownInstance * town); void heroVisitsTown(const CGHeroInstance* hero, const CGTownInstance * town);
void receivedResource(int type, int val); void receivedResource(int type, int val);
void showInfoDialog(const std::string &text, const std::vector<Component*> &components); void showInfoDialog(const std::string &text, const std::vector<Component*> &components, soundBase::soundNames soundID);
//void showSelDialog(const std::string &text, const std::vector<Component*> &components, ui32 askID); //void showSelDialog(const std::string &text, const std::vector<Component*> &components, ui32 askID);
//void showYesNoDialog(const std::string &text, const std::vector<Component*> &components, ui32 askID); //void showYesNoDialog(const std::string &text, const std::vector<Component*> &components, ui32 askID);
void showBlockingDialog(const std::string &text, const std::vector<Component> &components, ui32 askID, bool selection, bool cancel); //Show a dialog, player must take decision. If selection then he has to choose between one of given components, if cancel he is allowed to not choose. After making choice, CCallback::selectionMade should be called with number of selected component (1 - n) or 0 for cancel (if allowed) and askID. void showBlockingDialog(const std::string &text, const std::vector<Component> &components, ui32 askID, soundBase::soundNames soundID, bool selection, bool cancel); //Show a dialog, player must take decision. If selection then he has to choose between one of given components, if cancel he is allowed to not choose. After making choice, CCallback::selectionMade should be called with number of selected component (1 - n) or 0 for cancel (if allowed) and askID.
void showGarrisonDialog(const CArmedInstance *up, const CGHeroInstance *down, boost::function<void()> &onEnd); void showGarrisonDialog(const CArmedInstance *up, const CGHeroInstance *down, boost::function<void()> &onEnd);
void tileHidden(const std::set<int3> &pos); void tileHidden(const std::set<int3> &pos);
void tileRevealed(const std::set<int3> &pos); void tileRevealed(const std::set<int3> &pos);
@ -636,7 +636,7 @@ public:
void handleMouseMotion(SDL_Event *sEvent); void handleMouseMotion(SDL_Event *sEvent);
void init(ICallback * CB); void init(ICallback * CB);
int3 repairScreenPos(int3 pos); //returns position closest to pos we can center screen on int3 repairScreenPos(int3 pos); //returns position closest to pos we can center screen on
void showInfoDialog(const std::string &text, const std::vector<SComponent*> & components); void showInfoDialog(const std::string &text, const std::vector<SComponent*> & components, soundBase::soundNames soundID);
void showYesNoDialog(const std::string &text, const std::vector<SComponent*> & components, CFunctionList<void()> onYes, CFunctionList<void()> onNo, bool DelComps); //deactivateCur - whether current main interface should be deactivated; delComps - if components will be deleted on window close void showYesNoDialog(const std::string &text, const std::vector<SComponent*> & components, CFunctionList<void()> onYes, CFunctionList<void()> onNo, bool DelComps); //deactivateCur - whether current main interface should be deactivated; delComps - if components will be deleted on window close
bool moveHero(const CGHeroInstance *h, CPath path); bool moveHero(const CGHeroInstance *h, CPath path);

View File

@ -1973,6 +1973,7 @@ void CPreGame::scenHandleEv(SDL_Event& sEvent)
{ {
if (isItIn(&btns[i]->pos,sEvent.motion.x,sEvent.motion.y)) if (isItIn(&btns[i]->pos,sEvent.motion.x,sEvent.motion.y))
{ {
mush->playSound(soundBase::button);
btns[i]->press(true); btns[i]->press(true);
ourScenSel->pressed=(Button*)btns[i]; ourScenSel->pressed=(Button*)btns[i];
} }
@ -1981,6 +1982,7 @@ void CPreGame::scenHandleEv(SDL_Event& sEvent)
&& (sEvent.button.x>55) && (sEvent.button.x<372)) && (sEvent.button.x>55) && (sEvent.button.x<372))
{ {
int py = ((sEvent.button.y-121)/25)+ourScenSel->mapsel.slid->whereAreWe; int py = ((sEvent.button.y-121)/25)+ourScenSel->mapsel.slid->whereAreWe;
mush->playSound(soundBase::button);
ourScenSel->mapsel.select(ourScenSel->mapsel.whichWL(py)); ourScenSel->mapsel.select(ourScenSel->mapsel.whichWL(py));
} }
@ -2199,7 +2201,6 @@ StartInfo CPreGame::runLoop()
} }
else if ((sEvent.type==SDL_MOUSEBUTTONDOWN) && (sEvent.button.button == SDL_BUTTON_LEFT)) else if ((sEvent.type==SDL_MOUSEBUTTONDOWN) && (sEvent.button.button == SDL_BUTTON_LEFT))
{ {
mush->playClick();
for (size_t i=0; i < btns.size(); ++i) for (size_t i=0; i < btns.size(); ++i)
{ {
if (isItIn(&btns[i]->pos,sEvent.motion.x,sEvent.motion.y)) if (isItIn(&btns[i]->pos,sEvent.motion.x,sEvent.motion.y))
@ -2235,6 +2236,8 @@ StartInfo CPreGame::runLoop()
highlightButton(5,1); highlightButton(5,1);
current->highlighted=5; current->highlighted=5;
} }
if (current->highlighted)
mush->playSound(soundBase::button);
} }
else if ((sEvent.type==SDL_MOUSEBUTTONUP) && (sEvent.button.button == SDL_BUTTON_LEFT)) else if ((sEvent.type==SDL_MOUSEBUTTONUP) && (sEvent.button.button == SDL_BUTTON_LEFT))
{ {

View File

@ -11,6 +11,7 @@
#include "../lib/VCMI_Lib.h" #include "../lib/VCMI_Lib.h"
#include "../map.h" #include "../map.h"
#include "../hch/CSpellHandler.h" #include "../hch/CSpellHandler.h"
#include "../hch/CSoundBase.h"
#include "../mapHandler.h" #include "../mapHandler.h"
#include <boost/bind.hpp> #include <boost/bind.hpp>
#include <boost/foreach.hpp> #include <boost/foreach.hpp>
@ -265,7 +266,7 @@ void InfoWindow::applyCl( CClient *cl )
std::string str = toString(text); std::string str = toString(text);
if(vstd::contains(cl->playerint,player)) if(vstd::contains(cl->playerint,player))
cl->playerint[player]->showInfoDialog(str,comps); cl->playerint[player]->showInfoDialog(str,comps,(soundBase::soundNames)soundID);
else else
tlog2 << "We received InfoWindow for not our player...\n"; tlog2 << "We received InfoWindow for not our player...\n";
} }
@ -284,7 +285,7 @@ void BlockingDialog::applyCl( CClient *cl )
{ {
std::string str = toString(text); std::string str = toString(text);
if(vstd::contains(cl->playerint,player)) if(vstd::contains(cl->playerint,player))
cl->playerint[player]->showBlockingDialog(str,components,id,selection(),cancel()); cl->playerint[player]->showBlockingDialog(str,components,id,(soundBase::soundNames)soundID,selection(),cancel());
else else
tlog2 << "We received YesNoDialog for not our player...\n"; tlog2 << "We received YesNoDialog for not our player...\n";
} }

View File

@ -1,4 +1,11 @@
#include "../stdafx.h" #include "../stdafx.h"
#include <boost/assign/std/vector.hpp>
#include <boost/assign/list_of.hpp>
#include <SDL_mixer.h>
#include "CSndHandler.h"
#include "CMusicHandler.h" #include "CMusicHandler.h"
/* /*
@ -11,17 +18,25 @@
* *
*/ */
using namespace boost::assign;
void CMusicHandler::initMusics() void CMusicHandler::initMusics()
{ {
if(Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 4096)==-1) if(Mix_OpenAudio(44100, MIX_DEFAULT_FORMAT, 2, 1024)==-1)
{ {
printf("Mix_OpenAudio error: %s!!!\n", Mix_GetError()); printf("Mix_OpenAudio error: %s!!!\n", Mix_GetError());
//exit(2);
sndh = NULL;
return; return;
} }
atexit(Mix_CloseAudio); atexit(Mix_CloseAudio);
// Map sound names
#define VCMI_SOUND_NAME(x) ( soundBase::x,
#define VCMI_SOUND_FILE(y) cachedSounds(#y, 0) )
sounds = boost::assign::map_list_of
VCMI_SOUND_LIST;
#undef VCMI_SOUND_NAME
#undef VCMI_SOUND_FILE
//AITheme0 = Mix_LoadMUS(DATA_DIR "MP3" PATHSEPARATOR "AITheme0.mp3"); //AITheme0 = Mix_LoadMUS(DATA_DIR "MP3" PATHSEPARATOR "AITheme0.mp3");
//AITheme1 = Mix_LoadMUS(DATA_DIR "MP3" PATHSEPARATOR "AITHEME1.mp3"); //AITheme1 = Mix_LoadMUS(DATA_DIR "MP3" PATHSEPARATOR "AITHEME1.mp3");
//AITheme2 = Mix_LoadMUS(DATA_DIR "MP3" PATHSEPARATOR "AITHEME2.mp3"); //AITheme2 = Mix_LoadMUS(DATA_DIR "MP3" PATHSEPARATOR "AITHEME2.mp3");
@ -65,46 +80,60 @@ void CMusicHandler::initMusics()
//winBattle = Mix_LoadMUS(DATA_DIR "MP3" PATHSEPARATOR "Win Battle.mp3"); //winBattle = Mix_LoadMUS(DATA_DIR "MP3" PATHSEPARATOR "Win Battle.mp3");
//winScenario = Mix_LoadMUS(DATA_DIR "MP3" PATHSEPARATOR "Win Scenario.mp3"); //winScenario = Mix_LoadMUS(DATA_DIR "MP3" PATHSEPARATOR "Win Scenario.mp3");
click = Mix_LoadWAV(DATA_DIR "MP3" PATHSEPARATOR "snd1.wav"); // Map sounds
if(!click) sndh = new CSndHandler(std::string(DATA_DIR "Data" PATHSEPARATOR "Heroes3.snd"));
tlog1 << "Cannot open " DATA_DIR "MP3" PATHSEPARATOR "snd1.wav\n";
else
click->volume = 30;
this->sndh = new CSndHandler(std::string(DATA_DIR "Data" PATHSEPARATOR "Heroes3.snd"));
} }
void CMusicHandler::playClick() // Return an SDL chunk. Allocate if it is not cached yet.
Mix_Chunk *CMusicHandler::GetSoundChunk(std::string srcName)
{ {
if(!sndh) return;
int channel;
channel = Mix_PlayChannel(-1, click, 0);
if(channel == -1)
{
fprintf(stderr, "Unable to play WAV file: %s\n", Mix_GetError());
}
}
void CMusicHandler::playLodSnd(std::string sndname)
{
if(!sndh) return;
int size; int size;
const unsigned char *data; const char *data = sndh->extract(srcName, size);
SDL_RWops *ops; SDL_RWops *ops;
Mix_Chunk *chunk; Mix_Chunk *chunk;
int channel;
if ((data = reinterpret_cast<const unsigned char*>(sndh->extract(sndname, size))) == NULL) if (!data)
return; return NULL;
ops = SDL_RWFromConstMem(data, size); ops = SDL_RWFromConstMem(data, size);
chunk = Mix_LoadWAV_RW(ops, 1); chunk = Mix_LoadWAV_RW(ops, 1); // will free ops
channel = Mix_PlayChannel(-1, chunk, 0); if (!chunk)
if(channel == -1) fprintf(stderr, "Unable to mix: %s\n",
{ Mix_GetError());
fprintf(stderr, "Unable to play WAV file("DATA_DIR "Data" PATHSEPARATOR "Heroes3.wav::%s): %s\n",
sndname.c_str(),Mix_GetError()); return chunk;
} }
ops->close(ops);
// Plays a sound, and return its channel so we can fade it out later
int CMusicHandler::playSound(soundBase::soundNames soundID)
{
int channel;
if (!sndh)
return -1;
std::map<soundBase::soundNames, cachedSounds>::iterator it;
it = sounds.find(soundID);
if (it == sounds.end())
return -1;
class cachedSounds sound = it->second;
if (!sound.chunk) {
sound.chunk = GetSoundChunk(sound.filename);
}
if (sound.chunk)
{
channel = Mix_PlayChannel(-1, sound.chunk, 0);
if(channel == -1)
{
fprintf(stderr, "Unable to play WAV file("DATA_DIR "Data" PATHSEPARATOR "Heroes3.wav::%s): %s\n",
sound.filename.c_str(),Mix_GetError());
}
}
return channel;
} }

View File

@ -1,8 +1,7 @@
#ifndef __CMUSICHANDLER_H__ #ifndef __CMUSICHANDLER_H__
#define __CMUSICHANDLER_H__ #define __CMUSICHANDLER_H__
#include <SDL_mixer.h> #include "CSoundBase.h"
#include "CSndHandler.h"
/* /*
* CMusicHandler.h, part of VCMI engine * CMusicHandler.h, part of VCMI engine
@ -14,18 +13,35 @@
* *
*/ */
struct Mix_Chunk;
class CSndHandler;
class CMusicHandler class CMusicHandler
{ {
protected: private:
CSndHandler *sndh; CSndHandler *sndh;
class cachedSounds {
public:
std::string filename;
Mix_Chunk *chunk;
// This is some horrible C++ abuse. Isn't there any way to do
// something simplier to init sounds?
cachedSounds(std::string filename_in, Mix_Chunk *chunk_in):
filename(filename_in), chunk(chunk_in) {};
};
std::map<soundBase::soundNames, cachedSounds> sounds;
Mix_Chunk *GetSoundChunk(std::string srcName);
public: public:
Mix_Music *AITheme0, *AITheme1, *AITheme2, *combat1, *combat2, *combat3, *combat4, *castleTown, *defendCastle, *dirt, *dungeon, *elemTown, *evilTheme, *fortressTown, *goodTheme, *grass, *infernoTown, *lava, *loopLepr, *loseCampain, *loseCastle, *loseCombat, *mainMenu, *mainMenuWoG, *necroTown, *neutralTheme, *rampart, *retreatBattle, *rough, *sand, *secretTheme, *snow, *stronghold, *surrenderBattle, *swamp, *towerTown, *ultimateLose, *underground, *water, *winScenario, *winBattle; CMusicHandler(): sndh(NULL) {};
Mix_Chunk * buildTown, *click;
void initMusics(); void initMusics();
void playClick(); //plays click music ;]
void playLodSnd(std::string sndname); // plays sound wavs from Heroes3.snd // Sounds
int playSound(soundBase::soundNames soundID); // plays sound wavs from Heroes3.snd
}; };
#endif // __CMUSICHANDLER_H__ #endif // __CMUSICHANDLER_H__

View File

@ -13,6 +13,7 @@
#include <boost/random/linear_congruential.hpp> #include <boost/random/linear_congruential.hpp>
#include "CTownHandler.h" #include "CTownHandler.h"
#include "CArtHandler.h" #include "CArtHandler.h"
#include "CSoundBase.h"
#include "../lib/VCMI_Lib.h" #include "../lib/VCMI_Lib.h"
#include "../lib/IGameCallback.h" #include "../lib/IGameCallback.h"
#include "../CGameState.h" #include "../CGameState.h"
@ -1092,6 +1093,7 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const
iw.components.push_back(Component(id,subid,val,0)); iw.components.push_back(Component(id,subid,val,0));
iw.player = cb->getOwner(heroID); iw.player = cb->getOwner(heroID);
iw.text << std::pair<ui8,ui32>(11,ot); iw.text << std::pair<ui8,ui32>(11,ot);
iw.soundID = soundBase::gazebo;
cb->showInfoDialog(&iw); cb->showInfoDialog(&iw);
cb->changePrimSkill(heroID,4,val); cb->changePrimSkill(heroID,4,val);
break; break;
@ -1962,6 +1964,7 @@ void CGPickable::onHeroVisit( const CGHeroInstance * h ) const
sd.text << std::pair<ui8,ui32>(11,146); sd.text << std::pair<ui8,ui32>(11,146);
sd.components.push_back(Component(2,6,val1,0)); sd.components.push_back(Component(2,6,val1,0));
sd.components.push_back(Component(5,0,val2,0)); sd.components.push_back(Component(5,0,val2,0));
sd.soundID = soundBase::chest;
boost::function<void(ui32)> fun = boost::bind(&CGPickable::chosen,this,_1,h->id); boost::function<void(ui32)> fun = boost::bind(&CGPickable::chosen,this,_1,h->id);
cb->showBlockingDialog(&sd,fun); cb->showBlockingDialog(&sd,fun);
return; return;
@ -2061,6 +2064,7 @@ void CGBonusingObject::onHeroVisit( const CGHeroInstance * h ) const
{ {
case 14: //swan pond case 14: //swan pond
messageID = 29; messageID = 29;
iw.soundID = soundBase::faerie;
gbonus.bonus.type = HeroBonus::LUCK; gbonus.bonus.type = HeroBonus::LUCK;
gbonus.bonus.val = 2; gbonus.bonus.val = 2;
gbonus.bdescr << std::pair<ui8,ui32>(6,67); gbonus.bdescr << std::pair<ui8,ui32>(6,67);
@ -2104,6 +2108,7 @@ void CGBonusingObject::onHeroVisit( const CGHeroInstance * h ) const
break; break;
case 96: //temple case 96: //temple
messageID = 140; messageID = 140;
iw.soundID = soundBase::temple;
gbonus.bonus.type = HeroBonus::MORALE; gbonus.bonus.type = HeroBonus::MORALE;
if(cb->getDate(1)==7) //sunday if(cb->getDate(1)==7) //sunday
{ {

2076
hch/CSoundBase.h Normal file

File diff suppressed because it is too large Load Diff

View File

@ -526,12 +526,16 @@ struct InfoWindow : public CPackForClient //103 - displays simple info window
MetaString text; MetaString text;
std::vector<Component> components; std::vector<Component> components;
ui8 player; ui8 player;
ui16 soundID;
template <typename Handler> void serialize(Handler &h, const int version) template <typename Handler> void serialize(Handler &h, const int version)
{ {
h & text & components & player; h & text & components & player & soundID;
} }
InfoWindow(){type = 103;}; InfoWindow() {
type = 103;
soundID = 0;
};
}; };
struct SetObjectProperty : public CPackForClient//1001 struct SetObjectProperty : public CPackForClient//1001
@ -594,6 +598,7 @@ struct BlockingDialog : public Query//2003
std::vector<Component> components; std::vector<Component> components;
ui8 player; ui8 player;
ui8 flags; ui8 flags;
ui16 soundID;
bool cancel() const bool cancel() const
{ {
@ -608,6 +613,7 @@ struct BlockingDialog : public Query//2003
{ {
type = 2003; type = 2003;
flags = 0; flags = 0;
soundID = 0;
if(yesno) flags |= ALLOW_CANCEL; if(yesno) flags |= ALLOW_CANCEL;
if(Selection) flags |= SELECTION; if(Selection) flags |= SELECTION;
} }
@ -615,11 +621,12 @@ struct BlockingDialog : public Query//2003
{ {
type = 2003; type = 2003;
flags = 0; flags = 0;
soundID = 0;
}; };
template <typename Handler> void serialize(Handler &h, const int version) template <typename Handler> void serialize(Handler &h, const int version)
{ {
h & id & text & components & player & flags; h & id & text & components & player & flags & soundID;
} }
}; };

View File

@ -396,6 +396,10 @@
RelativePath=".\Connection.h" RelativePath=".\Connection.h"
> >
</File> </File>
<File
RelativePath="..\hch\CSoundBase.h"
>
</File>
<File <File
RelativePath="..\hch\CSpellHandler.h" RelativePath="..\hch\CSpellHandler.h"
> >