[Scummvm-cvs-logs] SF.net SVN: scummvm: [24531] scummvm/trunk/engines/agos

kirben at users.sourceforge.net kirben at users.sourceforge.net
Fri Oct 27 14:56:05 CEST 2006


Revision: 24531
          http://svn.sourceforge.net/scummvm/?rev=24531&view=rev
Author:   kirben
Date:     2006-10-27 05:55:48 -0700 (Fri, 27 Oct 2006)

Log Message:
-----------
Cleanup

Modified Paths:
--------------
    scummvm/trunk/engines/agos/agos.h
    scummvm/trunk/engines/agos/gfx.cpp
    scummvm/trunk/engines/agos/intern.h
    scummvm/trunk/engines/agos/module.mk
    scummvm/trunk/engines/agos/script.cpp
    scummvm/trunk/engines/agos/vga.cpp
    scummvm/trunk/engines/agos/vga_ff.cpp
    scummvm/trunk/engines/agos/vga_s1.cpp
    scummvm/trunk/engines/agos/vga_s2.cpp

Added Paths:
-----------
    scummvm/trunk/engines/agos/vga_e2.cpp
    scummvm/trunk/engines/agos/vga_ww.cpp

Modified: scummvm/trunk/engines/agos/agos.h
===================================================================
--- scummvm/trunk/engines/agos/agos.h	2006-10-27 11:43:17 UTC (rev 24530)
+++ scummvm/trunk/engines/agos/agos.h	2006-10-27 12:55:48 UTC (rev 24531)
@@ -867,32 +867,26 @@
 	bool getBitFlag(uint bit);
 	void setBitFlag(uint bit, bool value);
 
-	// Simon1/Simon2 video script opcodes
+	// Video Script Opcodes, Common
 	void vc1_fadeOut();
 	void vc2_call();
 	void vc3_loadSprite();
 	void vc4_fadeIn();
-	void vc5_skip_if_neq();
-	void vc6_skip_ifn_sib_with_a();
-	void vc7_skip_if_sib_with_a();
-	void vc8_skip_if_parent_is();
-	void vc9_skip_if_unk3_is();
+	void vc5_ifEqual();
+	void vc6_ifObjectHere();
+	void vc7_ifObjectNotHere();
+	void vc8_ifObjectIsAt();
+	void vc9_ifObjectStateIs();
 	void vc10_draw();
-	void vc11();
-	void vc11_clearPathFinder();
 	void vc12_delay();
 	void vc13_addToSpriteX();
 	void vc14_addToSpriteY();
 	void vc15_sync();
 	void vc16_waitSync();
-	void vc17_waitEnd();
-	void vc17_setPathfinderItem();
 	void vc18_jump();
 	void vc19_loop();
 	void vc20_setRepeat();
 	void vc21_endRepeat();
-	void vc22_setPaletteOld();
-	void vc22_setPaletteNew();
 	void vc23_setPriority();
 	void vc24_setSpriteXY();
 	void vc25_halt_sprite();
@@ -902,65 +896,79 @@
 	void vc29_stopAllSounds();
 	void vc30_setFrameRate();
 	void vc31_setWindow();
-	void vc32_saveScreen();
-	void vc32_copyVar();
 	void vc33_setMouseOn();
 	void vc34_setMouseOff();
 	void vc35_clearWindow();
 	void vc36_setWindowImage();
-	void vc37_pokePalette();
-	void vc37_addToSpriteY();
-	void vc38_skipIfVarZero();
+	void vc38_ifVarNotZero();
 	void vc39_setVar();
 	void vc40();
 	void vc41();
 	void vc42_delayIfNotEQ();
-	void vc43_skipIfBitClear();
-	void vc44_skipIfBitSet();
+
+	// Video Script Opcodes, Elvira 1
+	void vc11_onStop();
+	void vc17_waitEnd();
+	void vc22_setPaletteOld();
+	void vc32_saveScreen();
+	void vc37_pokePalette();
+
+	// Video Script Opcodes, Elvira 2
+	void vc43_ifBitSet();
+	void vc44_ifBitClear();
 	void vc45_setWindowPalette();
-	void vc45_setSpriteX();
 	void vc46_setPaletteSlot1();
-	void vc46_setSpriteY();
 	void vc47_setPaletteSlot2();
-	void vc47_addToVar();
 	void vc48_setPaletteSlot3();
-	void vc48_setPathFinder();
 	void vc49_setBit();
 	void vc50_clearBit();
 	void vc51_enableBox();
 	void vc52_playSound();
 	void vc53_dissolveIn();
-	void vc53_panSFX();
 	void vc54_dissolveOut();
 	void vc55_moveBox();
 	void vc56_fullScreen();
-	void vc56_delayLong();
 	void vc57_blackPalette();
 	void vc58_checkCodeWheel();
 	void vc58_changePriority();
-	void vc59_skipIfNotEGA();
-	void vc59_skipIfSpeechEnded();
-	void vc59_stopAnimations();
+	void vc59_ifEGA();
+
+	// Video Script Opcodes, Waxworks
 	void vc60_stopAnimation();
 	void vc61();
-	void vc61_setMaskImage();
 	void vc62_fastFadeOut();
 	void vc63_fastFadeIn();
 
-	// Simon2 specific Video Script Opcodes
-	void vc64_skipIfSpeechEnded();
+	// Video Script Opcodes, Simon 1
+	void vc11_clearPathFinder();
+	void vc17_setPathfinderItem();
+	void vc32_copyVar();
+	void vc37_addToSpriteY();
+	void vc45_setSpriteX();
+	void vc46_setSpriteY();
+	void vc47_addToVar();
+	void vc48_setPathFinder();
+	void vc59_ifSpeech();
+	void vc61_setMaskImage();
+	void vc22_setPaletteNew();
+
+	// Video Script Opcodes, Simon 2
+	void vc56_delayLong();
+	void vc59_stopAnimations();
+	void vc64_ifSpeech();
 	void vc65_slowFadeIn();
-	void vc66_skipIfNotEqual();
-	void vc67_skipIfGE();
-	void vc68_skipIfLE();
-	void vc69_playTrack();
-	void vc70_queueMusic();
-	void vc71_checkMusicQueue();
-	void vc72_play_track_2();
+	void vc66_ifEqual();
+	void vc67_ifLE();
+	void vc68_ifGE();
+	void vc69_playSeq();
+	void vc70_joinSeq();
+	void vc71_ifSeqWaiting();
+	void vc72_segue();
 	void vc73_setMark();
 	void vc74_clearMark();
 
-	// Feeble specific Video Script Opcodes
+	// Video Script Opcodes, Feeble Files
+	void vc53_panSFX();
 	void vc75_setScale();
 	void vc76_setScaleXOffs();
 	void vc77_setScaleYOffs();

Modified: scummvm/trunk/engines/agos/gfx.cpp
===================================================================
--- scummvm/trunk/engines/agos/gfx.cpp	2006-10-27 11:43:17 UTC (rev 24530)
+++ scummvm/trunk/engines/agos/gfx.cpp	2006-10-27 12:55:48 UTC (rev 24531)
@@ -760,4 +760,356 @@
 	} while (--num);
 }
 
