aboutsummaryrefslogtreecommitdiff
path: root/engines/gob
diff options
context:
space:
mode:
Diffstat (limited to 'engines/gob')
-rw-r--r--engines/gob/minigames/geisha/diving.cpp52
-rw-r--r--engines/gob/minigames/geisha/diving.h11
2 files changed, 63 insertions, 0 deletions
diff --git a/engines/gob/minigames/geisha/diving.cpp b/engines/gob/minigames/geisha/diving.cpp
index 8fe3d63990..556d54e516 100644
--- a/engines/gob/minigames/geisha/diving.cpp
+++ b/engines/gob/minigames/geisha/diving.cpp
@@ -68,6 +68,8 @@ Diving::~Diving() {
}
bool Diving::play(uint16 playerCount, bool hasPearlLocation) {
+ _hasPearlLocation = hasPearlLocation;
+
init();
initScreen();
initCursor();
@@ -81,6 +83,7 @@ bool Diving::play(uint16 playerCount, bool hasPearlLocation) {
updateEvilFish();
updateDecorFish();
updatePlants();
+ updatePearl();
updateAnims();
_vm->_draw->animateCursor(1);
@@ -155,6 +158,11 @@ void Diving::init() {
_plant[i].plant = new ANIObject(*_objects);
}
+ _pearl.pearl = new ANIObject(*_objects);
+ _pearl.black = false;
+
+ _pearl.pearl->setAnimation(4);
+
_decorFish[0].decorFish->setAnimation( 6); // Jellyfish
_decorFish[0].deltaX = 0;
@@ -184,6 +192,7 @@ void Diving::init() {
_anims.push_back(_water);
for (uint i = 0; i < kMaxShotCount; i++)
_anims.push_back(_shot[i]);
+ _anims.push_back(_pearl.pearl);
for (uint i = 0; i < kDecorFishCount; i++)
_anims.push_back(_decorFish[i].decorFish);
for (uint i = 0; i < kEvilFishCount; i++)
@@ -236,6 +245,9 @@ void Diving::deinit() {
_plant[i].plant = 0;
}
+ delete _pearl.pearl;
+ _pearl.pearl = 0;
+
delete _heart;
delete _lungs;
delete _water;
@@ -316,6 +328,27 @@ void Diving::enterPlant(ManagedPlant &plant, int16 prevPlantX) {
plant.plant->setPosition(plant.x, plant.y);
plant.plant->setVisible(true);
plant.plant->setPause(false);
+
+ if (plant.x > 320)
+ enterPearl(plant.x);
+}
+
+void Diving::enterPearl(int16 x) {
+ // Only one pearl is ever visible
+ if (_pearl.pearl->isVisible())
+ return;
+
+ // Only every 4th potential pearl position has a pearl
+ if (_vm->_util->getRandom(4) != 0)
+ return;
+
+ // Every 5th pearl is a black one, but only if the location is correct
+ _pearl.black = _hasPearlLocation && (_vm->_util->getRandom(5) == 0);
+
+ _pearl.pearl->setPosition(x + 80, 130);
+
+ _pearl.pearl->setVisible(true);
+ _pearl.pearl->setPause(false);
}
void Diving::updateEvilFish() {
@@ -424,6 +457,25 @@ void Diving::updatePlants() {
}
}
+void Diving::updatePearl() {
+ if (!_pearl.pearl->isVisible())
+ return;
+
+ // Move the pearl
+ int16 x, y, width, height;
+ _pearl.pearl->getPosition(x, y);
+ _pearl.pearl->setPosition(x - 5, y);
+
+ // Check if the pearl has left the screen
+ _pearl.pearl->getFramePosition(x, y);
+ _pearl.pearl->getFrameSize(width, height);
+
+ if ((x + width) <= 0) {
+ _pearl.pearl->setVisible(false);
+ _pearl.pearl->setPause(true);
+ }
+}
+
void Diving::foundBlackPearl() {
_blackPearlCount++;
diff --git a/engines/gob/minigames/geisha/diving.h b/engines/gob/minigames/geisha/diving.h
index af224401e3..ee2f8d8451 100644
--- a/engines/gob/minigames/geisha/diving.h
+++ b/engines/gob/minigames/geisha/diving.h
@@ -96,6 +96,12 @@ private:
int16 x, y;
};
+ struct ManagedPearl {
+ ANIObject *pearl;
+
+ bool black;
+ };
+
GobEngine *_vm;
DECFile *_background;
@@ -110,6 +116,7 @@ private:
ManagedEvilFish _evilFish[kEvilFishCount];
ManagedDecorFish _decorFish[kDecorFishCount];
ManagedPlant _plant[kPlantCount];
+ ManagedPearl _pearl;
ANIObject *_shot[kMaxShotCount];
@@ -129,6 +136,8 @@ private:
SoundDesc _soundWhitePearl;
SoundDesc _soundBlackPearl;
+ bool _hasPearlLocation;
+
void init();
void deinit();
@@ -138,6 +147,7 @@ private:
void initPlants();
void enterPlant(ManagedPlant &plant, int16 prevPlantX);
+ void enterPearl(int16 x);
void foundBlackPearl();
void foundWhitePearl();
@@ -145,6 +155,7 @@ private:
void updateEvilFish();
void updateDecorFish();
void updatePlants();
+ void updatePearl();
void updateAnims();
int16 checkInput(int16 &mouseX, int16 &mouseY, MouseButtons &mouseButtons);