diff options
| author | Florian Kagerer | 2009-01-18 23:50:31 +0000 | 
|---|---|---|
| committer | Florian Kagerer | 2009-01-18 23:50:31 +0000 | 
| commit | 44918f5f168ace7f21a9daef82e81e35e89ed000 (patch) | |
| tree | 275507b9846a1edfb93bb396f9867638b56ae3f6 | |
| parent | 7fba1e9aaf1803bd993a592faf015b0d9ac04777 (diff) | |
| download | scummvm-rg350-44918f5f168ace7f21a9daef82e81e35e89ed000.tar.gz scummvm-rg350-44918f5f168ace7f21a9daef82e81e35e89ed000.tar.bz2 scummvm-rg350-44918f5f168ace7f21a9daef82e81e35e89ed000.zip | |
LOL: basic music support and some cleanup
svn-id: r35917
| -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.datBinary files differ index 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, | 