+void AGOSEngine::animate(uint windowNum, uint zoneNum, uint vgaSpriteId, uint x, uint y, uint palette, bool vgaScript) {
+	VgaSprite *vsp;
+	VgaPointersEntry *vpe;
+	byte *p, *pp;
+	uint count;
+
+	if (isSpriteLoaded(vgaSpriteId, zoneNum))
+		return;
+
+	vsp = _vgaSprites;
+	while (vsp->id != 0)
+		vsp++;
+
+	vsp->windowNum = windowNum;
+	vsp->priority = 0;
+	vsp->flags = 0;
+
+	vsp->y = y;
+	vsp->x = x;
+	vsp->image = 0;
+	if (getGameType() == GType_ELVIRA1 || getGameType() == GType_ELVIRA2 || getGameType() == GType_WW)
+		vsp->palette = 0;
+	else
+		vsp->palette = palette;
+	vsp->id = vgaSpriteId;
+
+	if (getGameType() == GType_SIMON2 || getGameType() == GType_FF || getGameType() == GType_PP)
+		vsp->zoneNum = zoneNum;
+	else
+		vsp->zoneNum = zoneNum = vgaSpriteId / 100;
+
+	for (;;) {
+		vpe = &_vgaBufferPointers[zoneNum];
+		_curVgaFile1 = vpe->vgaFile1;
+		if (vgaScript) {
+			if (vpe->vgaFile1 != NULL)
+				break;
+			if (_zoneNumber != zoneNum)
+				_noOverWrite = _zoneNumber;
+
+			loadZone(zoneNum);
+			_noOverWrite = 0xFFFF;
+		} else {
+			_zoneNumber = zoneNum;
+			if (vpe->vgaFile1 != NULL)
+				break;
+			loadZone(zoneNum);
+		}
+	}
+
+	pp = _curVgaFile1;
+	if (getGameType() == GType_FF || getGameType() == GType_PP) {
+		p = pp + READ_LE_UINT16(pp + 2);
+		count = READ_LE_UINT16(&((VgaFileHeader2_Feeble *) p)->animationCount);
+		p = pp + READ_LE_UINT16(&((VgaFileHeader2_Feeble *) p)->animationTable);
+
+		while (count--) {
+			if (READ_LE_UINT16(&((AnimationHeader_Feeble *) p)->id) == vgaSpriteId)
+				break;
+			p += sizeof(AnimationHeader_Feeble);
+		}
+		assert(READ_LE_UINT16(&((AnimationHeader_Feeble *) p)->id) == vgaSpriteId);
+	} else if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) {
+		p = pp + READ_BE_UINT16(pp + 4);
+		count = READ_BE_UINT16(&((VgaFileHeader2_Common *) p)->animationCount);
+		p = pp + READ_BE_UINT16(&((VgaFileHeader2_Common *) p)->animationTable);
+
+		while (count--) {
+			if (READ_BE_UINT16(&((AnimationHeader_Simon *) p)->id) == vgaSpriteId)
+				break;
+			p += sizeof(AnimationHeader_Simon);
+		}
+		assert(READ_BE_UINT16(&((AnimationHeader_Simon *) p)->id) == vgaSpriteId);
+	} else {
+		p = pp + READ_BE_UINT16(pp + 10);
+		p += 20;
+
+		count = READ_BE_UINT16(&((VgaFileHeader2_Common *) p)->animationCount);
+		p = pp + READ_BE_UINT16(&((VgaFileHeader2_Common *) p)->animationTable);
+
+		while (count--) {
+			if (READ_BE_UINT16(&((AnimationHeader_WW *) p)->id) == vgaSpriteId)
+				break;
+			p += sizeof(AnimationHeader_WW);
+		}
+		assert(READ_BE_UINT16(&((AnimationHeader_WW *) p)->id) == vgaSpriteId);
+	}
+
+#ifdef DUMP_FILE_NR
+	{
+		static bool dumped = false;
+		if (res == DUMP_FILE_NR && !dumped) {
+			dumped = true;
+			dumpVgaFile(_curVgaFile1);
+		}
+	}
+#endif
+
+#ifdef DUMP_BITMAPS_FILE_NR
+	{
+		static bool dumped = false;
+		if (res == DUMP_BITMAPS_FILE_NR && !dumped) {
+			dumped = true;
+			dumpVgaBitmaps(_curVgaFile2, _curVgaFile1, zoneNum);
+		}
+	}
+#endif
+
+	if (_startVgaScript) {
+		if (getGameType() == GType_FF || getGameType() == GType_PP) {
+			dumpVgaScript(_curVgaFile1 + READ_LE_UINT16(&((AnimationHeader_Feeble*)p)->scriptOffs), zoneNum, vgaSpriteId);
+		} else if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) {
+			dumpVgaScript(_curVgaFile1 + READ_BE_UINT16(&((AnimationHeader_Simon*)p)->scriptOffs), zoneNum, vgaSpriteId);
+		} else {
+			dumpVgaScript(_curVgaFile1 + READ_BE_UINT16(&((AnimationHeader_WW*)p)->scriptOffs), zoneNum, vgaSpriteId);
+		}
+	}
+
+	if (getGameType() == GType_FF || getGameType() == GType_PP) {
+		addVgaEvent(_vgaBaseDelay, _curVgaFile1 + READ_LE_UINT16(&((AnimationHeader_Feeble *) p)->scriptOffs), vgaSpriteId, zoneNum);
+	} else if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) {
+		addVgaEvent(_vgaBaseDelay, _curVgaFile1 + READ_BE_UINT16(&((AnimationHeader_Simon *) p)->scriptOffs), vgaSpriteId, zoneNum);
+	} else {
+		addVgaEvent(_vgaBaseDelay, _curVgaFile1 + READ_BE_UINT16(&((AnimationHeader_WW *) p)->scriptOffs), vgaSpriteId, zoneNum);
+	}
+}
+
+void AGOSEngine::setImage(uint16 vga_res_id, bool vgaScript) {
+	uint zoneNum;
+	VgaPointersEntry *vpe;
+	byte *bb, *b;
+	uint16 count;
+	const byte *vc_ptr_org;
+
+	zoneNum = vga_res_id / 100;
+
+	for (;;) {
+		vpe = &_vgaBufferPointers[zoneNum];
+		_curVgaFile1 = vpe->vgaFile1;
+		_curVgaFile2 = vpe->vgaFile2;
+
+		if (vgaScript) {
+			if (vpe->vgaFile1 != NULL)
+				break;
+			if (_zoneNumber != zoneNum)
+				_noOverWrite = _zoneNumber;
+
+			loadZone(zoneNum);
+			_noOverWrite = 0xFFFF;
+		} else {
+			_curSfxFile = vpe->sfxFile;
+			_zoneNumber = zoneNum;
+
+			if (vpe->vgaFile1 != NULL)
+				break;
+
+			loadZone(zoneNum);
+		}
+	}
+
+	bb = _curVgaFile1;
+	if (getGameType() == GType_FF || getGameType() == GType_PP) {
+		b = bb + READ_LE_UINT16(bb + 2);
+		count = READ_LE_UINT16(&((VgaFileHeader2_Feeble *) b)->imageCount);
+		b = bb + READ_LE_UINT16(&((VgaFileHeader2_Feeble *) b)->imageTable);
+
+		while (count--) {
+			if (READ_LE_UINT16(&((ImageHeader_Feeble *) b)->id) == vga_res_id)
+				break;
+			b += sizeof(ImageHeader_Feeble);
+		}
+		assert(READ_LE_UINT16(&((ImageHeader_Feeble *) b)->id) == vga_res_id);
+	} else if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) {
+		b = bb + READ_BE_UINT16(bb + 4);
+		count = READ_BE_UINT16(&((VgaFileHeader2_Common *) b)->imageCount);
+		b = bb + READ_BE_UINT16(&((VgaFileHeader2_Common *) b)->imageTable);
+
+		while (count--) {
+			if (READ_BE_UINT16(&((ImageHeader_Simon *) b)->id) == vga_res_id)
+				break;
+			b += sizeof(ImageHeader_Simon);
+		}
+		assert(READ_BE_UINT16(&((ImageHeader_Simon *) b)->id) == vga_res_id);
+	} else {
+		b = bb + READ_BE_UINT16(bb + 10);
+		b += 20;
+
+		count = READ_BE_UINT16(&((VgaFileHeader2_Common *) b)->imageCount);
+		b = bb + READ_BE_UINT16(&((VgaFileHeader2_Common *) b)->imageTable);
+
+		while (count--) {
+			if (READ_BE_UINT16(&((ImageHeader_WW *) b)->id) == vga_res_id)
+				break;
+			b += sizeof(ImageHeader_WW);
+		}
+		assert(READ_BE_UINT16(&((ImageHeader_WW *) b)->id) == vga_res_id);
+
+		if (!vgaScript)
+			clearWindow(_windowNum, READ_BE_UINT16(&((ImageHeader_WW *) b)->color));
+	}
+
+	if (_startVgaScript) {
+		if (getGameType() == GType_FF || getGameType() == GType_PP) {
+			dumpVgaScript(_curVgaFile1 + READ_LE_UINT16(&((ImageHeader_Feeble*)b)->scriptOffs), zoneNum, vga_res_id);
+		} else if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) {
+			dumpVgaScript(_curVgaFile1 + READ_BE_UINT16(&((ImageHeader_Simon*)b)->scriptOffs), zoneNum, vga_res_id);
+		} else {
+			dumpVgaScript(_curVgaFile1 + READ_BE_UINT16(&((ImageHeader_WW*)b)->scriptOffs), zoneNum, vga_res_id);
+		}
+	}
+
+	vc_ptr_org = _vcPtr;
+
+	if (getGameType() == GType_FF || getGameType() == GType_PP) {
+		_vcPtr = _curVgaFile1 + READ_LE_UINT16(&((ImageHeader_Feeble *) b)->scriptOffs);
+	} else if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) {
+		_vcPtr = _curVgaFile1 + READ_BE_UINT16(&((ImageHeader_Simon *) b)->scriptOffs);
+	} else {
+		_vcPtr = _curVgaFile1 + READ_BE_UINT16(&((ImageHeader_WW *) b)->scriptOffs);
+	}
+
+	runVgaScript();
+	_vcPtr = vc_ptr_org;
+}
+
+void AGOSEngine::setWindowImageEx(uint16 mode, uint16 vga_res) {
+	if (!_initMouse) {
+		_initMouse = 1;
+		vc33_setMouseOn();
+	}
+
+	if (mode == 4) {
+		vc29_stopAllSounds();
+
+		if (getGameType() == GType_ELVIRA1) {
+			if (_variableArray[299] == 0) {
+				_variableArray[293] = 0;
+				_wallOn = 0;
+			}
+		} else if (getGameType() == GType_ELVIRA2) {
+			if (_variableArray[70] == 0) {
+				_variableArray[71] = 0;
+				_wallOn = 0;
+			}
+		}
+
+	}
+
+	if (_lockWord & 0x10)
+		error("setWindowImageEx: _lockWord & 0x10");
+
+	setWindowImage(mode, vga_res);
+}
+
+void AGOSEngine::setWindowImage(uint16 mode, uint16 vga_res_id) {
+	uint num_lines;
+	uint16 updateWindow;
+
+	_windowNum = updateWindow = mode;
+	_lockWord |= 0x20;
+
+	if (getGameType() == GType_FF || getGameType() == GType_PP) {
+		vc27_resetSprite();
+	}
+
+	if (vga_res_id == 0) {
+		if (getGameType() == GType_SIMON1) {
+			_unkPalFlag = true;
+		} else if (getGameType() == GType_SIMON2) {
+			_useBackGround = true;
+			_restoreWindow6 = true;
+		}
+	}
+
+	if (getGameType() == GType_SIMON1) {
+		if (vga_res_id == 16300) {
+			clearBackFromTop(134);
+			_usePaletteDelay = true;
+		}
+	} else if (getGameType() == GType_SIMON2 || getGameType() == GType_FF) {
+		_scrollX = 0;
+		_scrollY = 0;
+		_scrollXMax = 0;
+		_scrollYMax = 0;
+		_scrollCount = 0;
+		_scrollFlag = 0;
+		_scrollHeight = 134;
+		_variableArrayPtr = _variableArray;
+		if (_variableArray[34] >= 0) {
+			if (getGameType() == GType_FF)
+				_variableArray[250] = 0;
+			_variableArray[251] = 0;
+		}
+	}
+
+	setImage(vga_res_id);
+
+	if (getGameType() == GType_FF || getGameType() == GType_PP) {
+		fillFrontFromBack(0, 0, _screenWidth, _screenHeight);
+		fillBackGroundFromBack(_screenHeight);
+		_syncFlag2 = 1;
+	} else if (getGameType() == GType_SIMON2) {
+		if (!_useBackGround) {
+			num_lines = _windowNum == 4 ? 134 : 200;
+			_boxStarHeight = num_lines;
+			fillFrontFromBack(0, 0, _screenWidth, num_lines);
+			fillBackGroundFromBack(num_lines);
+			_syncFlag2 = 1;
+		}
+		_useBackGround = false;
+	} else if (getGameType() == GType_SIMON1) {
+		// Allow one section of Simon the Sorcerer 1 introduction to be displayed
+		// in lower half of screen
+		if (_subroutine == 2923 || _subroutine == 2926)
+			num_lines = 200;
+		else
+			num_lines = _windowNum == 4 ? 134 : 200;
+
+		fillFrontFromBack(0, 0, _screenWidth, num_lines);
+		fillBackGroundFromBack(num_lines);
+		_syncFlag2 = 1;
+		_timer5 = 0;
+	} else {
+		num_lines = _windowNum == 4 ? 134 : 200;
+		fillFrontFromBack(0, 0, _screenWidth, num_lines);
+		fillBackGroundFromBack(num_lines);
+		_syncFlag2 = 1;
+		_timer5 = 0;
+	}
+
+	if (getGameType() == GType_ELVIRA1 && updateWindow == 3 && _bottomPalette != 0) {
+		byte *dst = getBackBuf() + 42560;
+		int size = 21440;
+
+		while (size--) {
+			*dst += 0x10;
+			dst++;
+		}
+	}
+
+	_lockWord &= ~0x20;
+
+	if (getGameType() == GType_SIMON1) {
+		if (_unkPalFlag) {
+			_unkPalFlag = false;
+			while (_fastFadeInFlag != 0) {
+				delay(10);
+			}
+		}
+	}
+}
+
 } // End of namespace AGOS

