diff options
-rw-r--r-- | dists/engine-data/kyra.dat | bin | 253151 -> 253412 bytes | |||
-rw-r--r-- | engines/kyra/gui_lol.cpp | 2 | ||||
-rw-r--r-- | engines/kyra/lol.cpp | 36 | ||||
-rw-r--r-- | engines/kyra/lol.h | 39 | ||||
-rw-r--r-- | engines/kyra/resource.h | 1 | ||||
-rw-r--r-- | engines/kyra/scene_lol.cpp | 84 | ||||
-rw-r--r-- | engines/kyra/script_lol.cpp | 53 | ||||
-rw-r--r-- | engines/kyra/staticres.cpp | 10 | ||||
-rw-r--r-- | tools/create_kyradat/create_kyradat.cpp | 3 | ||||
-rw-r--r-- | tools/create_kyradat/create_kyradat.h | 1 | ||||
-rw-r--r-- | tools/create_kyradat/lol_cd.h | 1 | ||||
-rw-r--r-- | tools/create_kyradat/misc.h | 1 |
12 files changed, 145 insertions, 86 deletions
diff --git a/dists/engine-data/kyra.dat b/dists/engine-data/kyra.dat Binary files differindex ac939430fd..22e229a181 100644 --- a/dists/engine-data/kyra.dat +++ b/dists/engine-data/kyra.dat diff --git a/engines/kyra/gui_lol.cpp b/engines/kyra/gui_lol.cpp index 6d7acc28e3..477c7937eb 100644 --- a/engines/kyra/gui_lol.cpp +++ b/engines/kyra/gui_lol.cpp @@ -336,7 +336,7 @@ void LoLEngine::gui_drawCompass() { if (_updateUnk2 == -1) { _compassDirectionIndex = -1; - _updateUnk2 = _unkPara2 << 6; + _updateUnk2 = _currentDirection << 6; } int t = ((_updateUnk2 + 4) >> 3) & 0x1f; diff --git a/engines/kyra/lol.cpp b/engines/kyra/lol.cpp index 0217be6d3f..f6ada2ef69 100644 --- a/engines/kyra/lol.cpp +++ b/engines/kyra/lol.cpp @@ -96,7 +96,7 @@ LoLEngine::LoLEngine(OSystem *system, const GameFlags &flags) : KyraEngine_v1(sy _unkFlag = 0; _scriptBoolSkipExec = _boolScriptFuncDone = false; _unkScriptByte = 0; - _unkPara2 = 0; + _currentDirection = 0; _currentBlock = 0; memset(_scriptExecutedFuncs, 0, 18 * sizeof(uint16)); @@ -140,15 +140,19 @@ LoLEngine::LoLEngine(OSystem *system, const GameFlags &flags) : KyraEngine_v1(sy _dscBlockMap = _dscDoor1 = _dscShapeOvlIndex = 0; _dscBlockIndex = 0; _dscDimMap = 0; - _dscDoorX = _dscDoorY = 0; + _dscDoorMonsterX = _dscDoorMonsterY = 0; _dscDoor4 = 0; _ingameSoundList = 0; + _ingameSoundIndex = 0; _ingameSoundListSize = 0; + _musicTrackMap = 0; + _curMusicTheme = -1; + _curMusicFileExt = 0; _sceneDrawVar1 = _sceneDrawVar2 = _sceneDrawVar3 = _wllProcessFlag = 0; _unkCmzU1 = _unkCmzU2 = 0; - _shpDoorX = _shpDoorY = _doorScaleW = _doorScaleH = 0; + _shpDmX = _shpDmY = _dmScaleW = _dmScaleH = 0; } LoLEngine::~LoLEngine() { @@ -685,7 +689,7 @@ const char *LoLEngine::getLangString(uint16 id) { if (id & 0x4000) buffer = _landsFile; else - buffer = 0; // TODO + buffer = _levelLangFile; if (!buffer) return 0; @@ -1429,6 +1433,24 @@ void LoLEngine::snd_playSoundEffect(int track, int volume) { } } +void LoLEngine::snd_playTrack(int track) { + if (_unkGameFlag & 2) { + char filename[13]; + int t = (track - 250) * 3; + + if (_curMusicTheme != _musicTrackMap[t] || _curMusicFileExt != (char)_musicTrackMap[t + 1]) { + snprintf(filename, sizeof(filename), "LORE%02d%c", _musicTrackMap[t], (char)_musicTrackMap[t + 1]); + _sound->loadSoundFile(filename); + _curMusicTheme = _musicTrackMap[t]; + _curMusicFileExt = (char)_musicTrackMap[t + 1]; + } + + _sound->playTrack(_musicTrackMap[t + 2]); + } else { + + } +} + #pragma mark - Opcodes typedef Common::Functor1Mem<EMCState*, int, LoLEngine> OpcodeV2; @@ -1459,7 +1481,7 @@ void LoLEngine::setupOpcodeTable() { // 0x08 Opcode(o2_testGameFlag); - Opcode(o2_loadLevelSupplemenaryFiles); + Opcode(o2_loadLevelGraphics); Opcode(o2_loadCmzFile); Opcode(o2_loadMonsterShapes); @@ -1574,7 +1596,7 @@ void LoLEngine::setupOpcodeTable() { // 0x54 OpcodeUnImpl(); OpcodeUnImpl(); - OpcodeUnImpl(); + Opcode(o2_loadLangFile); OpcodeUnImpl(); // 0x58 @@ -1593,7 +1615,7 @@ void LoLEngine::setupOpcodeTable() { OpcodeUnImpl(); OpcodeUnImpl(); OpcodeUnImpl(); - OpcodeUnImpl(); + Opcode(o2_playTrack); // 0x64 OpcodeUnImpl(); diff --git a/engines/kyra/lol.h b/engines/kyra/lol.h index 764363874b..85a5b2ce4f 100644 --- a/engines/kyra/lol.h +++ b/engines/kyra/lol.h @@ -260,8 +260,10 @@ private: // sound void snd_playVoiceFile(int) { /* XXX */ } void snd_playSoundEffect(int track, int volume); + void snd_playTrack(int track); int _lastSfxTrack; + char _curMusicFileExt; int _unkAudioSpecOffs; bool _unkLangAudio; @@ -269,6 +271,8 @@ private: char **_ingameSoundList; int _ingameSoundListSize; + const uint8 *_musicTrackMap; + int _musicTrackMapSize; const uint16 *_ingameSoundIndex; int _ingameSoundIndexSize; const uint8 *_ingameGMSoundIndex; @@ -308,7 +312,7 @@ private: EMCData _scriptData; bool _scriptBoolSkipExec; uint8 _unkScriptByte; - uint16 _unkPara2; + uint16 _currentDirection; uint16 _currentBlock; bool _boolScriptFuncDone; int16 _scriptExecutedFuncs[18]; @@ -318,7 +322,7 @@ private: // emc opcode int o2_setGameFlag(EMCState *script); int o2_testGameFlag(EMCState *script); - int o2_loadLevelSupplemenaryFiles(EMCState *script); + int o2_loadLevelGraphics(EMCState *script); int o2_loadCmzFile(EMCState *script); int o2_loadMonsterShapes(EMCState *script); int o2_allocItemPropertiesBuffer(EMCState *script); @@ -333,6 +337,8 @@ private: int o2_setGlobalVar(EMCState *script); int o2_mapShapeToBlock(EMCState *script); int o2_resetBlockShapeAssignment(EMCState *script); + int o2_loadLangFile(EMCState *script); + int o2_playTrack(EMCState *script); int o2_setPaletteBrightness(EMCState *script); int o2_assignCustomSfx(EMCState *script); @@ -443,7 +449,7 @@ private: void loadMonsterShapes(const char *file, int monsterIndex, int b); void releaseMonsterShapes(int monsterIndex); void loadLevelShpDat(const char *shpFile, const char *datFile, bool flag); - void loadLevelSupplemenaryFiles(const char *file, int specialColor, int weight, int vcnLen, int vmpLen, const char *langFile); + void loadLevelGraphics(const char *file, int specialColor, int weight, int vcnLen, int vmpLen, const char *palFile); void drawScene(int pageNum); @@ -460,8 +466,9 @@ private: void drawLevelModifyScreenDim(int dim, int16 x1, int16 y1, int16 x2, int16 y2); void drawDecorations(int index); void drawIceShapes(int index, int iceShapeIndex); + void drawMonstersAndItems(int index); void drawDoor(uint8 *shape, uint8 *table, int index, int unk2, int w, int h, int flags); - void drawDoorShapes(uint8 *shape, uint8 *table, int x, int y, int flags, const uint8 *ovl); + void drawDoorOrMonsterShape(uint8 *shape, uint8 *table, int x, int y, int flags, const uint8 *ovl); void drawScriptShapes(int pageNum); void updateSceneWindow(); @@ -488,8 +495,8 @@ private: uint8 **_levelShapes; char _lastSuppFile[12]; - char _lastSuppLangFile[12]; - char *_lastSuppLangFilePtr; + char _lastOverridePalFile[12]; + char *_lastOverridePalFilePtr; int _lastSpecialColor; int _lastSpecialColorWeight; @@ -533,10 +540,10 @@ private: LevelShapeProperty *_levelFileData; uint8 *_doorShapes[2]; - int16 _shpDoorX; - int16 _shpDoorY; - int16 _doorScaleW; - int16 _doorScaleH; + int16 _shpDmX; + int16 _shpDmY; + int16 _dmScaleW; + int16 _dmScaleH; uint8 _unkGameFlag; @@ -575,8 +582,8 @@ private: int _dscBlockMapSize; const uint8 *_dscDimMap; int _dscDimMapSize; - const uint16 *_dscDoorScaleTable; - int _dscDoorScaleTableSize; + const uint16 *_dscDoorMonsterScaleTable; + int _dscDoorMonsterScaleTableSize; const uint16 *_dscDoor4; int _dscDoor4Size; const uint8 *_dscShapeOvlIndex; @@ -585,10 +592,10 @@ private: int _dscBlockIndexSize; const uint8 *_dscDoor1; int _dscDoor1Size; - const int16 *_dscDoorX; - int _dscDoorXSize; - const int16 *_dscDoorY; - int _dscDoorYSize; + const int16 *_dscDoorMonsterX; + int _dscDoorMonsterXSize; + const int16 *_dscDoorMonsterY; + int _dscDoorMonsterYSize; int _sceneDrawPage1; int _sceneDrawPage2; diff --git a/engines/kyra/resource.h b/engines/kyra/resource.h index b79a949e3f..e14e1c92c4 100644 --- a/engines/kyra/resource.h +++ b/engines/kyra/resource.h @@ -214,6 +214,7 @@ enum kKyraResources { lolCharacterDefs, lolIngameSfxFiles, lolIngameSfxIndex, + lolMusicTrackMap, lolIngameGMSfxIndex, lolIngameMT32SfxIndex, lolSpellProperties, diff --git a/engines/kyra/scene_lol.cpp b/engines/kyra/scene_lol.cpp index 9a13073060..207874cd7b 100644 --- a/engines/kyra/scene_lol.cpp +++ b/engines/kyra/scene_lol.cpp @@ -60,7 +60,7 @@ void LoLEngine::loadLevel(int index) { _loadLevelFlag = 1; char filename[16]; - sprintf(filename, "level%d.ini", index); + sprintf(filename, "LEVEL%d.INI", index); int f = _levelFlagUnk & (1 << ((index + 0xff) & 0xff)); @@ -69,7 +69,7 @@ void LoLEngine::loadLevel(int index) { if (f) loadLevelCMZ(index); - sprintf(filename, "level%d.inf", index); + sprintf(filename, "LEVEL%d.INF", index); runInfScript(filename); addLevelItems(); @@ -471,6 +471,7 @@ void LoLEngine::loadMonsterShapes(const char *file, int monsterIndex, int b) { uint8 **of = &_buf4[(monsterIndex << 7) + (i << 5) + (ii << 1)]; int s = (i << 4) + ii + 17; *of = _screen->makeShapeCopy(p, s); + ////TODO } }*/ @@ -577,16 +578,16 @@ void LoLEngine::loadLevelShpDat(const char *shpFile, const char *datFile, bool f } } -void LoLEngine::loadLevelSupplemenaryFiles(const char *file, int specialColor, int weight, int vcnLen, int vmpLen, const char *langFile) { +void LoLEngine::loadLevelGraphics(const char *file, int specialColor, int weight, int vcnLen, int vmpLen, const char *palFile) { if (file) { _lastSpecialColor = specialColor; _lastSpecialColorWeight = weight; strcpy(_lastSuppFile, file); - if (langFile) { - strcpy(_lastSuppLangFile, langFile); - _lastSuppLangFilePtr = _lastSuppLangFile; + if (palFile) { + strcpy(_lastOverridePalFile, palFile); + _lastOverridePalFilePtr = _lastOverridePalFile; } else { - _lastSuppLangFilePtr = 0; + _lastOverridePalFilePtr = 0; } } @@ -615,13 +616,14 @@ void LoLEngine::loadLevelSupplemenaryFiles(const char *file, int specialColor, i memcpy(_vcnExpTable, v, 128); v += 128; - if (_lastSuppLangFilePtr) { - if (_levelLangFile) - delete[] _levelLangFile; - _levelLangFile = _res->fileData(_lastSuppLangFilePtr, 0); + if (_lastOverridePalFilePtr) { + uint8 *tpal = _res->fileData(_lastOverridePalFilePtr, 0); + memcpy(_screen->_currentPalette, tpal, 384); + delete[] tpal; + } else { + memcpy(_screen->_currentPalette, v, 384); } - memcpy(_screen->_currentPalette, v, 384); v += 384; /*uint8 tmpPal = new uint8[384]; memcpy(tmpPal, _screen->_currentPalette + 384, 384); @@ -757,7 +759,7 @@ void LoLEngine::drawScene(int pageNum) { updateSceneWindow(); } - generateBlockDrawingBuffer(_currentBlock, _unkPara2); + generateBlockDrawingBuffer(_currentBlock, _currentDirection); drawVcnBlocks(_vcnBlocks, _blockDrawingBuffer, _vcnShift, _sceneDrawPage1); drawSceneShapes(); @@ -782,13 +784,13 @@ void LoLEngine::updateSceneWindow() { } void LoLEngine::generateBlockDrawingBuffer(int block, int b) { - _sceneDrawVar1 = _dscBlockMap[_unkPara2]; - _sceneDrawVar2 = _dscBlockMap[_unkPara2 + 4]; - _sceneDrawVar3 = _dscBlockMap[_unkPara2 + 8]; + _sceneDrawVar1 = _dscBlockMap[_currentDirection]; + _sceneDrawVar2 = _dscBlockMap[_currentDirection + 4]; + _sceneDrawVar3 = _dscBlockMap[_currentDirection + 8]; memset(_blockDrawingBuffer, 0, 660 * sizeof(uint16)); - _wllProcessFlag = ((block >> 5) + (block & 0x1f) + _unkPara2) & 1; + _wllProcessFlag = ((block >> 5) + (block & 0x1f) + _currentDirection) & 1; if (_wllProcessFlag) generateBlockDrawingBufferF1(0, 15, 1, -330, 22, 15); @@ -1094,8 +1096,8 @@ void LoLEngine::drawSceneShapes() { drawIceShapes(t, 0); - //if (_curBlockCaps[t]->itemIndex && (w & 0x80)) - //sub_3AA55(t); + if (_curBlockCaps[t]->itemIndex && (w & 0x80)) + drawMonstersAndItems(t); drawIceShapes(t, 1); @@ -1216,7 +1218,7 @@ void LoLEngine::drawDecorations(int index) { if (!scaleW || !scaleH) continue; - uint8 d = (_unkPara2 + _dscUnk1[s]) & 3; + uint8 d = (_currentDirection + _dscUnk1[s]) & 3; int8 l = _wllShapeMap[_curBlockCaps[index]->unk[d]]; uint8 *shapeData = 0; @@ -1287,13 +1289,17 @@ void LoLEngine::drawIceShapes(int index, int iceShapeIndex) { return; } +void LoLEngine::drawMonstersAndItems(int index) { + +} + void LoLEngine::drawDoor(uint8 *shape, uint8 *table, int index, int unk2, int w, int h, int flags) { - uint8 c = _dscDoor1[(_unkPara2 << 5) + unk2]; + uint8 c = _dscDoor1[(_currentDirection << 5) + unk2]; int r = (c / 5) + 5 * _dscDimMap[index]; uint16 d = _dscShapeOvlIndex[r]; uint16 t = (index << 5) + c; - _shpDoorY = _dscDoorY[t] + 120; + _shpDmY = _dscDoorMonsterY[t] + 120; if (flags & 1) { // TODO @@ -1303,40 +1309,40 @@ void LoLEngine::drawDoor(uint8 *shape, uint8 *table, int index, int unk2, int w, if (flags & 2) { uint8 dimW = _dscDimMap[index]; - _doorScaleW = _dscDoorScaleTable[dimW << 1]; - _doorScaleH = _dscDoorScaleTable[(dimW << 1) + 1]; + _dmScaleW = _dscDoorMonsterScaleTable[dimW << 1]; + _dmScaleH = _dscDoorMonsterScaleTable[(dimW << 1) + 1]; u = _dscDoor4[dimW]; } d += 2; - if (!_doorScaleW || !_doorScaleH) + if (!_dmScaleW || !_dmScaleH) return; - int s = _screen->getShapeScaledHeight(shape, _doorScaleH) >> 1; + int s = _screen->getShapeScaledHeight(shape, _dmScaleH) >> 1; if (w) - w = (w * _doorScaleW) >> 8; + w = (w * _dmScaleW) >> 8; if (h) - h = (h * _doorScaleH) >> 8; + h = (h * _dmScaleH) >> 8; - _shpDoorX = _dscDoorX[t] + w + 200; - _shpDoorY = _shpDoorY + 4 - s + h - u; + _shpDmX = _dscDoorMonsterX[t] + w + 200; + _shpDmY = _shpDmY + 4 - s + h - u; if (d > 7) d = 7; uint8 *ovl = _screen->getLevelOverlay(d); - int doorScaledWitdh = _screen->getShapeScaledWidth(shape, _doorScaleW); + int doorScaledWitdh = _screen->getShapeScaledWidth(shape, _dmScaleW); - _shpDoorX -= (doorScaledWitdh >> 1); - _shpDoorY -= s; + _shpDmX -= (doorScaledWitdh >> 1); + _shpDmY -= s; - drawDoorShapes(shape, table, _shpDoorX, _shpDoorY, flags, ovl); + drawDoorOrMonsterShape(shape, table, _shpDmX, _shpDmY, flags, ovl); } -void LoLEngine::drawDoorShapes(uint8 *shape, uint8 *table, int x, int y, int flags, const uint8 *ovl) { +void LoLEngine::drawDoorOrMonsterShape(uint8 *shape, uint8 *table, int x, int y, int flags, const uint8 *ovl) { int flg = 0; if (flags & 0x10) @@ -1350,14 +1356,14 @@ void LoLEngine::drawDoorShapes(uint8 *shape, uint8 *table, int x, int y, int fla if (flg & 0x1000) { if (table) - _screen->drawShape(_sceneDrawPage1, shape, x, y, 13, flg | 0x9104, table, ovl, 1, _tlcTable1, _tlcTable2, _doorScaleW, _doorScaleH); + _screen->drawShape(_sceneDrawPage1, shape, x, y, 13, flg | 0x9104, table, ovl, 1, _tlcTable1, _tlcTable2, _dmScaleW, _dmScaleH); else - _screen->drawShape(_sceneDrawPage1, shape, x, y, 13, flg | 0x1104, ovl, 1, _tlcTable1, _tlcTable2, _doorScaleW, _doorScaleH); + _screen->drawShape(_sceneDrawPage1, shape, x, y, 13, flg | 0x1104, ovl, 1, _tlcTable1, _tlcTable2, _dmScaleW, _dmScaleH); } else { if (table) - _screen->drawShape(_sceneDrawPage1, shape, x, y, 13, flg | 0x8104, table, ovl, 1, _doorScaleW, _doorScaleH); + _screen->drawShape(_sceneDrawPage1, shape, x, y, 13, flg | 0x8104, table, ovl, 1, _dmScaleW, _dmScaleH); else - _screen->drawShape(_sceneDrawPage1, shape, x, y, 13, flg | 0x104, ovl, 1, _doorScaleW, _doorScaleH); + _screen->drawShape(_sceneDrawPage1, shape, x, y, 13, flg | 0x104, ovl, 1, _dmScaleW, _dmScaleH); } } diff --git a/engines/kyra/script_lol.cpp b/engines/kyra/script_lol.cpp index 488ec54d14..041706936e 100644 --- a/engines/kyra/script_lol.cpp +++ b/engines/kyra/script_lol.cpp @@ -25,6 +25,7 @@ #include "kyra/lol.h" #include "kyra/screen_lol.h" +#include "kyra/resource.h" #include "common/endian.h" @@ -103,7 +104,7 @@ bool LoLEngine::checkScriptUnk(int func) { } int LoLEngine::o2_setGameFlag(EMCState *script) { - debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_setGameFlag(%p) (%d)", (const void *)script, stackPos(0)); + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_setGameFlag(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1)); if (stackPos(1)) _gameFlags[stackPos(0) >> 4] |= (1 << (stackPos(0) & 0x0f)); else @@ -123,20 +124,20 @@ int LoLEngine::o2_testGameFlag(EMCState *script) { return 0; } -int LoLEngine::o2_loadLevelSupplemenaryFiles(EMCState *script) { - debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_loadLevelSupplemenaryFiles(%p) (%d)", (const void *)script, stackPos(0)); - loadLevelSupplemenaryFiles(stackPosString(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), (stackPos(5) == -1) ? 0 : stackPosString(5)); +int LoLEngine::o2_loadLevelGraphics(EMCState *script) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_loadLevelGraphics(%p) (%s, %d, %d, %d, %d, %d)", (const void *)script, stackPosString(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5)); + loadLevelGraphics(stackPosString(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), (stackPos(5) == -1) ? 0 : stackPosString(5)); return 1; } int LoLEngine::o2_loadCmzFile(EMCState *script) { - debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_loadCmzFile(%p) (%d)", (const void *)script, stackPos(0)); + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_loadCmzFile(%p) (%s)", (const void *)script, stackPosString(0)); loadCmzFile(stackPosString(0)); return 1; } int LoLEngine::o2_loadMonsterShapes(EMCState *script) { - debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_loadMonsterShapes(%p) (%d)", (const void *)script, stackPos(0)); + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_loadMonsterShapes(%p) (%s, %d, %d)", (const void *)script, stackPosString(0), stackPos(1), stackPos(2)); loadMonsterShapes(stackPosString(0), stackPos(1), stackPos(2)); return 1; } @@ -149,7 +150,7 @@ int LoLEngine::o2_allocItemPropertiesBuffer(EMCState *script) { } int LoLEngine::o2_setItemProperty(EMCState *script) { - debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_setItemProperty(%p) (%d)", (const void *)script, stackPos(0)); + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_setItemProperty(%p) (%d, %d, %d, %d, %d, %d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7), stackPos(8), stackPos(9)); ItemProperty *tmp = &_itemProperties[stackPos(0)]; tmp->nameStringId = stackPos(1); @@ -165,12 +166,12 @@ int LoLEngine::o2_setItemProperty(EMCState *script) { } int LoLEngine::o2_makeItem(EMCState *script) { - debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_makeItem(%p) (%d)", (const void *)script, stackPos(0)); + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_makeItem(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2)); return makeItem(stackPos(0), stackPos(1), stackPos(2)); } int LoLEngine::o2_getItemPara(EMCState *script) { - debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_getItemPara(%p) (%d)", (const void *)script, stackPos(0)); + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_getItemPara(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1)); if(!stackPos(0)) return 0; @@ -220,7 +221,7 @@ int LoLEngine::o2_getItemPara(EMCState *script) { } int LoLEngine::o2_getCharacterStat(EMCState *script) { - debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_getCharacterStat(%p) (%d)", (const void *)script, stackPos(0)); + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_getCharacterStat(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2)); LoLCharacter *c = &_characters[stackPos(0)]; int d = stackPos(2); @@ -262,7 +263,7 @@ int LoLEngine::o2_getCharacterStat(EMCState *script) { } int LoLEngine::o2_setCharacterStat(EMCState *script) { - debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_setCharacterStat(%p) (%d)", (const void *)script, stackPos(0)); + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_setCharacterStat(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3)); LoLCharacter *c = &_characters[stackPos(0)]; int d = stackPos(2); int e = stackPos(3); @@ -308,20 +309,20 @@ int LoLEngine::o2_setCharacterStat(EMCState *script) { } int LoLEngine::o2_loadLevelShapes(EMCState *script) { - debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_loadLevelShapes(%p) (%d)", (const void *)script, stackPos(0)); + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_loadLevelShapes(%p) (%s, %s)", (const void *)script, stackPosString(0), stackPosString(1)); loadLevelShpDat(stackPosString(0), stackPosString(1), true); return 1; } int LoLEngine::o2_closeLevelShapeFile(EMCState *script) { - debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_closeLevelShapeFile(%p) (%d)", (const void *)script, stackPos(0)); + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_closeLevelShapeFile(%p) ()", (const void *)script); delete _lvlShpFileHandle; _lvlShpFileHandle = 0; return 1; } int LoLEngine::o2_loadDoorShapes(EMCState *script) { - debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_loadDoorShapes(%p) (%d)", (const void *)script, stackPos(0)); + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_loadDoorShapes(%p) (%s, %d, %d)", (const void *)script, stackPosString(0), stackPos(1), stackPos(2)); _screen->loadBitmap(stackPosString(0), 3, 3, 0); const uint8 *p = _screen->getCPagePtr(2); if (_doorShapes[0]) @@ -354,7 +355,7 @@ int LoLEngine::o2_loadDoorShapes(EMCState *script) { } int LoLEngine::o2_setGlobalVar(EMCState *script) { - debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_setGlobalVar(%p) (%d)", (const void *)script, stackPos(0)); + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_setGlobalVar(%p) (%d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2)); //uint16 a = stackPos(1); uint16 b = stackPos(2); @@ -365,7 +366,7 @@ int LoLEngine::o2_setGlobalVar(EMCState *script) { setLF2(_currentBlock); break; case 1: - _unkPara2 = b; + _currentDirection = b; break; case 2: _currentLevel = b & 0xff; @@ -420,8 +421,24 @@ int LoLEngine::o2_resetBlockShapeAssignment(EMCState *script) { return 1; } +int LoLEngine::o2_loadLangFile(EMCState *script) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_loadLangFile(%p) (%s)", (const void *)script, stackPosString(0)); + char filename[13]; + snprintf(filename, sizeof(filename), "%s.%s", stackPosString(0), _languageExt[_lang]); + if (_levelLangFile) + delete[] _levelLangFile; + _levelLangFile = _res->fileData(filename, 0); + return 1; +} + +int LoLEngine::o2_playTrack(EMCState *script) { + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_playTrack(%p) (%d)", (const void *)script, stackPos(0)); + snd_playTrack(stackPos(0)); + return 1; +} + int LoLEngine::o2_setPaletteBrightness(EMCState *script) { - debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_setPaletteBrightness(%p) (%d)", (const void *)script, stackPos(0)); + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_setPaletteBrightness(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1)); uint16 old = _brightness; _brightness = stackPos(0); if (stackPos(1) == 1) @@ -430,7 +447,7 @@ int LoLEngine::o2_setPaletteBrightness(EMCState *script) { } int LoLEngine::o2_assignCustomSfx(EMCState *script) { - debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_assignCustomSfx(%p) (%d)", (const void *)script, stackPos(0)); + debugC(3, kDebugLevelScriptFuncs, "LoLEngine::o2_assignCustomSfx(%p) (%s, %d)", (const void *)script, stackPosString(0), stackPos(1)); const char *c = stackPosString(0); int i = stackPos(1); diff --git a/engines/kyra/staticres.cpp b/engines/kyra/staticres.cpp index 45af54caea..3e510f552f 100644 --- a/engines/kyra/staticres.cpp +++ b/engines/kyra/staticres.cpp @@ -43,7 +43,7 @@ namespace Kyra { -#define RESFILE_VERSION 34 +#define RESFILE_VERSION 35 namespace { bool checkKyraDat(Common::SeekableReadStream *file) { @@ -371,6 +371,7 @@ bool StaticResource::init() { { lolCharacterDefs, lolCharData, "CHARACTER.DEF" }, { lolIngameSfxFiles, kStringList, "SFXFILES.TRA" }, { lolIngameSfxIndex, kRawData, "SFXINDEX.MAP" }, + { lolMusicTrackMap, kRawData, "MUSIC.MAP" }, { lolIngameGMSfxIndex, kRawData, "SFX_GM.MAP" }, { lolIngameMT32SfxIndex, kRawData, "SFX_MT32.MAP" }, { lolSpellProperties, lolSpellData, "SPELLS.DEF" }, @@ -1628,6 +1629,7 @@ void KyraEngine_MR::initStaticResource() { void LoLEngine::initStaticResource() { _charDefaults = _staticres->loadCharData(lolCharacterDefs, _charDefaultsSize); _ingameSoundIndex = (const uint16 *)_staticres->loadRawData(lolIngameSfxIndex, _ingameSoundIndexSize); + _musicTrackMap = _staticres->loadRawData(lolMusicTrackMap, _musicTrackMapSize); _ingameGMSoundIndex = _staticres->loadRawData(lolIngameGMSfxIndex, _ingameGMSoundIndexSize); _ingameMT32SoundIndex = _staticres->loadRawData(lolIngameMT32SfxIndex, _ingameMT32SoundIndexSize); _spellProperties = _staticres->loadSpellData(lolSpellProperties, _spellPropertiesSize); @@ -1650,13 +1652,13 @@ void LoLEngine::initStaticResource() { _dscDim2 = (const int8 *)_staticres->loadRawData(lolDscDimData2, _dscDim2Size); _dscBlockMap = _staticres->loadRawData(lolDscBlockMap, _dscBlockMapSize); _dscDimMap = _staticres->loadRawData(lolDscDimMap, _dscDimMapSize); - _dscDoorScaleTable = (const uint16 *)_staticres->loadRawDataBe16(lolDscDoorScale, _dscDoorScaleTableSize); + _dscDoorMonsterScaleTable = (const uint16 *)_staticres->loadRawDataBe16(lolDscDoorScale, _dscDoorMonsterScaleTableSize); _dscShapeOvlIndex = _staticres->loadRawData(lolDscOvlIndex, _dscShapeOvlIndexSize); _dscDoor4 = (const uint16 *)_staticres->loadRawDataBe16(lolDscDoor4, _dscDoor4Size); _dscBlockIndex = (const int8 *)_staticres->loadRawData(lolDscBlockIndex, _dscBlockIndexSize); _dscDoor1 = _staticres->loadRawData(lolDscDoor1, _dscDoor1Size); - _dscDoorX = (const int16 *)_staticres->loadRawDataBe16(lolDscDoorX, _dscDoorXSize); - _dscDoorY = (const int16 *)_staticres->loadRawDataBe16(lolDscDoorY, _dscDoorYSize); + _dscDoorMonsterX = (const int16 *)_staticres->loadRawDataBe16(lolDscDoorX, _dscDoorMonsterXSize); + _dscDoorMonsterY = (const int16 *)_staticres->loadRawDataBe16(lolDscDoorY, _dscDoorMonsterYSize); const char *const *tmpSndList = _staticres->loadStrings(lolIngameSfxFiles, _ingameSoundListSize); _ingameSoundList = new char*[_ingameSoundListSize]; diff --git a/tools/create_kyradat/create_kyradat.cpp b/tools/create_kyradat/create_kyradat.cpp index 6544d9c2cd..775af9cc9c 100644 --- a/tools/create_kyradat/create_kyradat.cpp +++ b/tools/create_kyradat/create_kyradat.cpp @@ -31,7 +31,7 @@ #include "md5.h" enum { - kKyraDatVersion = 34, + kKyraDatVersion = 35, kIndexSize = 12 }; @@ -266,6 +266,7 @@ const ExtractFilename extractFilenames[] = { { lolCharacterDefs, kTypeRawData, "CHARACTER.DEF" }, { lolIngameSfxFiles, k2TypeSfxList, "SFXFILES.TRA" }, { lolIngameSfxIndex, kTypeRawData, "SFXINDEX.MAP" }, + { lolMusicTrackMap, kTypeRawData, "MUSIC.MAP" }, { lolGMSfxIndex, kTypeRawData, "SFX_GM.MAP" }, { lolMT32SfxIndex, kTypeRawData, "SFX_MT32.MAP" }, { lolSpellProperties, kTypeRawData, "SPELLS.DEF" }, diff --git a/tools/create_kyradat/create_kyradat.h b/tools/create_kyradat/create_kyradat.h index 8ffdc40c5f..f996cfe491 100644 --- a/tools/create_kyradat/create_kyradat.h +++ b/tools/create_kyradat/create_kyradat.h @@ -179,6 +179,7 @@ enum kExtractID { lolCharacterDefs, lolIngameSfxFiles, lolIngameSfxIndex, + lolMusicTrackMap, lolGMSfxIndex, lolMT32SfxIndex, lolSpellProperties, diff --git a/tools/create_kyradat/lol_cd.h b/tools/create_kyradat/lol_cd.h index bf57fa9f23..8f9e5453d1 100644 --- a/tools/create_kyradat/lol_cd.h +++ b/tools/create_kyradat/lol_cd.h @@ -2,6 +2,7 @@ const ExtractEntry lolCDFile2[] = { { lolCharacterDefs, 0x00029D60, 0x0002A1F2 }, { lolIngameSfxFiles, 0x0002A330, 0x0002AC22 }, { lolIngameSfxIndex, 0x0002AC22, 0x0002B00A }, + { lolMusicTrackMap, 0x0002A240, 0x0002A330 }, { lolGMSfxIndex, 0x0002B010, 0x0002B10A }, { lolMT32SfxIndex, 0x0002B110, 0x0002B20A }, { lolSpellProperties, 0x0002B5D0, 0x0002B6E8 }, diff --git a/tools/create_kyradat/misc.h b/tools/create_kyradat/misc.h index 36b5ebe1ce..c664afc004 100644 --- a/tools/create_kyradat/misc.h +++ b/tools/create_kyradat/misc.h @@ -485,6 +485,7 @@ const int lolCDFile2Need[] = { lolCharacterDefs, lolIngameSfxFiles, lolIngameSfxIndex, + lolMusicTrackMap, lolGMSfxIndex, lolMT32SfxIndex, lolSpellProperties, |