[Scummvm-cvs-logs] SF.net SVN: scummvm: [31503] scummvm/trunk/engines/kyra

lordhoto at users.sourceforge.net lordhoto at users.sourceforge.net
Mon Apr 14 22:20:51 CEST 2008


Revision: 31503
          http://scummvm.svn.sourceforge.net/scummvm/?rev=31503&view=rev
Author:   lordhoto
Date:     2008-04-14 13:20:51 -0700 (Mon, 14 Apr 2008)

Log Message:
-----------
Implemented some kyra3 code.

Modified Paths:
--------------
    scummvm/trunk/engines/kyra/gui.cpp
    scummvm/trunk/engines/kyra/kyra_v3.cpp
    scummvm/trunk/engines/kyra/kyra_v3.h
    scummvm/trunk/engines/kyra/module.mk
    scummvm/trunk/engines/kyra/sound.h
    scummvm/trunk/engines/kyra/sound_digital.cpp
    scummvm/trunk/engines/kyra/staticres.cpp

Added Paths:
-----------
    scummvm/trunk/engines/kyra/animator_v3.cpp
    scummvm/trunk/engines/kyra/items_v3.cpp
    scummvm/trunk/engines/kyra/script_v3.cpp

Added: scummvm/trunk/engines/kyra/animator_v3.cpp
===================================================================
--- scummvm/trunk/engines/kyra/animator_v3.cpp	                        (rev 0)
+++ scummvm/trunk/engines/kyra/animator_v3.cpp	2008-04-14 20:20:51 UTC (rev 31503)
@@ -0,0 +1,65 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "kyra/kyra_v3.h"
+
+namespace Kyra {
+
+void KyraEngine_v3::clearAnimObjects() {
+	debugC(9, kDebugLevelAnimator, "KyraEngine_v3::clearAnimObjects()");
+
+	for (int i = 0; i < 67; ++i)
+		_animObjects[i].enabled = false;
+
+	_animObjects[0].index = 0;
+	_animObjects[0].type = 0;
+	_animObjects[0].enabled = true;
+	_animObjects[0].unk8 = 1;
+	_animObjects[0].flags = 0x800;
+	_animObjects[0].width = 57;
+	_animObjects[0].height = 91;
+	_animObjects[0].width2 = 4;
+	_animObjects[0].height2 = 10;
+
+	for (int i = 1; i < 17; ++i) {
+		_animObjects[i].type = 2;
+		_animObjects[i].flags = 0;
+		_animObjects[i].enabled = false;
+		_animObjects[i].needRefresh = 0;
+		_animObjects[i].unk8 = 1;
+	}
+
+	for (int i = 17; i <= 66; ++i) {
+		_animObjects[i].type = 1;
+		_animObjects[i].unk8 = 1;
+		_animObjects[i].flags = 0x800;
+		_animObjects[i].width = 24;
+		_animObjects[i].height = 20;
+		_animObjects[i].width2 = 0;
+		_animObjects[i].height2 = 0;
+	}
+}
+
+} // end of namespace Kyra


Property changes on: scummvm/trunk/engines/kyra/animator_v3.cpp
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Date Rev Author URL Id
Name: svn:eol-style
   + native

Modified: scummvm/trunk/engines/kyra/gui.cpp
===================================================================
--- scummvm/trunk/engines/kyra/gui.cpp	2008-04-14 15:59:32 UTC (rev 31502)
+++ scummvm/trunk/engines/kyra/gui.cpp	2008-04-14 20:20:51 UTC (rev 31503)
@@ -403,6 +403,9 @@
 	_screen->_charWidth = -2;
 	_screen->setScreenDim(dim);
 
+	while (!_screen->isMouseVisible())
+		_screen->showMouse();
+
 	int backUpX = _screen->_curDim->sx;
 	int backUpY = _screen->_curDim->sy;
 	int backUpWidth = _screen->_curDim->w;

Added: scummvm/trunk/engines/kyra/items_v3.cpp
===================================================================
--- scummvm/trunk/engines/kyra/items_v3.cpp	                        (rev 0)
+++ scummvm/trunk/engines/kyra/items_v3.cpp	2008-04-14 20:20:51 UTC (rev 31503)
@@ -0,0 +1,54 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL $
+ * $Id$
+ *
+ */
+
+#include "kyra/kyra_v3.h"
+
+namespace Kyra {
+
+void KyraEngine_v3::resetItem(int index) {
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::resetItem(%d)", index);
+	_itemList[index].id = 0xFFFF;
+	_itemList[index].sceneId = 0xFFFF;
+	_itemList[index].x = 0;
+	_itemList[index].y = 0;
+	_itemList[index].unk8 = 0;
+}
+
+void KyraEngine_v3::resetItemList() {
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::resetItemList()");
+	for (int i = 0; i < 50; ++i)
+		resetItem(i);
+}
+
+int KyraEngine_v3::findFreeItem() {
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::findFreeItem()");
+	for (int i = 0; i < 50; ++i) {
+		if (_itemList[i].id == 0xFFFF)
+			return i;
+	}
+	return -1;
+}
+
+} // end of namespace Kyra


Property changes on: scummvm/trunk/engines/kyra/items_v3.cpp
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Date Rev Author URL Id
Name: svn:eol-style
   + native

Modified: scummvm/trunk/engines/kyra/kyra_v3.cpp
===================================================================
--- scummvm/trunk/engines/kyra/kyra_v3.cpp	2008-04-14 15:59:32 UTC (rev 31502)
+++ scummvm/trunk/engines/kyra/kyra_v3.cpp	2008-04-14 20:20:51 UTC (rev 31503)
@@ -41,44 +41,65 @@
 	_musicSoundChannel = -1;
 	_menuAudioFile = "TITLE1.AUD";
 	_curMusicTrack = -1;
-	_unkPage1 = _unkPage2 = 0;
-	_interfaceCPS1 = _interfaceCPS2 = 0;
-	memset(_gameShapes, 0, sizeof(_gameShapes));
 	_itemBuffer1 = _itemBuffer2 = 0;