Modified: scummvm/trunk/engines/agos/intern.h
===================================================================
--- scummvm/trunk/engines/agos/intern.h	2006-10-27 11:43:17 UTC (rev 24530)
+++ scummvm/trunk/engines/agos/intern.h	2006-10-27 12:55:48 UTC (rev 24531)
@@ -205,7 +205,7 @@
 };
 
 enum GameFeatures {
-	GF_TALKIE           = 1 << 0,
+	GF_TALKIE          = 1 << 0,
 	GF_OLD_BUNDLE      = 1 << 1,
 	GF_CRUNCHED        = 1 << 2,
 	GF_CRUNCHED_GAMEPC = 1 << 3,
@@ -222,7 +222,7 @@
 	GAME_STRFILE  = 1 << 4,
 	GAME_RMSLFILE = 1 << 5,
 	GAME_TBLFILE  = 1 << 6,
-	GAME_XTBLFILE  = 1 << 7,
+	GAME_XTBLFILE = 1 << 7,
 
 	GAME_GFXIDXFILE = 1 << 8
 };

Modified: scummvm/trunk/engines/agos/module.mk
===================================================================
--- scummvm/trunk/engines/agos/module.mk	2006-10-27 11:43:17 UTC (rev 24530)
+++ scummvm/trunk/engines/agos/module.mk	2006-10-27 12:55:48 UTC (rev 24531)
@@ -37,6 +37,8 @@
 	subroutine.o \
 	verb.o \
 	vga.o \
+	vga_e2.o \
+	vga_ww.o \
 	vga_s1.o \
 	vga_s2.o \
 	vga_ff.o \

Modified: scummvm/trunk/engines/agos/script.cpp
===================================================================
--- scummvm/trunk/engines/agos/script.cpp	2006-10-27 11:43:17 UTC (rev 24530)
+++ scummvm/trunk/engines/agos/script.cpp	2006-10-27 12:55:48 UTC (rev 24531)
@@ -1135,33 +1135,57 @@
 	_lockWord &= ~0x8000;
 }
 
