diff options
-rw-r--r-- | engines/gob/minigames/geisha/penetration.cpp | 47 | ||||
-rw-r--r-- | engines/gob/minigames/geisha/penetration.h | 4 | ||||
-rw-r--r-- | engines/gob/minigames/geisha/submarine.cpp | 9 | ||||
-rw-r--r-- | engines/gob/minigames/geisha/submarine.h | 3 |
4 files changed, 52 insertions, 11 deletions
diff --git a/engines/gob/minigames/geisha/penetration.cpp b/engines/gob/minigames/geisha/penetration.cpp index 22cb06fed8..856c063edf 100644 --- a/engines/gob/minigames/geisha/penetration.cpp +++ b/engines/gob/minigames/geisha/penetration.cpp @@ -263,6 +263,8 @@ bool Penetration::play(bool hasAccessPass, bool hasMaxEnergy, bool testMode) { // Handle the sub movement handleSub(key); + + checkExited(); } deinit(); @@ -276,6 +278,7 @@ void Penetration::init() { _vm->_sound->sampleLoad(&_soundBite , SOUND_SND, "pervet.snd"); _vm->_sound->sampleLoad(&_soundKiss , SOUND_SND, "baise.snd"); _vm->_sound->sampleLoad(&_soundShoot , SOUND_SND, "tirgim.snd"); + _vm->_sound->sampleLoad(&_soundExit , SOUND_SND, "trouve.snd"); _background->clear(); @@ -296,11 +299,6 @@ void Penetration::init() { _floor = 0; createMap(); - - for (Common::List<ManagedMouth>::iterator m = _mouths.begin(); m != _mouths.end(); m++) - _mapAnims.push_back(m->mouth); - - _anims.push_back(_sub->sub); } void Penetration::deinit() { @@ -308,6 +306,7 @@ void Penetration::deinit() { _soundBite.free(); _soundKiss.free(); _soundShoot.free(); + _soundExit.free(); clearMap(); @@ -443,7 +442,12 @@ void Penetration::createMap() { } if (!_sub) - error("Geisha: No starting position in floor %d (testmode: %d", _floor, _testMode); + error("Geisha: No starting position in floor %d (testmode: %d)", _floor, _testMode); + + for (Common::List<ManagedMouth>::iterator m = _mouths.begin(); m != _mouths.end(); m++) + _mapAnims.push_back(m->mouth); + + _anims.push_back(_sub->sub); } void Penetration::initScreen() { @@ -525,6 +529,7 @@ void Penetration::subMove(int x, int y, Submarine::Direction direction) { checkShields(); checkMouths(); + checkExits(); } void Penetration::subShoot() { @@ -578,6 +583,23 @@ void Penetration::checkMouths() { } } +void Penetration::checkExits() { + if (!_sub->sub->canMove()) + return; + + for (Common::List<Position>::iterator e = _exits.begin(); e != _exits.end(); ++e) { + if ((e->x == _sub->x) && (e->y == _sub->y)) { + _sub->mapX = e->x * kMapTileWidth; + _sub->mapY = e->y * kMapTileHeight; + + _sub->sub->leave(); + + _vm->_sound->blasterPlay(&_soundExit, 1, 0); + break; + } + } +} + void Penetration::healthGain(int amount) { if (_shieldMeter->getValue() > 0) _healthMeter->increase(_shieldMeter->increase(amount)); @@ -592,12 +614,23 @@ void Penetration::healthLose(int amount) { _sub->sub->die(); } +void Penetration::checkExited() { + if (_sub->sub->hasExited()) { + _floor++; + + if (_floor >= kFloorCount) + return; + + createMap(); + } +} + bool Penetration::isDead() const { return _sub && _sub->sub->isDead(); } bool Penetration::hasWon() const { - return _floor > kFloorCount; + return _floor >= kFloorCount; } void Penetration::updateAnims() { diff --git a/engines/gob/minigames/geisha/penetration.h b/engines/gob/minigames/geisha/penetration.h index a5740382c6..f717e7219b 100644 --- a/engines/gob/minigames/geisha/penetration.h +++ b/engines/gob/minigames/geisha/penetration.h @@ -122,6 +122,7 @@ private: SoundDesc _soundBite; SoundDesc _soundKiss; SoundDesc _soundShoot; + SoundDesc _soundExit; void init(); @@ -142,12 +143,15 @@ private: bool isWalkable(int16 x, int16 y) const; + void checkExits(); void checkShields(); void checkMouths(); void healthGain(int amount); void healthLose(int amount); + void checkExited(); + bool isDead() const; bool hasWon() const; }; diff --git a/engines/gob/minigames/geisha/submarine.cpp b/engines/gob/minigames/geisha/submarine.cpp index 4a18c6e043..0f3f936ea6 100644 --- a/engines/gob/minigames/geisha/submarine.cpp +++ b/engines/gob/minigames/geisha/submarine.cpp @@ -109,12 +109,9 @@ void Submarine::advance() { break; case kStateExit: - if (isPaused()) { + if (isPaused()) _state = kStateExited; - setVisible(true); - } - break; case kStateDie: @@ -135,6 +132,10 @@ bool Submarine::isDead() const { return _state == kStateDead; } +bool Submarine::hasExited() const { + return _state == kStateExited; +} + uint16 Submarine::directionToMove(Direction direction) const { switch (direction) { case kDirectionN: diff --git a/engines/gob/minigames/geisha/submarine.h b/engines/gob/minigames/geisha/submarine.h index e8ae72d996..d14e4e953b 100644 --- a/engines/gob/minigames/geisha/submarine.h +++ b/engines/gob/minigames/geisha/submarine.h @@ -67,6 +67,9 @@ public: /** Is the submarine dead? */ bool isDead() const; + /** Has the submarine finished exiting the level? */ + bool hasExited() const; + private: enum State { kStateNone = 0, |