aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSven Hesse2012-07-15 21:12:34 +0200
committerSven Hesse2012-07-30 01:48:40 +0200
commitb001168658f57b845bae81df0ca85240c796e74e (patch)
tree8e219014f2ccde916ae8ce5a32754026b3ff0e98
parentdd2768a2e47dd54f055cf65b2212ee9dca395c18 (diff)
downloadscummvm-rg350-b001168658f57b845bae81df0ca85240c796e74e.tar.gz
scummvm-rg350-b001168658f57b845bae81df0ca85240c796e74e.tar.bz2
scummvm-rg350-b001168658f57b845bae81df0ca85240c796e74e.zip
GOB: Implement the parents section in Once Upon A Time
The text lines are not drawn completely correct yet, because apparently, GCTFile needs to wrap long lines.
-rw-r--r--engines/gob/module.mk1
-rw-r--r--engines/gob/pregob/onceupon/abracadabra.cpp8
-rw-r--r--engines/gob/pregob/onceupon/babayaga.cpp8
-rw-r--r--engines/gob/pregob/onceupon/onceupon.cpp13
-rw-r--r--engines/gob/pregob/onceupon/parents.cpp217
-rw-r--r--engines/gob/pregob/onceupon/parents.h94
6 files changed, 332 insertions, 9 deletions
diff --git a/engines/gob/module.mk b/engines/gob/module.mk
index 489afe509e..d5ee6478be 100644
--- a/engines/gob/module.mk
+++ b/engines/gob/module.mk
@@ -86,6 +86,7 @@ MODULE_OBJS := \
pregob/onceupon/abracadabra.o \
pregob/onceupon/babayaga.o \
pregob/onceupon/title.o \
+ pregob/onceupon/parents.o \
pregob/onceupon/stork.o \
pregob/onceupon/chargenchild.o \
minigames/geisha/evilfish.o \
diff --git a/engines/gob/pregob/onceupon/abracadabra.cpp b/engines/gob/pregob/onceupon/abracadabra.cpp
index 0d644d9056..2cf6855ef8 100644
--- a/engines/gob/pregob/onceupon/abracadabra.cpp
+++ b/engines/gob/pregob/onceupon/abracadabra.cpp
@@ -80,10 +80,10 @@ const char *Abracadabra::kAnimalNames[] = {
// The houses where the stork can drop a bundle
const OnceUpon::MenuButton Abracadabra::kStorkHouses[] = {
- {false, 16, 80, 87, 125, 0, 0, 0, 0, 0, 0, 0},
- {false, 61, 123, 96, 149, 0, 0, 0, 0, 0, 0, 1},
- {false, 199, 118, 226, 137, 0, 0, 0, 0, 0, 0, 2},
- {false, 229, 91, 304, 188, 0, 0, 0, 0, 0, 0, 3}
+ {false, 16, 80, 87, 125, 0, 0, 0, 0, 0, 0, 0}, // Castle , Lord & Lady
+ {false, 61, 123, 96, 149, 0, 0, 0, 0, 0, 0, 1}, // Cottage, Farmers
+ {false, 199, 118, 226, 137, 0, 0, 0, 0, 0, 0, 2}, // Hut , Woodcutters
+ {false, 229, 91, 304, 188, 0, 0, 0, 0, 0, 0, 3} // Palace , King & Queen
};
// The stork bundle drop parameters
diff --git a/engines/gob/pregob/onceupon/babayaga.cpp b/engines/gob/pregob/onceupon/babayaga.cpp
index 6aa60310b5..ef56b9dd0b 100644
--- a/engines/gob/pregob/onceupon/babayaga.cpp
+++ b/engines/gob/pregob/onceupon/babayaga.cpp
@@ -80,10 +80,10 @@ const char *BabaYaga::kAnimalNames[] = {
// The houses where the stork can drop a bundle
const OnceUpon::MenuButton BabaYaga::kStorkHouses[] = {
- {false, 16, 80, 87, 125, 0, 0, 0, 0, 0, 0, 0},
- {false, 61, 123, 96, 149, 0, 0, 0, 0, 0, 0, 1},
- {false, 199, 118, 226, 137, 0, 0, 0, 0, 0, 0, 2},
- {false, 229, 91, 304, 188, 0, 0, 0, 0, 0, 0, 3}
+ {false, 16, 80, 87, 125, 0, 0, 0, 0, 0, 0, 0}, // Castle , Lord & Lady
+ {false, 61, 123, 96, 149, 0, 0, 0, 0, 0, 0, 1}, // Cottage, Farmers
+ {false, 199, 118, 226, 137, 0, 0, 0, 0, 0, 0, 2}, // Hut , Woodcutters
+ {false, 229, 91, 304, 188, 0, 0, 0, 0, 0, 0, 3} // Palace , King & Queen
};
// The stork bundle drop parameters
diff --git a/engines/gob/pregob/onceupon/onceupon.cpp b/engines/gob/pregob/onceupon/onceupon.cpp
index 9d32eaa356..e4c2df34c0 100644
--- a/engines/gob/pregob/onceupon/onceupon.cpp
+++ b/engines/gob/pregob/onceupon/onceupon.cpp
@@ -38,6 +38,7 @@
#include "gob/pregob/onceupon/onceupon.h"
#include "gob/pregob/onceupon/palettes.h"
#include "gob/pregob/onceupon/title.h"
+#include "gob/pregob/onceupon/parents.h"
#include "gob/pregob/onceupon/chargenchild.h"
static const uint kLanguageCount = 5;
@@ -1747,7 +1748,17 @@ bool OnceUpon::sectionChapter1() {
}
bool OnceUpon::sectionParents() {
- warning("OnceUpon::sectionParents(): TODO");
+ fadeOut();
+ setGamePalette(14);
+ clearScreen();
+
+ const Common::String seq = ((_house == 1) || (_house == 2)) ? "parents.seq" : "parents2.seq";
+ const Common::String gct = getLocFile("mefait.gc");
+
+ Parents parents(_vm, seq, gct, _name, _house, *_plettre, kGamePalettes[14], kGamePalettes[13], kPaletteSize);
+ parents.play();
+
+ warning("OnceUpon::sectionParents(): TODO: Item search");
return true;
}
diff --git a/engines/gob/pregob/onceupon/parents.cpp b/engines/gob/pregob/onceupon/parents.cpp
new file mode 100644
index 0000000000..cdaee6a38d
--- /dev/null
+++ b/engines/gob/pregob/onceupon/parents.cpp
@@ -0,0 +1,217 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include "gob/gob.h"
+#include "gob/global.h"
+#include "gob/dataio.h"
+#include "gob/palanim.h"
+#include "gob/draw.h"
+#include "gob/video.h"
+
+#include "gob/sound/sound.h"
+
+#include "gob/pregob/gctfile.h"
+
+#include "gob/pregob/onceupon/palettes.h"
+#include "gob/pregob/onceupon/parents.h"
+
+namespace Gob {
+
+namespace OnceUpon {
+
+const char *Parents::kSound[kSoundCount] = {
+ "rire.snd", // kSoundCackle
+ "tonn.snd" // kSoundThunder
+};
+
+// So that every GCT line is displayed for 12 seconds
+const uint16 Parents::kLoop[kLoopCount][3] = {
+ { 72, 77, 33},
+ {105, 109, 38},
+ {141, 145, 38},
+ {446, 454, 23},
+ {456, 464, 23},
+ {466, 474, 23},
+ {476, 484, 23}
+};
+
+
+Parents::Parents(GobEngine *vm, const Common::String &seq, const Common::String &gct,
+ const Common::String &childName, uint8 house, const Font &font,
+ const byte *normalPalette, const byte *brightPalette, uint paletteSize) :
+ SEQFile(vm, seq),
+ _gct(0), _house(house), _font(&font),
+ _paletteSize(paletteSize), _normalPalette(normalPalette), _brightPalette(brightPalette) {
+
+ // Load sounds
+ for (int i = 0; i < kSoundCount; i++)
+ _vm->_sound->sampleLoad(&_sounds[i], SOUND_SND, kSound[i]);
+
+ // Load GCT
+ Common::SeekableReadStream *gctStream = _vm->_dataIO->getFile(gct);
+ if (gctStream) {
+ _gct = new GCTFile(*gctStream, _vm->_rnd);
+
+ delete gctStream;
+ } else
+ error("Parents::Parents(): Failed to open \"%s\"", gct.c_str());
+
+ _gct->setArea(17, 18, 303, 41);
+ _gct->setText(1, childName);
+
+ _gct->selectLine(2, _house);
+ _gct->selectLine(4, _house);
+
+ for (uint i = 0; i < kLoopCount; i++)
+ _loopID[i] = addLoop(kLoop[i][0], kLoop[i][1], kLoop[i][2]);
+}
+
+Parents::~Parents() {
+ delete _gct;
+}
+
+void Parents::play() {
+ _currentLoop = 0;
+
+ SEQFile::play(true, 496, 15);
+
+ // After playback, fade out
+ if (!_vm->shouldQuit())
+ _vm->_palAnim->fade(0, 0, 0);
+}
+
+void Parents::handleFrameEvent() {
+ switch (getFrame()) {
+ case 0:
+ // On fame 0, fade in
+ _vm->_draw->forceBlit();
+ _vm->_palAnim->fade(_vm->_global->_pPaletteDesc, 0, 0);
+ break;
+
+ case 4:
+ drawGCT(0);
+ break;
+
+ case 55:
+ drawGCT(3, 0);
+ break;
+
+ case 79:
+ drawGCT(_house + 5, 1);
+ break;
+
+ case 110:
+ drawGCT(_house + 9, 2);
+ break;
+
+ case 146:
+ drawGCT(17);
+ break;
+
+ case 198:
+ drawGCT(13);
+ break;
+
+ case 445:
+ drawGCT(14, 3);
+ break;
+
+ case 455:
+ drawGCT(18, 4);
+ break;
+
+ case 465:
+ drawGCT(19, 5);
+ break;
+
+ case 475:
+ drawGCT(20, 6);
+ break;
+
+ case 188:
+ case 228:
+ case 237:
+ case 257:
+ case 275:
+ case 426:
+ lightningEffect();
+ break;
+
+ case 203:
+ case 243:
+ case 252:
+ case 272:
+ case 290:
+ case 441:
+ playSound(kSoundThunder);
+ break;
+
+ case 340:
+ playSound(kSoundCackle);
+ break;
+ }
+}
+
+void Parents::handleInput(int16 key, int16 mouseX, int16 mouseY, MouseButtons mouseButtons) {
+ if ((key == kKeyEscape) || (mouseButtons == kMouseButtonsRight))
+ abortPlay();
+
+ if (((key == kKeySpace) || (mouseButtons == kMouseButtonsLeft)) && (_currentLoop < kLoopCount))
+ skipLoop(_loopID[_currentLoop]);
+}
+
+void Parents::playSound(Sound sound) {
+ _vm->_sound->blasterStop(0);
+ _vm->_sound->blasterPlay(&_sounds[sound], 0, 0);
+}
+
+void Parents::lightningEffect() {
+ for (int i = 0; (i < 5) && !_vm->shouldQuit(); i++) {
+
+ setPalette(_brightPalette, _paletteSize);
+ _vm->_util->delay(5);
+
+ setPalette(_normalPalette, _paletteSize);
+ _vm->_util->delay(5);
+ }
+}
+
+void Parents::setPalette(const byte *palette, uint size) {
+ memcpy(_vm->_draw->_vgaPalette, palette, 3 * size);
+
+ _vm->_video->setFullPalette(_vm->_global->_pPaletteDesc);
+ _vm->_video->retrace();
+}
+
+void Parents::drawGCT(uint item, uint loop) {
+ int16 left, top, right, bottom;
+ if (_gct->clear(*_vm->_draw->_backSurface, left, top, right, bottom))
+ _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, left, top, right, bottom);
+ if (_gct->draw(*_vm->_draw->_backSurface, item, *_font, 10, left, top, right, bottom))
+ _vm->_draw->dirtiedRect(_vm->_draw->_backSurface, left, top, right, bottom);
+
+ _currentLoop = loop;
+}
+
+} // End of namespace OnceUpon
+
+} // End of namespace Gob
diff --git a/engines/gob/pregob/onceupon/parents.h b/engines/gob/pregob/onceupon/parents.h
new file mode 100644
index 0000000000..f5c8307b73
--- /dev/null
+++ b/engines/gob/pregob/onceupon/parents.h
@@ -0,0 +1,94 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#ifndef GOB_PREGOB_ONCEUPON_PARENTS_H
+#define GOB_PREGOB_ONCEUPON_PARENTS_H
+
+#include "gob/sound/sounddesc.h"
+
+#include "gob/pregob/seqfile.h"
+
+namespace Gob {
+
+class Font;
+
+class GCTFile;
+
+namespace OnceUpon {
+
+/** The home / parents animation sequence. */
+class Parents : public SEQFile {
+public:
+ Parents(GobEngine *vm, const Common::String &seq, const Common::String &gct,
+ const Common::String &childName, uint8 house, const Font &font,
+ const byte *normalPalette, const byte *brightPalette, uint paletteSize);
+ ~Parents();
+
+ void play();
+
+protected:
+ void handleFrameEvent();
+ void handleInput(int16 key, int16 mouseX, int16 mouseY, MouseButtons mouseButtons);
+
+private:
+ static const uint kLoopCount = 7;
+
+ static const uint16 kLoop[kLoopCount][3];
+
+ enum Sound {
+ kSoundCackle = 0,
+ kSoundThunder ,
+ kSoundCount
+ };
+
+ static const char *kSound[kSoundCount];
+
+
+ uint8 _house;
+
+ const Font *_font;
+
+ uint _paletteSize;
+ const byte *_normalPalette;
+ const byte *_brightPalette;
+
+ SoundDesc _sounds[kSoundCount];
+
+ GCTFile *_gct;
+
+ uint _loopID[kLoopCount];
+ uint _currentLoop;
+
+
+ void lightningEffect();
+
+ void playSound(Sound sound);
+ void setPalette(const byte *palette, uint size);
+
+ void drawGCT(uint item, uint loop = 0xFFFF);
+};
+
+} // End of namespace OnceUpon
+
+} // End of namespace Gob
+
+#endif // GOB_PREGOB_ONCEUPON_PARENTS_H