-void AGOSEngine::setWindowImageEx(uint16 mode, uint16 vga_res) {
-	if (!_initMouse) {
-		_initMouse = 1;
-		vc33_setMouseOn();
+void AGOSEngine::waitForSync(uint a) {
+	const uint maxCount = (getGameType() == GType_SIMON1) ? 500 : 1000;
+
+	if (getGameType() == GType_SIMON1 && (getFeatures() & GF_TALKIE)) {
+		if (a != 200) {
+			uint16 tmp = _lastVgaWaitFor;
+			_lastVgaWaitFor = 0;
+			if (tmp == a)
+				return;
+		}
 	}
 
-	if (mode == 4) {
-		vc29_stopAllSounds();
+	_vgaWaitFor = a;
+	_syncCount = 0;
+	_exitCutscene = false;
+	_rightButtonDown = false;
 
-		if (getGameType() == GType_ELVIRA1) {
-			if (_variableArray[299] == 0) {
-				_variableArray[293] = 0;
-				_wallOn = 0;
+	while (_vgaWaitFor != 0) {
+		if (_rightButtonDown) {
+			if (_vgaWaitFor == 200 && (getGameType() == GType_FF || !getBitFlag(14))) {
+				skipSpeech();
+				break;
 			}
-		} else if (getGameType() == GType_ELVIRA2) {
-			if (_variableArray[70] == 0) {
-				_variableArray[71] = 0;
-				_wallOn = 0;
+		}
+		if (_exitCutscene) {
+			if (getGameType() == GType_ELVIRA1) {
+				if (_variableArray[105] == 0) {
+					_variableArray[105] = 255;
+					break;
+				}
+			} else if (getGameType() == GType_ELVIRA2 || getGameType() == GType_WW) {
+				if (_vgaWaitFor == 51) {
+					setBitFlag(244, 1);
+					break;
+				}
+			} else {
+				if (getBitFlag(9)) {
+					endCutscene();
+					break;
+				}
 			}
 		}
+		processSpecialKeys();
 
+		if (_syncCount >= maxCount) {
+			warning("waitForSync: wait timed out");
+			break;
+		}
+
+		delay(1);
 	}
-
-	if (_lockWord & 0x10)
-		error("setWindowImageEx: _lockWord & 0x10");
-
-	setWindowImage(mode, vga_res);
 }
 
 } // End of namespace AGOS

Modified: scummvm/trunk/engines/agos/vga.cpp
===================================================================
--- scummvm/trunk/engines/agos/vga.cpp	2006-10-27 11:43:17 UTC (rev 24530)
+++ scummvm/trunk/engines/agos/vga.cpp	2006-10-27 12:55:48 UTC (rev 24531)
@@ -38,11 +38,11 @@
 	op[2] = &AGOSEngine::vc2_call;
 	op[3] = &AGOSEngine::vc3_loadSprite;
 	op[4] = &AGOSEngine::vc4_fadeIn;
-	op[5] = &AGOSEngine::vc5_skip_if_neq;
-	op[6] = &AGOSEngine::vc6_skip_ifn_sib_with_a;
-	op[7] = &AGOSEngine::vc7_skip_if_sib_with_a;
-	op[8] = &AGOSEngine::vc8_skip_if_parent_is;
-	op[9] = &AGOSEngine::vc9_skip_if_unk3_is;
+	op[5] = &AGOSEngine::vc5_ifEqual;
+	op[6] = &AGOSEngine::vc6_ifObjectHere;
+	op[7] = &AGOSEngine::vc7_ifObjectNotHere;
+	op[8] = &AGOSEngine::vc8_ifObjectIsAt;
+	op[9] = &AGOSEngine::vc9_ifObjectStateIs;
 	op[10] = &AGOSEngine::vc10_draw;
 	op[12] = &AGOSEngine::vc12_delay;
 	op[13] = &AGOSEngine::vc13_addToSpriteX;
@@ -64,13 +64,13 @@
 	op[34] = &AGOSEngine::vc34_setMouseOff;
 	op[35] = &AGOSEngine::vc35_clearWindow;
 	op[36] = &AGOSEngine::vc36_setWindowImage;
-	op[38] = &AGOSEngine::vc38_skipIfVarZero;
+	op[38] = &AGOSEngine::vc38_ifVarNotZero;
 	op[39] = &AGOSEngine::vc39_setVar;
 	op[40] = &AGOSEngine::vc40;
 	op[41] = &AGOSEngine::vc41;
 	op[42] = &AGOSEngine::vc42_delayIfNotEQ;
-	op[43] = &AGOSEngine::vc43_skipIfBitClear;
-	op[44] = &AGOSEngine::vc44_skipIfBitSet;
+	op[43] = &AGOSEngine::vc43_ifBitSet;
+	op[44] = &AGOSEngine::vc44_ifBitClear;
 	op[45] = &AGOSEngine::vc45_setSpriteX;
 	op[46] = &AGOSEngine::vc46_setSpriteY;
 	op[47] = &AGOSEngine::vc47_addToVar;
@@ -86,12 +86,13 @@
 	op[2] = &AGOSEngine::vc2_call;
 	op[3] = &AGOSEngine::vc3_loadSprite;
 	op[4] = &AGOSEngine::vc4_fadeIn;
-	op[5] = &AGOSEngine::vc5_skip_if_neq;
-	op[6] = &AGOSEngine::vc6_skip_ifn_sib_with_a;
-	op[7] = &AGOSEngine::vc7_skip_if_sib_with_a;
-	op[8] = &AGOSEngine::vc8_skip_if_parent_is;
-	op[9] = &AGOSEngine::vc9_skip_if_unk3_is;
+	op[5] = &AGOSEngine::vc5_ifEqual;
+	op[6] = &AGOSEngine::vc6_ifObjectHere;
+	op[7] = &AGOSEngine::vc7_ifObjectNotHere;
+	op[8] = &AGOSEngine::vc8_ifObjectIsAt;
+	op[9] = &AGOSEngine::vc9_ifObjectStateIs;
 	op[10] = &AGOSEngine::vc10_draw;
+	op[11] = &AGOSEngine::vc11_onStop;
 
 	op[13] = &AGOSEngine::vc12_delay;
 	op[14] = &AGOSEngine::vc13_addToSpriteX;
@@ -122,44 +123,13 @@
 	op[40] = &AGOSEngine::vc36_setWindowImage;
 	op[41] = &AGOSEngine::vc37_pokePalette;
 
-	op[51] = &AGOSEngine::vc38_skipIfVarZero;
+	op[51] = &AGOSEngine::vc38_ifVarNotZero;
 	op[52] = &AGOSEngine::vc39_setVar;
 	op[53] = &AGOSEngine::vc40;
 	op[54] = &AGOSEngine::vc41;
+	op[55] = &AGOSEngine::vc42_delayIfNotEQ;
 }
 
-void AGOSEngine::setupElvira2VideoOpcodes(VgaOpcodeProc *op) {
-	setupCommonVideoOpcodes(op);
-
-	op[11] = &AGOSEngine::vc11;
-	op[17] = &AGOSEngine::vc17_waitEnd;
-	op[19] = &AGOSEngine::vc19_loop;
-	op[22] = &AGOSEngine::vc22_setPaletteOld;
-	op[28] = &AGOSEngine::vc28_playSFX;
-	op[32] = &AGOSEngine::vc32_saveScreen;
-	op[37] = &AGOSEngine::vc37_pokePalette;
-	op[45] = &AGOSEngine::vc45_setWindowPalette;
-	op[46] = &AGOSEngine::vc46_setPaletteSlot1;
-	op[47] = &AGOSEngine::vc47_setPaletteSlot2;
-	op[48] = &AGOSEngine::vc48_setPaletteSlot3;
-	op[53] = &AGOSEngine::vc53_dissolveIn;
-	op[54] = &AGOSEngine::vc54_dissolveOut;
-	op[57] = &AGOSEngine::vc57_blackPalette;
-	op[56] = &AGOSEngine::vc56_fullScreen;
-	op[58] = &AGOSEngine::vc58_checkCodeWheel;
-	op[59] = &AGOSEngine::vc59_skipIfNotEGA;
-}
-
-void AGOSEngine::setupWaxworksVideoOpcodes(VgaOpcodeProc *op) {
-	setupElvira2VideoOpcodes(op);
-
-	op[58] = &AGOSEngine::vc58_checkCodeWheel;
-	op[60] = &AGOSEngine::vc60_stopAnimation;
-	op[61] = &AGOSEngine::vc61;
-	op[62] = &AGOSEngine::vc62_fastFadeOut;
-	op[63] = &AGOSEngine::vc63_fastFadeIn;
-}
-
 void AGOSEngine::setupVgaOpcodes() {
 	memset(_vga_opcode_table, 0, sizeof(_vga_opcode_table));
 
@@ -188,7 +158,7 @@
 	}
 }
 
-// Script parser
+// VGA Script parser
 void AGOSEngine::runVgaScript() {
 	for (;;) {
 		uint opcode;
@@ -286,6 +256,16 @@
 	return vsp;
 }
 
+bool AGOSEngine::getBitFlag(uint bit) {
+	uint16 *bits = &_bitArray[bit / 16];
+	return (*bits & (1 << (bit & 15))) != 0;
+}
+
+void AGOSEngine::setBitFlag(uint bit, bool value) {
+	uint16 *bits = &_bitArray[bit / 16];
+	*bits = (*bits & ~(1 << (bit & 15))) | (value << (bit & 15));
+}
+
 int AGOSEngine::vcReadVarOrWord() {
 	if (getGameType() == GType_ELVIRA1) {
 		return vcReadNextWord();
@@ -462,7 +442,7 @@
 	_vcPtr += 6;
 }
 
-void AGOSEngine::vc5_skip_if_neq() {
+void AGOSEngine::vc5_ifEqual() {
 	uint16 var;
 
 	if (getGameType() == GType_PP)
@@ -475,24 +455,24 @@
 		vcSkipNextInstruction();
 }
 
-void AGOSEngine::vc6_skip_ifn_sib_with_a() {
+void AGOSEngine::vc6_ifObjectHere() {
 	if (!itemIsSiblingOf(vcReadNextWord()))
 		vcSkipNextInstruction();
 }
 
-void AGOSEngine::vc7_skip_if_sib_with_a() {
+void AGOSEngine::vc7_ifObjectNotHere() {
 	if (itemIsSiblingOf(vcReadNextWord()))
 		vcSkipNextInstruction();
 }
 
-void AGOSEngine::vc8_skip_if_parent_is() {
+void AGOSEngine::vc8_ifObjectIsAt() {
 	uint16 a = vcReadNextWord();
 	uint16 b = vcReadNextWord();
 	if (!itemIsParentOf(a, b))
 		vcSkipNextInstruction();
 }
 
-void AGOSEngine::vc9_skip_if_unk3_is() {
+void AGOSEngine::vc9_ifObjectStateIs() {
 	uint16 a = vcReadNextWord();
 	uint16 b = vcReadNextWord();
 	if (!vc_maybe_skip_proc_1(a, b))
@@ -701,9 +681,9 @@
 	}
 }
 
-void AGOSEngine::vc11() {
+void AGOSEngine::vc11_onStop() {
 	uint a = vcReadNextWord();
-	debug(0, "vc11: stub (%d)", a);
+	debug(0, "vc11_onStop: stub (%d)", a);
 }
 
 void AGOSEngine::vc12_delay() {
@@ -1164,7 +1144,7 @@
 	debug(0, "vc37_pokePalette: stub (%d, %d)", a, b);
 }
 
-void AGOSEngine::vc38_skipIfVarZero() {
+void AGOSEngine::vc38_ifVarNotZero() {
 	uint16 var;
 	if (getGameType() == GType_PP)
 		var = vcReadVarOrWord();
@@ -1250,803 +1230,4 @@
 	}
 }
 
-void AGOSEngine::vc43_skipIfBitClear() {
-	if (!getBitFlag(vcReadNextWord())) {
-		vcSkipNextInstruction();
-	}
-}
-
-void AGOSEngine::vc44_skipIfBitSet() {
-	if (getBitFlag(vcReadNextWord())) {
-		vcSkipNextInstruction();
-	}
-}
-
-void AGOSEngine::vc45_setWindowPalette() {
-	uint num = vcReadNextWord();
-	uint color = vcReadNextWord();
-
-	const uint16 *vlut = &_videoWindows[num * 4];
-	uint16 *dst = (uint16 *)getBackBuf() + vlut[0] * 8 + vlut[1] * _dxSurfacePitch / 2;
-
-	for (uint h = 0; h < vlut[3]; h++) {
-		uint width = vlut[2] * 8;
-		for (uint w = 0; w < width; w++) {
-			dst[w] &= 0xF0F;
-			dst[w] |= color * 16;
-		}
-		dst += _dxSurfacePitch / 2;
-	}
-}
-
-void AGOSEngine::setPaletteSlot(uint srcOffs, uint dstOffs) {
-	byte *offs, *palptr, *src;
-	uint16 num;
-
-	palptr = _displayPalette + dstOffs * 64;
-	offs = _curVgaFile1 + READ_BE_UINT16(_curVgaFile1 + 6);
-	src = offs + srcOffs * 32;
-	num = 16;
-
-	do {
-		uint16 color = READ_BE_UINT16(src);
-		palptr[0] = ((color & 0xf00) >> 8) * 32;
-		palptr[1] = ((color & 0x0f0) >> 4) * 32;
-		palptr[2] = ((color & 0x00f) >> 0) * 32;
-		palptr[3] = 0;
-
-		palptr += 4;
-		src += 2;
-	} while (--num);
-
-	_paletteFlag = 2;
-}
-
-void AGOSEngine::vc46_setPaletteSlot1() {
-	uint srcOffs = vcReadNextWord();
-	setPaletteSlot(srcOffs, 1);
-}
-
-void AGOSEngine::vc47_setPaletteSlot2() {
-	uint srcOffs = vcReadNextWord();
-	setPaletteSlot(srcOffs, 2);
-}
-
-void AGOSEngine::vc48_setPaletteSlot3() {
-	uint srcOffs = vcReadNextWord();
-	setPaletteSlot(srcOffs, 3);
-}
-
-void AGOSEngine::setBitFlag(uint bit, bool value) {
-	uint16 *bits = &_bitArray[bit / 16];
-	*bits = (*bits & ~(1 << (bit & 15))) | (value << (bit & 15));
-}
-
-bool AGOSEngine::getBitFlag(uint bit) {
-	uint16 *bits = &_bitArray[bit / 16];
-	return (*bits & (1 << (bit & 15))) != 0;
-}
-
-void AGOSEngine::vc49_setBit() {
-	uint16 bit = vcReadNextWord();
-	if (getGameType() == GType_FF && bit == 82) {
-		_variableArrayPtr = _variableArray2;
-	}
-	setBitFlag(bit, true);
-}
-
-void AGOSEngine::vc50_clearBit() {
-	uint16 bit = vcReadNextWord();
-	if (getGameType() == GType_FF && bit == 82) {
-		_variableArrayPtr = _variableArray;
-	}
-	setBitFlag(bit, false);
-}
-
-void AGOSEngine::vc51_enableBox() {
-	enableBox(vcReadNextWord());
-}
-
-void AGOSEngine::vc52_playSound() {
-	bool ambient = false;
-
-	uint16 sound = vcReadNextWord();
-	if (sound >= 0x8000) {
-		ambient = true;
-		sound = -sound;
-	}
-
-	if (getGameType() == GType_FF || getGameType() == GType_PP) {
-		int16 pan = vcReadNextWord();
-		int16 vol = vcReadNextWord();
-
-		if (ambient)
-			loadSound(sound, pan, vol, 2);
-		else
-			loadSound(sound, pan, vol, 1);
-	} else if (getGameType() == GType_SIMON2) {
-		if (ambient)
-			_sound->playAmbient(sound);
-		else
-			_sound->playEffects(sound);
-	} else if (getFeatures() & GF_TALKIE) {
-		_sound->playEffects(sound);
-	} else if (getGameId() == GID_SIMON1DOS) {
-		playSting(sound);
-	}
-}
-
-void AGOSEngine::vc53_dissolveIn() {
-	// TODO
-	uint num = vcReadNextWord();
-	uint speed = vcReadNextWord();
-	debug(0, "vc53_dissolveIn: stub (%d, %d)", num, speed);
-}
-
-void AGOSEngine::vc54_dissolveOut() {
-	// TODO
-	uint num = vcReadNextWord();
-	uint color = vcReadNextWord();
-	uint speed = vcReadNextWord();
-	debug(0, "vc54_dissolveOut: stub (%d, %d, %d)", num, color, speed);
-}
-
-void AGOSEngine::vc55_moveBox() {
-	HitArea *ha = _hitAreas;
-	uint count = ARRAYSIZE(_hitAreas);
-	uint16 id = vcReadNextWord();
-	int16 x = vcReadNextWord();
-	int16 y = vcReadNextWord();
-
-	for (;;) {
-		if (ha->id == id) {
-			ha->x += x;
-			ha->y += y;
-			break;
-		}
-		ha++;
-		if (!--count)
-			break;
-	}
-
-	_needHitAreaRecalc++;
-}
-
-void AGOSEngine::vc56_fullScreen() {
-	byte *src = _curVgaFile2 + 32;
-	byte *dst = getBackBuf();
-
-	memcpy(dst, src + 768, _screenHeight * _screenWidth);
-	//fullFade();
-
-	uint8 palette[1024];
-	for (int i = 0; i < 256; i++) {
-		palette[i * 4 + 0] = *src++ * 4;
-		palette[i * 4 + 1] = *src++ * 4;
-		palette[i * 4 + 2] = *src++ * 4;
-		palette[i * 4 + 3] = 0;
-	}
-
-	_system->setPalette(palette, 0, 256);
-}
-
-void AGOSEngine::vc57_blackPalette() {
-	uint8 palette[1024];
-	memset(palette, 0, sizeof(palette));
-	_system->setPalette(palette, 0, 256);
-}
-
-void AGOSEngine::vc58_checkCodeWheel() {
-	// TODO
-	debug(0, "vc58_checkCodeWheel: stub");
-
-	_variableArray[0] = 0;
-}
-
-void AGOSEngine::vc59_skipIfNotEGA() {
-	// Skip if not EGA
-	vcSkipNextInstruction();
-}
-
-void AGOSEngine::vcStopAnimation(uint file, uint sprite) {
-	uint16 old_sprite_id, old_cur_file_id;
-	VgaSleepStruct *vfs;
-	VgaSprite *vsp;
-	VgaTimerEntry *vte;
-	const byte *vcPtrOrg;
-
-	old_sprite_id = _vgaCurSpriteId;
-	old_cur_file_id = _vgaCurZoneNum;
-	vcPtrOrg = _vcPtr;
-
-	_vgaCurZoneNum = file;
-	_vgaCurSpriteId = sprite;
-
-	vfs = _waitSyncTable;
-	while (vfs->ident != 0) {
-		if (vfs->sprite_id == _vgaCurSpriteId && ((getGameType() == GType_SIMON1) || vfs->cur_vga_file == _vgaCurZoneNum)) {
-			while (vfs->ident != 0) {
-				memcpy(vfs, vfs + 1, sizeof(VgaSleepStruct));
-				vfs++;
-			}
-			break;
-		}
-		vfs++;
-	}
-
-	vsp = findCurSprite();
-	if (vsp->id) {
-		vc25_halt_sprite();
-
-		vte = _vgaTimerList;
-		while (vte->delay != 0) {
-			if (vte->sprite_id == _vgaCurSpriteId && ((getGameType() == GType_SIMON1) || vte->cur_vga_file == _vgaCurZoneNum)) {
-				deleteVgaEvent(vte);
-				break;
-			}
-			vte++;
-		}
-	}
-
-	_vgaCurZoneNum = old_cur_file_id;
-	_vgaCurSpriteId = old_sprite_id;
-	_vcPtr = vcPtrOrg;
-}
-
-void AGOSEngine::vc60_stopAnimation() {
-	uint16 sprite, zoneNum;
-
-	if (getGameType() == GType_PP) {
-		zoneNum = vcReadNextWord();
-		sprite = vcReadVarOrWord();
-	} else if (getGameType() == GType_SIMON2 || getGameType() == GType_FF) {
-		zoneNum = vcReadNextWord();
-		sprite = vcReadNextWord();
-	} else {
-		zoneNum = _vgaCurZoneNum;
-		sprite = vcReadNextWord();
-	}
-
-	vcStopAnimation(zoneNum, sprite);
-}
-
-void AGOSEngine::vc61() {
-	uint16 a = vcReadNextWord();
-	byte *src, *dst, *dstPtr;
-	uint h, tmp;
-
-	if (a == 6) {
-		src = _curVgaFile2 + 800;
-		dstPtr = getBackBuf();
-		memcpy(dstPtr, src, 64000);
-		tmp = 4 - 1;
-	} else {
-		dstPtr = getFrontBuf();
-		tmp = a - 1;
-	}
-
-	src = _curVgaFile2 + 3840 * 16 + 3360;
-	while (tmp--)
-		src += 1536 * 16 + 1712;
-
-
-	src += 800;
-
-	if (a != 5) {
-		dst = dstPtr + 7448;
-		for (h = 0; h < 177; h++) {
-			memcpy(dst, src, 144);
-			src += 144;
-			dst += _screenWidth;
-		}
-
-		if (a != 6)
-			return;
-
-		src = _curVgaFile2 + 9984 * 16 + 15344;
-	}
-
-	dst = dstPtr + 50296;
-	for (h = 0; h < 17; h++) {
-		memcpy(dst, src, 208);
-		src += 208;
-		dst += _screenWidth;
-	}
-
-	if (a == 6) {
-		//fullFade();
-		src = _curVgaFile2 + 32;
-
-		uint8 palette[1024];
-		for (int i = 0; i < 256; i++) {
-			palette[i * 4 + 0] = *src++ * 4;
-			palette[i * 4 + 1] = *src++ * 4;
-			palette[i * 4 + 2] = *src++ * 4;
-			palette[i * 4 + 3] = 0;
-		}
-
-		_system->setPalette(palette, 0, 256);
-	}
-}
-
-void AGOSEngine::vc62_fastFadeOut() {
-	vc29_stopAllSounds();
-
-	if (!_fastFadeOutFlag) {
-		uint i, fadeSize, fadeCount;
-
-		//if (getGameType() != GType_WW)
-		//	_fastFadeOutFlag = true;
-
-		_fastFadeCount = 256;
-		if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) {
-			if (_windowNum == 4)
-				_fastFadeCount = 208;
-		}
-
-		memcpy(_videoBuf1, _currentPalette, _fastFadeCount * 4);
-
-		if ((getGameType() == GType_FF || getGameType() == GType_PP) && !getBitFlag(75)) {
-			fadeCount = 32;
-			fadeSize = 8;
-		} else {
-			fadeCount = 4;
-			fadeSize = 64;
-		}
-
-		for (i = fadeCount; i != 0; --i) {
-			paletteFadeOut(_videoBuf1, _fastFadeCount, fadeSize);
-			_system->setPalette(_videoBuf1, 0, _fastFadeCount);
-			delay(5);
-		}
-
-		if (getGameType() == GType_SIMON1) {
-			uint16 params[5];						/* parameters to vc10_draw */
-			VgaSprite *vsp;
-			VgaPointersEntry *vpe;
-			const byte *vcPtrOrg = _vcPtr;
-
-			vsp = _vgaSprites;
-			while (vsp->id != 0) {
-				if (vsp->id == 128) {
-					byte *old_file_1 = _curVgaFile1;
-					byte *old_file_2 = _curVgaFile2;
-					uint palmode = _windowNum;
-
-					vpe = &_vgaBufferPointers[vsp->zoneNum];
-					_curVgaFile1 = vpe->vgaFile1;
-					_curVgaFile2 = vpe->vgaFile2;
-					_windowNum = vsp->windowNum;
-
-					params[0] = READ_BE_UINT16(&vsp->image);
-					params[1] = READ_BE_UINT16(&vsp->palette);
-					params[2] = READ_BE_UINT16(&vsp->x);
-					params[3] = READ_BE_UINT16(&vsp->y);
-					params[4] = READ_BE_UINT16(&vsp->flags);
-					_vcPtr = (byte *)params;
-					vc10_draw();
-
-					_windowNum = palmode;
-					_curVgaFile1 = old_file_1;
-					_curVgaFile2 = old_file_2;
-					break;
-				}
-				vsp++;
-			}
-			_vcPtr = vcPtrOrg;
-		}
-
-		// Allow one section of Simon the Sorcerer 1 introduction to be displayed
-		// in lower half of screen
-		if ((getGameType() == GType_SIMON1) && (_subroutine == 2923 || _subroutine == 2926)) {
-			clearSurfaces(200);
-		} else if (getGameType() == GType_FF || getGameType() == GType_PP) {
-			clearSurfaces(480);
-		} else {
-			clearSurfaces(_windowNum == 4 ? 134 : 200);
-		}
-	}
-	if (getGameType() == GType_SIMON2) {
-		if (_nextMusicToPlay != -1)
-			loadMusic(_nextMusicToPlay);
-	}
-}
-
-void AGOSEngine::vc63_fastFadeIn() {
-	if (getGameType() == GType_PP) {
-		_fastFadeInFlag = 256;
-		if (getBitFlag(100)) {
-			startOverlayAnims();
-		} else if (getBitFlag(103)) {
-			printf("NameAndTime\n");
-		} else if (getBitFlag(104)) {
-			printf("HiScoreTable\n");
-		}
-	} else if (getGameType() == GType_FF) {
-		_fastFadeInFlag = 256;
-	} else if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) {
-		_fastFadeInFlag = 208;
-		if (_windowNum != 4) {
-			_fastFadeInFlag = 256;
-		}
-	}
-	_fastFadeOutFlag = false;
-}
-
-void AGOSEngine::animate(uint windowNum, uint zoneNum, uint vgaSpriteId, uint x, uint y, uint palette, bool vgaScript) {
-	VgaSprite *vsp;
-	VgaPointersEntry *vpe;
-	byte *p, *pp;
-	uint count;
-
-	if (isSpriteLoaded(vgaSpriteId, zoneNum))
-		return;
-
-	vsp = _vgaSprites;
-	while (vsp->id != 0)
-		vsp++;
-
-	vsp->windowNum = windowNum;
-	vsp->priority = 0;
-	vsp->flags = 0;
-
-	vsp->y = y;
-	vsp->x = x;
-	vsp->image = 0;
-	if (getGameType() == GType_ELVIRA1 || getGameType() == GType_ELVIRA2 || getGameType() == GType_WW)
-		vsp->palette = 0;
-	else
-		vsp->palette = palette;
-	vsp->id = vgaSpriteId;
-
-	if (getGameType() == GType_SIMON2 || getGameType() == GType_FF || getGameType() == GType_PP)
-		vsp->zoneNum = zoneNum;
-	else
-		vsp->zoneNum = zoneNum = vgaSpriteId / 100;
-
-	for (;;) {
-		vpe = &_vgaBufferPointers[zoneNum];
-		_curVgaFile1 = vpe->vgaFile1;
-		if (vgaScript) {
-			if (vpe->vgaFile1 != NULL)
-				break;
-			if (_zoneNumber != zoneNum)
-				_noOverWrite = _zoneNumber;
-
-			loadZone(zoneNum);
-			_noOverWrite = 0xFFFF;
-		} else {
-			_zoneNumber = zoneNum;
-			if (vpe->vgaFile1 != NULL)
-				break;
-			loadZone(zoneNum);
-		}
-	}
-
-	pp = _curVgaFile1;
-	if (getGameType() == GType_FF || getGameType() == GType_PP) {
-		p = pp + READ_LE_UINT16(pp + 2);
-		count = READ_LE_UINT16(&((VgaFileHeader2_Feeble *) p)->animationCount);
-		p = pp + READ_LE_UINT16(&((VgaFileHeader2_Feeble *) p)->animationTable);
-
-		while (count--) {
-			if (READ_LE_UINT16(&((AnimationHeader_Feeble *) p)->id) == vgaSpriteId)
-				break;
-			p += sizeof(AnimationHeader_Feeble);
-		}
-		assert(READ_LE_UINT16(&((AnimationHeader_Feeble *) p)->id) == vgaSpriteId);
-	} else if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) {
-		p = pp + READ_BE_UINT16(pp + 4);
-		count = READ_BE_UINT16(&((VgaFileHeader2_Common *) p)->animationCount);
-		p = pp + READ_BE_UINT16(&((VgaFileHeader2_Common *) p)->animationTable);
-
-		while (count--) {
-			if (READ_BE_UINT16(&((AnimationHeader_Simon *) p)->id) == vgaSpriteId)
-				break;
-			p += sizeof(AnimationHeader_Simon);
-		}
-		assert(READ_BE_UINT16(&((AnimationHeader_Simon *) p)->id) == vgaSpriteId);
-	} else {
-		p = pp + READ_BE_UINT16(pp + 10);
-		p += 20;
-
-		count = READ_BE_UINT16(&((VgaFileHeader2_Common *) p)->animationCount);
-		p = pp + READ_BE_UINT16(&((VgaFileHeader2_Common *) p)->animationTable);
-
-		while (count--) {
-			if (READ_BE_UINT16(&((AnimationHeader_WW *) p)->id) == vgaSpriteId)
-				break;
-			p += sizeof(AnimationHeader_WW);
-		}
-		assert(READ_BE_UINT16(&((AnimationHeader_WW *) p)->id) == vgaSpriteId);
-	}
-
-#ifdef DUMP_FILE_NR
-	{
-		static bool dumped = false;
-		if (res == DUMP_FILE_NR && !dumped) {
-			dumped = true;
-			dumpVgaFile(_curVgaFile1);
-		}
-	}
-#endif
-
-#ifdef DUMP_BITMAPS_FILE_NR
-	{
-		static bool dumped = false;
-		if (res == DUMP_BITMAPS_FILE_NR && !dumped) {
-			dumped = true;
-			dumpVgaBitmaps(_curVgaFile2, _curVgaFile1, zoneNum);
-		}
-	}
-#endif
-
-	if (_startVgaScript) {
-		if (getGameType() == GType_FF || getGameType() == GType_PP) {
-			dumpVgaScript(_curVgaFile1 + READ_LE_UINT16(&((AnimationHeader_Feeble*)p)->scriptOffs), zoneNum, vgaSpriteId);
-		} else if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) {
-			dumpVgaScript(_curVgaFile1 + READ_BE_UINT16(&((AnimationHeader_Simon*)p)->scriptOffs), zoneNum, vgaSpriteId);
-		} else {
-			dumpVgaScript(_curVgaFile1 + READ_BE_UINT16(&((AnimationHeader_WW*)p)->scriptOffs), zoneNum, vgaSpriteId);
-		}
-	}
-
-	if (getGameType() == GType_FF || getGameType() == GType_PP) {
-		addVgaEvent(_vgaBaseDelay, _curVgaFile1 + READ_LE_UINT16(&((AnimationHeader_Feeble *) p)->scriptOffs), vgaSpriteId, zoneNum);
-	} else if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) {
-		addVgaEvent(_vgaBaseDelay, _curVgaFile1 + READ_BE_UINT16(&((AnimationHeader_Simon *) p)->scriptOffs), vgaSpriteId, zoneNum);
-	} else {
-		addVgaEvent(_vgaBaseDelay, _curVgaFile1 + READ_BE_UINT16(&((AnimationHeader_WW *) p)->scriptOffs), vgaSpriteId, zoneNum);
-	}
-}
-
-void AGOSEngine::setImage(uint16 vga_res_id, bool vgaScript) {
-	uint zoneNum;
-	VgaPointersEntry *vpe;
-	byte *bb, *b;
-	uint16 count;
-	const byte *vc_ptr_org;
-
-	zoneNum = vga_res_id / 100;
-
-	for (;;) {
-		vpe = &_vgaBufferPointers[zoneNum];
-		_curVgaFile1 = vpe->vgaFile1;
-		_curVgaFile2 = vpe->vgaFile2;
-
-		if (vgaScript) {
-			if (vpe->vgaFile1 != NULL)
-				break;
-			if (_zoneNumber != zoneNum)
-				_noOverWrite = _zoneNumber;
-
-			loadZone(zoneNum);
-			_noOverWrite = 0xFFFF;
-		} else {
-			_curSfxFile = vpe->sfxFile;
-			_zoneNumber = zoneNum;
-
-			if (vpe->vgaFile1 != NULL)
-				break;
-
-			loadZone(zoneNum);
-		}
-	}
-
-	bb = _curVgaFile1;
-	if (getGameType() == GType_FF || getGameType() == GType_PP) {
-		b = bb + READ_LE_UINT16(bb + 2);
-		count = READ_LE_UINT16(&((VgaFileHeader2_Feeble *) b)->imageCount);
-		b = bb + READ_LE_UINT16(&((VgaFileHeader2_Feeble *) b)->imageTable);
-
-		while (count--) {
-			if (READ_LE_UINT16(&((ImageHeader_Feeble *) b)->id) == vga_res_id)
-				break;
-			b += sizeof(ImageHeader_Feeble);
-		}
-		assert(READ_LE_UINT16(&((ImageHeader_Feeble *) b)->id) == vga_res_id);
-	} else if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) {
-		b = bb + READ_BE_UINT16(bb + 4);
-		count = READ_BE_UINT16(&((VgaFileHeader2_Common *) b)->imageCount);
-		b = bb + READ_BE_UINT16(&((VgaFileHeader2_Common *) b)->imageTable);
-
-		while (count--) {
-			if (READ_BE_UINT16(&((ImageHeader_Simon *) b)->id) == vga_res_id)
-				break;
-			b += sizeof(ImageHeader_Simon);
-		}
-		assert(READ_BE_UINT16(&((ImageHeader_Simon *) b)->id) == vga_res_id);
-	} else {
-		b = bb + READ_BE_UINT16(bb + 10);
-		b += 20;
-
-		count = READ_BE_UINT16(&((VgaFileHeader2_Common *) b)->imageCount);
-		b = bb + READ_BE_UINT16(&((VgaFileHeader2_Common *) b)->imageTable);
-
-		while (count--) {
-			if (READ_BE_UINT16(&((ImageHeader_WW *) b)->id) == vga_res_id)
-				break;
-			b += sizeof(ImageHeader_WW);
-		}
-		assert(READ_BE_UINT16(&((ImageHeader_WW *) b)->id) == vga_res_id);
-
-		if (!vgaScript)
-			clearWindow(_windowNum, READ_BE_UINT16(&((ImageHeader_WW *) b)->color));
-	}
-
-	if (_startVgaScript) {
-		if (getGameType() == GType_FF || getGameType() == GType_PP) {
-			dumpVgaScript(_curVgaFile1 + READ_LE_UINT16(&((ImageHeader_Feeble*)b)->scriptOffs), zoneNum, vga_res_id);
-		} else if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) {
-			dumpVgaScript(_curVgaFile1 + READ_BE_UINT16(&((ImageHeader_Simon*)b)->scriptOffs), zoneNum, vga_res_id);
-		} else {
-			dumpVgaScript(_curVgaFile1 + READ_BE_UINT16(&((ImageHeader_WW*)b)->scriptOffs), zoneNum, vga_res_id);
-		}
-	}
-
-	vc_ptr_org = _vcPtr;
-
-	if (getGameType() == GType_FF || getGameType() == GType_PP) {
-		_vcPtr = _curVgaFile1 + READ_LE_UINT16(&((ImageHeader_Feeble *) b)->scriptOffs);
-	} else if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) {
-		_vcPtr = _curVgaFile1 + READ_BE_UINT16(&((ImageHeader_Simon *) b)->scriptOffs);
-	} else {
-		_vcPtr = _curVgaFile1 + READ_BE_UINT16(&((ImageHeader_WW *) b)->scriptOffs);
-	}
-
-	runVgaScript();
-	_vcPtr = vc_ptr_org;
-}
-
-void AGOSEngine::setWindowImage(uint16 mode, uint16 vga_res_id) {
-	uint num_lines;
-	uint16 updateWindow;
-
-	_windowNum = updateWindow = mode;
-	_lockWord |= 0x20;
-
-	if (getGameType() == GType_FF || getGameType() == GType_PP) {
-		vc27_resetSprite();
-	}
-
-	if (vga_res_id == 0) {
-		if (getGameType() == GType_SIMON1) {
-			_unkPalFlag = true;
-		} else if (getGameType() == GType_SIMON2) {
-			_useBackGround = true;
-			_restoreWindow6 = true;
-		}
-	}
-
-	if (getGameType() == GType_SIMON1) {
-		if (vga_res_id == 16300) {
-			clearBackFromTop(134);
-			_usePaletteDelay = true;
-		}
-	} else if (getGameType() == GType_SIMON2 || getGameType() == GType_FF) {
-		_scrollX = 0;
-		_scrollY = 0;
-		_scrollXMax = 0;
-		_scrollYMax = 0;
-		_scrollCount = 0;
-		_scrollFlag = 0;
-		_scrollHeight = 134;
-		_variableArrayPtr = _variableArray;
-		if (_variableArray[34] >= 0) {
-			if (getGameType() == GType_FF)
-				_variableArray[250] = 0;
-			_variableArray[251] = 0;
-		}
-	}
-
-	setImage(vga_res_id);
-
-	if (getGameType() == GType_FF || getGameType() == GType_PP) {
-		fillFrontFromBack(0, 0, _screenWidth, _screenHeight);
-		fillBackGroundFromBack(_screenHeight);
-		_syncFlag2 = 1;
-	} else if (getGameType() == GType_SIMON2) {
-		if (!_useBackGround) {
-			num_lines = _windowNum == 4 ? 134 : 200;
-			_boxStarHeight = num_lines;
-			fillFrontFromBack(0, 0, _screenWidth, num_lines);
-			fillBackGroundFromBack(num_lines);
-			_syncFlag2 = 1;
-		}
-		_useBackGround = false;
-	} else if (getGameType() == GType_SIMON1) {
-		// Allow one section of Simon the Sorcerer 1 introduction to be displayed
-		// in lower half of screen
-		if (_subroutine == 2923 || _subroutine == 2926)
-			num_lines = 200;
-		else
-			num_lines = _windowNum == 4 ? 134 : 200;
-
-		fillFrontFromBack(0, 0, _screenWidth, num_lines);
-		fillBackGroundFromBack(num_lines);
-		_syncFlag2 = 1;
-		_timer5 = 0;
-	} else {
-		num_lines = _windowNum == 4 ? 134 : 200;
-		fillFrontFromBack(0, 0, _screenWidth, num_lines);
-		fillBackGroundFromBack(num_lines);
-		_syncFlag2 = 1;
-		_timer5 = 0;
-	}
-
-	if (getGameType() == GType_ELVIRA1 && updateWindow == 3 && _bottomPalette != 0) {
-		byte *dst = getBackBuf() + 42560;
-		int size = 21440;
-
-		while (size--) {
-			*dst += 0x10;
-			dst++;
-		}
-	}
-
-	_lockWord &= ~0x20;
-
-	if (getGameType() == GType_SIMON1) {
-		if (_unkPalFlag) {
-			_unkPalFlag = false;
-			while (_fastFadeInFlag != 0) {
-				delay(10);
-			}
-		}
-	}
-}
-
-void AGOSEngine::waitForSync(uint a) {
-	const uint maxCount = (getGameType() == GType_SIMON1) ? 500 : 1000;
-
-	if (getGameType() == GType_SIMON1 && (getFeatures() & GF_TALKIE)) {
-		if (a != 200) {
-			uint16 tmp = _lastVgaWaitFor;
-			_lastVgaWaitFor = 0;
-			if (tmp == a)
-				return;
-		}
-	}
-
-	_vgaWaitFor = a;
-	_syncCount = 0;
-	_exitCutscene = false;
-	_rightButtonDown = false;
-
-	while (_vgaWaitFor != 0) {
-		if (_rightButtonDown) {
-			if (_vgaWaitFor == 200 && (getGameType() == GType_FF || !getBitFlag(14))) {
-				skipSpeech();
-				break;
-			}
-		}
-		if (_exitCutscene) {
-			if (getGameType() == GType_ELVIRA1) {
-				if (_variableArray[105] == 0) {
-					_variableArray[105] = 255;
-					break;
-				}
-			} else if (getGameType() == GType_ELVIRA2 || getGameType() == GType_WW) {
-				if (_vgaWaitFor == 51) {
-					setBitFlag(244, 1);
-					break;
-				}
-			} else {
-				if (getBitFlag(9)) {
-					endCutscene();
-					break;
-				}
-			}
-		}
-		processSpecialKeys();
-
-		if (_syncCount >= maxCount) {
-			warning("waitForSync: wait timed out");
-			break;
-		}
-
-		delay(1);
-	}
-}
-
 } // End of namespace AGOS

Added: scummvm/trunk/engines/agos/vga_e2.cpp
===================================================================
--- scummvm/trunk/engines/agos/vga_e2.cpp	                        (rev 0)
+++ scummvm/trunk/engines/agos/vga_e2.cpp	2006-10-27 12:55:48 UTC (rev 24531)
@@ -0,0 +1,241 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2001  Ludvig Strigeus
+ * Copyright (C) 2001-2006 The ScummVM project
+ *
+ * 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$
+ *
+ */
+
+// Video script opcodes for Simon1/Simon2
+#include "common/stdafx.h"
+
+#include "agos/agos.h"
+#include "agos/intern.h"
+
+#include "common/system.h"
+
+namespace AGOS {
+
+void AGOSEngine::setupElvira2VideoOpcodes(VgaOpcodeProc *op) {
+	setupCommonVideoOpcodes(op);
+
+	op[11] = &AGOSEngine::vc11_onStop;
+	op[17] = &AGOSEngine::vc17_waitEnd;
+	op[19] = &AGOSEngine::vc19_loop;
+	op[22] = &AGOSEngine::vc22_setPaletteOld;
+	op[28] = &AGOSEngine::vc28_playSFX;
+	op[32] = &AGOSEngine::vc32_saveScreen;
+	op[37] = &AGOSEngine::vc37_pokePalette;
+	op[45] = &AGOSEngine::vc45_setWindowPalette;
+	op[46] = &AGOSEngine::vc46_setPaletteSlot1;
+	op[47] = &AGOSEngine::vc47_setPaletteSlot2;
+	op[48] = &AGOSEngine::vc48_setPaletteSlot3;
+	op[53] = &AGOSEngine::vc53_dissolveIn;
+	op[54] = &AGOSEngine::vc54_dissolveOut;
+	op[57] = &AGOSEngine::vc57_blackPalette;
+	op[56] = &AGOSEngine::vc56_fullScreen;
+	op[58] = &AGOSEngine::vc58_checkCodeWheel;
+	op[59] = &AGOSEngine::vc59_ifEGA;
+}
+
+void AGOSEngine::vc43_ifBitSet() {
+	if (!getBitFlag(vcReadNextWord())) {
+		vcSkipNextInstruction();
+	}
+}
+
+void AGOSEngine::vc44_ifBitClear() {
+	if (getBitFlag(vcReadNextWord())) {
+		vcSkipNextInstruction();
+	}
+}
+
+void AGOSEngine::vc45_setWindowPalette() {
+	uint num = vcReadNextWord();
+	uint color = vcReadNextWord();
+
+	const uint16 *vlut = &_videoWindows[num * 4];
+	uint16 *dst = (uint16 *)getBackBuf() + vlut[0] * 8 + vlut[1] * _dxSurfacePitch / 2;
+
+	for (uint h = 0; h < vlut[3]; h++) {
+		uint width = vlut[2] * 8;
+		for (uint w = 0; w < width; w++) {
+			dst[w] &= 0xF0F;
+			dst[w] |= color * 16;
+		}
+		dst += _dxSurfacePitch / 2;
+	}
+}
+
+void AGOSEngine::setPaletteSlot(uint srcOffs, uint dstOffs) {
+	byte *offs, *palptr, *src;
+	uint16 num;
+
+	palptr = _displayPalette + dstOffs * 64;
+	offs = _curVgaFile1 + READ_BE_UINT16(_curVgaFile1 + 6);
+	src = offs + srcOffs * 32;
+	num = 16;
+
+	do {
+		uint16 color = READ_BE_UINT16(src);
+		palptr[0] = ((color & 0xf00) >> 8) * 32;
+		palptr[1] = ((color & 0x0f0) >> 4) * 32;
+		palptr[2] = ((color & 0x00f) >> 0) * 32;
+		palptr[3] = 0;
+
+		palptr += 4;
+		src += 2;
+	} while (--num);
+
+	_paletteFlag = 2;
+}
+
+void AGOSEngine::vc46_setPaletteSlot1() {
+	uint srcOffs = vcReadNextWord();
+	setPaletteSlot(srcOffs, 1);
+}
+
+void AGOSEngine::vc47_setPaletteSlot2() {
+	uint srcOffs = vcReadNextWord();
+	setPaletteSlot(srcOffs, 2);
+}
+
+void AGOSEngine::vc48_setPaletteSlot3() {
+	uint srcOffs = vcReadNextWord();
+	setPaletteSlot(srcOffs, 3);
+}
+
+void AGOSEngine::vc49_setBit() {
+	uint16 bit = vcReadNextWord();
+	if (getGameType() == GType_FF && bit == 82) {
+		_variableArrayPtr = _variableArray2;
+	}
+	setBitFlag(bit, true);
+}
+
+void AGOSEngine::vc50_clearBit() {
+	uint16 bit = vcReadNextWord();
+	if (getGameType() == GType_FF && bit == 82) {
+		_variableArrayPtr = _variableArray;
+	}
+	setBitFlag(bit, false);
+}
+
+void AGOSEngine::vc51_enableBox() {
+	enableBox(vcReadNextWord());
+}
+
+void AGOSEngine::vc52_playSound() {
+	bool ambient = false;
+
+	uint16 sound = vcReadNextWord();
+	if (sound >= 0x8000) {
+		ambient = true;
+		sound = -sound;
+	}
+
+	if (getGameType() == GType_FF || getGameType() == GType_PP) {
+		int16 pan = vcReadNextWord();
+		int16 vol = vcReadNextWord();
+
+		if (ambient)
+			loadSound(sound, pan, vol, 2);
+		else
+			loadSound(sound, pan, vol, 1);
+	} else if (getGameType() == GType_SIMON2) {
+		if (ambient)
+			_sound->playAmbient(sound);
+		else
+			_sound->playEffects(sound);
+	} else if (getFeatures() & GF_TALKIE) {
+		_sound->playEffects(sound);
+	} else if (getGameId() == GID_SIMON1DOS) {
+		playSting(sound);
+	}
+}
+
+void AGOSEngine::vc53_dissolveIn() {
+	// TODO
+	uint num = vcReadNextWord();
+	uint speed = vcReadNextWord();
+	debug(0, "vc53_dissolveIn: stub (%d, %d)", num, speed);
+}
+
+void AGOSEngine::vc54_dissolveOut() {
+	// TODO
+	uint num = vcReadNextWord();
+	uint color = vcReadNextWord();
+	uint speed = vcReadNextWord();
+	debug(0, "vc54_dissolveOut: stub (%d, %d, %d)", num, color, speed);
+}
+
+void AGOSEngine::vc55_moveBox() {
+	HitArea *ha = _hitAreas;
+	uint count = ARRAYSIZE(_hitAreas);
+	uint16 id = vcReadNextWord();
+	int16 x = vcReadNextWord();
+	int16 y = vcReadNextWord();
+
+	for (;;) {
+		if (ha->id == id) {
+			ha->x += x;
+			ha->y += y;
+			break;
+		}
+		ha++;
+		if (!--count)
+			break;
+	}
+
+	_needHitAreaRecalc++;
+}
+
+void AGOSEngine::vc56_fullScreen() {
+	byte *src = _curVgaFile2 + 32;
+	byte *dst = getBackBuf();
+
+	memcpy(dst, src + 768, _screenHeight * _screenWidth);
+	//fullFade();
+
+	uint8 palette[1024];
+	for (int i = 0; i < 256; i++) {
+		palette[i * 4 + 0] = *src++ * 4;
+		palette[i * 4 + 1] = *src++ * 4;
+		palette[i * 4 + 2] = *src++ * 4;
+		palette[i * 4 + 3] = 0;
+	}
+
+	_system->setPalette(palette, 0, 256);
+}
+
+void AGOSEngine::vc57_blackPalette() {
+	uint8 palette[1024];
+	memset(palette, 0, sizeof(palette));
+	_system->setPalette(palette, 0, 256);
+}
+
+void AGOSEngine::vc58_checkCodeWheel() {
+	_variableArray[0] = 0;
+}
+
+void AGOSEngine::vc59_ifEGA() {
+	// Skip if not EGA
+	vcSkipNextInstruction();
+}
+
+} // End of namespace AGOS


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

Modified: scummvm/trunk/engines/agos/vga_ff.cpp
===================================================================
--- scummvm/trunk/engines/agos/vga_ff.cpp	2006-10-27 11:43:17 UTC (rev 24530)
+++ scummvm/trunk/engines/agos/vga_ff.cpp	2006-10-27 12:55:48 UTC (rev 24531)
@@ -25,7 +25,6 @@
 
 #include "agos/agos.h"
 #include "agos/intern.h"
-#include "agos/vga.h"
 
 namespace AGOS {
 

Modified: scummvm/trunk/engines/agos/vga_s1.cpp
===================================================================
--- scummvm/trunk/engines/agos/vga_s1.cpp	2006-10-27 11:43:17 UTC (rev 24530)
+++ scummvm/trunk/engines/agos/vga_s1.cpp	2006-10-27 12:55:48 UTC (rev 24531)
@@ -38,7 +38,7 @@
 	op[32] = &AGOSEngine::vc32_copyVar;
 	op[37] = &AGOSEngine::vc37_addToSpriteY;
 	op[48] = &AGOSEngine::vc48_setPathFinder;
-	op[59] = &AGOSEngine::vc59_skipIfSpeechEnded;
+	op[59] = &AGOSEngine::vc59_ifSpeech;
 	op[60] = &AGOSEngine::vc60_stopAnimation;
 	op[61] = &AGOSEngine::vc61_setMaskImage;
 	op[62] = &AGOSEngine::vc62_fastFadeOut;
@@ -196,7 +196,7 @@
 	}
 }
 
