mirror of
https://github.com/vcmi/vcmi.git
synced 2025-01-12 02:28:11 +02:00
parent
d625066449
commit
ade4b46edd
@ -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);
|
||||||
};
|
};
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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){};
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
{
|
{
|
||||||
|
@ -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);
|
||||||
|
|
||||||
|
@ -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))
|
||||||
{
|
{
|
||||||
|
@ -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";
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
@ -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__
|
||||||
|
@ -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
2076
hch/CSoundBase.h
Normal file
File diff suppressed because it is too large
Load Diff
@ -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;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -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"
|
||||||
>
|
>
|
||||||
|
Loading…
Reference in New Issue
Block a user