diff --git a/engines/gob/gob.cpp b/engines/gob/gob.cpp index ea7e32948076..59a96951dde7 100644 --- a/engines/gob/gob.cpp +++ b/engines/gob/gob.cpp @@ -402,7 +402,6 @@ bool GobEngine::initGameParts() { _game = new Game(this); switch (_gameType) { - case kGameTypeGeisha: case kGameTypeGob1: _init = new Init_v1(this); _video = new Video_v1(this); @@ -414,6 +413,17 @@ bool GobEngine::initGameParts() { _scenery = new Scenery_v1(this); break; + case kGameTypeGeisha: + _init = new Init_v1(this); + _video = new Video_v1(this); + _inter = new Inter_Geisha(this); + _mult = new Mult_v1(this); + _draw = new Draw_v1(this); + _map = new Map_v1(this); + _goblin = new Goblin_v1(this); + _scenery = new Scenery_v1(this); + break; + case kGameTypeFascination: _init = new Init_Fascination(this); _video = new Video_v2(this); diff --git a/engines/gob/inter.h b/engines/gob/inter.h index b1689e8d9e00..ecbf22610d74 100644 --- a/engines/gob/inter.h +++ b/engines/gob/inter.h @@ -334,6 +334,21 @@ class Inter_v1 : public Inter { void manipulateMap(int16 xPos, int16 yPos, int16 item); }; +class Inter_Geisha : public Inter_v1 { +public: + Inter_Geisha(GobEngine *vm); + virtual ~Inter_Geisha() {} + +protected: + virtual void setupOpcodesDraw(); + virtual void setupOpcodesFunc(); + virtual void setupOpcodesGob(); + + void oGeisha_loadSound(OpFuncParams ¶ms); + + int16 loadSound(int16 slot); +}; + class Inter_v2 : public Inter_v1 { public: Inter_v2(GobEngine *vm); diff --git a/engines/gob/inter_geisha.cpp b/engines/gob/inter_geisha.cpp new file mode 100644 index 000000000000..e3f3a24a9854 --- /dev/null +++ b/engines/gob/inter_geisha.cpp @@ -0,0 +1,83 @@ +/* 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 "common/endian.h" + +#include "gob/gob.h" +#include "gob/inter.h" +#include "gob/dataio.h" +#include "gob/script.h" +#include "gob/game.h" +#include "gob/sound/sound.h" +#include "gob/sound/sounddesc.h" + +namespace Gob { + +#define OPCODEVER Inter_Geisha +#define OPCODEDRAW(i, x) _opcodesDraw[i]._OPCODEDRAW(OPCODEVER, x) +#define OPCODEFUNC(i, x) _opcodesFunc[i]._OPCODEFUNC(OPCODEVER, x) +#define OPCODEGOB(i, x) _opcodesGob[i]._OPCODEGOB(OPCODEVER, x) + +Inter_Geisha::Inter_Geisha(GobEngine *vm) : Inter_v1(vm) { +} + +void Inter_Geisha::setupOpcodesDraw() { + Inter_v1::setupOpcodesDraw(); +} + +void Inter_Geisha::setupOpcodesFunc() { + Inter_v1::setupOpcodesFunc(); + + OPCODEFUNC(0x3A, oGeisha_loadSound); +} + +void Inter_Geisha::setupOpcodesGob() { +} + +void Inter_Geisha::oGeisha_loadSound(OpFuncParams ¶ms) { + loadSound(-1); +} + +int16 Inter_Geisha::loadSound(int16 slot) { + const char *sndFile = _vm->_game->_script->evalString(); + + if (slot == -1) + slot = _vm->_game->_script->readValExpr(); + + SoundDesc *sample = _vm->_sound->sampleGetBySlot(slot); + if (!sample) + return 0; + + int32 dataSize; + byte *dataPtr = _vm->_dataIO->getFile(sndFile, dataSize); + if (!dataPtr) + return 0; + + if (!sample->load(SOUND_SND, dataPtr, dataSize)) { + delete[] dataPtr; + return 0; + } + + return 0; +} + +} // End of namespace Gob diff --git a/engines/gob/module.mk b/engines/gob/module.mk index cdad1e6c46f1..7c634dfaa144 100644 --- a/engines/gob/module.mk +++ b/engines/gob/module.mk @@ -33,6 +33,7 @@ MODULE_OBJS := \ init_v7.o \ inter.o \ inter_v1.o \ + inter_geisha.o \ inter_v2.o \ inter_bargon.o \ inter_fascin.o \