[Scummvm-cvs-logs] SF.net SVN: scummvm:[42432] scummvm/branches/gsoc2009-16bit

Kirben at users.sourceforge.net Kirben at users.sourceforge.net
Mon Jul 13 01:54:47 CEST 2009


Revision: 42432
          http://scummvm.svn.sourceforge.net/scummvm/?rev=42432&view=rev
Author:   Kirben
Date:     2009-07-12 23:54:46 +0000 (Sun, 12 Jul 2009)

Log Message:
-----------
Merged revisions 42398,42402-42406,42418-42421,42423,42428-42430 via svnmerge from 
https://scummvm.svn.sourceforge.net/svnroot/scummvm/scummvm/trunk

........
  r42398 | thebluegr | 2009-07-12 09:45:54 +1000 (Sun, 12 Jul 2009) | 1 line
  
  Moved the kernel and the vocabulary outside of the engine state (they're static data, which never changes during a game)
........
  r42402 | sunmax | 2009-07-12 15:34:46 +1000 (Sun, 12 Jul 2009) | 8 lines
  
  Added a temporary work-around for PS2 backend in common/array.h
  cause its vintage compiler does not support "new T[newCapacity]()"
  but only "new T[newCapacity]", this will let it compile through.
  
  It's ifdef'd as __PLAYSTATION2__, so it won't make a difference
  for other backends with more modern tools.
........
  r42403 | sunmax | 2009-07-12 15:35:56 +1000 (Sun, 12 Jul 2009) | 5 lines
  
  I am re-commiting the FORCE_RTL as a temporary solution
  in trunk, so that trunk/1.0rc is au pair feature-wise
  with 0.13.x.
........
  r42404 | sunmax | 2009-07-12 15:38:08 +1000 (Sun, 12 Jul 2009) | 24 lines
  
  ScummVM/PS2 bugs fixed by this commit:
  
   - general file write corruption (eg. ScummVM.ini, etc.)
  
   - COMI specific save crash / corruption
     (added option in engines/scumm/saveload.cpp to disable
      thumbnails on PS2, as emergency fallback in case the
      fix should prove to be insufficient)
  
   - implemented _screenChange logic
     (fixes grabOverlay & COMI popup menu)
  
   - fixed higher pitch (chipmunk fx)
  
   - made NET IRXs optional to allow it to work on fat PS2 without net+hd
  
   - fixed cursor restore on RTL
  
   - added "." as R2 to skip single lines of dialog
  
   - added write cache
........
  r42405 | dreammaster | 2009-07-12 17:23:50 +1000 (Sun, 12 Jul 2009) | 1 line
  
  Added support for sub-relation message types - this fixes trying to attach the chain to the hook on the deck
........
  r42406 | lordhoto | 2009-07-12 18:51:57 +1000 (Sun, 12 Jul 2009) | 1 line
  
  Add missing quotation mark to error message.
........
  r42418 | lordhoto | 2009-07-13 00:29:59 +1000 (Mon, 13 Jul 2009) | 1 line
  
  Fix typo, which in fact fixes bug #2820353 "GUI: Search doesn't handle uppercase properly".
........
  r42419 | knakos | 2009-07-13 01:59:27 +1000 (Mon, 13 Jul 2009) | 1 line
  
  Apply patch 2802544: WINCE: Implement OSystem::engineInit to remove hack
........
  r42420 | knakos | 2009-07-13 01:59:56 +1000 (Mon, 13 Jul 2009) | 1 line
  
  fix build with arm-asm routines
........
  r42421 | knakos | 2009-07-13 02:40:10 +1000 (Mon, 13 Jul 2009) | 1 line
  
  oops, fix props
........
  r42423 | sev | 2009-07-13 04:52:38 +1000 (Mon, 13 Jul 2009) | 2 lines
  
  Patch #1936137: "Speech for Mac BS1 english"
........
  r42428 | sunmax | 2009-07-13 07:58:00 +1000 (Mon, 13 Jul 2009) | 6 lines
  
  Split _eof vs. _err.
  
  Latter defaults to false for now, there are hooks
  for possible future implementation.
........
  r42429 | sunmax | 2009-07-13 08:00:47 +1000 (Mon, 13 Jul 2009) | 4 lines
  
  On PS2 use "fprintf" (as in 0.13.x ) to print error messages to stderr,
  rather than "fputs", which is buggy in the PS2 implementation.
........
  r42430 | wjpalenstijn | 2009-07-13 08:08:10 +1000 (Mon, 13 Jul 2009) | 1 line
  
  Remove double endline
........

Modified Paths:
--------------
    scummvm/branches/gsoc2009-16bit/backends/events/default/default-events.h
    scummvm/branches/gsoc2009-16bit/backends/platform/ps2/Gs2dScreen.cpp
    scummvm/branches/gsoc2009-16bit/backends/platform/ps2/Gs2dScreen.h
    scummvm/branches/gsoc2009-16bit/backends/platform/ps2/Makefile.ps2
    scummvm/branches/gsoc2009-16bit/backends/platform/ps2/fileio.cpp
    scummvm/branches/gsoc2009-16bit/backends/platform/ps2/fileio.h
    scummvm/branches/gsoc2009-16bit/backends/platform/ps2/irxboot.cpp
    scummvm/branches/gsoc2009-16bit/backends/platform/ps2/ps2input.cpp
    scummvm/branches/gsoc2009-16bit/backends/platform/ps2/savefilemgr.cpp
    scummvm/branches/gsoc2009-16bit/backends/platform/ps2/systemps2.cpp
    scummvm/branches/gsoc2009-16bit/backends/platform/ps2/systemps2.h
    scummvm/branches/gsoc2009-16bit/backends/platform/wince/wince-sdl.cpp
    scummvm/branches/gsoc2009-16bit/backends/platform/wince/wince-sdl.h
    scummvm/branches/gsoc2009-16bit/base/main.cpp
    scummvm/branches/gsoc2009-16bit/common/array.h
    scummvm/branches/gsoc2009-16bit/common/events.h
    scummvm/branches/gsoc2009-16bit/common/util.cpp
    scummvm/branches/gsoc2009-16bit/engines/cruise/cruise_main.cpp
    scummvm/branches/gsoc2009-16bit/engines/kyra/script.cpp
    scummvm/branches/gsoc2009-16bit/engines/kyra/script_tim.cpp
    scummvm/branches/gsoc2009-16bit/engines/sci/console.cpp
    scummvm/branches/gsoc2009-16bit/engines/sci/engine/game.cpp
    scummvm/branches/gsoc2009-16bit/engines/sci/engine/kernel.h
    scummvm/branches/gsoc2009-16bit/engines/sci/engine/kgraphics.cpp
    scummvm/branches/gsoc2009-16bit/engines/sci/engine/kmisc.cpp
    scummvm/branches/gsoc2009-16bit/engines/sci/engine/kmovement.cpp
    scummvm/branches/gsoc2009-16bit/engines/sci/engine/kscripts.cpp
    scummvm/branches/gsoc2009-16bit/engines/sci/engine/ksound.cpp
    scummvm/branches/gsoc2009-16bit/engines/sci/engine/kstring.cpp
    scummvm/branches/gsoc2009-16bit/engines/sci/engine/said.cpp
    scummvm/branches/gsoc2009-16bit/engines/sci/engine/said.y
    scummvm/branches/gsoc2009-16bit/engines/sci/engine/savegame.cpp
    scummvm/branches/gsoc2009-16bit/engines/sci/engine/scriptdebug.cpp
    scummvm/branches/gsoc2009-16bit/engines/sci/engine/seg_manager.cpp
    scummvm/branches/gsoc2009-16bit/engines/sci/engine/state.cpp
    scummvm/branches/gsoc2009-16bit/engines/sci/engine/state.h
    scummvm/branches/gsoc2009-16bit/engines/sci/engine/vm.cpp
    scummvm/branches/gsoc2009-16bit/engines/sci/engine/vm.h
    scummvm/branches/gsoc2009-16bit/engines/sci/sci.cpp
    scummvm/branches/gsoc2009-16bit/engines/sci/sci.h
    scummvm/branches/gsoc2009-16bit/engines/scumm/gfx.cpp
    scummvm/branches/gsoc2009-16bit/engines/scumm/saveload.cpp
    scummvm/branches/gsoc2009-16bit/engines/sword1/sound.cpp
    scummvm/branches/gsoc2009-16bit/engines/sword1/sound.h
    scummvm/branches/gsoc2009-16bit/engines/sword1/sword1.cpp
    scummvm/branches/gsoc2009-16bit/gui/ListWidget.cpp

Added Paths:
-----------
    scummvm/branches/gsoc2009-16bit/backends/platform/ps2/Makefile.gdb

Property Changed:
----------------
    scummvm/branches/gsoc2009-16bit/


Property changes on: scummvm/branches/gsoc2009-16bit
___________________________________________________________________
Modified: svnmerge-integrated
   - /scummvm/trunk:1-42396 /scummvm/branches/gsoc2008-tfmx:1-31765 /scummvm/branches/gsoc2008-gui:1-31703
   + /scummvm/trunk:1-42430 /scummvm/branches/gsoc2008-tfmx:1-31765 /scummvm/branches/gsoc2008-gui:1-31703

Modified: scummvm/branches/gsoc2009-16bit/backends/events/default/default-events.h
===================================================================
--- scummvm/branches/gsoc2009-16bit/backends/events/default/default-events.h	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/backends/events/default/default-events.h	2009-07-12 23:54:46 UTC (rev 42432)
@@ -143,6 +143,9 @@
 	virtual int shouldQuit() const { return _shouldQuit; }
 	virtual int shouldRTL() const { return _shouldRTL; }
 	virtual void resetRTL() { _shouldRTL = false; }
+#ifdef FORCE_RTL
+	virtual void resetQuit() { _shouldQuit = false; }
+#endif
 
 #ifdef ENABLE_KEYMAPPER
 	virtual Common::Keymapper *getKeymapper() { return _keymapper; }

Modified: scummvm/branches/gsoc2009-16bit/backends/platform/ps2/Gs2dScreen.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/backends/platform/ps2/Gs2dScreen.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/backends/platform/ps2/Gs2dScreen.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -337,6 +337,7 @@
 	memset(_screenBuf, 0, _width * height);
 	memset(_overlayBuf, 0, _width * height * 2);
 	memset(_clut, 0, 256 * sizeof(uint32));
+	_clut[1] = GS_RGBA(0xC0, 0xC0, 0xC0, 0);
 
 	// clear video ram
 	_dmaPipe->uploadTex(_clutPtrs[MOUSE], 64, 0, 0, GS_PSMCT32, _clut, 16, 16);
@@ -345,7 +346,8 @@
 	_dmaPipe->flush();
 	_dmaPipe->waitForDma();
 
-	_clutChanged = _screenChanged = _overlayChanged = false;
+	/*_clutChanged = */ _screenChanged = _overlayChanged = false;
+	_clutChanged = true; // reload palette on scr change
 
 	_texCoords[1].u = SCALE(_width);
 	_texCoords[1].v = SCALE(_height);
@@ -396,6 +398,13 @@
 	SignalSema(g_DmacSema);
 }
 
