aboutsummaryrefslogtreecommitdiff
path: root/engines/kyra
diff options
context:
space:
mode:
authorFlorian Kagerer2009-01-18 23:50:31 +0000
committerFlorian Kagerer2009-01-18 23:50:31 +0000
commit44918f5f168ace7f21a9daef82e81e35e89ed000 (patch)
tree275507b9846a1edfb93bb396f9867638b56ae3f6 /engines/kyra
parent7fba1e9aaf1803bd993a592faf015b0d9ac04777 (diff)
downloadscummvm-rg350-44918f5f168ace7f21a9daef82e81e35e89ed000.tar.gz
scummvm-rg350-44918f5f168ace7f21a9daef82e81e35e89ed000.tar.bz2
scummvm-rg350-44918f5f168ace7f21a9daef82e81e35e89ed000.zip
LOL: basic music support and some cleanup
svn-id: r35917
Diffstat (limited to 'engines/kyra')
-rw-r--r--engines/kyra/gui_lol.cpp2
-rw-r--r--engines/kyra/lol.cpp36
-rw-r--r--engines/kyra/lol.h39
-rw-r--r--engines/kyra/resource.h1
-rw-r--r--engines/kyra/scene_lol.cpp84
-rw-r--r--engines/kyra/script_lol.cpp53
-rw-r--r--engines/kyra/staticres.cpp10
7 files changed, 140 insertions, 85 deletions
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];