1
0
mirror of https://github.com/vcmi/vcmi.git synced 2024-11-24 08:32:34 +02:00

Added sounds to several objects, minor improvements.

This commit is contained in:
Michał W. Urbańczyk 2009-04-23 21:09:10 +00:00
parent 992ce92ae5
commit 275ec5f640
7 changed files with 91 additions and 1068 deletions

View File

@ -2610,7 +2610,7 @@ bool CPlayerInterface::moveHero( const CGHeroInstance *h, CPath path )
} else } else
#endif #endif
{ {
newTerrain = CGI->mh->map->terrain[path.nodes[i].coord.x][path.nodes[i].coord.y][path.nodes[i].coord.z].tertype; newTerrain = cb->getTileInfo(path.nodes[i].coord)->tertype;
if (newTerrain != currentTerrain) { if (newTerrain != currentTerrain) {
CGI->mush->stopSound(sh); CGI->mush->stopSound(sh);

View File

@ -152,3 +152,8 @@ int CMusicHandler::playSoundFromSet(std::vector<soundBase::soundNames> &sound_ve
{ {
return playSound(sound_vec[rand() % sound_vec.size()]); return playSound(sound_vec[rand() % sound_vec.size()]);
} }
void CMusicHandler::stopSound( int handler )
{
Mix_HaltChannel(handler);
}

View File

@ -1,8 +1,6 @@
#ifndef __CMUSICHANDLER_H__ #ifndef __CMUSICHANDLER_H__
#define __CMUSICHANDLER_H__ #define __CMUSICHANDLER_H__
#include <SDL_mixer.h>
#include "CSoundBase.h" #include "CSoundBase.h"
/* /*
@ -45,7 +43,7 @@ public:
// Sounds // Sounds
int playSound(soundBase::soundNames soundID, int repeats=0); int playSound(soundBase::soundNames soundID, int repeats=0);
int playSoundFromSet(std::vector<soundBase::soundNames> &sound_vec); int playSoundFromSet(std::vector<soundBase::soundNames> &sound_vec);
void stopSound(int handler) { Mix_HaltChannel(handler); }; void stopSound(int handler);
// Sets // Sets
std::vector<soundBase::soundNames> pickup_sounds; std::vector<soundBase::soundNames> pickup_sounds;

View File

@ -618,24 +618,24 @@ void CGHeroInstance::onHeroVisit(const CGHeroInstance * h) const
} }
else if(ID == 62) //prison else if(ID == 62) //prison
{ {
InfoWindow iw;
iw.player = h->tempOwner;
iw.soundID = soundBase::ROGUE;
if(cb->getHeroCount(h->tempOwner,false) < 8) //free hero slot if(cb->getHeroCount(h->tempOwner,false) < 8) //free hero slot
{ {
cb->changeObjPos(id,pos+int3(1,0,0),0); cb->changeObjPos(id,pos+int3(1,0,0),0);
cb->setObjProperty(id,6,HEROI_TYPE); //set ID to 34 cb->setObjProperty(id,6,HEROI_TYPE); //set ID to 34
cb->giveHero(id,h->tempOwner); //recreates def and adds hero to player cb->giveHero(id,h->tempOwner); //recreates def and adds hero to player
InfoWindow iw;
iw.player = h->tempOwner;
iw.text << std::pair<ui8,ui32>(11,102); iw.text << std::pair<ui8,ui32>(11,102);
cb->showInfoDialog(&iw);
} }
else //already 8 wandering heroes else //already 8 wandering heroes
{ {
InfoWindow iw;
iw.player = h->tempOwner;
iw.text << std::pair<ui8,ui32>(11,103); iw.text << std::pair<ui8,ui32>(11,103);
cb->showInfoDialog(&iw);
} }
cb->showInfoDialog(&iw);
} }
} }
@ -1017,46 +1017,56 @@ void CGVisitableOPH::treeSelected( int heroID, int resType, int resVal, int expV
} }
void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const
{ {
int id=0, subid=0, ot=0, val=1; int id=0, subid=0, ot=0, val=1, sound = 0;
switch(ID) switch(ID)
{ {
case 4: case 4: //arena
sound = soundBase::NOMAD;
ot = 0; ot = 0;
break; break;
case 51: case 51: //mercenary camp
sound = soundBase::NOMAD;
subid=0; subid=0;
ot=80; ot=80;
break; break;
case 23: case 23: //marletto tower
sound = soundBase::NOMAD;
subid=1; subid=1;
ot=39; ot=39;
break; break;
case 61: case 61:
sound = soundBase::gazebo;
subid=2; subid=2;
ot=100; ot=100;
break; break;
case 32: case 32:
sound = soundBase::GETPROTECTION;
subid=3; subid=3;
ot=59; ot=59;
break; break;
case 100: case 100:
sound = soundBase::gazebo;
id=5; id=5;
ot=143; ot=143;
val=1000; val=1000;
break; break;
case 102: case 102:
sound = soundBase::gazebo;
id = 5; id = 5;
subid = 1; subid = 1;
ot = 146; ot = 146;
val = 1; val = 1;
break; break;
case 41: case 41:
sound = soundBase::gazebo;
ot = 66; ot = 66;
break; break;
case 47: //School of Magic case 47: //School of Magic
sound = soundBase::faerie;
ot = 71; ot = 71;
break; break;
case 107://School of War case 107://School of War
sound = soundBase::MILITARY;
ot = 158; ot = 158;
break; break;
} }
@ -1067,6 +1077,7 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const
case 4: //arena case 4: //arena
{ {
BlockingDialog sd(false,true); BlockingDialog sd(false,true);
sd.soundID = sound;
sd.text << std::pair<ui8,ui32>(11,ot); sd.text << std::pair<ui8,ui32>(11,ot);
sd.components.push_back(Component(0,0,2,0)); sd.components.push_back(Component(0,0,2,0));
sd.components.push_back(Component(0,1,2,0)); sd.components.push_back(Component(0,1,2,0));
@ -1081,6 +1092,7 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const
{ {
cb->changePrimSkill(heroID,subid,val); cb->changePrimSkill(heroID,subid,val);
InfoWindow iw; InfoWindow iw;
iw.soundID = sound;
iw.components.push_back(Component(0,subid,val,0)); iw.components.push_back(Component(0,subid,val,0));
iw.text << std::pair<ui8,ui32>(11,ot); iw.text << std::pair<ui8,ui32>(11,ot);
iw.player = cb->getOwner(heroID); iw.player = cb->getOwner(heroID);
@ -1090,6 +1102,7 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const
case 100: //give exp case 100: //give exp
{ {
InfoWindow iw; InfoWindow iw;
iw.soundID = sound;
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);
@ -1106,6 +1119,7 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const
{ {
cb->setObjProperty(this->id,4,heroID); //add to the visitors cb->setObjProperty(this->id,4,heroID); //add to the visitors
InfoWindow iw; InfoWindow iw;
iw.soundID = sound;
iw.components.push_back(Component(id,subid,1,0)); iw.components.push_back(Component(id,subid,1,0));
iw.player = cb->getOwner(heroID); iw.player = cb->getOwner(heroID);
iw.text << std::pair<ui8,ui32>(11,148); iw.text << std::pair<ui8,ui32>(11,148);
@ -1133,6 +1147,7 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const
{ {
ot++; ot++;
InfoWindow iw; InfoWindow iw;
iw.soundID = sound;
iw.player = h->tempOwner; iw.player = h->tempOwner;
iw.text << std::pair<ui8,ui32>(11,ot); iw.text << std::pair<ui8,ui32>(11,ot);
cb->showInfoDialog(&iw); cb->showInfoDialog(&iw);
@ -1140,6 +1155,7 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const
} }
BlockingDialog sd(true,false); BlockingDialog sd(true,false);
sd.soundID = sound;
sd.player = cb->getOwner(heroID); sd.player = cb->getOwner(heroID);
sd.text << std::pair<ui8,ui32>(11,ot); sd.text << std::pair<ui8,ui32>(11,ot);
sd.components.push_back(Component(id,subid,val,0)); sd.components.push_back(Component(id,subid,val,0));
@ -1153,6 +1169,7 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const
if(h->level < 10 - 2*h->getSecSkillLevel(4)) //not enough level if(h->level < 10 - 2*h->getSecSkillLevel(4)) //not enough level
{ {
InfoWindow iw; InfoWindow iw;
iw.soundID = sound;
iw.player = cb->getOwner(heroID); iw.player = cb->getOwner(heroID);
iw.text << std::pair<ui8,ui32>(11,68); iw.text << std::pair<ui8,ui32>(11,68);
cb->showInfoDialog(&iw); cb->showInfoDialog(&iw);
@ -1165,6 +1182,7 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const
cb->changePrimSkill(heroID,2,2); cb->changePrimSkill(heroID,2,2);
cb->changePrimSkill(heroID,3,2); cb->changePrimSkill(heroID,3,2);
InfoWindow iw; InfoWindow iw;
iw.soundID = sound;
iw.player = cb->getOwner(heroID); iw.player = cb->getOwner(heroID);
iw.text << std::pair<ui8,ui32>(11,66); iw.text << std::pair<ui8,ui32>(11,66);
cb->showInfoDialog(&iw); cb->showInfoDialog(&iw);
@ -1178,6 +1196,7 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const
if(cb->getResource(cb->getOwner(heroID),6) < 1000) //not enough resources if(cb->getResource(cb->getOwner(heroID),6) < 1000) //not enough resources
{ {
InfoWindow iw; InfoWindow iw;
iw.soundID = sound;
iw.player = cb->getOwner(heroID); iw.player = cb->getOwner(heroID);
iw.text << std::pair<ui8,ui32>(MetaString::ADVOB_TXT,ot+2); iw.text << std::pair<ui8,ui32>(MetaString::ADVOB_TXT,ot+2);
cb->showInfoDialog(&iw); cb->showInfoDialog(&iw);
@ -1185,6 +1204,7 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const
else else
{ {
BlockingDialog sd(true,true); BlockingDialog sd(true,true);
sd.soundID = sound;
sd.player = cb->getOwner(heroID); sd.player = cb->getOwner(heroID);
sd.text << std::pair<ui8,ui32>(11,ot); sd.text << std::pair<ui8,ui32>(11,ot);
sd.components.push_back(Component(Component::PRIM_SKILL, skill, +1, 0)); sd.components.push_back(Component(Component::PRIM_SKILL, skill, +1, 0));
@ -1199,6 +1219,7 @@ void CGVisitableOPH::onNAHeroVisit(int heroID, bool alreadyVisited) const
{ {
ot++; ot++;
InfoWindow iw; InfoWindow iw;
iw.soundID = sound;
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);
cb->showInfoDialog(&iw); cb->showInfoDialog(&iw);
@ -1572,6 +1593,7 @@ void CGMine::onHeroVisit( const CGHeroInstance * h ) const
vv = 1000; vv = 1000;
InfoWindow iw; InfoWindow iw;
iw.soundID = soundBase::FLAGMINE;
iw.text << std::pair<ui8,ui32>(10,subID); iw.text << std::pair<ui8,ui32>(10,subID);
iw.player = h->tempOwner; iw.player = h->tempOwner;
iw.components.push_back(Component(2,subID,vv,-1)); iw.components.push_back(Component(2,subID,vv,-1));
@ -1689,16 +1711,19 @@ void CGVisitableOPW::newTurn() const
void CGVisitableOPW::onHeroVisit( const CGHeroInstance * h ) const void CGVisitableOPW::onHeroVisit( const CGHeroInstance * h ) const
{ {
int mid; int mid, sound = 0;
switch (ID) switch (ID)
{ {
case 55: case 55: //mystical garden
sound = soundBase::experience;
mid = 92; mid = 92;
break; break;
case 112: case 112://windmill
sound = soundBase::GENIE;
mid = 170; mid = 170;
break; break;
case 109: case 109://waterwheel
sound = soundBase::GENIE;
mid = 164; mid = 164;
break; break;
} }
@ -1710,6 +1735,7 @@ void CGVisitableOPW::onHeroVisit( const CGHeroInstance * h ) const
mid--; mid--;
InfoWindow iw; InfoWindow iw;
iw.soundID = sound;
iw.player = h->tempOwner; iw.player = h->tempOwner;
iw.text << std::pair<ui8,ui32>(11,mid); iw.text << std::pair<ui8,ui32>(11,mid);
cb->showInfoDialog(&iw); cb->showInfoDialog(&iw);
@ -1747,6 +1773,7 @@ void CGVisitableOPW::onHeroVisit( const CGHeroInstance * h ) const
} }
cb->giveResource(h->tempOwner,sub,val); cb->giveResource(h->tempOwner,sub,val);
InfoWindow iw; InfoWindow iw;
iw.soundID = sound;
iw.player = h->tempOwner; iw.player = h->tempOwner;
iw.components.push_back(Component(type,sub,val,0)); iw.components.push_back(Component(type,sub,val,0));
iw.text << std::pair<ui8,ui32>(11,mid); iw.text << std::pair<ui8,ui32>(11,mid);
@ -1931,6 +1958,7 @@ void CGPickable::onHeroVisit( const CGHeroInstance * h ) const
cb->giveResource(h->tempOwner,type,val2); //non-gold resource cb->giveResource(h->tempOwner,type,val2); //non-gold resource
cb->giveResource(h->tempOwner,6,val1);//gold cb->giveResource(h->tempOwner,6,val1);//gold
InfoWindow iw; InfoWindow iw;
iw.soundID = soundBase::experience;
iw.player = h->tempOwner; iw.player = h->tempOwner;
iw.components.push_back(Component(2,6,val1,0)); iw.components.push_back(Component(2,6,val1,0));
iw.components.push_back(Component(2,type,val2,0)); iw.components.push_back(Component(2,type,val2,0));
@ -1950,6 +1978,7 @@ void CGPickable::onHeroVisit( const CGHeroInstance * h ) const
{ {
cb->giveHeroArtifact(val1,h->id,-2); cb->giveHeroArtifact(val1,h->id,-2);
InfoWindow iw; InfoWindow iw;
iw.soundID = soundBase::treasure;
iw.player = h->tempOwner; iw.player = h->tempOwner;
iw.components.push_back(Component(4,val1,1,0)); iw.components.push_back(Component(4,val1,1,0));
iw.text << std::pair<ui8,ui32>(11,145); iw.text << std::pair<ui8,ui32>(11,145);
@ -1998,6 +2027,7 @@ void CGWitchHut::initObj()
void CGWitchHut::onHeroVisit( const CGHeroInstance * h ) const void CGWitchHut::onHeroVisit( const CGHeroInstance * h ) const
{ {
InfoWindow iw; InfoWindow iw;
iw.soundID = soundBase::gazebo;
iw.player = h->getOwner(); iw.player = h->getOwner();
if(!hasVisited(h->tempOwner)) if(!hasVisited(h->tempOwner))
cb->setObjProperty(id,10,h->tempOwner); cb->setObjProperty(id,10,h->tempOwner);
@ -2051,7 +2081,7 @@ void CGBonusingObject::onHeroVisit( const CGHeroInstance * h ) const
{ {
bool visited = h->getBonus(HeroBonus::OBJECT,ID); bool visited = h->getBonus(HeroBonus::OBJECT,ID);
int messageID, bonusType, bonusVal; int messageID, bonusType, bonusVal;
int bonusMove = 0; int bonusMove = 0, sound = -1;
InfoWindow iw; InfoWindow iw;
iw.player = h->tempOwner; iw.player = h->tempOwner;
GiveBonus gbonus; GiveBonus gbonus;
@ -2064,7 +2094,7 @@ void CGBonusingObject::onHeroVisit( const CGHeroInstance * h ) const
{ {
case 14: //swan pond case 14: //swan pond
messageID = 29; messageID = 29;
iw.soundID = soundBase::faerie; sound = soundBase::LUCK;
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);
@ -2072,12 +2102,14 @@ void CGBonusingObject::onHeroVisit( const CGHeroInstance * h ) const
break; break;
case 28: //Faerie Ring case 28: //Faerie Ring
messageID = 49; messageID = 49;
sound = soundBase::LUCK;
gbonus.bonus.type = HeroBonus::LUCK; gbonus.bonus.type = HeroBonus::LUCK;
gbonus.bonus.val = 1; gbonus.bonus.val = 1;
gbonus.bdescr << std::pair<ui8,ui32>(6,71); gbonus.bdescr << std::pair<ui8,ui32>(6,71);
break; break;
case 30: //fountain of fortune case 30: //fountain of fortune
messageID = 55; messageID = 55;
sound = soundBase::LUCK;
gbonus.bonus.type = HeroBonus::LUCK; gbonus.bonus.type = HeroBonus::LUCK;
gbonus.bonus.val = rand()%5 - 1; gbonus.bonus.val = rand()%5 - 1;
gbonus.bdescr << std::pair<ui8,ui32>(6,69); gbonus.bdescr << std::pair<ui8,ui32>(6,69);
@ -2085,6 +2117,7 @@ void CGBonusingObject::onHeroVisit( const CGHeroInstance * h ) const
break; break;
case 38: //idol of fortune case 38: //idol of fortune
messageID = 62; messageID = 62;
iw.soundID = soundBase::experience;
if(cb->getDate(1) == 7) //7th day of week if(cb->getDate(1) == 7) //7th day of week
gbonus.bonus.type = HeroBonus::MORALE_AND_LUCK; gbonus.bonus.type = HeroBonus::MORALE_AND_LUCK;
else else
@ -2093,6 +2126,7 @@ void CGBonusingObject::onHeroVisit( const CGHeroInstance * h ) const
gbonus.bdescr << std::pair<ui8,ui32>(6,68); gbonus.bdescr << std::pair<ui8,ui32>(6,68);
break; break;
case 64: //Rally Flag case 64: //Rally Flag
sound = soundBase::MORALE;
messageID = 111; messageID = 111;
gbonus.bonus.type = HeroBonus::MORALE_AND_LUCK; gbonus.bonus.type = HeroBonus::MORALE_AND_LUCK;
gbonus.bonus.val = 1; gbonus.bonus.val = 1;
@ -2122,6 +2156,7 @@ void CGBonusingObject::onHeroVisit( const CGHeroInstance * h ) const
} }
break; break;
case 110://Watering Hole case 110://Watering Hole
sound = soundBase::MORALE;
messageID = 166; messageID = 166;
gbonus.bonus.type = HeroBonus::MORALE; gbonus.bonus.type = HeroBonus::MORALE;
gbonus.bonus.val = 1; gbonus.bonus.val = 1;
@ -2129,6 +2164,7 @@ void CGBonusingObject::onHeroVisit( const CGHeroInstance * h ) const
bonusMove = 400; bonusMove = 400;
break; break;
case 31: //Fountain of Youth case 31: //Fountain of Youth
sound = soundBase::MORALE;
messageID = 57; messageID = 57;
gbonus.bonus.type = HeroBonus::MORALE; gbonus.bonus.type = HeroBonus::MORALE;
gbonus.bonus.val = 1; gbonus.bonus.val = 1;
@ -2158,6 +2194,7 @@ void CGBonusingObject::onHeroVisit( const CGHeroInstance * h ) const
cb->setMovePoints(&smp); cb->setMovePoints(&smp);
} }
} }
iw.soundID = sound;
iw.text << std::pair<ui8,ui32>(11,messageID); iw.text << std::pair<ui8,ui32>(11,messageID);
cb->showInfoDialog(&iw); cb->showInfoDialog(&iw);
} }
@ -2180,6 +2217,7 @@ void CGMagicWell::onHeroVisit( const CGHeroInstance * h ) const
{ {
int message; int message;
InfoWindow iw; InfoWindow iw;
iw.soundID = soundBase::faerie;
iw.player = h->tempOwner; iw.player = h->tempOwner;
if(h->getBonus(HeroBonus::OBJECT,ID)) //has already visited Well today if(h->getBonus(HeroBonus::OBJECT,ID)) //has already visited Well today
{ {
@ -2504,6 +2542,7 @@ void CGEvent::getText( InfoWindow &iw, bool &afterBattle, int val, int positive,
void CGObservatory::onHeroVisit( const CGHeroInstance * h ) const void CGObservatory::onHeroVisit( const CGHeroInstance * h ) const
{ {
InfoWindow iw; InfoWindow iw;
iw.soundID = soundBase::LIGHTHOUSE;
iw.player = h->tempOwner; iw.player = h->tempOwner;
iw.text.addTxt(MetaString::ADVOB_TXT,98 + (ID==60)); iw.text.addTxt(MetaString::ADVOB_TXT,98 + (ID==60));
cb->showInfoDialog(&iw); cb->showInfoDialog(&iw);
@ -2527,6 +2566,7 @@ void CGShrine::onHeroVisit( const CGHeroInstance * h ) const
cb->setObjProperty(id,10,h->tempOwner); cb->setObjProperty(id,10,h->tempOwner);
InfoWindow iw; InfoWindow iw;
iw.soundID = soundBase::temple;
iw.player = h->getOwner(); iw.player = h->getOwner();
iw.text.addTxt(MetaString::ADVOB_TXT,127 + ID - 88); iw.text.addTxt(MetaString::ADVOB_TXT,127 + ID - 88);
iw.text.addTxt(MetaString::SPELL_NAME,spell); iw.text.addTxt(MetaString::SPELL_NAME,spell);
@ -2607,6 +2647,7 @@ void CGSignBottle::initObj()
void CGSignBottle::onHeroVisit( const CGHeroInstance * h ) const void CGSignBottle::onHeroVisit( const CGHeroInstance * h ) const
{ {
InfoWindow iw; InfoWindow iw;
iw.soundID = soundBase::STORE;
iw.player = h->getOwner(); iw.player = h->getOwner();
iw.text << message; iw.text << message;
cb->showInfoDialog(&iw); cb->showInfoDialog(&iw);
@ -2634,6 +2675,7 @@ void CGScholar::onHeroVisit( const CGHeroInstance * h ) const
InfoWindow iw; InfoWindow iw;
iw.soundID = soundBase::gazebo;
iw.player = h->getOwner(); iw.player = h->getOwner();
iw.text.addTxt(MetaString::ADVOB_TXT,115); iw.text.addTxt(MetaString::ADVOB_TXT,115);
@ -2689,16 +2731,20 @@ void CGScholar::initObj()
void CGOnceVisitable::onHeroVisit( const CGHeroInstance * h ) const void CGOnceVisitable::onHeroVisit( const CGHeroInstance * h ) const
{ {
int sound = 0;
int txtid = -1; int txtid = -1;
switch(ID) switch(ID)
{ {
case 22: //Corpse case 22: //Corpse
txtid = 37; txtid = 37;
sound = soundBase::MYSTERY;
break; break;
case 39: //Lean To case 39: //Lean To
sound = soundBase::GENIE;
txtid = 64; txtid = 64;
break; break;
case 105://Wagon case 105://Wagon
sound = soundBase::GENIE;
txtid = 154; txtid = 154;
break; break;
case 108: case 108:
@ -2712,6 +2758,7 @@ void CGOnceVisitable::onHeroVisit( const CGHeroInstance * h ) const
{ {
//ask if player wants to search the Tomb //ask if player wants to search the Tomb
BlockingDialog bd(true, false); BlockingDialog bd(true, false);
sound = soundBase::GRAVEYARD;
bd.player = h->getOwner(); bd.player = h->getOwner();
bd.text.addTxt(MetaString::ADVOB_TXT,161); bd.text.addTxt(MetaString::ADVOB_TXT,161);
cb->showBlockingDialog(&bd,boost::bind(&CGOnceVisitable::searchTomb,this,h,_1)); cb->showBlockingDialog(&bd,boost::bind(&CGOnceVisitable::searchTomb,this,h,_1));
@ -2719,6 +2766,7 @@ void CGOnceVisitable::onHeroVisit( const CGHeroInstance * h ) const
} }
InfoWindow iw; InfoWindow iw;
iw.soundID = sound;
iw.player = h->getOwner(); iw.player = h->getOwner();
if(players.size()) //we have been already visited... if(players.size()) //we have been already visited...

View File

@ -1,5 +1,7 @@
#include "../stdafx.h" #include "../stdafx.h"
#include <fstream>
#include "CSndHandler.h" #include "CSndHandler.h"
#include <boost/iostreams/device/mapped_file.hpp>
/* /*
* CSndHandler.cpp, part of VCMI engine * CSndHandler.cpp, part of VCMI engine
@ -15,7 +17,8 @@ CSndHandler::~CSndHandler()
{ {
entries.clear(); entries.clear();
fimap.clear(); fimap.clear();
mfile.close(); mfile->close();
delete mfile;
} }
// Analyze the sound file. Half of this could go away if we were using // Analyze the sound file. Half of this could go away if we were using
@ -24,14 +27,14 @@ CSndHandler::~CSndHandler()
// them. */ // them. */
CSndHandler::CSndHandler(std::string fname) CSndHandler::CSndHandler(std::string fname)
{ {
mfile.open(fname); mfile = new boost::iostreams::mapped_file_source(fname);
if (!mfile.is_open()) if (!mfile->is_open())
{ {
tlog1 << "Cannot open " << fname << std::endl; tlog1 << "Cannot open " << fname << std::endl;
throw std::string("Cannot open ")+fname; throw std::string("Cannot open ")+fname;
} }
const unsigned char *data = (const unsigned char *)mfile.data(); const unsigned char *data = (const unsigned char *)mfile->data();
unsigned int numFiles = readNormalNr(&data[0]); unsigned int numFiles = readNormalNr(&data[0]);
@ -78,7 +81,7 @@ unsigned int CSndHandler::readNormalNr (const unsigned char *p)
void CSndHandler::extract(int index, std::string dstfile) //saves selected file void CSndHandler::extract(int index, std::string dstfile) //saves selected file
{ {
std::ofstream out(dstfile.c_str(),std::ios_base::binary); std::ofstream out(dstfile.c_str(),std::ios_base::binary);
const char *data = mfile.data(); const char *data = mfile->data();
out.write(&data[entries[index].offset], entries[index].size); out.write(&data[entries[index].offset], entries[index].size);
out.close(); out.close();
@ -138,7 +141,7 @@ MemberFile CSndHandler::getFile(std::string name)
const char * CSndHandler::extract (int index, int & size) const char * CSndHandler::extract (int index, int & size)
{ {
size = entries[index].size; size = entries[index].size;
const char *data = mfile.data(); const char *data = mfile->data();
return &data[entries[index].offset]; return &data[entries[index].offset];
} }

View File

@ -2,10 +2,9 @@
#define __CSNDHANDLER_H__ #define __CSNDHANDLER_H__
#include <vector> #include <vector>
#include <fstream> #include <iosfwd>
#include <map> #include <map>
#include <boost/iostreams/device/mapped_file.hpp>
/* /*
* CSndHandler.h, part of VCMI engine * CSndHandler.h, part of VCMI engine
@ -17,6 +16,14 @@
* *
*/ */
namespace boost
{
namespace iostreams
{
class mapped_file_source;
}
}
struct MemberFile struct MemberFile
{ {
std::ifstream * ifs; std::ifstream * ifs;
@ -33,7 +40,7 @@ private:
}; };
inline unsigned int readNormalNr (const unsigned char *p); inline unsigned int readNormalNr (const unsigned char *p);
boost::iostreams::mapped_file_source mfile; boost::iostreams::mapped_file_source *mfile;
public: public:
std::vector<Entry> entries; std::vector<Entry> entries;

File diff suppressed because it is too large Load Diff