-	_mouseSHPBuf = 0;
-	_unkBuffer5 = _unkBuffer6 = _unkBuffer7 = _unkBuffer9 = 0;
-	_costpalData = 0;
-	_unkWSAPtr = 0;
-	memset(_unkShapeTable, 0, sizeof(_unkShapeTable));
 	_scoreFile = 0;
 	_cCodeFile = 0;
-	_scenesList = 0;
+	_scenesFile = 0;
+	_itemFile = 0;
+	_gamePlayBuffer = 0;
+	_interface = _interfaceCommandLine = 0;
+	_costPalBuffer = 0;
+	_animObjects = 0;
+	_sceneAnims = 0;
+	memset(_sceneShapes, 0, sizeof(_sceneShapes));
+	memset(_sceneAnimMovie, 0, sizeof(_sceneAnimMovie));
+	_gfxBackUpRect = 0;
+	_itemList = 0;
+	_malcolmShapes = 0;
+	_paletteOverlay = 0;
+	_sceneList = 0;
+	memset(&_mainCharacter, 0, sizeof(_mainCharacter));
+	_mainCharacter.sceneId = 9;
+	_mainCharacter.dlgIndex = 0;
+	_mainCharacter.unk4 = 0x4C;
+	_mainCharacter.facing = 5;
+	_mainCharacter.walkspeed = 5;
+	memset(_mainCharacter.inventory, -1, sizeof(_mainCharacter.inventory));
 }
 
 KyraEngine_v3::~KyraEngine_v3() {
+	delete _screen;
 	delete _soundDigital;
 
-	delete [] _unkPage1;
-	delete [] _unkPage2;
-	delete [] _interfaceCPS1;
-	delete [] _interfaceCPS2;
-
 	delete [] _itemBuffer1;
 	delete [] _itemBuffer2;
+	delete [] _scoreFile;
+	delete [] _cCodeFile;
+	delete [] _scenesFile;
+	delete [] _itemFile;
+	delete [] _gamePlayBuffer;
+	delete [] _interface;
+	delete [] _interfaceCommandLine;
+	delete [] _costPalBuffer;
+	delete [] _animObjects;
+	delete [] _sceneAnims;
 
-	delete [] _mouseSHPBuf;
+	for (uint i = 0; i < ARRAYSIZE(_sceneShapes); ++i)
+		delete _sceneShapes[i];
 
-	delete [] _unkBuffer5;
-	delete [] _unkBuffer6;
-	delete [] _unkBuffer7;
-	delete [] _unkBuffer9;
+	for (uint i = 0; i < ARRAYSIZE(_sceneAnimMovie); ++i)
+		delete _sceneAnimMovie[i];
 
-	delete [] _costpalData;
-	delete [] _unkWSAPtr;
+	delete [] _gfxBackUpRect;
+	delete [] _itemList;
+	delete [] _paletteOverlay;
+	delete [] _sceneList;
 
-	delete [] _scoreFile;
-	delete [] _cCodeFile;
-	delete [] _scenesList;
+	for (ShapeMap::iterator i = _gameShapes.begin(); i != _gameShapes.end(); ++i) {
+		delete i->_value;
+		i->_value = 0;
+	}
+	_gameShapes.clear();
 }
 
 int KyraEngine_v3::init() {
@@ -97,28 +118,20 @@
 	_screen->loadFont(Screen::FID_6_FNT, "6.FNT");
 	_screen->loadFont(Screen::FID_8_FNT, "8FAT.FNT");
 	_screen->loadFont(Screen::FID_BOOKFONT_FNT, "BOOKFONT.FNT");
+	_screen->setFont(Screen::FID_6_FNT);
 	_screen->setAnimBlockPtr(3500);
 	_screen->setScreenDim(0);
+	
+	_res->loadFileToBuf("PALETTE.COL", _screen->getPalette(0), 768);
+	_screen->setScreenPalette(_screen->getPalette(0));
 
-	_itemBuffer1 = new uint8[72];
-	_itemBuffer2 = new uint8[144];
-	assert(_itemBuffer1 && _itemBuffer2);
-
-	_mouseSHPBuf = _res->fileData("MOUSE.SHP", 0);
-	assert(_mouseSHPBuf);
-
-	for (int i = 0; i <= 6; ++i)
-		_gameShapes[i] = _screen->getPtrToShape(_mouseSHPBuf, i);
-
-	initItems();
-
-	_screen->setMouseCursor(0, 0, *_gameShapes);
-
 	return 0;
 }
 
 int KyraEngine_v3::go() {
 	bool running = true;
+	preinit();
+	_screen->hideMouse();
 	initMainMenu();
 
 	_screen->clearPage(0);
@@ -154,16 +167,16 @@
 		case 0:
 			uninitMainMenu();
 
-			preinit();
-			realInit();
+			startup();
 			// XXX
 			running = false;
 			break;
 
 		case 1:
-			memcpy(_screen->getPalette(1), _screen->getPalette(0), 768);
+			_soundDigital->beginFadeOut(_musicSoundChannel, 60);
+			_screen->fadeToBlack(60);
 			playVQA("K3INTRO");
-			memcpy(_screen->getPalette(0), _screen->getPalette(1), 768);
+			_screen->hideMouse();
 			break;
 
 		case 2:
@@ -222,7 +235,10 @@
 }
 
 void KyraEngine_v3::playVQA(const char *name) {
-	debugC(9, kDebugLevelMain, "KyraEngine::playVQA('%s')", name);
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::playVQA('%s')", name);
+
+	memcpy(_screen->getPalette(1), _screen->getPalette(0), 768);
+
 	VQAMovie vqa(this, _system);
 
 	char filename[20];
@@ -249,12 +265,14 @@
 			_screen->copyRegion(0, 0, 0, 0, 320, 200, 3, 0);
 		_screen->setScreenPalette(pal);
 	}