+void Gs2dScreen::fillScreen(uint32 col) {
+	WaitSema(g_DmacSema);
+	memset(_screenBuf, col, _width * _height);
+	_screenChanged = true;
+	SignalSema(g_DmacSema);
+}
+
 Graphics::Surface *Gs2dScreen::lockScreen() {
 	WaitSema(g_DmacSema);
 
@@ -541,11 +550,11 @@
 }
 
 int16 Gs2dScreen::getOverlayWidth(void) {
-	return _videoMode.overlayWidth;
+	return _width; // _videoMode.overlayWidth;
 }
 
 int16 Gs2dScreen::getOverlayHeight(void) {
-	return _videoMode.overlayHeight;
+	return _height; // _videoMode.overlayHeight;
 }
 
 void Gs2dScreen::setShakePos(int shake) {

Modified: scummvm/branches/gsoc2009-16bit/backends/platform/ps2/Gs2dScreen.h
===================================================================
--- scummvm/branches/gsoc2009-16bit/backends/platform/ps2/Gs2dScreen.h	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/backends/platform/ps2/Gs2dScreen.h	2009-07-12 23:54:46 UTC (rev 42432)
@@ -61,6 +61,7 @@
 	void copyPrintfOverlay(const uint8* buf);
 	void clearPrintfOverlay(void);
 	void clearScreen(void);
+	void fillScreen(uint32 col);
 
 	Graphics::Surface *lockScreen();
 	void unlockScreen();

Copied: scummvm/branches/gsoc2009-16bit/backends/platform/ps2/Makefile.gdb (from rev 42430, scummvm/trunk/backends/platform/ps2/Makefile.gdb)
===================================================================
--- scummvm/branches/gsoc2009-16bit/backends/platform/ps2/Makefile.gdb	                        (rev 0)
+++ scummvm/branches/gsoc2009-16bit/backends/platform/ps2/Makefile.gdb	2009-07-12 23:54:46 UTC (rev 42432)
@@ -0,0 +1,94 @@
+# $Header: Exp $
+ include $(PS2SDK)/Defs.make
+
+PS2_EXTRA = /media/disk/nw8240/extras/scummvm/ports
+PS2_EXTRA_INCS = /zlib/include /libmad/ee/include /SjPcm/ee/src /tremor
+PS2_EXTRA_LIBS = /zlib/lib /libmad/ee/lib /SjPcm/ee/lib /tremor/tremor
+
+ENABLED=STATIC_PLUGIN
+
+#control build
+DISABLE_SCALERS = true
+DISABLE_HQ_SCALERS = true
+
+ENABLE_SCUMM = $(ENABLED)
+ENABLE_SCUMM_7_8 = $(ENABLED)
+#ENABLE_HE = $(ENABLED)
+#ENABLE_AGI = $(ENABLED)
+#ENABLE_AGOS = $(ENABLED)
+#ENABLE_CINE = $(ENABLED)
+#ENABLE_CRUISE = $(ENABLED)
+#ENABLE_DRASCULA = $(ENABLED)
+#ENABLE_GOB = $(ENABLED)
+#ENABLE_IGOR = $(ENABLED)
+#ENABLE_KYRA = $(ENABLED)
+#ENABLE_LURE = $(ENABLED)
+ # ENABLE_M4 = $(ENABLED)
+#ENABLE_MADE = $(ENABLED)
+#ENABLE_PARALLACTION = $(ENABLED)
+#ENABLE_QUEEN = $(ENABLED)
+#ENABLE_SAGA = $(ENABLED)
+#ENABLE_SAGA2 = $(ENABLED)
+#ENABLE_IHNM = $(ENABLED)
+#ENABLE_SKY = $(ENABLED)
+#ENABLE_SWORD1 = $(ENABLED)
+#ENABLE_SWORD2 = $(ENABLED)
+ # ENABLE_TINSEL = $(ENABLED)
+#ENABLE_TOUCHE = $(ENABLED)
+
+HAVE_GCC3 = true
+
+CC		= ee-gcc
+CXX     = ee-g++
+AS      = ee-gcc
+LD      = ee-gcc
+AR      = ee-ar cru
+RANLIB  = ee-ranlib
+STRIP   = ee-strip
+MKDIR   = mkdir -p
+RM      = rm -f
+
+srcdir = ../../..
+VPATH = $(srcdir)
+INCDIR = ../../../
+# DEPDIR = .deps
+
+DEFINES  = -DUSE_VORBIS -DUSE_TREMOR -DUSE_MAD -DUSE_ZLIB -DFORCE_RTL -D_EE -D__PLAYSTATION2__ -D__PS2_DEBUG__ -g -Wall -Wno-multichar
+
+
+INCLUDES  = $(addprefix -I$(PS2_EXTRA),$(PS2_EXTRA_INCS)) 
+INCLUDES += -I $(PS2GDB)/ee -I $(PS2SDK)/ee/include -I $(PS2SDK)/common/include -I ./common -I . -I $(srcdir) -I $(srcdir)/engines
+
+TARGET = elf/scummvm.elf
+
+OBJS := backends/platform/ps2/DmaPipe.o \
+    backends/platform/ps2/Gs2dScreen.o \
+    backends/platform/ps2/irxboot.o \
+	backends/platform/ps2/ps2input.o \
+	backends/platform/ps2/ps2pad.o \
+	backends/platform/ps2/savefilemgr.o \
+    backends/platform/ps2/fileio.o \
+    backends/platform/ps2/asyncfio.o \
+	backends/platform/ps2/icon.o \
+    backends/platform/ps2/cd.o \
+    backends/platform/ps2/eecodyvdfs.o \
+    backends/platform/ps2/rpckbd.o \
+    backends/platform/ps2/systemps2.o \
+    backends/platform/ps2/ps2mutex.o \
+    backends/platform/ps2/ps2time.o \
+	backends/platform/ps2/ps2debug.o
+    
+MODULE_DIRS += .
+
+include $(srcdir)/Makefile.common
+
+LDFLAGS += -mno-crt0 $(PS2SDK)/ee/startup/crt0.o -T $(PS2SDK)/ee/startup/linkfile 
+LDFLAGS += -L $(PS2GDB)/lib  -L $(PS2SDK)/ee/lib -L .
+LDFLAGS += $(addprefix -L$(PS2_EXTRA),$(PS2_EXTRA_LIBS)) 
+LDFLAGS += -lmc -lpad -lmouse -lhdd -lpoweroff -lsjpcm -lmad -ltremor -lz -lm -lc -lfileXio -lps2gdbStub -lps2ip -ldebug -lkernel -lstdc++
+
+all: $(TARGET)
+
+$(TARGET): $(OBJS)
+	$(LD) $^ $(LDFLAGS) -o $@
+

Modified: scummvm/branches/gsoc2009-16bit/backends/platform/ps2/Makefile.ps2
===================================================================
--- scummvm/branches/gsoc2009-16bit/backends/platform/ps2/Makefile.ps2	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/backends/platform/ps2/Makefile.ps2	2009-07-12 23:54:46 UTC (rev 42432)
@@ -1,7 +1,7 @@
 # $Header: Exp $
  include $(PS2SDK)/Defs.make
 
-PS2_EXTRA = /media/disk-1/nw8240/extras/scummvm/ports
+PS2_EXTRA = /media/disk/nw8240/extras/scummvm/ports
 PS2_EXTRA_INCS = /zlib/include /libmad/ee/include /SjPcm/ee/src /tremor
 PS2_EXTRA_LIBS = /zlib/lib /libmad/ee/lib /SjPcm/ee/lib /tremor/tremor
 
@@ -45,15 +45,15 @@
 AR      = ee-ar cru
 RANLIB  = ee-ranlib
 STRIP   = ee-strip
-MKDIR 	= mkdir -p
-RM 	= rm -f
+MKDIR   = mkdir -p
+RM      = rm -f
 
 srcdir = ../../..
 VPATH = $(srcdir)
 INCDIR = ../../../
 # DEPDIR = .deps
 
-DEFINES  = -DUSE_VORBIS -DUSE_TREMOR -DUSE_MAD -DUSE_ZLIB -D_EE -D__PLAYSTATION2__ -O2 -Wall -Wno-multichar
+DEFINES  = -DUSE_VORBIS -DUSE_TREMOR -DUSE_MAD -DUSE_ZLIB -DFORCE_RTL -D_EE -D__PLAYSTATION2__ -O2 -Wall -Wno-multichar
 
 
 INCLUDES  = $(addprefix -I$(PS2_EXTRA),$(PS2_EXTRA_INCS)) 
@@ -86,7 +86,7 @@
 LDFLAGS += -L $(PS2SDK)/ee/lib -L .
 LDFLAGS += $(addprefix -L$(PS2_EXTRA),$(PS2_EXTRA_LIBS)) 
 LDFLAGS += -lmc -lpad -lmouse -lhdd -lpoweroff -lsjpcm -lmad -ltremor -lz -lm -lc -lfileXio -lkernel -lstdc++ 
-# LDFLAGS += -s 
+LDFLAGS += -s 
 
 all: $(TARGET)
 

Modified: scummvm/branches/gsoc2009-16bit/backends/platform/ps2/fileio.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/backends/platform/ps2/fileio.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/backends/platform/ps2/fileio.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -58,10 +58,11 @@
 	_cacheSize = 0;
 	_cachePos = 0;
 	_eof = false;
+	_err = false;
 
 	// _cache = (uint8 *)malloc(PS2_CACHE_MAX);
 
-	_cacheBuf = (uint8*)memalign(64, CACHE_SIZE);
+	_cacheBuf = (uint8*)memalign(64, CACHE_SIZE * 2);
 
 	_cacheOpRunning = 0;
 	_filePos = _physFilePos = _cachePos = 0;
@@ -80,7 +81,16 @@
 }
 
 Ps2File::~Ps2File(void) {
+	uint32 w;
 	if (_fd >= 0) {
+
+		if (_mode != O_RDONLY) {
+			fio.seek(_fd, 0, SEEK_SET);
+			fio.write(_fd, _cacheBuf, _filePos);
+			w = fio.sync(_fd);
+			printf("flushed wbuf: %x of %x\n", w, _filePos);
+		}
+
 		fio.close(_fd);
 		uint32 r = fio.sync(_fd);
 		printf("close [%d] - sync'd = %d\n", _fd, r);
@@ -95,24 +105,87 @@
 }
 
 bool Ps2File::open(const char *name, int mode) {
-	assert(_fd < 0);
-
+#if 1
 	_fd = fio.open(name, mode);
 
 	printf("open %s [%d]\n", name, _fd);
 
 	if (_fd >= 0) {
-		_fileSize = fio.seek(_fd, 0, SEEK_END);
-		if (mode == O_RDONLY)
-		// if (!(mode & O_APPEND))
+		_mode = mode;
+		_filePos = 0;
+
+		if (_mode == O_RDONLY) {
+			_fileSize = fio.seek(_fd, 0, SEEK_END);
 			fio.seek(_fd, 0, SEEK_SET);
+		}
+		else
+			_fileSize = 0;
 
+		printf("  _mode = %x\n", _mode);
 		printf("  _fileSize = %d\n", _fileSize);
+		// printf("  _filePos = %d\n", _filePos);
+
+		return true;
+	}
+
+	return false;
+#else
+	uint32 r;
+
+	// hack: FIO does not reports size for RW (?)
+	_fd = fio.open(name, O_RDONLY);
+	if (_fd >= 0) {
+		_fileSize = fio.seek(_fd, 0, SEEK_END);
+		fio.seek(_fd, 0, SEEK_SET); /* rewind ! */
+
+		if (_fileSize && mode != O_RDONLY) {
+			fio.read(_fd, _cacheBuf, _fileSize);
+			r = fio.sync(_fd);
+			printf(" sz=%d, read=%d\n", _fileSize, r);
+			assert(r == _fileSize);
+		}
+
+		fio.close(_fd);
+	}
+	else
+		_fileSize = 0; /* new file */
+
+	_fd = fio.open(name, mode);
+
+	printf("open %s [%d]\n", name, _fd);
+
+	if (_fd >= 0) {
+		_mode = mode;
+		_filePos = 0;
+
+		if (_fileSize) { /* existing data */
+			if (mode == O_RDONLY) {
+				/* DANGER: for w* modes it will truncate your fine files */
+				fio.seek(_fd, 0, SEEK_SET);
+			}
+			else if (_mode & O_APPEND) {
+				fio.seek(_fd, 0, _fileSize);
+				_filePos = _fileSize;
+			}
+			#if 0 /* file already trunc'd when opened as w* -> moved up */
+			if (mode != O_RDONLY) {
+				fio.read(_fd, _cacheBuf, _fileSize);
+				r = fio.sync(_fd);
+				printf(" sz=%d, read=%d\n", _fileSize, r);
+				assert(r == _fileSize);
+				// _fileSize = fio.seek(_fd, 0, SEEK_END);
+			}
+			#endif
+		}
+
+		printf("  _mode = %x\n", _mode);
+		printf("  _fileSize = %d\n", _fileSize);
 		printf("  _filePos = %d\n", _filePos);
 
 		return true;
 	} else
 		return false;
+#endif
 }
 
 int32 Ps2File::tell(void) {
@@ -152,10 +225,11 @@
 }
 
 bool Ps2File::getErr(void) {
-	return _eof;
+	return _err;
 }
 
 void Ps2File::setErr(bool err) {
+	_err = err;
 	_eof = err;
 }
 
@@ -189,7 +263,9 @@
 		_eof = false;
 		res = 0;
 	}
-	else _eof = true;
+	else {
+		_eof = true;
+	}
 
 	// printf("seek [%d]  %d  %d\n", _fd, offset, origin);
 	// printf("  res = %d\n", res);
