diff --git a/source/game/gameslot.h b/source/game/gameslot.h index 6c58d0cfb..01a933f19 100644 --- a/source/game/gameslot.h +++ b/source/game/gameslot.h @@ -95,8 +95,8 @@ public: // Kelp Token functions.. int getKelpTokenCollectedCount(unsigned int _chapter,unsigned int _level) { - ASSERT(_chapter==NUM_CHAPTERS); - ASSERT(_level==NUM_LEVELS_WITH_SPATULAS+1); + ASSERT(_chapter<=NUM_CHAPTERS); + ASSERT(_level==NUM_LEVELS_WITH_SPATULAS); int i,j,count; count=0; for(i=0;i<8;i++) @@ -112,15 +112,15 @@ public: } void collectKelpToken(unsigned int _chapter,unsigned int _level,unsigned int _token) { - ASSERT(_chapter==NUM_CHAPTERS); - ASSERT(_level<=NUM_LEVELS_WITH_SPATULAS+1); + ASSERT(_chapter<=NUM_CHAPTERS); + ASSERT(_level==NUM_LEVELS_WITH_SPATULAS); ASSERT(_token<=128); m_kelpTokenCollectedFlags[_level][_token>>3]|=1<<(_token&7); } int isKelpTokenUncollected(unsigned int _chapter,unsigned int _level,unsigned int _token) { - ASSERT(_chapter==NUM_CHAPTERS); - ASSERT(_level<=NUM_LEVELS_WITH_SPATULAS+1); + ASSERT(_chapter<=NUM_CHAPTERS); + ASSERT(_level<=NUM_LEVELS_WITH_SPATULAS); ASSERT(_token<=128); return (m_kelpTokenCollectedFlags[_level][_token>>3]>>(_token&7))&1?false:true; } diff --git a/source/level/level.cpp b/source/level/level.cpp index 982130638..6a5ce073c 100644 --- a/source/level/level.cpp +++ b/source/level/level.cpp @@ -50,6 +50,10 @@ #include "pickups\pspatula.h" #endif +#ifndef __PICKUPS_PKELP_H__ +#include "pickups\pkelp.h" +#endif + #ifndef __SOUND_SOUND_H__ #include "sound\sound.h" #endif @@ -413,23 +417,35 @@ void CLevel::initThings(int _respawningLevel) // Items if (LevelHdr->ItemList) { + DVECTOR pos; + int itemNumber; sThingHdr *Hdr=(sThingHdr*)MakePtr(LevelHdr,LevelHdr->ItemList); ItemCount=Hdr->Count; ItemList=(sThingItem*)MakePtr(Hdr,sizeof(sThingHdr)); - DVECTOR pos; - int spatNumber=0; + itemNumber=0; for(int i=0;iType==PICKUP__SPATULA; - if(isSpat&&CGameSlotManager::getSlotData()->isSpatulaUncollected(GameScene.getChapterNumber()-1,GameScene.getLevelNumber()-1,spatNumber)==false) + isNumberedItem=false; + if((PICKUP_TYPE)ItemList->Type==PICKUP__SPATULA) { - createThisPickup=false; + isNumberedItem=true; + if(CGameSlotManager::getSlotData()->isSpatulaUncollected(GameScene.getChapterNumber()-1,GameScene.getLevelNumber()-1,itemNumber)==false) + { + createThisPickup=false; + } + } + else if((PICKUP_TYPE)ItemList->Type==PICKUP__KELP_TOKEN) + { + isNumberedItem=true; + if(CGameSlotManager::getSlotData()->isKelpTokenUncollected(GameScene.getChapterNumber()-1,GameScene.getLevelNumber()-1,itemNumber)==false) + { + createThisPickup=false; + } } if((PICKUP_TYPE)ItemList->Type==PICKUP__HELMET&& @@ -443,20 +459,47 @@ void CLevel::initThings(int _respawningLevel) pos.vx=ItemList->Pos.X<<4; pos.vy=ItemList->Pos.Y<<4; newPickup=createPickup((PICKUP_TYPE)ItemList->Type,&pos); - if(isSpat) + if(isNumberedItem) { - ((CSpatulaPickup*)newPickup)->setSpatulaNumber(spatNumber); + if((PICKUP_TYPE)ItemList->Type==PICKUP__SPATULA) + { + ((CSpatulaPickup*)newPickup)->setSpatulaNumber(itemNumber); + } + else if((PICKUP_TYPE)ItemList->Type==PICKUP__KELP_TOKEN) + { + ((CKelpTokenPickup*)newPickup)->setTokenNumber(itemNumber); + } + else + { + ASSERT(0); + } } } - if(isSpat) + if(isNumberedItem) { - spatNumber++; + itemNumber++; } ItemList++; } } + +/////// +{ + int i; + DVECTOR pos={100,100}; + for(i=PICKUP__BIG_HEALTH;im_kelpWorldLevel) { + sFrameHdr *fh; + POLY_FT4 *ft4; + // Normal level m_font->setColour(253,251,67); sprintf(buf,"%d/%d",CGameSlotManager::getSlotData()->getSpatulaCollectedCount(m_currentChapterSelection,i),level->m_spatulaOrTokenCounts); @@ -248,7 +250,7 @@ void CMapScene::render() { // Bonuse level m_font->setColour(67,251,67); - sprintf(buf,"-");//"%d/%d",CGameSlotManager::getSlotData()->getKelpTokenCollectedCount(m_currentChapterSelection,i),level->m_spatulaOrTokenCounts); + sprintf(buf,"%d/%d",CGameSlotManager::getSlotData()->getKelpTokenCollectedCount(m_currentChapterSelection,i),level->m_spatulaOrTokenCounts); } m_font->print(pos.vx,pos.vy,buf); diff --git a/source/pickups/pballoon.cpp b/source/pickups/pballoon.cpp index 9c33c13b6..ca461e55e 100644 --- a/source/pickups/pballoon.cpp +++ b/source/pickups/pballoon.cpp @@ -117,7 +117,6 @@ DVECTOR CBalloonPickup::getSizeForPlacement() void CBalloonPickup::collect(class CPlayer *_player) { _player->setMode(PLAYER_MODE_BALLOON); - CSoundMediator::playSfx(CSoundMediator::SFX_BALLOON_INFLATE); CBaseWeaponPickup::collect(_player); } diff --git a/source/pickups/pballoon.h b/source/pickups/pballoon.h index 893374eaf..c2badfaa7 100644 --- a/source/pickups/pballoon.h +++ b/source/pickups/pballoon.h @@ -50,6 +50,8 @@ protected: virtual void renderPickup(DVECTOR *_pos); private: + virtual CSoundMediator::SFXID sfxToPlayWhenCollected(){return CSoundMediator::SFX_BALLOON_INFLATE;} + int m_sin; }; diff --git a/source/pickups/pblower.h b/source/pickups/pblower.h index 1bb745678..fa1ecfe42 100644 --- a/source/pickups/pblower.h +++ b/source/pickups/pblower.h @@ -43,6 +43,8 @@ public: protected: virtual int getWeaponSpriteFrame(); +private: + virtual CSoundMediator::SFXID sfxToPlayWhenCollected(){return CSoundMediator::SFX_ITEM__CORAL_BLOWER;} }; diff --git a/source/pickups/pbubmix.h b/source/pickups/pbubmix.h index 7aca5354e..17f136333 100644 --- a/source/pickups/pbubmix.h +++ b/source/pickups/pbubmix.h @@ -49,6 +49,8 @@ protected: virtual void renderPickup(DVECTOR *_pos); private: + virtual CSoundMediator::SFXID sfxToPlayWhenCollected(){return CSoundMediator::SFX_ITEM__JAMJAR_AMMO;} + int m_sin; }; diff --git a/source/pickups/pglasses.cpp b/source/pickups/pglasses.cpp index 5ce8ab730..ade60c096 100644 --- a/source/pickups/pglasses.cpp +++ b/source/pickups/pglasses.cpp @@ -109,7 +109,6 @@ DVECTOR CGlassesPickup::getSizeForPlacement() void CGlassesPickup::collect(class CPlayer *_player) { _player->giveGlasses(); - CSoundMediator::playSfx(CSoundMediator::SFX_GLASSES_ON); CBasePickup::collect(_player); } diff --git a/source/pickups/pglasses.h b/source/pickups/pglasses.h index 059363de5..4a14996b4 100644 --- a/source/pickups/pglasses.h +++ b/source/pickups/pglasses.h @@ -47,6 +47,8 @@ protected: virtual void renderPickup(DVECTOR *_pos); private: + virtual CSoundMediator::SFXID sfxToPlayWhenCollected(){return CSoundMediator::SFX_GLASSES_ON;} + int m_glint; int m_glintRot; diff --git a/source/pickups/phelmet.cpp b/source/pickups/phelmet.cpp index 170722a77..259716dec 100644 --- a/source/pickups/phelmet.cpp +++ b/source/pickups/phelmet.cpp @@ -101,7 +101,6 @@ void CHelmetPickup::collect(class CPlayer *_player) { _player->giveDivingHelmet(); CBasePickup::collect(_player); - CSoundMediator::playSfx(CSoundMediator::SFX_SPONGEBOB_DIVING_HELMET); } /*---------------------------------------------------------------------- diff --git a/source/pickups/pickup.cpp b/source/pickups/pickup.cpp index bcf5d98a5..1b74ccaf2 100644 --- a/source/pickups/pickup.cpp +++ b/source/pickups/pickup.cpp @@ -184,6 +184,7 @@ void CBasePickup::collidedWith(CThing *_thisThing) { case TYPE_PLAYER: collect((CPlayer*)_thisThing); + CSoundMediator::playSfx(sfxToPlayWhenCollected()); break; default: @@ -339,6 +340,7 @@ void CBaseWeaponPickup::collidedWith(CThing *_thisThing) (!m_dontAutoPickUpUntilPlayerMovesOffMe&&player->tryingToAutomaticallyPickupWeapon())) { collect(player); + CSoundMediator::playSfx(sfxToPlayWhenCollected()); } else { diff --git a/source/pickups/pickup.h b/source/pickups/pickup.h index 8e204de29..df91b0e31 100644 --- a/source/pickups/pickup.h +++ b/source/pickups/pickup.h @@ -22,6 +22,10 @@ #include "thing/thing.h" #endif +#ifndef __SOUND_SOUND_H__ +#include "sound\sound.h" +#endif + /* Std Lib ------- */ @@ -88,7 +92,9 @@ protected: virtual void collidedWith(CThing *_thisThing); + private: + virtual CSoundMediator::SFXID sfxToPlayWhenCollected(){return CSoundMediator::SFX_ITEM__ANY_OTHER_ITEM;} }; @@ -123,6 +129,9 @@ protected: int m_dontAutoPickUpUntilPlayerMovesOffMe; int m_collidedWithPlayer; +private: + virtual CSoundMediator::SFXID sfxToPlayWhenCollected(){return CSoundMediator::SFX_ITEM__POWER_UP_ITEM;} + }; diff --git a/source/pickups/pjlammo.h b/source/pickups/pjlammo.h index cfff5c2b2..ce34e7842 100644 --- a/source/pickups/pjlammo.h +++ b/source/pickups/pjlammo.h @@ -46,6 +46,8 @@ protected: virtual void renderPickup(DVECTOR *_pos); private: + virtual CSoundMediator::SFXID sfxToPlayWhenCollected(){return CSoundMediator::SFX_ITEM__JAMJAR_AMMO;} + int m_rattle; }; diff --git a/source/pickups/pkelp.cpp b/source/pickups/pkelp.cpp index 4077ab075..3ece84ff5 100644 --- a/source/pickups/pkelp.cpp +++ b/source/pickups/pkelp.cpp @@ -108,7 +108,7 @@ DVECTOR CKelpTokenPickup::getSizeForPlacement() void CKelpTokenPickup::collect(class CPlayer *_player) { CBasePickup::collect(_player); -// CGameSlotManager::getSlotData()->collectSpatula(GameScene.getChapterNumber(),GameScene.getLevelNumber(),m_spatulaNumber); + CGameSlotManager::getSlotData()->collectKelpToken(GameScene.getChapterNumber()-1,GameScene.getLevelNumber()-1,m_tokenNumber); } /*---------------------------------------------------------------------- diff --git a/source/pickups/pkelp.h b/source/pickups/pkelp.h index b2d5d56e8..ed53719e9 100644 --- a/source/pickups/pkelp.h +++ b/source/pickups/pkelp.h @@ -48,6 +48,8 @@ protected: virtual void renderPickup(DVECTOR *_pos); private: + virtual CSoundMediator::SFXID sfxToPlayWhenCollected(){return CSoundMediator::SFX_ITEM__SKILL_ITEM;} + int m_tokenNumber; }; diff --git a/source/pickups/pquest.h b/source/pickups/pquest.h index 8641ae4e8..c6572e04e 100644 --- a/source/pickups/pquest.h +++ b/source/pickups/pquest.h @@ -48,6 +48,8 @@ private: virtual void thinkPickup(int _frames); virtual void renderPickup(DVECTOR *_pos); + virtual CSoundMediator::SFXID sfxToPlayWhenCollected(){return CSoundMediator::SFX_ITEM__LEVEL_ITEM;} + int m_pingFrame; int m_gfxFrame; diff --git a/source/pickups/pspatula.h b/source/pickups/pspatula.h index 841cbf2f2..9de8d0ab2 100644 --- a/source/pickups/pspatula.h +++ b/source/pickups/pspatula.h @@ -53,6 +53,8 @@ protected: virtual void renderPickup(DVECTOR *_pos); private: + virtual CSoundMediator::SFXID sfxToPlayWhenCollected(){return CSoundMediator::SFX_ITEM__SKILL_ITEM;} + int m_glint; int m_glintRot; int m_spatulaNumber; diff --git a/source/player/panimsfx.cpp b/source/player/panimsfx.cpp index 7f92d0298..70c9b9c01 100644 --- a/source/player/panimsfx.cpp +++ b/source/player/panimsfx.cpp @@ -96,8 +96,6 @@ static const int s_jumpEndCount=sizeof(s_jumpEndSfx)/sizeof(CPlayer::AnimFrameSf // ANIM_PLAYER_ANIM_KARATE static const CPlayer::AnimFrameSfx s_karateSfx[]= { - { 12, CSoundMediator::SFX_SPONGEBOB_WALK_1 }, - { 13, CSoundMediator::SFX_SPONGEBOB_WALK_2 }, { 13, CSoundMediator::SFX_SPONGEBOB_KARATE_1 }, }; static const int s_karateCount=sizeof(s_karateSfx)/sizeof(CPlayer::AnimFrameSfx); diff --git a/source/player/player.cpp b/source/player/player.cpp index 0003818b0..7768598a2 100644 --- a/source/player/player.cpp +++ b/source/player/player.cpp @@ -679,6 +679,7 @@ void CPlayer::shutdown() static int oldmode=-1; int newmode=-1; + void CPlayer::think(int _frames) { int i; @@ -1016,11 +1017,20 @@ if(newmode!=-1) if(isWearingDivingHelmet()&&getIsInWater()==false&& m_currentMode!=PLAYER_MODE_DEAD&&m_currentMode!=PLAYER_MODE_FLY) { + // Drain water/health m_healthWaterLevel-=waterDrainSpeed*_frames; if(m_healthWaterLevel<=0) { dieYouPorousFreak(DEATHTYPE__DRYUP); } + + // Breath sound + m_helmetSoundTimer+=_frames; + if(m_helmetSoundTimer>150+(m_healthWaterLevel>>WATERLEVELSHIFT)) + { + CSoundMediator::playSfx(CSoundMediator::SFX_SPONGEBOB_DIVING_HELMET); + m_helmetSoundTimer=0; + } } // Ledge look-ahead stuff @@ -1305,14 +1315,6 @@ if(drawlastpos) CGameScene::getSpriteBank()->printFT4(fh,x-2,y-2,0,0,0); itemX+=COLLECTEDITEM_GAP; } -/* - if(isWearingDivingHelmet()) - { - sFrameHdr *fh=CGameScene::getSpriteBank()->getFrameHeader(FRM__HELMET); - CGameScene::getSpriteBank()->printFT4(fh,itemX-(fh->W/2),COLLECTEDITEM_BASEY-(fh->H/2),0,0,0); - itemX+=COLLECTEDITEM_GAP; - } -*/ } @@ -1675,6 +1677,7 @@ void CPlayer::respawn() m_healthWaterLevel=WATERMAXHEALTH; m_healthReactFrames=0; m_invincibleFrameCount=INVINCIBLE_FRAMES__START; + m_helmetSoundTimer=0; Pos=m_respawnPos; m_cameraLookOffset=0; @@ -2183,6 +2186,7 @@ u32 CPlayer::getColourOfNextJellyfishAmmo() ---------------------------------------------------------------------- */ void CPlayer::justButtBouncedABadGuy() { + CSoundMediator::playSfx(CSoundMediator::SFX_SPONGEBOB_BUTTBOUNCE); m_currentPlayerModeClass->setState(STATE_BUTTBOUNCEUP); } diff --git a/source/player/player.h b/source/player/player.h index b66be55ce..1ae4c5ed5 100644 --- a/source/player/player.h +++ b/source/player/player.h @@ -327,6 +327,8 @@ private: int m_health; int m_healthWaterLevel; int m_healthReactFrames; + int m_helmetSoundTimer; // Timer for breathing sound when using the helmet + void dieYouPorousFreak(DEATH_TYPE _deathType=DEATHTYPE__NORMAL); DEATH_TYPE m_deathType; @@ -383,7 +385,7 @@ public: int getJellyFishAmmo(); u32 getColourOfNextJellyfishAmmo(); - void setIsInWater(int _in) {m_isInWater=_in;} + void setIsInWater(int _in) {m_isInWater=_in;m_helmetSoundTimer=0;} int getIsInWater() {return m_isInWater;} int getIsHealthFullSoICanStopSoakingUp() {return m_healthWaterLevel==WATERMAXHEALTH;} int getIsHealthSoFullThatIDontNeedToSoakUp(){return m_healthWaterLevel>=WATERMINSOACKUPLEVEL;} diff --git a/source/player/pmbubble.cpp b/source/player/pmbubble.cpp index 30bdfe9ef..7fdb347ff 100644 --- a/source/player/pmbubble.cpp +++ b/source/player/pmbubble.cpp @@ -67,7 +67,6 @@ void CPlayerModeBubbleMixture::enter() { CPlayerModeBase::enter(); - CSoundMediator::playSfx(CSoundMediator::SFX_BUBBLE_WAND); m_blowing=false; m_bubbleDelay=0; m_player->giveBubbleAmmo(); diff --git a/source/player/pmcoral.cpp b/source/player/pmcoral.cpp index 5e007af37..af7dbdf61 100644 --- a/source/player/pmcoral.cpp +++ b/source/player/pmcoral.cpp @@ -162,7 +162,6 @@ void CPlayerModeCoralBlower::enter() { CPlayerModeBase::enter(); m_blowerState=BLOWER_STATE__EMPTY; - CSoundMediator::playSfx(CSoundMediator::SFX_ITEM__CORAL_BLOWER); } /*---------------------------------------------------------------------- diff --git a/source/sound/sound.cpp b/source/sound/sound.cpp index 8bceb2531..bddfd0202 100644 --- a/source/sound/sound.cpp +++ b/source/sound/sound.cpp @@ -293,6 +293,7 @@ void CSoundMediator::initialise() s_targetVolume[i]=INITIAL_VOLUME; s_volumeDirty[i]=true; } +s_targetVolume[VOL_SONG]=32; ASSERT(CXAStream::MIN_VOLUME==0); // Just incase someone decides to change any of these.. things in here will break ( PKG ) ASSERT(CXAStream::MAX_VOLUME==32767);