-void AGOSEngine::vc59_skipIfSpeechEnded() {
+void AGOSEngine::vc59_ifSpeech() {
 	if (!_sound->isVoiceActive())
 		vcSkipNextInstruction();
 }

Modified: scummvm/trunk/engines/agos/vga_s2.cpp
===================================================================
--- scummvm/trunk/engines/agos/vga_s2.cpp	2006-10-27 11:43:17 UTC (rev 24530)
+++ scummvm/trunk/engines/agos/vga_s2.cpp	2006-10-27 12:55:48 UTC (rev 24531)
@@ -25,7 +25,6 @@
 
 #include "agos/agos.h"
 #include "agos/intern.h"
-#include "agos/vga.h"
 
 namespace AGOS {
 
@@ -35,15 +34,15 @@
 	op[56] = &AGOSEngine::vc56_delayLong;
 	op[58] = &AGOSEngine::vc58_changePriority;
 	op[59] = &AGOSEngine::vc59_stopAnimations;
-	op[64] = &AGOSEngine::vc64_skipIfSpeechEnded;
+	op[64] = &AGOSEngine::vc64_ifSpeech;
 	op[65] = &AGOSEngine::vc65_slowFadeIn;
-	op[66] = &AGOSEngine::vc66_skipIfNotEqual;
-	op[67] = &AGOSEngine::vc67_skipIfGE;
-	op[68] = &AGOSEngine::vc68_skipIfLE;
-	op[69] = &AGOSEngine::vc69_playTrack;
-	op[70] = &AGOSEngine::vc70_queueMusic;
-	op[71] = &AGOSEngine::vc71_checkMusicQueue;
-	op[72] = &AGOSEngine::vc72_play_track_2;
+	op[66] = &AGOSEngine::vc66_ifEqual;
+	op[67] = &AGOSEngine::vc67_ifLE;
+	op[68] = &AGOSEngine::vc68_ifGE;
+	op[69] = &AGOSEngine::vc69_playSeq;
+	op[70] = &AGOSEngine::vc70_joinSeq;
+	op[71] = &AGOSEngine::vc71_ifSeqWaiting;
+	op[72] = &AGOSEngine::vc72_segue;
 	op[73] = &AGOSEngine::vc73_setMark;
 	op[74] = &AGOSEngine::vc74_clearMark;
 }
@@ -85,7 +84,7 @@
 	} while (++start != end);
 }
 