@@ -225,7 +301,7 @@
 			_cachePos = cachePosEnd = _filePos & ~READ_ALIGN_MASK;
 			assert(_filePos == _physFilePos);
 		} else {
-            		uint32 cacheDiff = _filePos - _cachePos;
+			uint32 cacheDiff = _filePos - _cachePos;
 			assert(_bytesInCache >= cacheDiff);
 			cacheDiff &= ~READ_ALIGN_MASK;
 			_bytesInCache -= cacheDiff;
@@ -278,10 +354,17 @@
 	printf("read (1) : _cachePos = %d\n", _cachePos);
 #endif
 
+	if (len == 0) {
+#ifdef __PS2_FILE_SEMA__
+		SignalSema(_sema);
+#endif
+		return 0;
+	}
+
 	if (_filePos >= _fileSize) {
 		_eof = true;
 #ifdef __PS2_FILE_SEMA__
-    SignalSema(_sema);
+		SignalSema(_sema);
 #endif
 		return 0;
 	}
@@ -344,32 +427,18 @@
 }
 
 uint32 Ps2File::write(const void *src, uint32 len) {
-	uint32 w;
 #ifdef __PS2_FILE_SEMA__
 	WaitSema(_sema);
 #endif
-	_cacheSize = 0;
 
-	w = fio.sync(_fd);
-	assert(w==0);
+	memcpy(&_cacheBuf[_filePos], src, len);
+	_filePos += len;
 
-	fio.seek(_fd, _filePos, SEEK_SET);
-	fio.write(_fd, src, len);
-
-	w = fio.sync(_fd);
-
 #ifdef __PS2_FILE_SEMA__
 	SignalSema(_sema);
 #endif
 
-	if (w) {
-		_filePos += w;
-		if (w < len)
-			_eof = true;
-		return w;
-	}
-
-	return 0;
+	return len;
 }
 
 FILE *ps2_fopen(const char *fname, const char *mode) {
@@ -468,8 +537,9 @@
 int ps2_ferror(FILE *stream) {
 	int err = ((Ps2File*)stream)->getErr();
 
-	if (err)
+	if (err) {
 		printf("ferror -> %d\n", err);
+	}
 
 	return err;
 }

Modified: scummvm/branches/gsoc2009-16bit/backends/platform/ps2/fileio.h
===================================================================
--- scummvm/branches/gsoc2009-16bit/backends/platform/ps2/fileio.h	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/backends/platform/ps2/fileio.h	2009-07-12 23:54:46 UTC (rev 42432)
@@ -62,15 +62,16 @@
 	void cacheReadSync(void);
 
 	int _fd;
+	uint32 _mode;
 	uint32 _fileSize;
 	uint32 _filePos;
 	uint32 _cacheSize;
 	uint32 _cachePos;
 
-	// uint8 cache[2048];
 	uint8 *_cache;
 
-	int _eof;
+	bool _eof;
+	bool _err;
 	int _sema;
 
 

Modified: scummvm/branches/gsoc2009-16bit/backends/platform/ps2/irxboot.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/backends/platform/ps2/irxboot.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/backends/platform/ps2/irxboot.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -55,15 +55,16 @@
 	{ "USB_MASS.IRX", USB | OPTIONAL, MASS_DRIVER, NULL, 0 },
 	{ "PS2MOUSE.IRX", USB | OPTIONAL, MOUSE_DRIVER, NULL, 0 },
 	{ "RPCKBD.IRX",   USB | OPTIONAL, KBD_DRIVER, NULL, 0 },
-
+#ifndef NO_ADAPTOR
 	{ "POWEROFF.IRX", HDD | OPTIONAL | NOT_HOST | DEPENDANCY, HDD_DRIVER, NULL, 0 },
 	{ "PS2DEV9.IRX",  HDD | OPTIONAL | NOT_HOST | DEPENDANCY, HDD_DRIVER, NULL, 0 },
 	{ "PS2ATAD.IRX",  HDD | OPTIONAL | DEPENDANCY, HDD_DRIVER, NULL, 0 },
 	{ "PS2HDD.IRX",   HDD | OPTIONAL | DEPENDANCY, HDD_DRIVER, hddArg, sizeof(hddArg) },
 	{ "PS2FS.IRX",    HDD | OPTIONAL | DEPENDANCY, HDD_DRIVER, pfsArg, sizeof(pfsArg) },
-	{ "PS2IP.IRX",    NET | NOT_HOST, NET_DRIVER, NULL, 0 },
-	{ "PS2SMAP.IRX",  NET | NOT_HOST, NET_DRIVER, netArg, sizeof(netArg) },
-	{ "PS2HOST.IRX",  NET | NOT_HOST, NET_DRIVER, NULL, 0 }
+	{ "PS2IP.IRX",    NET | OPTIONAL | NOT_HOST | DEPENDANCY, NET_DRIVER, NULL, 0 },
+	{ "PS2SMAP.IRX",  NET | OPTIONAL | NOT_HOST | DEPENDANCY, NET_DRIVER, netArg, sizeof(netArg) },
+	{ "PS2HOST.IRX",  NET | OPTIONAL | NOT_HOST | DEPENDANCY, NET_DRIVER, NULL, 0 }
+#endif
 };
 
 static const int numIrxFiles = sizeof(irxFiles) / sizeof(irxFiles[0]);

Modified: scummvm/branches/gsoc2009-16bit/backends/platform/ps2/ps2input.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/backends/platform/ps2/ps2input.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/backends/platform/ps2/ps2input.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -510,22 +510,22 @@
 };
 
 const Common::KeyCode Ps2Input::_padCodes[16] = {
-	Common::KEYCODE_1,		 // Select
-	Common::KEYCODE_INVALID,			 // L3
-	Common::KEYCODE_INVALID,			 // R3
-	Common::KEYCODE_F5,	 // Start
-	Common::KEYCODE_INVALID,			 //	Up
-	Common::KEYCODE_INVALID,			 //	Right
-	Common::KEYCODE_INVALID,			 //	Down
-	Common::KEYCODE_INVALID,			 //	Left
-	Common::KEYCODE_KP0,	 //	L2
-	Common::KEYCODE_INVALID,			 //	R2
-	Common::KEYCODE_n,		 //	L1
-	Common::KEYCODE_y,		 //	R1
-	Common::KEYCODE_ESCAPE, // Triangle
-	Common::KEYCODE_INVALID,			 //	Circle  => Right mouse button
-	Common::KEYCODE_INVALID,			 //	Cross	=> Left mouse button
-	Common::KEYCODE_RETURN	 //	Square
+	Common::KEYCODE_1,					// Select
+	Common::KEYCODE_INVALID,			// L3
+	Common::KEYCODE_INVALID,			// R3
+	Common::KEYCODE_F5,					// Start
+	Common::KEYCODE_INVALID,			// Up
+	Common::KEYCODE_INVALID,			// Right
+	Common::KEYCODE_INVALID,			// Down
+	Common::KEYCODE_INVALID,			// Left
+	Common::KEYCODE_KP0,				// L2
+	Common::KEYCODE_PERIOD,				// R2
+	Common::KEYCODE_n,					// L1
+	Common::KEYCODE_y,					// R1
+	Common::KEYCODE_ESCAPE,				// Triangle
+	Common::KEYCODE_INVALID,			// Circle  => Right mouse button
+	Common::KEYCODE_INVALID,			// Cross	=> Left mouse button
+	Common::KEYCODE_RETURN				// Square
 };
 
 const Common::KeyCode Ps2Input::_padFlags[16] = {
@@ -544,7 +544,7 @@
 	Common::KEYCODE_INVALID,			 // Triangle
 	Common::KEYCODE_INVALID,			 //	Circle
 	Common::KEYCODE_INVALID,			 //	Cross
-	Common::KEYCODE_INVALID			 //	Square
+	Common::KEYCODE_INVALID				 //	Square
 };
 
 

Modified: scummvm/branches/gsoc2009-16bit/backends/platform/ps2/savefilemgr.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/backends/platform/ps2/savefilemgr.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/backends/platform/ps2/savefilemgr.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -239,10 +239,10 @@
 	if (!savePath.exists() || !savePath.isDirectory())
 		return Common::StringList();
 
-	printf("listSavefiles = %s\n", pattern);
+	printf("listSavefiles = %s\n", pattern.c_str());
 
 	if (_mc) {
-		strcpy(temp, pattern);
+		strcpy(temp, pattern.c_str());
 
 		// mcSplit(temp, game, ext);
 		game = strdup(strtok(temp, "."));
@@ -255,7 +255,7 @@
 	}
 	else {
 		_dir = Common::String(savePath.getPath());
-		search = Common::String(pattern);
+		search = pattern;
 	}
 
 	Common::FSDirectory dir(_dir);

Modified: scummvm/branches/gsoc2009-16bit/backends/platform/ps2/systemps2.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/backends/platform/ps2/systemps2.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/backends/platform/ps2/systemps2.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -66,6 +66,10 @@
 #include "icon.h"
 #include "ps2temp.h"
 
+#ifdef __PS2_DEBUG__
+#include <debug.h>
+#endif
+
 // asm("mfc0	%0, $9\n" : "=r"(tickStart));
 
 extern void *_gp;
@@ -95,6 +99,11 @@
 
 extern AsyncFio fio;
 
+#ifdef __PS2_DEBUG__
+extern "C" int gdb_stub_main(int argc, char *argv[]);
+extern "C" void breakpoint(void);
+#endif
+
 extern "C" int scummvm_main(int argc, char *argv[]);
 
 extern "C" int main(int argc, char *argv[]) {
@@ -117,6 +126,10 @@
 		sioprintf("Result = %d\n", res);
 	}
 
+#ifdef __PS2_DEBUG__
+	gdb_stub_main(argc, argv);
+#endif
+
 	sioprintf("Creating system\n");
 	g_system = g_systemPs2 = new OSystem_PS2(argv[0]);
 
@@ -241,6 +254,8 @@
 	_printY = 0;
 	_msgClearTime = 0;
 	_systemQuit = false;
+	_modeChanged = false;
+	_screenChangeCount = 0;
 
 	_screen = new Gs2dScreen(320, 200, TV_DONT_CARE);
 
@@ -327,9 +342,8 @@
 void OSystem_PS2::init(void) {
 	sioprintf("Timer...\n");
 	_scummTimerManager = new DefaultTimerManager();
-	_scummEventManager = new DefaultEventManager();
 	_scummMixer = new Audio::MixerImpl(this);
-	_scummMixer->setOutputRate(44100);
+	_scummMixer->setOutputRate(48000);
 	_scummMixer->setReady(true);
 	initTimer();
 
@@ -520,6 +534,9 @@
 
 	_oldMouseX = width / 2;
 	_oldMouseY = height / 2;
+
+	_modeChanged = true;
+	_screenChangeCount++;
 	printf("done\n");
 }
 
@@ -574,11 +591,11 @@
 Common::TimerManager *OSystem_PS2::getTimerManager() {
 	return _scummTimerManager;
 }
-
+/*
 Common::EventManager *OSystem_PS2::getEventManager() {
-	return _scummEventManager;
+	return getEventManager();
 }
-
+*/
 Audio::Mixer *OSystem_PS2::getMixer() {
 	return _scummMixer;
 }
@@ -661,7 +678,7 @@
 	return _screen->getOverlayHeight();
 }
 
-Graphics::Surface *OSystem_PS2::lockScreen() {
+Graphics::Surface *OSystem_PS2::lockScreen(void) {
 	return _screen->lockScreen();
 }
 
@@ -669,6 +686,10 @@
 	_screen->unlockScreen();
 }
 
+void OSystem_PS2::fillScreen(uint32 col) {
+	_screen->fillScreen(col);
+}
+
 const OSystem::GraphicsMode OSystem_PS2::_graphicsMode = { NULL, NULL, 0 };
 
 const OSystem::GraphicsMode *OSystem_PS2::getSupportedGraphicsModes(void) const {
@@ -688,7 +709,16 @@
 }
 
 bool OSystem_PS2::pollEvent(Common::Event &event) {
-	bool res = _input->pollEvent(&event);
+	bool res;
+
+	if (_modeChanged) {
+		_modeChanged = false;
+		event.type = Common::EVENT_SCREEN_CHANGED;
+		return true;
+	}
+
+	res = _input->pollEvent(&event);
+
 	if (res && (event.type == Common::EVENT_MOUSEMOVE))
 		_screen->setMouseXy(event.mouse.x, event.mouse.y);
 	return res;

Modified: scummvm/branches/gsoc2009-16bit/backends/platform/ps2/systemps2.h
===================================================================
--- scummvm/branches/gsoc2009-16bit/backends/platform/ps2/systemps2.h	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/backends/platform/ps2/systemps2.h	2009-07-12 23:54:46 UTC (rev 42432)
@@ -27,9 +27,9 @@
 #define SYSTEMPS2_H
 
 #include "common/system.h"
+#include "backends/base-backend.h"
 
 class DefaultTimerManager;
-class DefaultEventManager;
 class DefaultSaveFileManager;
 
 class Gs2dScreen;
@@ -54,7 +54,7 @@
 	class MixerImpl;
 };
 
-class OSystem_PS2 : public OSystem {
+class OSystem_PS2 : public BaseBackend {
 public:
 	OSystem_PS2(const char *elfPath);
 	virtual ~OSystem_PS2(void);
@@ -72,6 +72,7 @@
 	virtual Graphics::Surface *lockScreen();
 	virtual void unlockScreen();
 	virtual void updateScreen();
+	virtual void fillScreen(uint32);
 	/* TODO : check */
 	virtual void displayMessageOnOSD(const char *msg) { printf("displayMessageOnOSD: %s\n", msg); };
 	/* */
@@ -92,7 +93,7 @@
 	virtual uint32 getMillis();
 	virtual void delayMillis(uint msecs);
 	virtual Common::TimerManager *getTimerManager();
-	virtual Common::EventManager *getEventManager();
+//	virtual Common::EventManager *getEventManager();
 	virtual bool pollEvent(Common::Event &event);
 
 	virtual Audio::Mixer *getMixer();
@@ -112,14 +113,14 @@
 	virtual int getDefaultGraphicsMode() const;
 	virtual bool setGraphicsMode(int mode);
 	virtual int getGraphicsMode() const;
+	virtual int getScreenChangeID() const { return _screenChangeCount; }
 
 	virtual void quit();
 
 	virtual Common::SeekableReadStream *createConfigReadStream();
 	virtual Common::WriteStream *createConfigWriteStream();
 
-	virtual Graphics::PixelFormat getOverlayFormat() const;
-
+	virtual Graphics::PixelFormat getOverlayFormat() const; 
 	virtual Common::SaveFileManager *getSavefileManager();
 	virtual FilesystemFactory *getFilesystemFactory();
 
@@ -149,7 +150,6 @@
 	void readRtcTime(void);
 
 	DefaultTimerManager *_scummTimerManager;
-	DefaultEventManager *_scummEventManager;
 	Audio::MixerImpl *_scummMixer;
 
 	bool _mouseVisible;
@@ -163,6 +163,8 @@
 	uint16		_oldMouseX, _oldMouseY;
 	uint32		_msgClearTime;
 	uint16		_printY;
+	bool _modeChanged;
+	int _screenChangeCount;
 
 	int			_mutexSema;
 	Ps2Mutex	_mutex[MAX_MUTEXES];
@@ -179,4 +181,3 @@
 };
 
 #endif // SYSTEMPS2_H
-

Modified: scummvm/branches/gsoc2009-16bit/backends/platform/wince/wince-sdl.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/backends/platform/wince/wince-sdl.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/backends/platform/wince/wince-sdl.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -908,18 +908,13 @@
 	return _sampleRate;
 }
 
