diff options
| author | Sven Hesse | 2012-07-15 21:12:34 +0200 | 
|---|---|---|
| committer | Sven Hesse | 2012-07-30 01:48:40 +0200 | 
| commit | b001168658f57b845bae81df0ca85240c796e74e (patch) | |
| tree | 8e219014f2ccde916ae8ce5a32754026b3ff0e98 | |
| parent | dd2768a2e47dd54f055cf65b2212ee9dca395c18 (diff) | |
| download | scummvm-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.mk | 1 | ||||
| -rw-r--r-- | engines/gob/pregob/onceupon/abracadabra.cpp | 8 | ||||
| -rw-r--r-- | engines/gob/pregob/onceupon/babayaga.cpp | 8 | ||||
| -rw-r--r-- | engines/gob/pregob/onceupon/onceupon.cpp | 13 | ||||
| -rw-r--r-- | engines/gob/pregob/onceupon/parents.cpp | 217 | ||||
| -rw-r--r-- | engines/gob/pregob/onceupon/parents.h | 94 | 
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  | 