+
+	memcpy(_screen->getPalette(0), _screen->getPalette(1), 768);
 }
 
 #pragma mark -
 
 void KyraEngine_v3::playMenuAudioFile() {
-	debugC(9, kDebugLevelMain, "KyraEngine::playMenuAudioFile()");
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::playMenuAudioFile()");
 	if (_soundDigital->isPlaying(_musicSoundChannel))
 		return;
 
@@ -264,9 +282,9 @@
 }
 
 void KyraEngine_v3::playMusicTrack(int track, int force) {
-	debugC(9, kDebugLevelMain, "KyraEngine::playMusicTrack(%d, %d)", track, force);
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::playMusicTrack(%d, %d)", track, force);
 
-	// XXX byte_2C87C compare
+	// XXX byte_3C87C compare
 
 	if (_musicSoundChannel != -1 && !_soundDigital->isPlaying(_musicSoundChannel))
 		force = 1;
@@ -290,6 +308,8 @@
 }
 
 void KyraEngine_v3::stopMusicTrack() {
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::stopMusicTrack()");
+
 	if (_musicSoundChannel != -1 && _soundDigital->isPlaying(_musicSoundChannel))
 		_soundDigital->stopSound(_musicSoundChannel);
 
@@ -298,23 +318,21 @@
 }
 
 int KyraEngine_v3::musicUpdate(int forceRestart) {
-	debugC(9, kDebugLevelMain, "KyraEngine::unkUpdate(%d)", forceRestart);
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::musicUpdate(%d)", forceRestart);
 
 	static uint32 mTimer = 0;
 	static uint16 lock = 0;
 
-	if (ABS<int>(_system->getMillis() - mTimer) > (int)(0x0F * _tickLength)) {
+	if (ABS<int>(_system->getMillis() - mTimer) > (int)(0x0F * _tickLength))
 		mTimer = _system->getMillis();
-	}
 
-	if (_system->getMillis() < mTimer && !forceRestart) {
+	if (_system->getMillis() < mTimer && !forceRestart)
 		return 1;
-	}
 
 	if (!lock) {
 		lock = 1;
 		if (_musicSoundChannel >= 0) {
-			// XXX sub_1C262 (sound specific. it seems to close some sound resource files in special cases)
+			_soundDigital->stopAllSounds();
 			if (!_soundDigital->isPlaying(_musicSoundChannel)) {
 				if (_curMusicTrack != -1)
 					playMusicTrack(_curMusicTrack, 1);
@@ -330,75 +348,182 @@
 #pragma mark -
 
 void KyraEngine_v3::preinit() {
-	debugC(9, kDebugLevelMain, "KyraEngine::preinit()");
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::preinit()");
+	
+	_unkBuffer1040Bytes = new uint8[1040];
+	_itemBuffer1 = new uint8[72];
+	_itemBuffer2 = new uint8[144];
+	initMouseShapes();
+	initItems();
 
+	_screen->setMouseCursor(0, 0, _gameShapes[0]);
+}
+
+void KyraEngine_v3::initMouseShapes() {
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::initMouseShapes()");
+	uint8 *data = _res->fileData("MOUSE.SHP", 0);
+	assert(data);
+	for (int i = 0; i <= 6; ++i)
+		_gameShapes[i] = _screen->makeShapeCopy(data, i);
+	delete [] data;
+}
+
+void KyraEngine_v3::startup() {
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::startup()");
 	musicUpdate(0);
 
-	// XXX snd_allocateSoundBuffer?
 	memset(_flagsTable, 0, sizeof(_flagsTable));
-
-	// XXX
 	setGameFlag(0x216);
 
-	_unkPage1 = new uint8[64000];
-	assert(_unkPage1);
-
+	_gamePlayBuffer = new uint8[64000];
 	musicUpdate(0);
 	musicUpdate(0);
 
-	_interfaceCPS1 = new uint8[17920];
-	_interfaceCPS2 = new uint8[3840];
-	assert(_interfaceCPS1 && _interfaceCPS2);
+	_interface = new uint8[17920];
+	_interfaceCommandLine = new uint8[3840];
 
 	_screen->setFont(Screen::FID_6_FNT);
-}
 
-void KyraEngine_v3::realInit() {
-	debugC(9, kDebugLevelMain, "KyraEngine::realInit()");
+	//XXX
+	musicUpdate(0);
+	//XXX
+	_costPalBuffer = new uint8[864];
+	//XXX
+	_animObjects = new AnimObj[67];
+	_sceneAnims = new SceneAnim[16];
 
-	// XXX sound specific stuff
-
-	_unkBuffer5 = new uint8[500];
-	_unkBuffer6 = new uint8[200];
-	_unkBuffer7 = new uint8[600];
-	_costpalData = new uint8[864];
-	_unkBuffer9 = new uint8[3618];
-	_unkWSAPtr = new uint8[624];
-
 	musicUpdate(0);
 
-	_unkPage2 = new uint8[64000];
+	memset(_sceneShapes, 0, sizeof(_sceneShapes));
+	_screenBuffer = new uint8[64000];
 
 	musicUpdate(0);
 	musicUpdate(0);
 
-	if (!loadLanguageFile("ITEMS.", _itemList))
+	if (!loadLanguageFile("ITEMS.", _itemFile))
 		error("couldn't load ITEMS");
 	if (!loadLanguageFile("C_CODE.", _cCodeFile))
 		error("couldn't load C_CODE");
-	if (!loadLanguageFile("SCENES.", _scenesList))
+	if (!loadLanguageFile("SCENES.", _scenesFile))
 		error("couldn't load SCENES");
 
-	assert(_unkBuffer5 && _unkBuffer6 && _unkBuffer7 && _costpalData && _unkBuffer9 &&
-			_unkWSAPtr && _unkPage2 && _itemList && _cCodeFile && _scenesList);
+	//XXX
 
+	if ((_actorFileSize = loadLanguageFile("_ACTOR.", _actorFile)) == 0)
+		error("couldn't load _ACTOR");
+
 	musicUpdate(0);
+	//XXX
+	musicUpdate(0);
+	openTalkFile(0);
+	musicUpdate(0);
+	_currentTalkFile = 0;
+	openTalkFile(1);
+	//XXX
+	loadCostPal();
+	musicUpdate(0);
+
+	for (int i = 0; i < 16; ++i) {
+		_sceneAnims[i].flags = 0;
+		_sceneAnimMovie[i] = new WSAMovieV2(this, _screen);
+		assert(_sceneAnimMovie[i]);
+	}
+
+	_screen->_curPage = 0;
+
+	//XXX
+
+	musicUpdate(0);
+	updateMalcolmShapes();
+	_gfxBackUpRect = new uint8[_screen->getRectSize(32, 32)];
+	_itemList = new Item[50];
+	resetItemList();
+
+	loadShadowShape();
+	//loadButtonShapes();
+	musicUpdate(0);
+	loadExtrasShapes();
+	musicUpdate(0);
+	loadMalcolmShapes(_malcolmShapes);
+	musicUpdate(0);
+	//initInventoryButtonList(1);
+	loadInterfaceShapes();
+
+	musicUpdate(0);
+	_res->loadFileToBuf("PALETTE.COL", _screen->getPalette(0), 768);
+	_paletteOverlay = new uint8[256];
+	_screen->generateOverlay(_screen->getPalette(0), _paletteOverlay, 0xF0, 0x19);
+
+	loadInterface();
+	musicUpdate(0);
+
+	clearAnimObjects();
+
+	//XXX
+
+	musicUpdate(0);
+	memset(_hiddenItems, -1, sizeof(_hiddenItems));
+	
+	//resetNewSceneDlgState();
+
+	_sceneList = new SceneDesc[98];
+	musicUpdate(0);
+	runStartupScript(1, 0);
+	//openMoondomtrWsa();
+	_soundDigital->beginFadeOut(_musicSoundChannel, 60);
+	delayUntil(_system->getMillis() + 60 * _tickLength);
+	//XXX enterNewScene(_mainCharacter.sceneId, _mainCharacter.facing, 0, 0, 1);
+	musicUpdate(0);
+	_screen->showMouse();
+	//XXX
 }
 
-#pragma mark - items
+void KyraEngine_v3::loadCostPal() {
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::loadCostPal()");
+	_costPalBuffer = _res->fileData("_COSTPAL.DAT", 0);
+}
 
+void KyraEngine_v3::loadShadowShape() {
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::loadShadowShape()");
+	_screen->loadBitmap("SHADOW.CSH", 3, 3, 0);
+	addShapeToPool(_screen->getCPagePtr(3), 421, 0);
+}
+
+void KyraEngine_v3::loadExtrasShapes() {
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::loadExtrasShapes()");
+	_screen->loadBitmap("EXTRAS.CSH", 3, 3, 0);
+	for (int i = 0; i < 20; ++i)
+		addShapeToPool(_screen->getCPagePtr(3), i+433, i);
+	addShapeToPool(_screen->getCPagePtr(3), 453, 20);
+	addShapeToPool(_screen->getCPagePtr(3), 454, 21);
+}
+
+void KyraEngine_v3::loadInterfaceShapes() {
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::loadInterfaceShapes()");
+	_screen->loadBitmap("INTRFACE.CSH", 3, 3, 0);
+	for (int i = 422; i <= 432; ++i)
+		addShapeToPool(_screen->getCPagePtr(3), i, i-422);
+}
+
+void KyraEngine_v3::loadInterface() {
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::loadInterface()");
+	_screen->loadBitmap("INTRFACE.CPS", 3, 3, 0);
+	memcpy(_interface, _screen->getCPagePtr(3), 17920);
+	memcpy(_interfaceCommandLine, _screen->getCPagePtr(3), 3840);
+}
+
 void KyraEngine_v3::initItems() {
-	debugC(9, kDebugLevelMain, "KyraEngine::initItems()");
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::initItems()");
 
 	_screen->loadBitmap("ITEMS.CSH", 3, 3, 0);
 
-	//for (int i = 248; i <= 319; ++i)
-	//	addShapeToTable(_screen->getCPagePtr(3), i, i-248);
+	for (int i = 248; i <= 319; ++i)
+		addShapeToPool(_screen->getCPagePtr(3), i, i-248);
 
 	_screen->loadBitmap("ITEMS2.CSH", 3, 3, 0);
 
-	//for (int i = 320; i <= 397; ++i)
-	//	addShapeToTable(_screen->getCPagePtr(3), i, i-320);
+	for (int i = 320; i <= 397; ++i)
+		addShapeToPool(_screen->getCPagePtr(3), i, i-320);
 
 	uint32 size = 0;
 	uint8 *itemsDat = _res->fileData("_ITEMS.DAT", &size);
@@ -413,10 +538,114 @@
 	_screen->_curPage = 0;
 }
 
+void KyraEngine_v3::runStartupScript(int script, int unk1) {
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::runStartupScript(%d, %d)", script, unk1);
+	ScriptState state;
+	ScriptData data;
+	memset(&state, 0, sizeof(state));
+	memset(&data, 0, sizeof(data));
+	char filename[13];
+	strcpy(filename, "_START0X.EMC");
+	filename[7] = (script % 10) + '0';
+
+	_scriptInterpreter->loadScript(filename, &data, &_opcodes);
+	_scriptInterpreter->initScript(&state, &data);
+	_scriptInterpreter->startScript(&state, 0);
+	state.regs[6] = unk1;
+
+	while (_scriptInterpreter->validScript(&state))
+		_scriptInterpreter->runScript(&state);
+}
+
+void KyraEngine_v3::openTalkFile(int file) {
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::openTalkFile(%d)", file);
+	char talkFilename[16];
+
+	if (file == 0) {
+		strcpy(talkFilename, "ANYTALK.TLK");
+	} else {
+		if (_currentTalkFile > 0)
+			sprintf(talkFilename, "CH%dTALK.TLK", _currentTalkFile);
+		_res->unloadPakFile(talkFilename);
+		sprintf(talkFilename, "CH%dTALK.TLK", file);
+	}
+
+	_currentTalkFile = file;
+	//TODO: support Kyra3 TLK files
+	//_res->loadPakFile(talkFilename);
+}
+
 #pragma mark -
 
+void KyraEngine_v3::addShapeToPool(const uint8 *data, int realIndex, int shape) {
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::addShapeToPool(%p, %d, %d)", data, realIndex, shape);
+	ShapeMap::iterator iter = _gameShapes.find(realIndex);
+	if (iter != _gameShapes.end()) {
+		delete [] iter->_value;
+		iter->_value = 0;
+	}
+	_gameShapes[realIndex] = _screen->makeShapeCopy(data, shape);
+	assert(_gameShapes[realIndex]);
+}
+
+void KyraEngine_v3::loadMalcolmShapes(int newShapes) {
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::loadMalcolmShapes(%d)", newShapes);
+	static const uint8 numberOffset[] = { 3, 3, 4, 4, 3, 3 };
+	static const uint8 startShape[] = { 0x32, 0x58, 0x78, 0x98, 0xB8, 0xD8 };
+	static const uint8 endShape[] = { 0x57, 0x77, 0x97, 0xB7, 0xD7, 0xF7 };
+	static const char * const filenames[] = {
+		"MSW##.SHP",
+		"MTA##.SHP",
+		"MTFL##.SHP",
+		"MTFR##.SHP",
+		"MTL##.SHP",
+		"MTR#.SHP"
+	};
+
+	for (int i = 50; i <= 247; ++i) {
+		if (i == 87)
+			continue;
+
+		ShapeMap::iterator iter = _gameShapes.find(i);
+		if (iter != _gameShapes.end()) {
+			delete iter->_value;
+			iter->_value = 0;
+		}
+	}
+
+	const char lowNum = (newShapes % 10) + '0';
+	const char highNum = (newShapes / 10) + '0';
+
+	for (int i = 0; i < 6; ++i) {
+		char filename[16];
+		strcpy(filename, filenames[i]);
+		filename[numberOffset[i]+0] = highNum;
+		filename[numberOffset[i]+1] = lowNum;
+		_res->loadFileToBuf(filename, _screenBuffer, 64000);
+		for (int j = startShape[i]; j < endShape[i]; ++j) {
+			if (j == 87)
+				continue;
+			addShapeToPool(_screenBuffer, j, j-startShape[i]);
+		}
+	}
+
+	_malcolmShapes = newShapes;
+	updateMalcolmShapes();
+}
+
+void KyraEngine_v3::updateMalcolmShapes() {
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::updateMalcolmShapes()");
+	assert(_malcolmShapes >= 0 && _malcolmShapes < _shapeDescsSize);
+	_malcolmShapeXOffset = _shapeDescs[_malcolmShapes].xOffset;
+	_malcolmShapeYOffset = _shapeDescs[_malcolmShapes].yOffset;
+	_animObjects[0].width = _shapeDescs[_malcolmShapes].width;
+	_animObjects[0].height = _shapeDescs[_malcolmShapes].height;
+}
+
+#pragma mark -
+
 int KyraEngine_v3::getMaxFileSize(const char *file) {
-	debugC(9, kDebugLevelMain, "KyraEngine::getMaxFileSize(%s)", file);
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::getMaxFileSize(%s)", file);
 	int size = 0;
 
 	char buffer[32];
@@ -430,7 +659,7 @@
 }
 
 char *KyraEngine_v3::appendLanguage(char *buf, int lang, int bufSize) {
-	debugC(9, kDebugLevelMain, "KyraEngine::appendLanguage([%p|'%s'], %d, %d)", (const void*)buf, buf, lang, bufSize);
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::appendLanguage([%p|'%s'], %d, %d)", (const void*)buf, buf, lang, bufSize);
 	assert(lang < _languageExtensionSize);
 
 	int size = strlen(buf) + strlen(_languageExtension[lang]);
@@ -448,15 +677,15 @@
 	return buf;
 }
 
-bool KyraEngine_v3::loadLanguageFile(const char *file, uint8 *&buffer) {
-	debugC(9, kDebugLevelMain, "KyraEngine::loadLanguageFile('%s', %p)", file, (const void*)buffer);
+int KyraEngine_v3::loadLanguageFile(const char *file, uint8 *&buffer) {
+	debugC(9, kDebugLevelMain, "KyraEngine_v3::loadLanguageFile('%s', %p)", file, (const void*)buffer);
 
 	uint32 size = 0;
 	char nBuf[32];
 	strncpy(nBuf, file, 32);
 	buffer = _res->fileData(appendLanguage(nBuf, _lang, sizeof(nBuf)), &size);
 
-	return size != 0 && buffer != 0;
+	return buffer ? size : 0 ;
 }
 
 Movie *KyraEngine_v3::createWSAMovie() {

Modified: scummvm/trunk/engines/kyra/kyra_v3.h
===================================================================
--- scummvm/trunk/engines/kyra/kyra_v3.h	2008-04-14 15:59:32 UTC (rev 31502)
+++ scummvm/trunk/engines/kyra/kyra_v3.h	2008-04-14 20:20:51 UTC (rev 31503)
@@ -28,12 +28,14 @@
 
 #include "kyra/kyra.h"
 #include "kyra/screen_v3.h"
+#include "common/hashmap.h"
 
 namespace Kyra {
 
 class SoundDigital;
 class Screen_v3;
 class MainMenu;
+class WSAMovieV2;
 
 class KyraEngine_v3 : public KyraEngine {
 public:
@@ -52,10 +54,12 @@
 	int init();
 
 	void preinit();
-	void realInit();
+	void startup();
 
-	void setupOpcodeTable() {}
+	void runStartupScript(int script, int unk1);
 
+	void setupOpcodeTable();
+
 	Screen_v3 *_screen;
 	SoundDigital *_soundDigital;
 
@@ -96,47 +100,167 @@
 	// pathfinder
 	bool lineIsPassable(int, int) { return false; }
 
-	// unknown
 private:
-	uint8 *_unkPage1;
-	uint8 *_unkPage2;
+	// main menu
+	static const char *_mainMenuStrings[];
 
-	uint8 *_unkBuffer5;
-	uint8 *_unkBuffer6;
-	uint8 *_unkBuffer7;
-	uint8 *_unkBuffer9;
+	// animator
+	struct AnimObj {
+		uint16 index;
+		uint16 type;
+		bool enabled;
+		bool needRefresh;
+		uint16 unk8;
+		uint16 flags;
+		int16 xPos1, yPos1;
+		uint8 *shapePtr;
+		uint16 shapeIndex;
+		uint16 animNum;
+		uint16 shapeIndex3;
+		uint16 shapeIndex2;
+		int16 xPos2, yPos2;
+		int16 xPos3, yPos3;
+		int16 width, height;
+		int16 width2, height2;
+		AnimObj *nextObject;
+	};
 
-	uint8 *_costpalData;
+	AnimObj *_animObjects;
+	uint8 *_gamePlayBuffer;
 
-	uint8 *_unkWSAPtr;
+	void clearAnimObjects();
 
-	uint8 *_unkShapeTable[20];
+	// interface
+	uint8 *_interface;
+	uint8 *_interfaceCommandLine;
 
-	// main menu
-	static const char *_mainMenuStrings[];
+	void loadInterfaceShapes();
+	void loadInterface();
 
 	// translation stuff
 	uint8 *_scoreFile;
 	uint8 *_cCodeFile;
-	uint8 *_scenesList;
+	uint8 *_scenesFile;
+	uint8 *_itemFile;
+	uint8 *_actorFile;
+	uint32 _actorFileSize;
 
-	// interface?
-	uint8 *_interfaceCPS1;
-	uint8 *_interfaceCPS2;
+	// items
+	uint8 *_itemBuffer1;
+	uint8 *_itemBuffer2;
+	
+	void initItems();
 
 	// shapes
-	uint8 *_gameShapes[50];
+	typedef Common::HashMap<int, uint8*> ShapeMap;
+	ShapeMap _gameShapes;
 
-	uint8 *_mouseSHPBuf;
+	void addShapeToPool(const uint8 *data, int realIndex, int shape);
 
+	void initMouseShapes();
+
+	int _malcolmShapes;
+	void loadMalcolmShapes(int newShapes);
+	void updateMalcolmShapes();
+
+	int _malcolmShapeXOffset, _malcolmShapeYOffset;
+
+	struct ShapeDesc {
+		uint8 width, height;
+		int8 xOffset, yOffset;
+	};
+	static const ShapeDesc _shapeDescs[];
+	static const int _shapeDescsSize;
+
+	// scene animation
+	struct SceneAnim {
+		uint16 flags;
+		int16 x, y;
+		int16 x2, y2;
+		int16 width, height;
+		uint16 unk10;
+		uint16 specialSize;
+		uint16 unk14;
+		uint16 shapeIndex;
+		uint16 wsaFlag;
+		char filename[13];
+	};
+
+	SceneAnim *_sceneAnims;
+	WSAMovieV2 *_sceneAnimMovie[16];
+	uint8 *_sceneShapes[20];
+
+	// voice
+	int _currentTalkFile;
+	void openTalkFile(int file);
+
+	// scene
+	struct SceneDesc {
+		char filename1[10];
+		char filename2[10];
+		uint16 exit1, exit2, exit3, exit4;
+		uint8 flags, sound;
+	};
+
+	SceneDesc *_sceneList;
+	uint16 _sceneExit1, _sceneExit2, _sceneExit3, _sceneExit4;
+
 	// items
-	uint8 *_itemBuffer1;
-	uint8 *_itemBuffer2;
+	struct Item {
+		uint16 id;
+		uint16 sceneId;
+		int16 x, y;
+		uint16 unk8;
+	};
 
-	uint8 *_itemList;
+	Item *_itemList;
+	uint16 _hiddenItems[100];
 
-	void initItems();
+	void resetItem(int index);
+	void resetItemList();
 
+	int findFreeItem();
+
+	// character
+	struct Character {
+		uint16 sceneId;
+		uint16 dlgIndex;
+		uint8 unk4;
+		uint8 facing;
+		uint16 animFrame;
+		//uint8 unk8, unk9;
+		uint32 walkspeed;
+		uint16 inventory[10];
+		int16 x1, y1;
+		int16 x2, y2;
+		int16 x3, y3;
+	};
+
+	Character _mainCharacter;
+
+	// unk
+	uint8 *_unkBuffer1040Bytes;
+	uint8 *_costPalBuffer;
+	uint8 *_screenBuffer;
+	uint8 *_gfxBackUpRect;
+	uint8 *_paletteOverlay;
+
+	void loadCostPal();
+	void loadShadowShape();
+	void loadExtrasShapes();
+
+	// opcodes
+	int o3_defineItem(ScriptState *script);
+	int o3_queryGameFlag(ScriptState *script);
+	int o3_resetGameFlag(ScriptState *script);
+	int o3_setGameFlag(ScriptState *script);
+	int o3_setSceneFilename(ScriptState *script);
+	int o3_getRand(ScriptState *script);
+	int o3_defineScene(ScriptState *script);
+	int o3_setHiddenItemsEntry(ScriptState *script);
+	int o3_getHiddenItemsEntry(ScriptState *script);
+	int o3_dummy(ScriptState *script);
+
 	// resource specific
 private:
 	static const char *_languageExtension[];
@@ -145,7 +269,7 @@
 	int getMaxFileSize(const char *file);
 	char *appendLanguage(char *buf, int lang, int bufSize);
 
-	bool loadLanguageFile(const char *file, uint8 *&buffer);
+	int loadLanguageFile(const char *file, uint8 *&buffer);
 };
 
 } // end of namespace Kyra

Modified: scummvm/trunk/engines/kyra/module.mk
===================================================================
--- scummvm/trunk/engines/kyra/module.mk	2008-04-14 15:59:32 UTC (rev 31502)
+++ scummvm/trunk/engines/kyra/module.mk	2008-04-14 20:20:51 UTC (rev 31503)
@@ -3,6 +3,7 @@
 MODULE_OBJS := \
 	animator_v1.o \
 	animator_v2.o \
+	animator_v3.o \
 	debugger.o \
 	detection.o \
 	gui.o \
@@ -10,6 +11,7 @@
 	gui_v2.o \
 	items_v1.o \
 	items_v2.o \
+	items_v3.o \
 	kyra.o \
 	kyra_v1.o \
 	kyra_v2.o \
@@ -27,6 +29,7 @@
 	screen_v3.o \
 	script_v1.o \
 	script_v2.o \
+	script_v3.o \
 	script.o \
 	seqplayer.o \
 	sequences_tim.o \

Added: scummvm/trunk/engines/kyra/script_v3.cpp
===================================================================
--- scummvm/trunk/engines/kyra/script_v3.cpp	                        (rev 0)
+++ scummvm/trunk/engines/kyra/script_v3.cpp	2008-04-14 20:20:51 UTC (rev 31503)
@@ -0,0 +1,347 @@
+/* ScummVM - Graphic Adventure Engine
+ *
+ * ScummVM is the legal property of its developers, whose names
+ * are too numerous to list here. Please refer to the COPYRIGHT
+ * file distributed with this source distribution.
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "kyra/kyra_v3.h"
+#include "kyra/script.h"
+
+#include "common/endian.h"
+
+namespace Kyra {
+
+int KyraEngine_v3::o3_defineItem(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_defineItem(%p) (%d, %d, %d, %d)", (const void *)script, stackPos(0), stackPos(1), stackPos(2), stackPos(3));
+	int freeItem = findFreeItem();
+	if (freeItem != -1) {
+		_itemList[freeItem].id = stackPos(0);
+		_itemList[freeItem].x = stackPos(1);
+		_itemList[freeItem].y = stackPos(2);
+		_itemList[freeItem].sceneId = stackPos(3);
+	}
+	return freeItem;
+}
+
+int KyraEngine_v3::o3_queryGameFlag(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_queryGameFlag(%p) (%d)", (const void *)script, stackPos(0));
+	return queryGameFlag(stackPos(0));
+}
+
+int KyraEngine_v3::o3_resetGameFlag(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_resetGameFlag(%p) (%d)", (const void *)script, stackPos(0));
+	resetGameFlag(stackPos(0));
+	return 0;
+}
+
+int KyraEngine_v3::o3_setGameFlag(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_setGameFlag(%p) (%d)", (const void *)script, stackPos(0));
+	setGameFlag(stackPos(0));
+	return 1;
+}
+
+int KyraEngine_v3::o3_setSceneFilename(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_setSceneFilename(%p) (%d, '%s')", (const void *)script, stackPos(0), stackPosString(1));
+	strcpy(_sceneList[stackPos(0)].filename1, stackPosString(1));
+	_sceneList[stackPos(0)].filename1[9] = 0;
+	return 0;
+}
+
+int KyraEngine_v3::o3_getRand(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_getRand(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
+	assert(stackPos(0) < stackPos(1));
+	return _rnd.getRandomNumberRng(stackPos(0), stackPos(1));
+}
+
+int KyraEngine_v3::o3_defineScene(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_defineScene(%p) (%d, '%s', %d, %d, %d, %d, %d)",
+		(const void *)script, stackPos(0), stackPosString(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5), stackPos(6), stackPos(7));
+	const int scene = stackPos(0);
+	strcpy(_sceneList[scene].filename1, stackPosString(1));
+	_sceneList[scene].filename1[9] = 0;
+	strcpy(_sceneList[scene].filename2, stackPosString(1));
+	_sceneList[scene].filename2[9] = 0;
+
+	_sceneList[scene].exit1 = stackPos(2);
+	_sceneList[scene].exit2 = stackPos(3);
+	_sceneList[scene].exit3 = stackPos(4);
+	_sceneList[scene].exit4 = stackPos(5);
+	_sceneList[scene].flags = stackPos(6);
+	_sceneList[scene].sound = stackPos(7);
+
+	if (_mainCharacter.sceneId == scene) {
+		_sceneExit1 = _sceneList[scene].exit1;
+		_sceneExit2 = _sceneList[scene].exit2;
+		_sceneExit3 = _sceneList[scene].exit3;
+		_sceneExit4 = _sceneList[scene].exit4;
+	}
+
+	return 0;
+}
+
+int KyraEngine_v3::o3_setHiddenItemsEntry(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_setHiddenItemsEntry(%p) (%d, %d)", (const void *)script, stackPos(0), stackPos(1));
+	return (_hiddenItems[stackPos(0)] = (uint16)stackPos(1));
+}
+
+int KyraEngine_v3::o3_getHiddenItemsEntry(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_getHiddenItemsEntry(%p) (%d)", (const void *)script, stackPos(0));
+	return (int16)_hiddenItems[stackPos(0)];
+}
+
+int KyraEngine_v3::o3_dummy(ScriptState *script) {
+	debugC(3, kDebugLevelScriptFuncs, "KyraEngine_v3::o3_dummy(%p) ()", (const void *)script);
+	return 0;
+}
+
+typedef Functor1Mem<ScriptState*, int, KyraEngine_v3> OpcodeV3;
+#define Opcode(x) OpcodeV3(this, &KyraEngine_v3::x)
+#define OpcodeUnImpl() OpcodeV3(this, 0)
+void KyraEngine_v3::setupOpcodeTable() {
+	static const OpcodeV3 opcodeTable[] = {
+		// 0x00
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		// 0x04
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		// 0x08
+		OpcodeUnImpl(),
+		Opcode(o3_dummy),
+		Opcode(o3_dummy),
+		OpcodeUnImpl(),
+		// 0x0c
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		// 0x10
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		Opcode(o3_dummy),
+		Opcode(o3_dummy),
+		// 0x14
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		Opcode(o3_dummy),
+		OpcodeUnImpl(),
+		// 0x18
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		// 0x1c
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		// 0x20
+		OpcodeUnImpl(),
+		Opcode(o3_dummy),
+		OpcodeUnImpl(),
+		Opcode(o3_defineItem),
+		// 0x24
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		Opcode(o3_queryGameFlag),
+		// 0x28
+		Opcode(o3_resetGameFlag),
+		Opcode(o3_setGameFlag),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		// 0x2c
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		// 0x30
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		Opcode(o3_dummy),
+		// 0x34
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		Opcode(o3_dummy),
+		OpcodeUnImpl(),
+		// 0x38
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		Opcode(o3_setSceneFilename),
+		OpcodeUnImpl(),
+		// 0x3c
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		// 0x40
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		Opcode(o3_dummy),
+		// 0x44
+		Opcode(o3_dummy),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		Opcode(o3_dummy),
+		// 0x48
+		Opcode(o3_dummy),
+		Opcode(o3_dummy),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		// 0x4c
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		// 0x50
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		Opcode(o3_dummy),
+		// 0x54
+		Opcode(o3_dummy),
+		Opcode(o3_dummy),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		// 0x58
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		// 0x5c
+		OpcodeUnImpl(),
+		Opcode(o3_dummy),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		// 0x60
+		Opcode(o3_getRand),
+		Opcode(o3_dummy),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		// 0x64
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		Opcode(o3_dummy),
+		OpcodeUnImpl(),
+		// 0x68
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		// 0x6c
+		Opcode(o3_dummy),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		// 0x70
+		OpcodeUnImpl(),
+		Opcode(o3_dummy),
+		OpcodeUnImpl(),
+		Opcode(o3_dummy),
+		// 0x74
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		// 0x78
+		OpcodeUnImpl(),
+		Opcode(o3_defineScene),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		// 0x7c
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		Opcode(o3_dummy),
+		Opcode(o3_dummy),
+		// 0x80
+		Opcode(o3_dummy),
+		OpcodeUnImpl(),
+		Opcode(o3_dummy),
+		Opcode(o3_dummy),
+		// 0x84
+		Opcode(o3_dummy),
+		Opcode(o3_dummy),
+		Opcode(o3_dummy),
+		Opcode(o3_dummy),
+		// 0x88
+		OpcodeUnImpl(),
+		Opcode(o3_dummy),
+		OpcodeUnImpl(),
+		Opcode(o3_dummy),
+		// 0x8c
+		OpcodeUnImpl(),
+		Opcode(o3_dummy),
+		Opcode(o3_dummy),
+		OpcodeUnImpl(),
+		// 0x90
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		Opcode(o3_dummy),
+		Opcode(o3_setHiddenItemsEntry),
+		// 0x94
+		Opcode(o3_getHiddenItemsEntry),
+		Opcode(o3_dummy),
+		Opcode(o3_dummy),
+		OpcodeUnImpl(),
+		// 0x98
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		// 0x9c
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		// 0xa0
+		Opcode(o3_dummy),
+		Opcode(o3_dummy),
+		Opcode(o3_dummy),
+		Opcode(o3_dummy),
+		// 0xa4
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		// 0xa8
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		OpcodeUnImpl(),
+		// 0xac
+		OpcodeUnImpl(),
+		Opcode(o3_dummy),
+		OpcodeUnImpl(),
+		Opcode(o3_dummy),
+	};
+
+	for (int i = 0; i < ARRAYSIZE(opcodeTable); ++i)
+		_opcodes.push_back(&opcodeTable[i]);
+}
+
+} // end of namespace Kyra


Property changes on: scummvm/trunk/engines/kyra/script_v3.cpp
___________________________________________________________________
Name: svn:mime-type
   + text/plain
Name: svn:keywords
   + Date Rev Author URL Id
Name: svn:eol-style
   + native

Modified: scummvm/trunk/engines/kyra/sound.h
===================================================================
--- scummvm/trunk/engines/kyra/sound.h	2008-04-14 15:59:32 UTC (rev 31502)
+++ scummvm/trunk/engines/kyra/sound.h	2008-04-14 20:20:51 UTC (rev 31503)
@@ -537,6 +537,11 @@
 	void stopSound(int channel);
 
 	/**
+	 * Stops playback of all sounds
+	 */
+	void stopAllSounds();
+
+	/**
 	 * Makes the sound in a given channel
 	 * fading out.
 	 *

Modified: scummvm/trunk/engines/kyra/sound_digital.cpp
===================================================================
--- scummvm/trunk/engines/kyra/sound_digital.cpp	2008-04-14 15:59:32 UTC (rev 31502)
+++ scummvm/trunk/engines/kyra/sound_digital.cpp	2008-04-14 20:20:51 UTC (rev 31503)
@@ -380,6 +380,13 @@
 	_sounds[channel].stream = 0;
 }
 
+void SoundDigital::stopAllSounds() {
+	for (int i = 0; i < SOUND_STREAMS; ++i) {
+		if (isPlaying(i))
+			stopSound(i);
+	}
+}
+
 void SoundDigital::beginFadeOut(int channel, int ticks) {
 	if (isPlaying(channel))
 		_sounds[channel].stream->beginFadeOut(ticks * _vm->tickLength());

Modified: scummvm/trunk/engines/kyra/staticres.cpp
===================================================================
--- scummvm/trunk/engines/kyra/staticres.cpp	2008-04-14 15:59:32 UTC (rev 31502)
+++ scummvm/trunk/engines/kyra/staticres.cpp	2008-04-14 20:20:51 UTC (rev 31503)
@@ -1970,6 +1970,23 @@
 
 const int KyraEngine_v3::_languageExtensionSize = ARRAYSIZE(KyraEngine_v3::_languageExtension);
 
+const KyraEngine_v3::ShapeDesc KyraEngine_v3::_shapeDescs[] = {
+	{ 57, 91, -31, -82 },
+	{ 57, 91, -31, -82 },
+	{ 57, 91, -31, -82 },
+	{ 57, 91, -31, -82 },
+	{ 57, 91, -31, -82 },
+	{ 82, 96, -43, -86 },
+	{ 57, 91, -31, -82 },
+	{ 57, 91, -31, -82 },
+	{ 57, 91, -31, -82 },
+	{ 69, 91, -31, -82 },
+	{ 57, 91, -31, -82 },
+	{ 57, 91, -31, -82 }
+};
+
+const int KyraEngine_v3::_shapeDescsSize = ARRAYSIZE(KyraEngine_v3::_shapeDescs);
+
 } // End of namespace Kyra
 
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list