-void OSystem_WINCE3::setWindowCaption(const char *caption) {
+void OSystem_WINCE3::engineInit() {
 	check_mappings(); // called here to initialize virtual keys handling
 
 	//update_game_settings();
 	// finalize mixer init
 	compute_sample_rate();
 	setupMixer();
-
-FIXME: move check_mappings() etc. calls to engineInit() & engineDone()
-
-	// handle the actual event
-	OSystem_SDL::setWindowCaption(caption);
 }
 
 bool OSystem_WINCE3::openCD(int drive) {

Modified: scummvm/branches/gsoc2009-16bit/backends/platform/wince/wince-sdl.h
===================================================================
--- scummvm/branches/gsoc2009-16bit/backends/platform/wince/wince-sdl.h	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/backends/platform/wince/wince-sdl.h	2009-07-12 23:54:46 UTC (rev 42432)
@@ -84,7 +84,7 @@
 	// Overloaded from SDL backend (master volume and sample rate subtleties)
 	void setupMixer();
 	// Overloaded from OSystem
-	//void engineInit();
+	void engineInit();
 	void getTimeAndDate(struct tm &t) const;
 	virtual Common::SeekableReadStream *createConfigReadStream();
 	virtual Common::WriteStream *createConfigWriteStream();
@@ -145,7 +145,6 @@
 	//int getGraphicsMode() const;
 	int getDefaultGraphicsMode() const;
 
-	void setWindowCaption(const char *caption);
 	bool openCD(int drive);
 	int getOutputSampleRate() const;
 

Modified: scummvm/branches/gsoc2009-16bit/base/main.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/base/main.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/base/main.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -382,11 +382,15 @@
 			}
 
 			// Quit unless an error occurred, or Return to launcher was requested
+			#ifndef FORCE_RTL
 			if (result == 0 && !g_system->getEventManager()->shouldRTL())
 				break;
-
+			#endif
 			// Reset RTL flag in case we want to load another engine
 			g_system->getEventManager()->resetRTL();
+			#ifdef FORCE_RTL
+			g_system->getEventManager()->resetQuit();
+			#endif
 
 			// Discard any command line options. It's unlikely that the user
 			// wanted to apply them to *all* games ever launched.

Modified: scummvm/branches/gsoc2009-16bit/common/array.h
===================================================================
--- scummvm/branches/gsoc2009-16bit/common/array.h	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/common/array.h	2009-07-12 23:54:46 UTC (rev 42432)
@@ -222,7 +222,13 @@
 
 		T *old_storage = _storage;
 		_capacity = newCapacity;
+		// PS2 gcc 3.2.2 can't do "new T[newCapacity]()" but only
+		// "new T[newCapacity]" -> quick fix until we update tools.
+		#ifndef __PLAYSTATION2__
 		_storage = new T[newCapacity]();
+		#else
+		_storage = new T[newCapacity];
+		#endif
 		assert(_storage);
 
 		if (old_storage) {
@@ -273,7 +279,13 @@
 				// If there is not enough space, allocate more and
 				// copy old elements over.
 				uint newCapacity = roundUpCapacity(_size + n);
+				// PS2 gcc 3.2.2 can't do "new T[newCapacity]()" but only
+				// "new T[newCapacity]" -> quick fix until we update tools.
+				#ifndef __PLAYSTATION2__
 				newStorage = new T[newCapacity]();
+				#else
+				newStorage = new T[newCapacity];
+				#endif
 				assert(newStorage);
 				copy(_storage, _storage + idx, newStorage);
 				pos = newStorage + idx;

Modified: scummvm/branches/gsoc2009-16bit/common/events.h
===================================================================
--- scummvm/branches/gsoc2009-16bit/common/events.h	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/common/events.h	2009-07-12 23:54:46 UTC (rev 42432)
@@ -195,7 +195,9 @@
 	 * Used when we have returned to the launcher.
 	 */
 	virtual void resetRTL() = 0;
-
+#ifdef FORCE_RTL
+	virtual void resetQuit() = 0;
+#endif
 	// Optional: check whether a given key is currently pressed ????
 	//virtual bool isKeyPressed(int keycode) = 0;
 

Modified: scummvm/branches/gsoc2009-16bit/common/util.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/common/util.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/common/util.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -477,7 +477,11 @@
 
 
 	// Print the error message to stderr
+#ifndef __PLAYSTATION2__
 	fputs(buf_output, stderr);
+#else
+	fprintf(stderr, "%s", buf_output);
+#endif
 
 	// Unless this error -originated- within the debugger itself, we
 	// now invoke the debugger, if available / supported.

Modified: scummvm/branches/gsoc2009-16bit/engines/cruise/cruise_main.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/cruise/cruise_main.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/cruise/cruise_main.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -35,6 +35,8 @@
 
 namespace Cruise {
 
+enum RelationType {RT_REL = 30, RT_MSG = 50};
+
 static int playerDontAskQuit;
 unsigned int timer = 0;
 
@@ -1024,8 +1026,8 @@
 		}
 
 		if ((obj2Ovl == nOvl) && (pHeader->obj2Number != -1) && (pHeader->obj2Number == nObj)) {
-//			int x = 60;
-//			int y = 60;
+			int x = 60;
+			int y = 60;
 
 			objectParamsQuery params;
 			memset(&params, 0, sizeof(objectParamsQuery)); // to remove warning
@@ -1035,7 +1037,7 @@
 			}
 
 			if ((pHeader->obj2OldState == -1) || (params.state == pHeader->obj2OldState)) {
-				if (pHeader->type == 30) { // REL
+				if (pHeader->type == RT_REL) { // REL
 					if (currentScriptPtr) {
 						attacheNewScriptToTail(&relHead, ovlIdx, pHeader->id, 30, currentScriptPtr->scriptNumber, currentScriptPtr->overlayNumber, scriptType_REL);
 					} else {
@@ -1073,8 +1075,69 @@
 							changeScriptParamInList(ovlIdx, pHeader->id, &relHead, 0, 9998);
 						}
 					}
-				} else if (pHeader->type == 50) {
-					ASSERT(0);
+				} else if (pHeader->type == RT_MSG) {
+
+					if (pHeader->obj2Number >= 0) {
+						if ((pHeader->trackX !=-1) && (pHeader->trackY !=-1) && 
+								(pHeader->trackX != 9999) && (pHeader->trackY != 9999)) {
+							x = pHeader->trackX - 100;
+							y = pHeader->trackY - 150;
+						} else if (params.scale >= 0) {
+							x = params.X - 100;
+							y = params.Y - 40;
+						}
+
+						if (pHeader->obj2NewState != -1) {
+							objInit(obj2Ovl, pHeader->obj2Number, pHeader->obj2NewState);
+						}
+					}
+
+					if ((pHeader->obj1Number >= 0) && (pHeader->obj1NewState != -1)) {
+						int obj1Ovl = pHeader->obj1Overlay;
+						if (!obj1Ovl) obj1Ovl = ovlIdx;
+						objInit(obj1Ovl, pHeader->obj1Number, pHeader->obj1NewState);
+					}
+
+					if (currentScriptPtr) {
+						createTextObject(&cellHead, ovlIdx, pHeader->id, x, y, 200, findHighColor(), masterScreen, currentScriptPtr->overlayNumber, currentScriptPtr->scriptNumber);
+					} else {
+						createTextObject(&cellHead, ovlIdx, pHeader->id, x, y, 200, findHighColor(), masterScreen, 0, 0);
+					}
+
+					userWait = 1;
+					autoOvl = ovlIdx;
+					autoMsg = pHeader->id;
+				
+					if ((narratorOvl > 0) && (pHeader->trackX != -1) && (pHeader->trackY != -1)) {
+						actorStruct *pTrack = findActor(&actorHead, narratorOvl, narratorIdx, 0);
+
+						if (pTrack)	 {
+							objectParamsQuery naratorParams;
+							animationStart = false;
+
+							if (pHeader->trackDirection == 9999) {
+								getMultipleObjectParam(narratorOvl, narratorIdx, &naratorParams);
+								pTrack->x_dest = naratorParams.X;
+								pTrack->y_dest = naratorParams.Y;
+								pTrack->endDirection = direction(naratorParams.X, naratorParams.Y, pHeader->trackX,pHeader->trackY, 0, 0);
+							} else if ((pHeader->trackX == 9999) && (pHeader->trackY == 9999)) {
+								getMultipleObjectParam(narratorOvl, narratorIdx, &naratorParams);
+								pTrack->x_dest = naratorParams.X;
+								pTrack->y_dest = naratorParams.Y;
+								pTrack->endDirection = pHeader->trackDirection;
+							} else {
+								pTrack->x_dest = pHeader->trackX;
+								pTrack->y_dest = pHeader->trackY;
+								pTrack->endDirection = pHeader->trackDirection;
+							}
+
+							pTrack->flag = 1;
+							autoTrack = true;
+							userWait = 0;
+							userEnabled = 0;
+							freezeCell(&cellHead, ovlIdx, pHeader->id, 5, -1, 0, 9998);
+						}
+					}
 				}
 			}
 		}
@@ -1112,7 +1175,7 @@
 
 		if (pHeader->obj2Number == nObj2) {
 			// REL
-			if (pHeader->type == 30) {
+			if (pHeader->type == RT_REL) {
 				if (currentScriptPtr) {
 					attacheNewScriptToTail(&relHead, ovlIdx, pHeader->id, 30, currentScriptPtr->scriptNumber, currentScriptPtr->overlayNumber, scriptType_REL);
 				} else {
@@ -1150,7 +1213,7 @@
 						changeScriptParamInList(ovlIdx, pHeader->id, &relHead, 0, 9998);
 					}
 				}
-			} else if (pHeader->type == 50) { // MSG
+			} else if (pHeader->type == RT_MSG) { // MSG
 				int obj1Ovl = pHeader->obj1Overlay;
 				if (!obj1Ovl)
 					obj1Ovl = ovlIdx;

Modified: scummvm/branches/gsoc2009-16bit/engines/kyra/script.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/kyra/script.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/kyra/script.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -125,7 +125,7 @@
 		error("No DATA chunk found in file: '%s'", filename);
 
 	if (stream->err())
-		error("Read error while parsing file '%s", filename);
+		error("Read error while parsing file '%s'", filename);
 
 	delete stream;
 

Modified: scummvm/branches/gsoc2009-16bit/engines/kyra/script_tim.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/kyra/script_tim.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/kyra/script_tim.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -169,7 +169,7 @@
 		error("No AVTL chunk found in file: '%s'", filename);
 
 	if (stream->err())
-		error("Read error while parsing file '%s", filename);
+		error("Read error while parsing file '%s'", filename);
 
 	delete stream;
 

Modified: scummvm/branches/gsoc2009-16bit/engines/sci/console.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/sci/console.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/sci/console.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -366,8 +366,8 @@
 }
 
 const char *selector_name(EngineState *s, int selector) {
-	if (selector >= 0 && selector < (int)s->_kernel->getSelectorNamesSize())
-		return s->_kernel->getSelectorName(selector).c_str();
+	if (selector >= 0 && selector < (int)((SciEngine*)g_engine)->getKernel()->getSelectorNamesSize())
+		return ((SciEngine*)g_engine)->getKernel()->getSelectorName(selector).c_str();
 	else
 		return "--INVALID--";
 }
@@ -381,8 +381,8 @@
 
 bool Console::cmdOpcodes(int argc, const char **argv) {
 	DebugPrintf("Opcode names in numeric order [index: type name]:\n");
-	for (uint seeker = 0; seeker < _vm->_gamestate->_kernel->getOpcodesSize(); seeker++) {
-		opcode op = _vm->_gamestate->_kernel->getOpcode(seeker);
+	for (uint seeker = 0; seeker < _vm->getKernel()->getOpcodesSize(); seeker++) {
+		opcode op = _vm->getKernel()->getOpcode(seeker);
 		DebugPrintf("%03x: %03x %20s | ", seeker, op.type, op.name.c_str());
 		if ((seeker % 3) == 2)
 			DebugPrintf("\n");
@@ -400,9 +400,9 @@
 		return true;
 	}
 
-	for (uint seeker = 0; seeker < _vm->_gamestate->_kernel->getSelectorNamesSize(); seeker++) {
-		if (!scumm_stricmp(_vm->_gamestate->_kernel->getSelectorName(seeker).c_str(), argv[1])) {
-			DebugPrintf("Selector %s found at %03x\n", _vm->_gamestate->_kernel->getSelectorName(seeker).c_str(), seeker);
+	for (uint seeker = 0; seeker < _vm->getKernel()->getSelectorNamesSize(); seeker++) {
+		if (!scumm_stricmp(_vm->getKernel()->getSelectorName(seeker).c_str(), argv[1])) {
+			DebugPrintf("Selector %s found at %03x\n", _vm->getKernel()->getSelectorName(seeker).c_str(), seeker);
 			return true;
 		}
 	}
@@ -414,8 +414,8 @@
 
 bool Console::cmdSelectors(int argc, const char **argv) {
 	DebugPrintf("Selector names in numeric order:\n");
-	for (uint seeker = 0; seeker < _vm->_gamestate->_kernel->getSelectorNamesSize(); seeker++) {
-		DebugPrintf("%03x: %20s | ", seeker, _vm->_gamestate->_kernel->getSelectorName(seeker).c_str());
+	for (uint seeker = 0; seeker < _vm->getKernel()->getSelectorNamesSize(); seeker++) {
+		DebugPrintf("%03x: %20s | ", seeker, _vm->getKernel()->getSelectorName(seeker).c_str());
 		if ((seeker % 3) == 2)
 			DebugPrintf("\n");
 	}
@@ -427,8 +427,8 @@
 
 bool Console::cmdKernelFunctions(int argc, const char **argv) {
 	DebugPrintf("Kernel function names in numeric order:\n");
-	for (uint seeker = 0; seeker <  _vm->_gamestate->_kernel->getKernelNamesSize(); seeker++) {
-		DebugPrintf("%03x: %20s | ", seeker, _vm->_gamestate->_kernel->getKernelName(seeker).c_str());
+	for (uint seeker = 0; seeker <  _vm->getKernel()->getKernelNamesSize(); seeker++) {
+		DebugPrintf("%03x: %20s | ", seeker, _vm->getKernel()->getKernelName(seeker).c_str());
 		if ((seeker % 3) == 2)
 			DebugPrintf("\n");
 	}
@@ -439,13 +439,13 @@
 }
 
 bool Console::cmdSuffixes(int argc, const char **argv) {
-	_vm->_gamestate->_vocabulary->printSuffixes();
+	_vm->getVocabulary()->printSuffixes();
 
 	return true;
 }
 
 bool Console::cmdParserWords(int argc, const char **argv) {
-	_vm->_gamestate->_vocabulary->printParserWords();
+	_vm->getVocabulary()->printParserWords();
 
 	return true;
 }
@@ -604,7 +604,7 @@
 		return true;
 	}
 
-	_vm->_gamestate->_kernel->dissectScript(atoi(argv[1]), _vm->_gamestate->_vocabulary);
+	_vm->getKernel()->dissectScript(atoi(argv[1]), _vm->getVocabulary());
 
 	return true;
 }
@@ -894,10 +894,10 @@
 bool Console::cmdSentenceFragments(int argc, const char **argv) {
 	DebugPrintf("Sentence fragments (used to build Parse trees)\n");
 
-	for (uint i = 0; i < _vm->_gamestate->_vocabulary->getParserBranchesSize(); i++) {
+	for (uint i = 0; i < _vm->getVocabulary()->getParserBranchesSize(); i++) {
 		int j = 0;
 
-		const parse_tree_branch_t &branch = _vm->_gamestate->_vocabulary->getParseTreeBranch(i);
+		const parse_tree_branch_t &branch = _vm->getVocabulary()->getParseTreeBranch(i);
 		DebugPrintf("R%02d: [%x] ->", i, branch.id);
 		while ((j < 10) && branch.data[j]) {
 			int dat = branch.data[j++];
@@ -929,7 +929,7 @@
 		DebugPrintf("\n");
 	}
 
-	DebugPrintf("%d rules.\n", _vm->_gamestate->_vocabulary->getParserBranchesSize());
+	DebugPrintf("%d rules.\n", _vm->getVocabulary()->getParserBranchesSize());
 
 	return true;
 }
@@ -952,7 +952,7 @@
 	}
 
 	DebugPrintf("Parsing '%s'\n", string);
-	bool res = _vm->_gamestate->_vocabulary->tokenizeString(words, string, &error);
+	bool res = _vm->getVocabulary()->tokenizeString(words, string, &error);
 	if (res && !words.empty()) {
 		int syntax_fail = 0;
 
@@ -963,7 +963,7 @@
 		for (ResultWordList::const_iterator i = words.begin(); i != words.end(); ++i)
 			DebugPrintf("   Type[%04x] Group[%04x]\n", i->_class, i->_group);
 
-		if (_vm->_gamestate->_vocabulary->parseGNF(_vm->_gamestate->parser_nodes, words, true))
+		if (_vm->getVocabulary()->parseGNF(_vm->_gamestate->parser_nodes, words, true))
 			syntax_fail = 1; // Building a tree failed
 
 		if (syntax_fail)
@@ -1214,7 +1214,7 @@
 bool Console::cmdParseGrammar(int argc, const char **argv) {
 	DebugPrintf("Parse grammar, in strict GNF:\n");
 
-	_vm->_gamestate->_vocabulary->buildGNF(true);
+	_vm->getVocabulary()->buildGNF(true);
 
 	return true;
 }
@@ -2049,12 +2049,12 @@
 		break;
 
 		case EXEC_STACK_TYPE_KERNEL: // Kernel function
-			printf(" %x:[%x]  k%s(", i, call.origin, _vm->_gamestate->_kernel->getKernelName(-(call.selector) - 42).c_str());
+			printf(" %x:[%x]  k%s(", i, call.origin, _vm->getKernel()->getKernelName(-(call.selector) - 42).c_str());
 			break;
 
 		case EXEC_STACK_TYPE_VARSELECTOR:
 			printf(" %x:[%x] vs%s %s::%s (", i, call.origin, (call.argc) ? "write" : "read",
-			          objname, _vm->_gamestate->_kernel->getSelectorName(call.selector).c_str());
+			          objname, _vm->getKernel()->getSelectorName(call.selector).c_str());
 			break;
 		}
 
@@ -2139,8 +2139,8 @@
 		callk_index = strtoul(argv[1], &endptr, 0);
 		if (*endptr != '\0') {
 			callk_index = -1;
-			for (uint i = 0; i < _vm->_gamestate->_kernel->getKernelNamesSize(); i++)
-				if (argv[1] == _vm->_gamestate->_kernel->getKernelName(i)) {
+			for (uint i = 0; i < _vm->getKernel()->getKernelNamesSize(); i++)
+				if (argv[1] == _vm->getKernel()->getKernelName(i)) {
 					callk_index = i;
 					break;
 				}
@@ -2176,7 +2176,7 @@
 	}
 
 	Object *obj = obj_get(_vm->_gamestate, objAddr);
-	int selector_id = _vm->_gamestate->_kernel->findSelector(argv[2]);
+	int selector_id = _vm->getKernel()->findSelector(argv[2]);
 	reg_t addr;
 
 	if (!obj) {
@@ -2276,7 +2276,7 @@
 	Object *o;
 	reg_t fptr;
 
-	selector_id = _vm->_gamestate->_kernel->findSelector(selector_name);
+	selector_id = _vm->getKernel()->findSelector(selector_name);
 
 	if (selector_id < 0) {
 		DebugPrintf("Unknown selector: \"%s\"\n", selector_name);
@@ -3108,7 +3108,7 @@
 	int have_rects = 0;
 	Common::Rect nsrect, nsrect_clipped, brrect;
 
-	if (lookup_selector(s, pos, s->_kernel->_selectorMap.nsBottom, NULL) == kSelectorVariable) {
+	if (lookup_selector(s, pos, ((SciEngine*)g_engine)->getKernel()->_selectorMap.nsBottom, NULL) == kSelectorVariable) {
 		GETRECT(nsLeft, nsRight, nsBottom, nsTop);
 		GETRECT(lsLeft, lsRight, lsBottom, lsTop);
 		GETRECT(brLeft, brRight, brBottom, brTop);
@@ -3122,7 +3122,7 @@
 	x = GET_SELECTOR(pos, x);
 	y = GET_SELECTOR(pos, y);
 	priority = GET_SELECTOR(pos, priority);
-	if (s->_kernel->_selectorMap.z > 0) {
+	if (((SciEngine*)g_engine)->getKernel()->_selectorMap.z > 0) {
 		z = GET_SELECTOR(pos, z);
 		printf("(%d,%d,%d)\n", x, y, z);
 	} else
@@ -3186,10 +3186,10 @@
 	}
 
 
-	is_view = (lookup_selector(s, pos, s->_kernel->_selectorMap.x, NULL) == kSelectorVariable) &&
-	    (lookup_selector(s, pos, s->_kernel->_selectorMap.brLeft, NULL) == kSelectorVariable) &&
-	    (lookup_selector(s, pos, s->_kernel->_selectorMap.signal, NULL) == kSelectorVariable) &&
-	    (lookup_selector(s, pos, s->_kernel->_selectorMap.nsTop, NULL) == kSelectorVariable);
+	is_view = (lookup_selector(s, pos, ((SciEngine*)g_engine)->getKernel()->_selectorMap.x, NULL) == kSelectorVariable) &&
+	    (lookup_selector(s, pos, ((SciEngine*)g_engine)->getKernel()->_selectorMap.brLeft, NULL) == kSelectorVariable) &&
+	    (lookup_selector(s, pos, ((SciEngine*)g_engine)->getKernel()->_selectorMap.signal, NULL) == kSelectorVariable) &&
+	    (lookup_selector(s, pos, ((SciEngine*)g_engine)->getKernel()->_selectorMap.nsTop, NULL) == kSelectorVariable);
 
 	if (!is_view) {
 		printf("Not a dynamic View object.\n");

Modified: scummvm/branches/gsoc2009-16bit/engines/sci/engine/game.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/sci/engine/game.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/sci/engine/game.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -87,7 +87,7 @@
 
 	s->priority_first = 42; // Priority zone 0 ends here
 
-	if (s->_kernel->usesOldGfxFunctions())
+	if (((SciEngine*)g_engine)->getKernel()->usesOldGfxFunctions())
 		s->priority_last = 200;
 	else
 		s->priority_last = 190;
@@ -257,7 +257,7 @@
 		Resource *script = s->resmgr->findResource(ResourceId(kResourceTypeScript, scriptnr), 0);
 
 		if (script) {
-			if (s->_kernel->hasOldScriptHeader())
+			if (((SciEngine*)g_engine)->getKernel()->hasOldScriptHeader())
 				magic_offset = seeker = 2;
 			else
 				magic_offset = seeker = 0;
@@ -327,9 +327,6 @@
 
 	s->kernel_opt_flags = 0;
 
-	s->_kernel = new Kernel(s->resmgr);
-	s->_vocabulary = new Vocabulary(s->resmgr);
-
 	if (s->_version >= SCI_VERSION_1_1)
 		result = create_class_table_sci11(s);
 	else
@@ -375,7 +372,7 @@
 	s->bp_list = NULL; // No breakpoints defined
 	s->have_bp = 0;
 
-	if (s->_kernel->hasLofsAbsolute())
+	if (((SciEngine*)g_engine)->getKernel()->hasLofsAbsolute())
 		s->seg_manager->setExportWidth(1);
 	else
 		s->seg_manager->setExportWidth(0);
@@ -412,11 +409,6 @@
 	script_free_vm_memory(s);
 
 	debug(2, "Freeing state-dependant data");
-
-	delete s->_vocabulary;
-	s->_vocabulary = 0;
-	delete s->_kernel;
-	s->_kernel = 0;
 }
 
 void script_free_breakpoints(EngineState *s) {

Modified: scummvm/branches/gsoc2009-16bit/engines/sci/engine/kernel.h
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/sci/engine/kernel.h	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/sci/engine/kernel.h	2009-07-12 23:54:46 UTC (rev 42432)
@@ -205,7 +205,7 @@
 	kContinueOnInvalidSelector = 1
 };
 
-#define GET_SEL32(_o_, _slc_) read_selector(s, _o_, s->_kernel->_selectorMap._slc_, __FILE__, __LINE__)
+#define GET_SEL32(_o_, _slc_) read_selector(s, _o_, ((SciEngine*)g_engine)->getKernel()->_selectorMap._slc_, __FILE__, __LINE__)
 #define GET_SEL32V(_o_, _slc_) (GET_SEL32(_o_, _slc_).offset)
 #define GET_SEL32SV(_o_, _slc_) ((int16)(GET_SEL32(_o_, _slc_).offset))
 /* Retrieves a selector from an object
@@ -216,8 +216,8 @@
 ** selector_map_t and mapped in script.c.
 */
 
-#define PUT_SEL32(_o_, _slc_, _val_) write_selector(s, _o_, s->_kernel->_selectorMap._slc_, _val_, __FILE__, __LINE__)
-#define PUT_SEL32V(_o_, _slc_, _val_) write_selector(s, _o_, s->_kernel->_selectorMap._slc_, make_reg(0, _val_), __FILE__, __LINE__)
+#define PUT_SEL32(_o_, _slc_, _val_) write_selector(s, _o_, ((SciEngine*)g_engine)->getKernel()->_selectorMap._slc_, _val_, __FILE__, __LINE__)
+#define PUT_SEL32V(_o_, _slc_, _val_) write_selector(s, _o_, ((SciEngine*)g_engine)->getKernel()->_selectorMap._slc_, make_reg(0, _val_), __FILE__, __LINE__)
 /* Writes a selector value to an object
 ** Parameters: (reg_t) object: The address of the object which the selector should be written to
 **             (selector_name) selector: The selector to read
@@ -229,7 +229,7 @@
 
 
 #define INV_SEL(_object_, _selector_, _noinvalid_) \
-	s, _object_,  s->_kernel->_selectorMap._selector_, _noinvalid_, funct_nr, argv, argc, __FILE__, __LINE__
+	s, _object_,  ((SciEngine*)g_engine)->getKernel()->_selectorMap._selector_, _noinvalid_, funct_nr, argv, argc, __FILE__, __LINE__
 /* Kludge for use with invoke_selector(). Used for compatibility with compilers that can't
 ** handle vararg macros.
 */

Modified: scummvm/branches/gsoc2009-16bit/engines/sci/engine/kgraphics.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/sci/engine/kgraphics.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/sci/engine/kgraphics.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -164,7 +164,7 @@
 				return j;
 		return 14; // Maximum
 	} else {
-		if (!s->_kernel->usesOldGfxFunctions())
+		if (!((SciEngine*)g_engine)->getKernel()->usesOldGfxFunctions())
 			return SCI0_VIEW_PRIORITY_14_ZONES(y);
 		else
 			return SCI0_VIEW_PRIORITY(y) == 15 ? 14 : SCI0_VIEW_PRIORITY(y);
@@ -172,7 +172,7 @@
 }
 
 int _find_priority_band(EngineState *s, int nr) {
-	if (!s->_kernel->usesOldGfxFunctions() && (nr < 0 || nr > 14)) {
+	if (!((SciEngine*)g_engine)->getKernel()->usesOldGfxFunctions() && (nr < 0 || nr > 14)) {
 		if (nr == 15)
 			return 0xffff;
 		else {
@@ -181,7 +181,7 @@
 		return 0;
 	}
 
-	if (s->_kernel->usesOldGfxFunctions() && (nr < 0 || nr > 15)) {
+	if (((SciEngine*)g_engine)->getKernel()->usesOldGfxFunctions() && (nr < 0 || nr > 15)) {
 		warning("Attempt to get priority band %d", nr);
 		return 0;
 	}
@@ -191,7 +191,7 @@
 	else {
 		int retval;
 
-		if (!s->_kernel->usesOldGfxFunctions())
+		if (!((SciEngine*)g_engine)->getKernel()->usesOldGfxFunctions())
 			retval = SCI0_PRIORITY_BAND_FIRST_14_ZONES(nr);
 		else
 			retval = SCI0_PRIORITY_BAND_FIRST(nr);
@@ -696,7 +696,7 @@
 
 	angle %= 360;
 
-	if (!s->_kernel->hasOldScriptHeader()) {
+	if (!((SciEngine*)g_engine)->getKernel()->hasOldScriptHeader()) {
 		if (angle < 45)
 			loop = 3;
 		else if (angle < 136)
@@ -1002,7 +1002,7 @@
 	gfx_color_t transparent = s->wm_port->_bgcolor;
 	int picFlags = DRAWPIC01_FLAG_FILL_NORMALLY;
 
-	if (s->_kernel->usesOldGfxFunctions())
+	if (((SciEngine*)g_engine)->getKernel()->usesOldGfxFunctions())
 		add_to_pic = (argc > 2) ? argv[2].toSint16() : false;
 
 	dp.nr = argv[0].toSint16();
@@ -1056,7 +1056,7 @@
 
 	s->priority_first = 42;
 
-	if (s->_kernel->usesOldGfxFunctions())
+	if (((SciEngine*)g_engine)->getKernel()->usesOldGfxFunctions())
 		s->priority_last = 200;
 	else
 		s->priority_last = 190;
@@ -1079,7 +1079,7 @@
 	x = GET_SEL32SV(object, x);
 	original_y = y = GET_SEL32SV(object, y);
 
-	if (s->_kernel->_selectorMap.z > -1)
+	if (((SciEngine*)g_engine)->getKernel()->_selectorMap.z > -1)
 		z = GET_SEL32SV(object, z);
 	else
 		z = 0;
@@ -1133,7 +1133,7 @@
 void _k_base_setter(EngineState *s, reg_t object) {
 	Common::Rect absrect = set_base(s, object);
 
-	if (lookup_selector(s, object, s->_kernel->_selectorMap.brLeft, NULL, NULL) != kSelectorVariable)
+	if (lookup_selector(s, object, ((SciEngine*)g_engine)->getKernel()->_selectorMap.brLeft, NULL, NULL) != kSelectorVariable)
 		return; // non-fatal
 
 	// Note: there was a check here for a very old version of SCI, which supposedly needed
@@ -1214,7 +1214,7 @@
 	x = GET_SEL32SV(object, x);
 	y = GET_SEL32SV(object, y);
 
-	if (s->_kernel->_selectorMap.z > -1)
+	if (((SciEngine*)g_engine)->getKernel()->_selectorMap.z > -1)
 		z = GET_SEL32SV(object, z);
 	else
 		z = 0;
@@ -1238,7 +1238,7 @@
 static void _k_set_now_seen(EngineState *s, reg_t object) {
 	Common::Rect absrect = get_nsrect(s, object, 0);
 
-	if (lookup_selector(s, object, s->_kernel->_selectorMap.nsTop, NULL, NULL) != kSelectorVariable) {
+	if (lookup_selector(s, object, ((SciEngine*)g_engine)->getKernel()->_selectorMap.nsTop, NULL, NULL) != kSelectorVariable) {
 		return;
 	} // This isn't fatal
 
@@ -1724,7 +1724,7 @@
 		 * if ((widget->signal & (_K_VIEW_SIG_FLAG_PRIVATE | _K_VIEW_SIG_FLAG_REMOVE | _K_VIEW_SIG_FLAG_NO_UPDATE)) == _K_VIEW_SIG_FLAG_PRIVATE) {
 		 */
 		if ((widget->signal & (_K_VIEW_SIG_FLAG_REMOVE | _K_VIEW_SIG_FLAG_NO_UPDATE)) == 0) {
-			int has_nsrect = lookup_selector(s, obj, s->_kernel->_selectorMap.nsBottom, NULL, NULL) == kSelectorVariable;
+			int has_nsrect = lookup_selector(s, obj, ((SciEngine*)g_engine)->getKernel()->_selectorMap.nsBottom, NULL, NULL) == kSelectorVariable;
 
 			if (has_nsrect) {
 				int temp;
@@ -1746,7 +1746,7 @@
 			}
 #ifdef DEBUG_LSRECT
 			else
-				fprintf(stderr, "Not lsRecting %04x:%04x because %d\n", PRINT_REG(obj), lookup_selector(s, obj, s->_kernel->_selectorMap.nsBottom, NULL, NULL));
+				fprintf(stderr, "Not lsRecting %04x:%04x because %d\n", PRINT_REG(obj), lookup_selector(s, obj, ((SciEngine*)g_engine)->getKernel()->_selectorMap.nsBottom, NULL, NULL));
 #endif
 
 			if (widget->signal & _K_VIEW_SIG_FLAG_HIDDEN)
@@ -1900,7 +1900,7 @@
 	loop = oldloop = sign_extend_byte(GET_SEL32V(obj, loop));
 	cel = oldcel = sign_extend_byte(GET_SEL32V(obj, cel));
 
-	if (s->_kernel->_selectorMap.palette)
+	if (((SciEngine*)g_engine)->getKernel()->_selectorMap.palette)
 		palette = GET_SEL32V(obj, palette);
 	else
 		palette = 0;
@@ -1923,7 +1923,7 @@
 	}
 
 	ObjVarRef under_bitsp;
-	if (lookup_selector(s, obj, s->_kernel->_selectorMap.underBits, &(under_bitsp), NULL) != kSelectorVariable) {
+	if (lookup_selector(s, obj, ((SciEngine*)g_engine)->getKernel()->_selectorMap.underBits, &(under_bitsp), NULL) != kSelectorVariable) {
 		under_bitsp.obj = NULL_REG;
 		under_bits = NULL_REG;
 		debugC(2, kDebugLevelGraphics, "Object at %04x:%04x has no underBits\n", PRINT_REG(obj));
@@ -1931,7 +1931,7 @@
 		under_bits = *under_bitsp.getPointer(s);
 
 	ObjVarRef signalp;
-	if (lookup_selector(s, obj, s->_kernel->_selectorMap.signal, &(signalp), NULL) != kSelectorVariable) {
+	if (lookup_selector(s, obj, ((SciEngine*)g_engine)->getKernel()->_selectorMap.signal, &(signalp), NULL) != kSelectorVariable) {
 		signalp.obj = NULL_REG;
 		signal = 0;
 		debugC(2, kDebugLevelGraphics, "Object at %04x:%04x has no signal selector\n", PRINT_REG(obj));
@@ -2024,7 +2024,7 @@
 	while (view) {
 		reg_t obj = make_reg(view->_ID, view->_subID);
 		int priority, _priority;
-		int has_nsrect = (view->_ID <= 0) ? 0 : lookup_selector(s, obj, s->_kernel->_selectorMap.nsBottom, NULL, NULL) == kSelectorVariable;
+		int has_nsrect = (view->_ID <= 0) ? 0 : lookup_selector(s, obj, ((SciEngine*)g_engine)->getKernel()->_selectorMap.nsBottom, NULL, NULL) == kSelectorVariable;
 		int oldsignal = view->signal;
 
 		_k_set_now_seen(s, obj);

Modified: scummvm/branches/gsoc2009-16bit/engines/sci/engine/kmisc.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/sci/engine/kmisc.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/sci/engine/kmisc.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -240,7 +240,7 @@
 reg_t kStub(EngineState *s, int funct_nr, int argc, reg_t *argv) {
 	char tmpbuf[200];
 	sprintf(tmpbuf, "Unimplemented syscall: %s[%x] (", 
-					s->_kernel->getKernelName(funct_nr).c_str(), funct_nr);
+					((SciEngine*)g_engine)->getKernel()->getKernelName(funct_nr).c_str(), funct_nr);
 
 	for (int i = 0; i < argc; i++) {
 		char tmpbuf2[20];
@@ -257,7 +257,7 @@
 }
 
 reg_t kNOP(EngineState *s, int funct_nr, int argc, reg_t *argv) {
-	warning("Kernel function 0x%02x (%s) invoked: unmapped", funct_nr, s->_kernel->_kernelFuncs[funct_nr].orig_name.c_str());
+	warning("Kernel function 0x%02x (%s) invoked: unmapped", funct_nr, ((SciEngine*)g_engine)->getKernel()->_kernelFuncs[funct_nr].orig_name.c_str());
 	return NULL_REG;
 }
 

Modified: scummvm/branches/gsoc2009-16bit/engines/sci/engine/kmovement.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/sci/engine/kmovement.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/sci/engine/kmovement.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -267,7 +267,7 @@
 			return;
 		}
 
-		if (lookup_selector(s, motion_class, s->_kernel->_selectorMap.doit, NULL, &fptr) != kSelectorMethod) {
+		if (lookup_selector(s, motion_class, ((SciEngine*)g_engine)->getKernel()->_selectorMap.doit, NULL, &fptr) != kSelectorMethod) {
 			warning("bresenham_autodetect failed");
 			handle_movecnt = INCREMENT_MOVECNT; // Most games do this, so best guess
 			return;
@@ -362,7 +362,7 @@
 
 	debugC(2, kDebugLevelBresen, "New data: (x,y)=(%d,%d), di=%d\n", x, y, bdi);
 
-	if (s->_kernel->_selectorMap.cantBeHere != -1)
+	if (((SciEngine*)g_engine)->getKernel()->_selectorMap.cantBeHere != -1)
 		invoke_selector(INV_SEL(client, cantBeHere, kStopOnInvalidSelector), 0);
 	else
 		invoke_selector(INV_SEL(client, canBeHere, kStopOnInvalidSelector), 0);

Modified: scummvm/branches/gsoc2009-16bit/engines/sci/engine/kscripts.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/sci/engine/kscripts.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/sci/engine/kscripts.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -43,7 +43,7 @@
 void write_selector(EngineState *s, reg_t object, Selector selector_id, reg_t value, const char *fname, int line) {
 	ObjVarRef address;
 
-	if ((selector_id < 0) || (selector_id > (int)s->_kernel->getSelectorNamesSize())) {
+	if ((selector_id < 0) || (selector_id > (int)((SciEngine*)g_engine)->getKernel()->getSelectorNamesSize())) {
 		warning("Attempt to write to invalid selector %d of"
 		         " object at %04x:%04x (%s L%d).", selector_id, PRINT_REG(object), fname, line);
 		return;
@@ -51,7 +51,7 @@
 
 	if (lookup_selector(s, object, selector_id, &address, NULL) != kSelectorVariable)
 		warning("Selector '%s' of object at %04x:%04x could not be"
-		         " written to (%s L%d)", s->_kernel->getSelectorName(selector_id).c_str(), PRINT_REG(object), fname, line);
+		         " written to (%s L%d)", ((SciEngine*)g_engine)->getKernel()->getSelectorName(selector_id).c_str(), PRINT_REG(object), fname, line);
 	else
 		*address.getPointer(s) = value;
 }
@@ -72,7 +72,7 @@
 
 	if (slc_type == kSelectorNone) {
 		warning("Selector '%s' of object at %04x:%04x could not be invoked (%s L%d)",
-		         s->_kernel->getSelectorName(selector_id).c_str(), PRINT_REG(object), fname, line);
+		         ((SciEngine*)g_engine)->getKernel()->getSelectorName(selector_id).c_str(), PRINT_REG(object), fname, line);
 		if (noinvalid == kStopOnInvalidSelector)
 			error("[Kernel] Not recoverable: VM was halted\n");
 		return 1;

Modified: scummvm/branches/gsoc2009-16bit/engines/sci/engine/ksound.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/sci/engine/ksound.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/sci/engine/ksound.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -988,9 +988,9 @@
  * Used for synthesized music playback
  */
 reg_t kDoSound(EngineState *s, int funct_nr, int argc, reg_t *argv) {
-	if (s->_kernel->usesSci1SoundFunctions())
+	if (((SciEngine*)g_engine)->getKernel()->usesSci1SoundFunctions())
 		return kDoSound_SCI1(s, funct_nr, argc, argv);
-	else if (s->_kernel->usesSci01SoundFunctions())
+	else if (((SciEngine*)g_engine)->getKernel()->usesSci01SoundFunctions())
 		return kDoSound_SCI01(s, funct_nr, argc, argv);
 	else
 		return kDoSound_SCI0(s, funct_nr, argc, argv);

Modified: scummvm/branches/gsoc2009-16bit/engines/sci/engine/kstring.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/sci/engine/kstring.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/sci/engine/kstring.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -95,7 +95,7 @@
 
 #ifdef DEBUG_PARSER
 		debugC(2, kDebugLevelParser, "Said block:", 0);
-		s->_vocabulary->decipherSaidBlock(said_block);
+		((SciEngine*)g_engine)->getVocabulary()->decipherSaidBlock(said_block);
 #endif
 
 	if (s->parser_event.isNull() || (GET_SEL32V(s->parser_event, claimed))) {
@@ -190,10 +190,11 @@
 	char *error;
 	ResultWordList words;
 	reg_t event = argv[1];
+	Vocabulary *voc = ((SciEngine*)g_engine)->getVocabulary();
 
 	s->parser_event = event;
 
-	bool res = s->_vocabulary->tokenizeString(words, string, &error);
+	bool res = voc->tokenizeString(words, string, &error);
 	s->parser_valid = 0; /* not valid */
 
 	if (res && !words.empty()) {
@@ -211,7 +212,7 @@
 				debugC(2, kDebugLevelParser, "   Type[%04x] Group[%04x]\n", i->_class, i->_group);
 #endif
 
-		if (s->_vocabulary->parseGNF(s->parser_nodes, words))
+		if (voc->parseGNF(s->parser_nodes, words))
 			syntax_fail = 1; /* Building a tree failed */
 
 		if (syntax_fail) {

Modified: scummvm/branches/gsoc2009-16bit/engines/sci/engine/said.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/sci/engine/said.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/sci/engine/said.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -2449,7 +2449,7 @@
 	if (s->parser_valid) {
 		if (said_parse_spec(s, spec)) {
 			printf("Offending spec was: ");
-			s->_vocabulary->decipherSaidBlock(spec);
+			((SciEngine*)g_engine)->getVocabulary()->decipherSaidBlock(spec);
 			return SAID_NO_MATCH;
 		}
 

Modified: scummvm/branches/gsoc2009-16bit/engines/sci/engine/said.y
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/sci/engine/said.y	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/sci/engine/said.y	2009-07-12 23:54:46 UTC (rev 42432)
@@ -805,7 +805,7 @@
 	if (s->parser_valid) {
 		if (said_parse_spec(s, spec)) {
 			warning("Offending spec was: ");
-			s->_vocabulary->decypherSaidBlock(spec);
+			((SciEngine*)g_engine)->getVocabulary()->decypherSaidBlock(spec);
 			return SAID_NO_MATCH;
 		}
 

Modified: scummvm/branches/gsoc2009-16bit/engines/sci/engine/savegame.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/sci/engine/savegame.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/sci/engine/savegame.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -497,7 +497,7 @@
 }
 
 static byte *find_unique_script_block(EngineState *s, byte *buf, int type) {
-	if (s->_kernel->hasOldScriptHeader())
+	if (((SciEngine*)g_engine)->getKernel()->hasOldScriptHeader())
 		buf += 2;
 
 	do {
@@ -756,13 +756,6 @@
 	// FIXME: Do in-place loading at some point, instead of creating a new EngineState instance from scratch.
 	retval = new EngineState(s->resmgr, s->_version, s->_flags);
 
-	// static VM/Kernel information:
-	assert(0 == retval->_kernel);
-	retval->_kernel = s->_kernel;	// needs to be initialized before _reset_graphics_input is called
-//	s->_kernel = 0;	// FIXME: We should set s->_kernel to 0 here,
-// else it could be freed when the old EngineState is freed. Luckily, this freeing currently
-// never happens, so we don't need to. 
-
 	// Copy some old data
 	retval->gfx_state = s->gfx_state;
 	retval->sound_mute = s->sound_mute;
@@ -821,11 +814,6 @@
 	retval->game_start_time = g_system->getMillis() - retval->game_time * 1000;
 
 	// static parser information:
-	assert(0 == retval->_vocabulary);
-	retval->_vocabulary = s->_vocabulary;
-//	s->_vocabulary = 0;	// FIXME: We should set s->_vocabulary to 0 here,
-// else it could be freed when the old EngineState is freed. Luckily, this freeing currently
-// never happens, so we don't need to. 
 
 	retval->parser_base = make_reg(s->sys_strings_segment, SYS_STRING_PARSER_BASE);
 

Modified: scummvm/branches/gsoc2009-16bit/engines/sci/engine/scriptdebug.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/sci/engine/scriptdebug.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/sci/engine/scriptdebug.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -148,7 +148,7 @@
 
 	if (print_bw_tag)
 		printf("[%c] ", opsize ? 'B' : 'W');
-	printf("%s", s->_kernel->getOpcode(opcode).name.c_str());
+	printf("%s", ((SciEngine*)g_engine)->getKernel()->getOpcode(opcode).name.c_str());
 
 	i = 0;
 	while (g_opcode_formats[opcode][i]) {
@@ -183,8 +183,8 @@
 			}
 
 			if (opcode == op_callk)
-				printf(" %s[%x]", (param_value < s->_kernel->_kernelFuncs.size()) ?
-							((param_value < s->_kernel->getKernelNamesSize()) ? s->_kernel->getKernelName(param_value).c_str() : "[Unknown(postulated)]")
+				printf(" %s[%x]", (param_value < ((SciEngine*)g_engine)->getKernel()->_kernelFuncs.size()) ?
+							((param_value < ((SciEngine*)g_engine)->getKernel()->getKernelNamesSize()) ? ((SciEngine*)g_engine)->getKernel()->getKernelName(param_value).c_str() : "[Unknown(postulated)]")
 							: "<invalid>", param_value);
 			else
 				printf(opsize ? " %02x" : " %04x", param_value);
@@ -238,7 +238,7 @@
 			int stackframe = (scr[pos.offset + 2] >> 1) + (scriptState.restAdjust);
 			int argc = ((scriptState.xs->sp)[- stackframe - 1]).offset;
 
-			if (!s->_kernel->hasOldScriptHeader())
+			if (!((SciEngine*)g_engine)->getKernel()->hasOldScriptHeader())
 				argc += (scriptState.restAdjust);
 
 			printf(" Kernel params: (");
@@ -273,7 +273,7 @@
 				if (!name)
 					name = "<invalid>";
 
-				printf("  %s::%s[", name, (selector > s->_kernel->getSelectorNamesSize()) ? "<invalid>" : selector_name(s, selector));
+				printf("  %s::%s[", name, (selector > ((SciEngine*)g_engine)->getKernel()->getSelectorNamesSize()) ? "<invalid>" : selector_name(s, selector));
 
 				switch (lookup_selector(s, called_obj_addr, selector, 0, &fun_ref)) {
 				case kSelectorMethod:

Modified: scummvm/branches/gsoc2009-16bit/engines/sci/engine/seg_manager.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/sci/engine/seg_manager.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/sci/engine/seg_manager.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -138,7 +138,7 @@
 	if (!script || (s->_version >= SCI_VERSION_1_1 && !heap)) {
 		error("SegManager::setScriptSize: failed to load %s", !script ? "script" : "heap");
 	}
-	if (s->_kernel->hasOldScriptHeader()) {
+	if (((SciEngine*)g_engine)->getKernel()->hasOldScriptHeader()) {
 		scr.buf_size = script->size + READ_LE_UINT16(script->data) * 2;
 		//locals_size = READ_LE_UINT16(script->data) * 2;
 	} else if (s->_version < SCI_VERSION_1_1) {

Modified: scummvm/branches/gsoc2009-16bit/engines/sci/engine/state.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/sci/engine/state.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/sci/engine/state.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -113,9 +113,6 @@
 	seg_manager = 0;
 	gc_countdown = 0;
 
-	_vocabulary = 0;
-	_kernel = 0;
-
 	successor = 0;
 }
 

Modified: scummvm/branches/gsoc2009-16bit/engines/sci/engine/state.h
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/sci/engine/state.h	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/sci/engine/state.h	2009-07-12 23:54:46 UTC (rev 42432)
@@ -257,9 +257,6 @@
 
 	MessageState _msgState;
 
-	Vocabulary *_vocabulary;
-	Kernel *_kernel;
-
 	EngineState *successor; /**< Successor of this state: Used for restoring */
 
 private:
@@ -283,7 +280,7 @@
 // misleading. A different name (and a different place for declaring this)
 // would be highly welcome.
 static inline reg_t not_register(EngineState *s, reg_t r) {
-	if (s->_kernel->_selectorMap.cantBeHere != -1)
+	if (((SciEngine*)g_engine)->getKernel()->_selectorMap.cantBeHere != -1)
 		return make_reg(0, !r.offset);
 	else
 		return r;

Modified: scummvm/branches/gsoc2009-16bit/engines/sci/engine/vm.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/sci/engine/vm.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/sci/engine/vm.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -312,7 +312,7 @@
 			Breakpoint *bp;
 			char method_name [256];
 
-			sprintf(method_name, "%s::%s", obj_get_name(s, send_obj), s->_kernel->getSelectorName(selector).c_str());
+			sprintf(method_name, "%s::%s", obj_get_name(s, send_obj), ((SciEngine*)g_engine)->getKernel()->getSelectorName(selector).c_str());
 
 			bp = s->bp_list;
 			while (bp) {
@@ -952,26 +952,26 @@
 			gc_countdown(s);
 
 			scriptState.xs->sp -= (opparams[1] >> 1) + 1;
-			if (!s->_kernel->hasOldScriptHeader()) {
+			if (!((SciEngine*)g_engine)->getKernel()->hasOldScriptHeader()) {
 				scriptState.xs->sp -= scriptState.restAdjust;
 				s->restAdjust = 0; // We just used up the scriptState.restAdjust, remember?
 			}
 
-			if (opparams[0] >= (int)s->_kernel->_kernelFuncs.size()) {
+			if (opparams[0] >= (int)((SciEngine*)g_engine)->getKernel()->_kernelFuncs.size()) {
 				error("Invalid kernel function 0x%x requested\n", opparams[0]);
 			} else {
 				int argc = ASSERT_ARITHMETIC(scriptState.xs->sp[0]);
 
-				if (!s->_kernel->hasOldScriptHeader())
+				if (!((SciEngine*)g_engine)->getKernel()->hasOldScriptHeader())
 					argc += scriptState.restAdjust;
 
-				if (s->_kernel->_kernelFuncs[opparams[0]].signature
+				if (((SciEngine*)g_engine)->getKernel()->_kernelFuncs[opparams[0]].signature
 						&& !kernel_matches_signature(s,
-						s->_kernel->_kernelFuncs[opparams[0]].signature, argc,
+						((SciEngine*)g_engine)->getKernel()->_kernelFuncs[opparams[0]].signature, argc,
 						scriptState.xs->sp + 1)) {
 					error("[VM] Invalid arguments to kernel call %x\n", opparams[0]);
 				} else {
-					s->r_acc = s->_kernel->_kernelFuncs[opparams[0]].fun(s, opparams[0],
+					s->r_acc = ((SciEngine*)g_engine)->getKernel()->_kernelFuncs[opparams[0]].fun(s, opparams[0],
 														argc, scriptState.xs->sp + 1);
 				}
 				// Call kernel function
@@ -982,7 +982,7 @@
 				xs_new = &(s->_executionStack.back());
 				s->_executionStackPosChanged = true;
 
-				if (!s->_kernel->hasOldScriptHeader())
+				if (!((SciEngine*)g_engine)->getKernel()->hasOldScriptHeader())
 					scriptState.restAdjust = s->restAdjust;
 
 			}
@@ -1194,7 +1194,7 @@
 			if (s->_version >= SCI_VERSION_1_1) {
 				s->r_acc.offset = opparams[0] + local_script->script_size;
 			} else {
-				if (s->_kernel->hasLofsAbsolute())
+				if (((SciEngine*)g_engine)->getKernel()->hasLofsAbsolute())
 					s->r_acc.offset = opparams[0];
 				else
 					s->r_acc.offset = scriptState.xs->addr.pc.offset + opparams[0];
@@ -1214,7 +1214,7 @@
 			if (s->_version >= SCI_VERSION_1_1) {
 				r_temp.offset = opparams[0] + local_script->script_size;
 			} else {
-				if (s->_kernel->hasLofsAbsolute())
+				if (((SciEngine*)g_engine)->getKernel()->hasLofsAbsolute())
 					r_temp.offset = opparams[0];
 				else
 					r_temp.offset = scriptState.xs->addr.pc.offset + opparams[0];
@@ -1500,7 +1500,7 @@
 
 	// Early SCI versions used the LSB in the selector ID as a read/write
 	// toggle, meaning that we must remove it for selector lookup.
-	if (s->_kernel->hasOldScriptHeader())
+	if (((SciEngine*)g_engine)->getKernel()->hasOldScriptHeader())
 		selector_id &= ~1;
 
 	if (!obj) {
@@ -1659,7 +1659,7 @@
 
 	Script *scr = s->seg_manager->getScript(seg_id);
 
-	if (s->_kernel->hasOldScriptHeader()) {
+	if (((SciEngine*)g_engine)->getKernel()->hasOldScriptHeader()) {
 		//
 		int locals_nr = READ_LE_UINT16(script->data);
 
@@ -1835,7 +1835,7 @@
 }
 
 void script_uninstantiate_sci0(EngineState *s, int script_nr, SegmentId seg) {
-	reg_t reg = make_reg(seg, s->_kernel->hasOldScriptHeader() ? 2 : 0);
+	reg_t reg = make_reg(seg, ((SciEngine*)g_engine)->getKernel()->hasOldScriptHeader() ? 2 : 0);
 	int objtype, objlength;
 	Script *scr = s->seg_manager->getScript(seg);
 
@@ -1879,7 +1879,7 @@
 }
 
 void script_uninstantiate(EngineState *s, int script_nr) {
-	reg_t reg = make_reg(0, s->_kernel->hasOldScriptHeader() ? 2 : 0);
+	reg_t reg = make_reg(0, ((SciEngine*)g_engine)->getKernel()->hasOldScriptHeader() ? 2 : 0);
 
 	reg.segment = s->seg_manager->segGet(script_nr);
 	Script *scr = script_locate_by_segment(s, reg.segment);
@@ -1938,7 +1938,7 @@
 			script_init_engine(s);
 			game_init(s);
 			sfx_reset_player();
-			_init_stack_base_with_selector(s, s->_kernel->_selectorMap.play);
+			_init_stack_base_with_selector(s, ((SciEngine*)g_engine)->getKernel()->_selectorMap.play);
 
 			send_selector(s, s->game_obj, s->game_obj, s->stack_base, 2, s->stack_base);
 
@@ -1957,7 +1957,7 @@
 					debugC(2, kDebugLevelVM, "Restarting with replay()\n");
 					s->_executionStack.clear(); // Restart with replay
 
-					_init_stack_base_with_selector(s, s->_kernel->_selectorMap.replay);
+					_init_stack_base_with_selector(s, ((SciEngine*)g_engine)->getKernel()->_selectorMap.replay);
 
 					send_selector(s, s->game_obj, s->game_obj, s->stack_base, 2, s->stack_base);
 				}
@@ -1976,7 +1976,7 @@
 	EngineState *s = *_s;
 
 	debugC(2, kDebugLevelVM, "Calling %s::play()\n", s->_gameName.c_str());
-	_init_stack_base_with_selector(s, s->_kernel->_selectorMap.play); // Call the play selector
+	_init_stack_base_with_selector(s, ((SciEngine*)g_engine)->getKernel()->_selectorMap.play); // Call the play selector
 
 	// Now: Register the first element on the execution stack-
 	if (!send_selector(s, s->game_obj, s->game_obj, s->stack_base, 2, s->stack_base)) {

Modified: scummvm/branches/gsoc2009-16bit/engines/sci/engine/vm.h
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/sci/engine/vm.h	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/sci/engine/vm.h	2009-07-12 23:54:46 UTC (rev 42432)
@@ -419,7 +419,7 @@
  * @return		0 on success, 1 if vocab.996 (the class table) is missing
  * 				or corrupted
  */
-int script_init_engine(EngineState *s);
+int script_init_engine(EngineState *);
 
 /**
  * Sets the gamestate's save_dir to the parameter path

Modified: scummvm/branches/gsoc2009-16bit/engines/sci/sci.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/sci/sci.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/sci/sci.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -100,7 +100,10 @@
 	// Remove all of our debug levels here
 	Common::clearAllDebugChannels();
 
+	delete _kernel;
+	delete _vocabulary;
 	delete _console;
+	delete _resmgr;
 }
 
 Common::Error SciEngine::run() {
@@ -143,6 +146,8 @@
 		return Common::kNoGameDataFoundError;
 	}
 
+	_kernel = new Kernel(_resmgr);
+	_vocabulary = new Vocabulary(_resmgr);
 	script_adjust_opcode_formats(_resmgr->_sciVersion);
 
 #if 0
@@ -235,8 +240,6 @@
 
 	delete _gamestate;
 
-	delete _resmgr;
-
 	gfxop_exit(&gfx_state);
 
 	return Common::kNoError;

Modified: scummvm/branches/gsoc2009-16bit/engines/sci/sci.h
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/sci/sci.h	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/sci/sci.h	2009-07-12 23:54:46 UTC (rev 42432)
@@ -35,6 +35,8 @@
 
 class Console;
 struct EngineState;
+class Kernel;
+class Vocabulary;
 
 // our engine debug levels
 enum kDebugLevels {
@@ -107,7 +109,9 @@
 	Common::Language getLanguage() const;
 	Common::Platform getPlatform() const;
 	uint32 getFlags() const;
-	ResourceManager *getResMgr() { return _resmgr; }
+	ResourceManager *getResMgr() const { return _resmgr; }
+	Kernel *getKernel() const { return _kernel; }
+	Vocabulary *getVocabulary() const { return _vocabulary; }
 
 	Common::String getSavegameName(int nr) const;
 	Common::String getSavegamePattern() const;
@@ -122,6 +126,8 @@
 	const SciGameDescription *_gameDescription;
 	ResourceManager *_resmgr;
 	EngineState *_gamestate;
+	Kernel *_kernel;
+	Vocabulary *_vocabulary;
 	Console *_console;
 };
 

Modified: scummvm/branches/gsoc2009-16bit/engines/scumm/gfx.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/scumm/gfx.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/scumm/gfx.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -36,7 +36,7 @@
 #include "scumm/util.h"
 
 #ifdef USE_ARM_GFX_ASM
-extern "C" void asmDrawStripToScreen(int height, int width, byte const* text, byte const* src, byte* dst,
+extern "C" void asmDrawStripToScreen(int height, int width, void const* text, void const* src, byte* dst,
 	int vsPitch, int vmScreenWidth, int textSurfacePitch);
 extern "C" void asmCopy8Col(byte* dst, int dstPitch, const byte* src, int height);
 #endif /* USE_ARM_GFX_ASM */

Modified: scummvm/branches/gsoc2009-16bit/engines/scumm/saveload.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/scumm/saveload.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/scumm/saveload.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -137,7 +137,7 @@
 		memcpy(hdr.name, _saveLoadName, sizeof(hdr.name));
 		saveSaveGameHeader(out, hdr);
 	}
-#if !defined(__DS__)
+#if !defined(__DS__) /* && !defined(__PLAYSTATION2__) */
 	Graphics::saveThumbnail(*out);
 #endif
 	saveInfos(out);

Modified: scummvm/branches/gsoc2009-16bit/engines/sword1/sound.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/sword1/sound.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/sword1/sound.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -51,6 +51,7 @@
 	strcpy(_filePath, searchPath);
 	_mixer = mixer;
 	_resMan = pResMan;
+	_bigEndianSpeech = false;
 	_cowHeader = NULL;
 	_endOfQueue = 0;
 	_currentCowFile = 0;
@@ -67,6 +68,83 @@
 	closeCowSystem();
 }
 
+void Sound::checkSpeechFileEndianness() {
+	// Some mac versions (not all of them) use big endian wav, although
+	// the wav header doesn't indicate it.
+	// Use heuristic to determine endianness of speech.
+	// The heuristic consist in computing the sum of the absolute difference for
+	// every two consecutive samples. This is done both with a big endian and a
+	// little endian assumption. The one with the smallest sum should be the
+	// correct one (the sound wave is supposed to be relatively smooth).
+	// It needs at least 1000 samples to get stable result (the code below is
+	// using the first 2000 samples of the wav sound.
+
+	// Init speach file if not already done.
+	if (!_currentCowFile) {
+		// Open one of the speech file. It uses SwordEngine::_systemVars.currentCD
+		// to decide which file to open, therefore if it is currently set to zero
+		// we have to set it to either 1 or 2 (I decided to set it to 1 as this is
+		// more likely to be the first file that will be needed).
+		bool no_current_cd = false;
+		if (SwordEngine::_systemVars.currentCD == 0) {
+			SwordEngine::_systemVars.currentCD = 1;
+			no_current_cd = true;
+		}
+		initCowSystem();
+		if (no_current_cd) {
+			// In case it fails with CD1 retyr with CD2
+			if (!_currentCowFile) {
+				SwordEngine::_systemVars.currentCD = 2;
+				initCowSystem();
+			}
+			// Reset curentCD flag
+			SwordEngine::_systemVars.currentCD = 0;
+		}
+	}
+
+	// Testing for endianness makes sense only if using the nom compressed files.
+	if (_cowHeader == NULL || (_cowMode != CowWave && _cowMode != CowDemo))
+		return;
+
+	// I picked the sample to use randomly (I just made sure it is long enough so that there is
+	// a fair change of the heuristic to have a stable result and work for every languages).
+	int roomNo = _currentCowFile == 1 ? 1 : 129;
+	int localNo = _currentCowFile == 1 ? 2 : 933;
+	// Get the speech data and apply the heuristic
+	uint32 locIndex = _cowHeader[roomNo] >> 2;
+	uint32 sampleSize = _cowHeader[locIndex + (localNo * 2)];
+	uint32 index = _cowHeader[locIndex + (localNo * 2) - 1];
+	if (sampleSize) {
+		uint32 size;
+		double be_diff_sum = 0., le_diff_sum = 0.;
+		_bigEndianSpeech = false;
+		int16 *data = uncompressSpeech(index + _cowHeaderSize, sampleSize, &size);
+		// Compute average of differecen between two consecutive samples for both BE and LE
+		if (data) {
+			if (size > 4000)
+				size = 2000;
+			else
+				size /= 2;
+			int16 prev_be_value = (int16)SWAP_BYTES_16(*((uint16*)(data)));
+			for (uint32 i = 1 ; i < size ; ++i) {
+				le_diff_sum += fabs(data[i] - data[i-1]);
+				int16 be_value = (int16)SWAP_BYTES_16(*((uint16*)(data + i)));
+				be_diff_sum += fabs(be_value - prev_be_value);
+				prev_be_value = be_value;
+			}
+			delete [] data;
+		}
+		// Set the big endian flag
+		_bigEndianSpeech = (be_diff_sum < le_diff_sum);
+		if (_bigEndianSpeech)
+			debug(6, "Mac version: using big endian speech file");
+		else
+			debug(6, "Mac version: using little endian speech file");
+		debug(8, "Speech endianness heuristic: average = %f for BE and %f for LE, computed on %d samples)", be_diff_sum / (size - 1), le_diff_sum / (size - 1), size);
+	}
+}
+
+
 int Sound::addToQueue(int32 fxNo) {
 	bool alreadyInQueue = false;
 	for (uint8 cnt = 0; (cnt < _endOfQueue) && (!alreadyInQueue); cnt++)
@@ -386,21 +464,32 @@
 		int16 *dstData = (int16*)malloc(resSize * 2);
 		int32 samplesLeft = resSize;
 		while (srcPos < cSize && samplesLeft > 0) {
-			length = (int16)READ_LE_UINT16(srcData + srcPos);
+			length = (int16)(_bigEndianSpeech ? READ_BE_UINT16(srcData + srcPos) : READ_LE_UINT16(srcData + srcPos));
 			srcPos++;
 			if (length < 0) {
 				length = -length;
 				if (length > samplesLeft)
 					length = samplesLeft;
+				int16 value;
+				if (_bigEndianSpeech) {
+					value = (int16)SWAP_BYTES_16(*((uint16*)(srcData + srcPos)));
+				} else {
+					value = srcData[srcPos];
+				}
 				for (uint16 cnt = 0; cnt < (uint16)length; cnt++)
-					dstData[dstPos++] = srcData[srcPos];
+					dstData[dstPos++] = value;
 				srcPos++;
 			} else {
 				if (length > samplesLeft)
 					length = samplesLeft;
-				memcpy(dstData + dstPos, srcData + srcPos, length * 2);
-				dstPos += length;
-				srcPos += length;
+				if (_bigEndianSpeech) {
+					for (uint16 cnt = 0; cnt < (uint16)length; cnt++)
+						dstData[dstPos++] = (int16)SWAP_BYTES_16(*((uint16*)(srcData + (srcPos++))));
+				} else {
+					memcpy(dstData + dstPos, srcData + srcPos, length * 2);
+					dstPos += length;
+					srcPos += length;
+				}
 			}
 			samplesLeft -= length;
 		}

Modified: scummvm/branches/gsoc2009-16bit/engines/sword1/sound.h
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/sword1/sound.h	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/sword1/sound.h	2009-07-12 23:54:46 UTC (rev 42432)
@@ -95,6 +95,8 @@
 
 	void engine(void);
 
+	void checkSpeechFileEndianness();
+
 private:
 	uint8 _sfxVolL, _sfxVolR, _speechVolL, _speechVolR;
 	void playSample(QueueElement *elem);
@@ -116,6 +118,7 @@
 	uint8		 _endOfQueue;
 	Audio::Mixer *_mixer;
 	ResMan *_resMan;
+	bool _bigEndianSpeech;
 	char _filePath[100];
 	static const char _musicList[270];
 	static const uint16 _roomsFixedFx[TOTAL_ROOMS][TOTAL_FX_PER_ROOM];

Modified: scummvm/branches/gsoc2009-16bit/engines/sword1/sword1.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/engines/sword1/sword1.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/engines/sword1/sword1.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -145,6 +145,10 @@
 
 	_systemVars.playSpeech = 1;
 	_mouseState = 0;
+	
+	// Some Mac versions use big endian for the speech files but not all of them.
+	if (_systemVars.platform == Common::kPlatformMacintosh)
+		_sound->checkSpeechFileEndianness();
 
 	_logic->initialize();
 	_objectMan->initialize();

Modified: scummvm/branches/gsoc2009-16bit/gui/ListWidget.cpp
===================================================================
--- scummvm/branches/gsoc2009-16bit/gui/ListWidget.cpp	2009-07-12 23:42:12 UTC (rev 42431)
+++ scummvm/branches/gsoc2009-16bit/gui/ListWidget.cpp	2009-07-12 23:54:46 UTC (rev 42432)
@@ -564,7 +564,7 @@
 		// Restrict the list to everything which contains all words in _filter
 		// as substrings, ignoring case.
 		
-		Common::StringTokenizer tok(filter);
+		Common::StringTokenizer tok(_filter);
 		String tmp;
 		int n = 0;
 


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