diff options
Diffstat (limited to 'engines/gob/inter_geisha.cpp')
-rw-r--r-- | engines/gob/inter_geisha.cpp | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/engines/gob/inter_geisha.cpp b/engines/gob/inter_geisha.cpp index e3f3a24a98..658f2346f4 100644 --- a/engines/gob/inter_geisha.cpp +++ b/engines/gob/inter_geisha.cpp @@ -26,7 +26,10 @@ #include "gob/inter.h" #include "gob/dataio.h" #include "gob/script.h" +#include "gob/resources.h" #include "gob/game.h" +#include "gob/draw.h" +#include "gob/video.h" #include "gob/sound/sound.h" #include "gob/sound/sounddesc.h" @@ -47,16 +50,46 @@ void Inter_Geisha::setupOpcodesDraw() { void Inter_Geisha::setupOpcodesFunc() { Inter_v1::setupOpcodesFunc(); + OPCODEFUNC(0x03, oGeisha_loadCursor); + OPCODEFUNC(0x25, oGeisha_goblinFunc); OPCODEFUNC(0x3A, oGeisha_loadSound); + OPCODEFUNC(0x3F, oGeisha_checkData); + + OPCODEGOB(0, oGeisha_gamePenetration); + OPCODEGOB(1, oGeisha_gameDiving); + OPCODEGOB(2, oGeisha_loadTitleMusic); + OPCODEGOB(3, oGeisha_playMusic); + OPCODEGOB(4, oGeisha_stopMusic); + OPCODEGOB(6, oGeisha_caress1); + OPCODEGOB(7, oGeisha_caress2); } void Inter_Geisha::setupOpcodesGob() { } +void Inter_Geisha::oGeisha_loadCursor(OpFuncParams ¶ms) { + if (_vm->_game->_script->peekByte(1) & 0x80) + warning("Geisha Stub: oGeisha_loadCursor: script[1] & 0x80"); + + o1_loadCursor(params); +} + void Inter_Geisha::oGeisha_loadSound(OpFuncParams ¶ms) { loadSound(-1); } +void Inter_Geisha::oGeisha_goblinFunc(OpFuncParams ¶ms) { + OpGobParams gobParams; + int16 cmd; + + cmd = _vm->_game->_script->readInt16(); + + gobParams.paramCount = _vm->_game->_script->readInt16(); + gobParams.extraData = cmd; + + executeOpcodeGob(cmd, gobParams); +} + int16 Inter_Geisha::loadSound(int16 slot) { const char *sndFile = _vm->_game->_script->evalString(); @@ -80,4 +113,74 @@ int16 Inter_Geisha::loadSound(int16 slot) { return 0; } +void Inter_Geisha::oGeisha_checkData(OpFuncParams ¶ms) { + const char *file = _vm->_game->_script->evalString(); + int16 varOff = _vm->_game->_script->readVarIndex(); + + Common::String fileName(file); + + fileName.toLowercase(); + if (fileName.hasSuffix(".0ot")) + fileName.setChar('t', fileName.size() - 3); + + if (!_vm->_dataIO->hasFile(fileName)) { + warning("File \"%s\" not found", fileName.c_str()); + WRITE_VAR_OFFSET(varOff, (uint32) -1); + } else + WRITE_VAR_OFFSET(varOff, 50); // "handle" between 50 and 128 = in archive +} + +void Inter_Geisha::oGeisha_gamePenetration(OpGobParams ¶ms) { + uint16 var1 = _vm->_game->_script->readUint16(); + uint16 var2 = _vm->_game->_script->readUint16(); + uint16 var3 = _vm->_game->_script->readUint16(); + uint16 var4 = _vm->_game->_script->readUint16(); + + WRITE_VAR_UINT32(var4, 0); + + warning("Geisha Stub: Minigame \"Penetration\": %d, %d, %d, %d", var1, var2, var3, var4); + + // Fudge a win for now + WRITE_VAR_UINT32(var4, 1); +} + +void Inter_Geisha::oGeisha_gameDiving(OpGobParams ¶ms) { + uint16 var1 = _vm->_game->_script->readUint16(); + uint16 var2 = _vm->_game->_script->readUint16(); + uint16 var3 = _vm->_game->_script->readUint16(); + + WRITE_VAR_UINT32(var3, 1); + + warning("Geisha Stub: Minigame \"Diving\": %d, %d, %d", var1, var2, var3); + + // Fudge a win for now + WRITE_VAR_UINT32(var3, 0); +} + +void Inter_Geisha::oGeisha_loadTitleMusic(OpGobParams ¶ms) { + _vm->_sound->adlibLoadTBR("geisha.tbr"); + _vm->_sound->adlibLoadMDY("geisha.mdy"); +} + +void Inter_Geisha::oGeisha_playMusic(OpGobParams ¶ms) { + // TODO: The MDYPlayer is still broken! + warning("Geisha Stub: oGeisha_playMusic"); + // _vm->_sound->adlibPlay(); +} + +void Inter_Geisha::oGeisha_stopMusic(OpGobParams ¶ms) { + _vm->_sound->adlibStop(); + _vm->_sound->adlibUnload(); +} + +void Inter_Geisha::oGeisha_caress1(OpGobParams ¶ms) { + if (_vm->_draw->_spritesArray[0]) + _vm->_video->drawPackedSprite("hp1.cmp", *_vm->_draw->_spritesArray[0]); +} + +void Inter_Geisha::oGeisha_caress2(OpGobParams ¶ms) { + if (_vm->_draw->_spritesArray[1]) + _vm->_video->drawPackedSprite("hpsc1.cmp", *_vm->_draw->_spritesArray[1]); +} + } // End of namespace Gob |