aboutsummaryrefslogtreecommitdiff
path: root/engines/gob/inter_v2.cpp
diff options
context:
space:
mode:
authorSven Hesse2007-01-25 14:18:12 +0000
committerSven Hesse2007-01-25 14:18:12 +0000
commit604077827f44d027e7c3afd3200afe1a901e1c2a (patch)
tree36049c29fb3533a4725d1e4c1189f16b8c63503e /engines/gob/inter_v2.cpp
parent30b7ac3db529c80d71d89ee41a09bce3d9076309 (diff)
downloadscummvm-rg350-604077827f44d027e7c3afd3200afe1a901e1c2a.tar.gz
scummvm-rg350-604077827f44d027e7c3afd3200afe1a901e1c2a.tar.bz2
scummvm-rg350-604077827f44d027e7c3afd3200afe1a901e1c2a.zip
- Some clean-up
- Fixed sound playing and looping - Changed Paula to use non-absolute panning, defaulting to 0.25/0.75 and 0.75/0.25, as per madmoose's suggestion - Prepared/Cleaned-up Paula and Infogrames for the move to sound/mods/ svn-id: r25189
Diffstat (limited to 'engines/gob/inter_v2.cpp')
-rw-r--r--engines/gob/inter_v2.cpp244
1 files changed, 124 insertions, 120 deletions
diff --git a/engines/gob/inter_v2.cpp b/engines/gob/inter_v2.cpp
index f0389dc201..181289621e 100644
--- a/engines/gob/inter_v2.cpp
+++ b/engines/gob/inter_v2.cpp
@@ -84,7 +84,7 @@ const int Inter_v2::_goblinFuncLookUp[][2] = {
{50, 36},
{52, 37},
{53, 38},
- {150, 39},
+ {100, 39},
{152, 40},
{200, 41},
{201, 42},
@@ -551,94 +551,94 @@ void Inter_v2::setupOpcodes(void) {
static const OpcodeGoblinEntryV2 opcodesGoblin[71] = {
/* 00 */
- OPCODE(o1_setState),
- OPCODE(o1_setCurFrame),
- OPCODE(o1_setNextState),
- OPCODE(o1_setMultState),
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
/* 04 */
- OPCODE(o1_setOrder),
- OPCODE(o1_setActionStartState),
- OPCODE(o1_setCurLookDir),
- OPCODE(o1_setType),
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
/* 08 */
- OPCODE(o1_setNoTick),
- OPCODE(o2_setPickable),
- OPCODE(o1_setXPos),
- OPCODE(o1_setYPos),
+ {NULL, ""},
+ OPCODE(o2_playInfogrames),
+ {NULL, ""},
+ {NULL, ""},
/* 0C */
- OPCODE(o1_setDoAnim),
- OPCODE(o1_setRelaxTime),
- OPCODE(o1_setMaxTick),
- OPCODE(o1_getState),
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
/* 10 */
- OPCODE(o1_getCurFrame),
- OPCODE(o1_getNextState),
- OPCODE(o1_getMultState),
- OPCODE(o1_getOrder),
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
/* 14 */
- OPCODE(o1_getActionStartState),
- OPCODE(o1_getCurLookDir),
- OPCODE(o1_getType),
- OPCODE(o1_getNoTick),
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
/* 18 */
- OPCODE(o1_getPickable),
- OPCODE(o1_getObjMaxFrame),
- OPCODE(o1_getXPos),
- OPCODE(o1_getYPos),
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
/* 1C */
- OPCODE(o1_getDoAnim),
- OPCODE(o1_getRelaxTime),
- OPCODE(o1_getMaxTick),
- OPCODE(o1_manipulateMap),
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
/* 20 */
- OPCODE(o1_getItem),
- OPCODE(o1_manipulateMapIndirect),
- OPCODE(o1_getItemIndirect),
- OPCODE(o1_setPassMap),
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
/* 24 */
- OPCODE(o1_setGoblinPosH),
- OPCODE(o1_getGoblinPosXH),
- OPCODE(o1_getGoblinPosYH),
- OPCODE(o1_setGoblinMultState),
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ OPCODE(o2_handleGoblins),
/* 28 */
- OPCODE(o1_setGoblinUnk14),
- OPCODE(o1_setItemIdInPocket),
- OPCODE(o1_setItemIndInPocket),
- OPCODE(o1_getItemIdInPocket),
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
/* 2C */
- OPCODE(o1_getItemIndInPocket),
- OPCODE(o1_setItemPos),
- OPCODE(o1_setGoblinPos),
- OPCODE(o1_setGoblinState),
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
/* 30 */
- OPCODE(o1_setGoblinStateRedraw),
- OPCODE(o1_decRelaxTime),
- OPCODE(o1_getGoblinPosX),
- OPCODE(o1_getGoblinPosY),
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
/* 34 */
- OPCODE(o1_clearPathExistence),
- OPCODE(o1_setGoblinVisible),
- OPCODE(o1_setGoblinInvisible),
- OPCODE(o1_getObjectIntersect),
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
/* 38 */
- OPCODE(o1_getGoblinIntersect),
- OPCODE(o1_setItemPos),
- OPCODE(o1_loadObjects),
- OPCODE(o1_freeObjects),
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
/* 3C */
- OPCODE(o1_animateObjects),
- OPCODE(o1_drawObjects),
- OPCODE(o1_loadMap),
- OPCODE(o1_moveGoblin),
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
/* 40 */
- OPCODE(o1_switchGoblin),
- OPCODE(o1_loadGoblin),
- OPCODE(o1_writeTreatItem),
- OPCODE(o1_moveGoblin0),
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
/* 44 */
- OPCODE(o1_setGoblinTarget),
- OPCODE(o1_setGoblinObjectsPos),
- OPCODE(o1_initGoblin)
+ {NULL, ""},
+ {NULL, ""},
+ {NULL, ""},
};
_opcodesDrawV2 = opcodesDraw;
@@ -687,9 +687,11 @@ void Inter_v2::executeGoblinOpcode(int i, int16 &extraData, int32 *retVarPtr, Go
}
if (op == NULL) {
- warning("unimplemented opcodeGoblin: %d", i);
+ int16 val;
+
_vm->_global->_inter_execPtr -= 2;
- _vm->_global->_inter_execPtr += load16() * 2;
+ val = load16();
+ _vm->_global->_inter_execPtr += val << 1;
}
else
(this->*op) (extraData, retVarPtr, objDesc);
@@ -1613,52 +1615,13 @@ bool Inter_v2::o2_playSound(char &cmdCount, int16 &counter, int16 &retFlag) {
bool Inter_v2::o2_goblinFunc(char &cmdCount, int16 &counter, int16 &retFlag) {
int16 cmd;
- char fileName[20];
+ int16 extraData;
cmd = load16();
_vm->_global->_inter_execPtr += 2;
- switch (cmd) {
- case 0:
- case 1:
- case 2:
- case 3:
- case 11:
- case 13:
- load16();
- break;
-
- case 10:
- strcpy(fileName, GET_VAR_STR(load16()));
- strcat(fileName, ".DUM");
- if (!_vm->_infogrames) {
- _vm->_infogrames = new Infogrames(_vm, true);
- _vm->_infogrames->loadInstruments("i1.ins");
- }
- _vm->_infogrames->load(fileName);
- _vm->_infogrames->startPlay();
- break;
-
- case 100:
- _vm->_goblin->_word_2F9C0 = VAR(load16());
- _vm->_goblin->_word_2F9BE = VAR(load16());
- _vm->_goblin->_dword_2F9B6 = load16();
- _vm->_goblin->_dword_2F9B2 = load16();
- _vm->_goblin->_word_2F9BC = VAR(load16());
- _vm->_goblin->_word_2F9BA = VAR(load16());
- _vm->_goblin->sub_19BD3();
- break;
-
- case 101:
- break;
-
- default:
- _vm->_global->_inter_execPtr -= 2;
- cmd = load16();
- _vm->_global->_inter_execPtr += cmd << 1;
- break;
- }
-
+ if (cmd != 101)
+ executeGoblinOpcode(cmd, extraData, NULL, NULL);
return false;
}
@@ -2346,6 +2309,51 @@ void Inter_v2::o2_switchTotSub(void) {
_vm->_game->switchTotSub(index, skipPlay);
}
+void Inter_v2::o2_handleGoblins(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc) {
+ _vm->_goblin->_word_2F9C0 = VAR(load16());
+ _vm->_goblin->_word_2F9BE = VAR(load16());
+ _vm->_goblin->_dword_2F9B6 = load16();
+ _vm->_goblin->_dword_2F9B2 = load16();
+ _vm->_goblin->_word_2F9BC = VAR(load16());
+ _vm->_goblin->_word_2F9BA = VAR(load16());
+ _vm->_goblin->handleGoblins();
+}
+
+void Inter_v2::o2_playInfogrames(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc) {
+ int16 varName;
+ char fileName[20];
+
+ varName = load16();
+
+ if (_vm->_noMusic)
+ return;
+
+ strcpy(fileName, GET_VAR_STR(varName));
+ strcat(fileName, ".DUM");
+ debugC(1, kDebugMusic, "Playing Infogrames music file \"%s\"", fileName);
+ if (!_vm->_game->_infIns) {
+ _vm->_game->_infIns = new Infogrames::Instruments;
+ if (!_vm->_game->_infIns->load("i1.ins")) {
+ warning("Couldn't load instruments file");
+ delete _vm->_game->_infIns;
+ _vm->_game->_infIns = 0;
+ }
+ }
+ if (_vm->_game->_infIns) {
+ _vm->_mixer->stopHandle(_vm->_game->_infHandle);
+ _vm->_game->_infogrames =
+ new Infogrames(*_vm->_game->_infIns, true,
+ _vm->_mixer->getOutputRate());
+ if (!_vm->_game->_infogrames->load(fileName)) {
+ warning("Couldn't load infogrames music");
+ delete _vm->_game->_infogrames;
+ _vm->_game->_infogrames = 0;
+ } else
+ _vm->_mixer->playInputStream(Audio::Mixer::kMusicSoundType,
+ &_vm->_game->_infHandle, _vm->_game->_infogrames);
+ }
+}
+
void Inter_v2::storeKey(int16 key) {
WRITE_VAR(12, _vm->_util->getTimeKey() - _vm->_game->_startTimeKey);
@@ -2388,10 +2396,6 @@ void Inter_v2::storeMouse(void) {
WRITE_VAR(4, _vm->_game->_mouseButtons);
}
-void Inter_v2::o2_setPickable(int16 &extraData, int32 *retVarPtr, Goblin::Gob_Object *objDesc) {
- warning("GOB2 Stub! o2_setPickable");
-}
-
void Inter_v2::animPalette(void) {
int16 i;
int16 j;