-void AGOSEngine::vc64_skipIfSpeechEnded() {
+void AGOSEngine::vc64_ifSpeech() {
 	if ((getGameType() == GType_SIMON2 && _subtitles && _language != Common::HB_ISR) ||
 		!_sound->isVoiceActive()) {
 		vcSkipNextInstruction();
@@ -103,7 +102,7 @@
 	_fastFadeOutFlag = false;
 }
 
-void AGOSEngine::vc66_skipIfNotEqual() {
+void AGOSEngine::vc66_ifEqual() {
 	uint16 a = vcReadNextWord();
 	uint16 b = vcReadNextWord();
 
@@ -111,7 +110,7 @@
 		vcSkipNextInstruction();
 }
 
-void AGOSEngine::vc67_skipIfGE() {
+void AGOSEngine::vc67_ifLE() {
 	uint16 a = vcReadNextWord();
 	uint16 b = vcReadNextWord();
 
@@ -119,7 +118,7 @@
 		vcSkipNextInstruction();
 }
 
-void AGOSEngine::vc68_skipIfLE() {
+void AGOSEngine::vc68_ifGE() {
 	uint16 a = vcReadNextWord();
 	uint16 b = vcReadNextWord();
 
@@ -127,7 +126,7 @@
 		vcSkipNextInstruction();
 }
 
-void AGOSEngine::vc69_playTrack() {
+void AGOSEngine::vc69_playSeq() {
 	int16 track = vcReadNextWord();
 	int16 loop = vcReadNextWord();
 
@@ -150,7 +149,7 @@
 	midi.startTrack(track);
 }
 
-void AGOSEngine::vc70_queueMusic() {
+void AGOSEngine::vc70_joinSeq() {
 	// Simon2
 	uint16 track = vcReadNextWord();
 	uint16 loop = vcReadNextWord();
@@ -166,7 +165,7 @@
 		midi.setLoop(loop != 0);
 }
 
-void AGOSEngine::vc71_checkMusicQueue() {
+void AGOSEngine::vc71_ifSeqWaiting() {
 	// Jamieson630:
 	// This command skips the next instruction
 	// unless (1) there is a track playing, AND
@@ -175,7 +174,7 @@
 		vcSkipNextInstruction();
 }
 
-void AGOSEngine::vc72_play_track_2() {
+void AGOSEngine::vc72_segue() {
 	// Jamieson630:
 	// This is a "play or stop track". Note that
 	// this opcode looks very similar in function

Added: scummvm/trunk/engines/agos/vga_ww.cpp
===================================================================
--- scummvm/trunk/engines/agos/vga_ww.cpp	                        (rev 0)
+++ scummvm/trunk/engines/agos/vga_ww.cpp	2006-10-27 12:55:48 UTC (rev 24531)
@@ -0,0 +1,266 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2001  Ludvig Strigeus
+ * Copyright (C) 2001-2006 The ScummVM project
+ *
+ * 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$
+ *
+ */
+
+// Video script opcodes for Simon1/Simon2
+#include "common/stdafx.h"
+
+#include "agos/agos.h"
+#include "agos/intern.h"
+
+#include "common/system.h"
+
+namespace AGOS {
+
+void AGOSEngine::setupWaxworksVideoOpcodes(VgaOpcodeProc *op) {
+	setupElvira2VideoOpcodes(op);
+
+	op[58] = &AGOSEngine::vc58_checkCodeWheel;
+	op[60] = &AGOSEngine::vc60_stopAnimation;
+	op[61] = &AGOSEngine::vc61;
+	op[62] = &AGOSEngine::vc62_fastFadeOut;
+	op[63] = &AGOSEngine::vc63_fastFadeIn;
+}
+
+void AGOSEngine::vcStopAnimation(uint file, uint sprite) {
+	uint16 old_sprite_id, old_cur_file_id;
+	VgaSleepStruct *vfs;
+	VgaSprite *vsp;
+	VgaTimerEntry *vte;
+	const byte *vcPtrOrg;
+
+	old_sprite_id = _vgaCurSpriteId;
+	old_cur_file_id = _vgaCurZoneNum;
+	vcPtrOrg = _vcPtr;
+
+	_vgaCurZoneNum = file;
+	_vgaCurSpriteId = sprite;
+
+	vfs = _waitSyncTable;
+	while (vfs->ident != 0) {
+		if (vfs->sprite_id == _vgaCurSpriteId && ((getGameType() == GType_SIMON1) || vfs->cur_vga_file == _vgaCurZoneNum)) {
+			while (vfs->ident != 0) {
+				memcpy(vfs, vfs + 1, sizeof(VgaSleepStruct));
+				vfs++;
+			}
+			break;
+		}
+		vfs++;
+	}
+
+	vsp = findCurSprite();
+	if (vsp->id) {
+		vc25_halt_sprite();
+
+		vte = _vgaTimerList;
+		while (vte->delay != 0) {
+			if (vte->sprite_id == _vgaCurSpriteId && ((getGameType() == GType_SIMON1) || vte->cur_vga_file == _vgaCurZoneNum)) {
+				deleteVgaEvent(vte);
+				break;
+			}
+			vte++;
+		}
+	}
+
+	_vgaCurZoneNum = old_cur_file_id;
+	_vgaCurSpriteId = old_sprite_id;
+	_vcPtr = vcPtrOrg;
+}
+
+void AGOSEngine::vc60_stopAnimation() {
+	uint16 sprite, zoneNum;
+
+	if (getGameType() == GType_PP) {
+		zoneNum = vcReadNextWord();
+		sprite = vcReadVarOrWord();
+	} else if (getGameType() == GType_SIMON2 || getGameType() == GType_FF) {
+		zoneNum = vcReadNextWord();
+		sprite = vcReadNextWord();
+	} else {
+		zoneNum = _vgaCurZoneNum;
+		sprite = vcReadNextWord();
+	}
+
+	vcStopAnimation(zoneNum, sprite);
+}
+
+void AGOSEngine::vc61() {
+	uint16 a = vcReadNextWord();
+	byte *src, *dst, *dstPtr;
+	uint h, tmp;
+
+	if (a == 6) {
+		src = _curVgaFile2 + 800;
+		dstPtr = getBackBuf();
+		memcpy(dstPtr, src, 64000);
+		tmp = 4 - 1;
+	} else {
+		dstPtr = getFrontBuf();
+		tmp = a - 1;
+	}
+
+	src = _curVgaFile2 + 3840 * 16 + 3360;
+	while (tmp--)
+		src += 1536 * 16 + 1712;
+
+
+	src += 800;
+
+	if (a != 5) {
+		dst = dstPtr + 7448;
+		for (h = 0; h < 177; h++) {
+			memcpy(dst, src, 144);
+			src += 144;
+			dst += _screenWidth;
+		}
+
+		if (a != 6)
+			return;
+
+		src = _curVgaFile2 + 9984 * 16 + 15344;
+	}
+
+	dst = dstPtr + 50296;
+	for (h = 0; h < 17; h++) {
+		memcpy(dst, src, 208);
+		src += 208;
+		dst += _screenWidth;
+	}
+
+	if (a == 6) {
+		//fullFade();
+		src = _curVgaFile2 + 32;
+
+		uint8 palette[1024];
+		for (int i = 0; i < 256; i++) {
+			palette[i * 4 + 0] = *src++ * 4;
+			palette[i * 4 + 1] = *src++ * 4;
+			palette[i * 4 + 2] = *src++ * 4;
+			palette[i * 4 + 3] = 0;
+		}
+
+		_system->setPalette(palette, 0, 256);
+	}
+}
+
+void AGOSEngine::vc62_fastFadeOut() {
+	vc29_stopAllSounds();
+
+	if (!_fastFadeOutFlag) {
+		uint i, fadeSize, fadeCount;
+
+		_fastFadeCount = 256;
+		if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) {
+			if (_windowNum == 4)
+				_fastFadeCount = 208;
+		}
+
+		memcpy(_videoBuf1, _currentPalette, _fastFadeCount * 4);
+
+		if ((getGameType() == GType_FF || getGameType() == GType_PP) && !getBitFlag(75)) {
+			fadeCount = 32;
+			fadeSize = 8;
+		} else {
+			fadeCount = 4;
+			fadeSize = 64;
+		}
+
+		for (i = fadeCount; i != 0; --i) {
+			paletteFadeOut(_videoBuf1, _fastFadeCount, fadeSize);
+			_system->setPalette(_videoBuf1, 0, _fastFadeCount);
+			delay(5);
+		}
+
+		if (getGameType() == GType_SIMON1) {
+			uint16 params[5];						/* parameters to vc10_draw */
+			VgaSprite *vsp;
+			VgaPointersEntry *vpe;
+			const byte *vcPtrOrg = _vcPtr;
+
+			vsp = _vgaSprites;
+			while (vsp->id != 0) {
+				if (vsp->id == 128) {
+					byte *old_file_1 = _curVgaFile1;
+					byte *old_file_2 = _curVgaFile2;
+					uint palmode = _windowNum;
+
+					vpe = &_vgaBufferPointers[vsp->zoneNum];
+					_curVgaFile1 = vpe->vgaFile1;
+					_curVgaFile2 = vpe->vgaFile2;
+					_windowNum = vsp->windowNum;
+
+					params[0] = READ_BE_UINT16(&vsp->image);
+					params[1] = READ_BE_UINT16(&vsp->palette);
+					params[2] = READ_BE_UINT16(&vsp->x);
+					params[3] = READ_BE_UINT16(&vsp->y);
+					params[4] = READ_BE_UINT16(&vsp->flags);
+					_vcPtr = (byte *)params;
+					vc10_draw();
+
+					_windowNum = palmode;
+					_curVgaFile1 = old_file_1;
+					_curVgaFile2 = old_file_2;
+					break;
+				}
+				vsp++;
+			}
+			_vcPtr = vcPtrOrg;
+		}
+
+		// Allow one section of Simon the Sorcerer 1 introduction to be displayed
+		// in lower half of screen
+		if ((getGameType() == GType_SIMON1) && (_subroutine == 2923 || _subroutine == 2926)) {
+			clearSurfaces(200);
+		} else if (getGameType() == GType_FF || getGameType() == GType_PP) {
+			clearSurfaces(480);
+		} else {
+			clearSurfaces(_windowNum == 4 ? 134 : 200);
+		}
+	}
+	if (getGameType() == GType_SIMON2) {
+		if (_nextMusicToPlay != -1)
+			loadMusic(_nextMusicToPlay);
+	}
+}
+
+void AGOSEngine::vc63_fastFadeIn() {
+	if (getGameType() == GType_PP) {
+		_fastFadeInFlag = 256;
+		if (getBitFlag(100)) {
+			startOverlayAnims();
+		} else if (getBitFlag(103)) {
+			printf("NameAndTime\n");
+		} else if (getBitFlag(104)) {
+			printf("HiScoreTable\n");
+		}
+	} else if (getGameType() == GType_FF) {
+		_fastFadeInFlag = 256;
+	} else if (getGameType() == GType_SIMON1 || getGameType() == GType_SIMON2) {
+		_fastFadeInFlag = 208;
+		if (_windowNum != 4) {
+			_fastFadeInFlag = 256;
+		}
+	}
+	_fastFadeOutFlag = false;
+}
+
+} // End of namespace AGOS


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


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