diff options
| author | Travis Howell | 2006-04-29 14:11:29 +0000 | 
|---|---|---|
| committer | Travis Howell | 2006-04-29 14:11:29 +0000 | 
| commit | 16e90765a9103e8c1c39b2e009b5f152e56cc2b8 (patch) | |
| tree | 326eb17dbfe7606656109cfadb884070fda55beb | |
| parent | 39e9853d91a88c9659036ec6dc903d48a000e93c (diff) | |
| download | scummvm-rg350-16e90765a9103e8c1c39b2e009b5f152e56cc2b8.tar.gz scummvm-rg350-16e90765a9103e8c1c39b2e009b5f152e56cc2b8.tar.bz2 scummvm-rg350-16e90765a9103e8c1c39b2e009b5f152e56cc2b8.zip  | |
Split more functions of simon.cpp into separate files
svn-id: r22224
| -rw-r--r-- | engines/simon/cursor.cpp | 115 | ||||
| -rw-r--r-- | engines/simon/draw.cpp | 494 | ||||
| -rw-r--r-- | engines/simon/event.cpp | 81 | ||||
| -rw-r--r-- | engines/simon/module.mk | 1 | ||||
| -rw-r--r-- | engines/simon/res.cpp | 34 | ||||
| -rw-r--r-- | engines/simon/simon.cpp | 854 | ||||
| -rw-r--r-- | engines/simon/subroutine.cpp | 10 | ||||
| -rw-r--r-- | engines/simon/verb.cpp | 63 | ||||
| -rw-r--r-- | engines/simon/vga.cpp | 15 | ||||
| -rw-r--r-- | engines/simon/window.cpp | 23 | 
10 files changed, 861 insertions, 829 deletions
diff --git a/engines/simon/cursor.cpp b/engines/simon/cursor.cpp index f0dd0945f0..5271e13d06 100644 --- a/engines/simon/cursor.cpp +++ b/engines/simon/cursor.cpp @@ -260,6 +260,121 @@ void SimonEngine::drawMousePointer() {  	}  } +void SimonEngine::handleMouseMoved() { +	uint x; + +	if (_mouseHideCount) { +		_system->showMouse(false); +		return; +	} + +	_system->showMouse(true); +	pollMouseXY(); + +	if (_mouseX <= 0) +		_mouseX = 0; +	if (_mouseX >= _screenWidth - 1) +		_mouseX = _screenWidth - 1; + +	if (_mouseY <= 0) +		_mouseY = 0; +	if (_mouseY >= _screenHeight - 1) +		_mouseY = _screenHeight - 1; + +	if (_defaultVerb) { +		uint id = 101; +		if (_mouseY >= 136) +			id = 102; +		if (_defaultVerb != id) +			resetVerbs(); +	} + +	if (getGameType() == GType_FF) { +		if (getBitFlag(99)) { // Oracle +			if (_mouseX >= 10 && _mouseX <= 635 && _mouseY >= 5 && _mouseY <= 475) { +				setBitFlag(98, true); +			} else { +				if (getBitFlag(98)) { +					_variableArray[254] = 63; +				} +			} +		} else if (getBitFlag(88)) { // Close Up +			if (_mouseX >= 10 && _mouseX <= 635 && _mouseY >= 5 && _mouseY <= 475) { +				setBitFlag(87, true); +			} else { +				if (getBitFlag(87)) { +					_variableArray[254] = 75; +				} +			} +		} + +		if (_rightButtonDown) { +			_rightButtonDown = 0; +			setVerb(NULL); +		} +	} +	if (getGameType() == GType_SIMON2) { +		if (getBitFlag(79)) { +			if (!_vgaVar9) { +				if (_mouseX >= 315 || _mouseX < 9) +					goto get_out2; +				_vgaVar9 = 1; +			} +			if (_scrollCount == 0) { +				if (_mouseX >= 315) { +					if (_scrollX != _scrollXMax) +						_scrollFlag = 1; +				} else if (_mouseX < 8) { +					if (_scrollX != 0) +						_scrollFlag = -1; +				} +			} +		} else { +		get_out2:; +			_vgaVar9 = 0; +		} +	} + +	if (_mouseX != _mouseXOld || _mouseY != _mouseYOld) +		_needHitAreaRecalc++; + +	x = 0; +	if (_lastHitArea3 == 0 && _leftButtonDown != 0) { +		_leftButtonDown = 0; +		x = 1; +	} else { +		if (_hitarea_unk_3 == 0 && _needHitAreaRecalc == 0) +			goto get_out; +	} + +	boxController(_mouseX, _mouseY, x); +	_lastHitArea3 = _lastHitArea; +	if (x == 1 && _lastHitArea == NULL) +		_lastHitArea3 = (HitArea *) -1; + +get_out: +	drawMousePointer(); +	_needHitAreaRecalc = 0; +} + +void SimonEngine::mouseOff() { +	_mouseHideCount++; +} + +void SimonEngine::mouseOn() { +	_lockWord |= 1; + +	if (_mouseHideCount != 0) +		_mouseHideCount--; + +	_lockWord &= ~1; +} + +void SimonEngine::pollMouseXY() { +	_mouseX = _sdlMouseX; +	_mouseY = _sdlMouseY; +} +  } // End of namespace Simon  #ifdef PALMOS_68K diff --git a/engines/simon/draw.cpp b/engines/simon/draw.cpp new file mode 100644 index 0000000000..dddaa97d8e --- /dev/null +++ b/engines/simon/draw.cpp @@ -0,0 +1,494 @@ +/* ScummVM - Scumm Interpreter + * 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$ + * + */ + +#include "common/stdafx.h" + +#include "common/system.h" + +#include "simon/simon.h" +#include "simon/intern.h" + +namespace Simon { + +byte *SimonEngine::getFrontBuf() { +	_dxSurfacePitch = _screenWidth; +	return _frontBuf; +} + +byte *SimonEngine::getBackBuf() { +	_dxSurfacePitch = _screenWidth; +	return _useBackGround ? _backGroundBuf : _backBuf; +} + +byte *SimonEngine::getBackGround() { +	_dxSurfacePitch = _screenWidth; +	return _backGroundBuf; +} + +byte *SimonEngine::getScaleBuf() { +	_dxSurfacePitch = _screenWidth; +	return _scaleBuf; +} + +void SimonEngine::animateSprites() { +	VgaSprite *vsp; +	VgaPointersEntry *vpe; +	const byte *vc_ptr_org = _vcPtr; +	uint16 params[5];							// parameters to vc10 + +	if (_paletteFlag == 2) +		_paletteFlag = 1; + +	if (getGameType() == GType_FF && _scrollCount) { +		scrollEvent(); +	} +	if (getGameType() == GType_SIMON2 && _scrollFlag) { +		scrollScreen(); +	} + +	if (getGameType() == GType_FF && getBitFlag(84)) { +		animateSpritesByY(); +		return; +	} + +	vsp = _vgaSprites; + +	while (vsp->id != 0) { +		vsp->windowNum &= 0x7FFF; + +		vpe = &_vgaBufferPointers[vsp->zoneNum]; +		_curVgaFile1 = vpe->vgaFile1; +		_curVgaFile2 = vpe->vgaFile2; +		_curSfxFile = vpe->sfxFile; +		_windowNum = vsp->windowNum; +		_vgaCurSpriteId = vsp->id; +		_vgaCurSpritePriority = vsp->priority; + +		params[0] = readUint16Wrapper(&vsp->image); +		params[1] = readUint16Wrapper(&vsp->palette); +		params[2] = readUint16Wrapper(&vsp->x); +		params[3] = readUint16Wrapper(&vsp->y); + +		if (getGameType() == GType_SIMON1) { +			params[4] = READ_BE_UINT16(&vsp->flags); +		} else { +			*(byte *)(¶ms[4]) = (byte)vsp->flags; +		} + +		_vcPtr = (const byte *)params; +		vc10_draw(); + +		vsp++; +	} + +	if (_drawImagesDebug) +		memset(_backBuf, 0, _screenWidth * _screenHeight); + +	_updateScreen++; +	_vcPtr = vc_ptr_org; +} + +void SimonEngine::animateSpritesDebug() { +	VgaSprite *vsp; +	VgaPointersEntry *vpe; +	const byte *vc_ptr_org = _vcPtr; +	uint16 params[5];							// parameters to vc10_draw + +	if (_paletteFlag == 2) +		_paletteFlag = 1; + +	vsp = _vgaSprites; +	while (vsp->id != 0) { +		vsp->windowNum &= 0x7FFF; + +		vpe = &_vgaBufferPointers[vsp->zoneNum]; +		_curVgaFile1 = vpe->vgaFile1; +		_curVgaFile2 = vpe->vgaFile2; +		_curSfxFile = vpe->sfxFile; +		_windowNum = vsp->windowNum; +		_vgaCurSpriteId = vsp->id; + +		if (vsp->image) +			fprintf(_dumpFile, "id:%5d image:%3d base-color:%3d x:%3d y:%3d flags:%x\n", +							vsp->id, vsp->image, vsp->palette, vsp->x, vsp->y, vsp->flags); +		params[0] = readUint16Wrapper(&vsp->image); +		params[1] = readUint16Wrapper(&vsp->palette); +		params[2] = readUint16Wrapper(&vsp->x); +		params[3] = readUint16Wrapper(&vsp->y); +		params[4] = readUint16Wrapper(&vsp->flags); +		_vcPtr = (const byte *)params; +		vc10_draw(); + +		vsp++; +	} + +	_updateScreen++; +	_vcPtr = vc_ptr_org; +} + +void SimonEngine::animateSpritesByY() { +	VgaSprite *vsp; +	VgaPointersEntry *vpe; +	const byte *vc_ptr_org = _vcPtr; +	uint16 params[5];							// parameters to vc10 +	int16 spriteTable[180][2]; +	 +	byte *src; +	int height, slot, y; +	uint i, numSprites = 0; + +	vsp = _vgaSprites; +	while (vsp->id != 0) { +		if (vsp->flags & kDFScaled) { +			y = vsp->y; +		} else if (vsp->flags & kDFMasked) { +			vpe = &_vgaBufferPointers[vsp->zoneNum]; +			src = vpe->vgaFile2 + vsp->image * 8; +			height = READ_LE_UINT16(src + 4) & 0x7FFF; +			y = vsp->y + height; +		} else { +			y = vsp->priority; +		} + +		spriteTable[numSprites][0] = y; +		spriteTable[numSprites][1] = numSprites; +		numSprites++; +		vsp++; +	} + +	while(1) { +		y = spriteTable[0][0]; +		slot = spriteTable[0][1]; + +		for (i = 0; i < numSprites; i++) { +			if (y >= spriteTable[i][0]) { +				y = spriteTable[i][0]; +				slot = spriteTable[i][1]; +			} +		} + +		if (y == 9999) +			break; + +		for (i = 0; i < numSprites; i++) { +			if (slot == spriteTable[i][1]) { +				spriteTable[i][0] = 9999; +				break; +			} +		} + +		vsp = &_vgaSprites[slot]; +		vsp->windowNum &= 0x7FFF; + +		vpe = &_vgaBufferPointers[vsp->zoneNum]; +		_curVgaFile1 = vpe->vgaFile1; +		_curVgaFile2 = vpe->vgaFile2; +		_curSfxFile = vpe->sfxFile; +		_windowNum = vsp->windowNum; +		_vgaCurSpriteId = vsp->id; +		_vgaCurSpritePriority = vsp->priority; + +		params[0] = readUint16Wrapper(&vsp->image); +		params[1] = readUint16Wrapper(&vsp->palette); +		params[2] = readUint16Wrapper(&vsp->x); +		params[3] = readUint16Wrapper(&vsp->y); +		*(byte *)(¶ms[4]) = (byte)vsp->flags; + +		_vcPtr = (const byte *)params; +		vc10_draw(); +	} + +	_updateScreen++; +	_vcPtr = vc_ptr_org; +} + +void SimonEngine::displayBoxStars() { +	HitArea *ha, *dha; +	uint count; +	uint y_, x_; +	byte *dst; +	uint b, color; + +	_lockWord |= 0x8000; + +	if (getGameType() == GType_SIMON2) +		color = 236; +	else +		color = 225; + +	uint limit = (getGameType() == GType_SIMON2) ? 200 : 134; + +	for (int i = 0; i < 5; i++) { +		ha = _hitAreas; +		count = ARRAYSIZE(_hitAreas); + +		animateSprites(); + +		do { +			if (ha->id != 0 && ha->flags & kBFBoxInUse && !(ha->flags & kBFBoxDead)) { + +				dha = _hitAreas; +				if (ha->flags & kBFTextBox) { +					while (dha != ha && dha->flags != ha->flags) +						++dha; +					if (dha != ha && dha->flags == ha->flags) +						continue; +				} else { +					dha = _hitAreas; +					while (dha != ha && dha->item_ptr != ha->item_ptr) +						++dha; +					if (dha != ha && dha->item_ptr == ha->item_ptr) +						continue; +				} + +				if (ha->y >= limit || ((getGameType() == GType_SIMON2) && ha->y >= _boxStarHeight)) +					continue; + +				y_ = (ha->height / 2) - 4 + ha->y; + +				x_ = (ha->width / 2) - 4 + ha->x - (_scrollX * 8); + +				if (x_ >= 311) +					continue; + +				dst = getBackBuf(); + +				dst += (((_dxSurfacePitch / 4) * y_) * 4) + x_; + +				b = _dxSurfacePitch; +				dst[4] = color; +				dst[b+1] = color; +				dst[b+4] = color; +				dst[b+7] = color; +				b += _dxSurfacePitch; +				dst[b+2] = color; +				dst[b+4] = color; +				dst[b+6] = color; +				b += _dxSurfacePitch; +				dst[b+3] = color; +				dst[b+5] = color; +				b += _dxSurfacePitch; +				dst[b] = color; +				dst[b+1] = color; +				dst[b+2] = color; +				dst[b+6] = color; +				dst[b+7] = color; +				dst[b+8] = color; +				b += _dxSurfacePitch; +				dst[b+3] = color; +				dst[b+5] = color; +				b += _dxSurfacePitch; +				dst[b+2] = color; +				dst[b+4] = color; +				dst[b+6] = color; +				b += _dxSurfacePitch; +				dst[b+1] = color; +				dst[b+4] = color; +				dst[b+7] = color; +				b += _dxSurfacePitch; +				dst[b+4] = color; +			} +		} while (ha++, --count); + +		dx_update_screen_and_palette(); +		delay(100); +		animateSprites(); +		dx_update_screen_and_palette(); +		delay(100); +	} + +	_lockWord &= ~0x8000; +} + +void SimonEngine::scrollScreen() { +	byte *dst = getFrontBuf(); +	const byte *src; +	uint x, y; + +	if (_scrollXMax == 0) { +		uint screenSize = 8 * _screenWidth; +		if (_scrollFlag < 0) { +			memmove(dst + screenSize, dst, _scrollWidth * _screenHeight - screenSize); +		} else { +			memmove(dst, dst + screenSize, _scrollWidth * _screenHeight - screenSize); +		} + +		y = _scrollY - 8; + +		if (_scrollFlag > 0) { +			dst += _screenHeight * _screenWidth - screenSize; +			y += 488; +		} + +		src = _scrollImage + y / 2; +		decodeRow(dst, src + readUint32Wrapper(src), _scrollWidth); + +		_scrollY += _scrollFlag; +		vcWriteVar(250, _scrollY); +	} else { +		if (_scrollFlag < 0) { +			memmove(dst + 8, dst, _screenWidth * _scrollHeight - 8); +		} else { +			memmove(dst, dst + 8, _screenWidth * _scrollHeight - 8); +		} + +		x = _scrollX; +		x -= (getGameType() == GType_FF) ? 8 : 1; + +		if (_scrollFlag > 0) { +			dst += _screenWidth - 8; +			x += (getGameType() == GType_FF) ? 648 : 41; +		} + +		if (getGameType() == GType_FF) +			src = _scrollImage + x / 2; +		else +			src = _scrollImage + x * 4; +		decodeColumn(dst, src + readUint32Wrapper(src), _scrollHeight); + +		_scrollX += _scrollFlag; +		vcWriteVar(251, _scrollX); +	} + +	memcpy(_backBuf, _frontBuf, _screenWidth * _screenHeight); +	memcpy(_backGroundBuf, _backBuf, _scrollHeight * _screenWidth); + +	_scrollFlag = 0; +} + +void SimonEngine::clearBackFromTop(uint lines) { +	memset(_backBuf, 0, lines * _screenWidth); +} + +void SimonEngine::dx_clear_surfaces(uint num_lines) { +	memset(_backBuf, 0, num_lines * _screenWidth); + +	_system->copyRectToScreen(_backBuf, _screenWidth, 0, 0, _screenWidth, num_lines); + +	if (_useBackGround) { +		memset(_frontBuf, 0, num_lines * _screenWidth); +		memset(_backGroundBuf, 0, num_lines * _screenWidth); +	} +} + +void SimonEngine::fillFrontFromBack(uint x, uint y, uint w, uint h) { +	uint offs = x + y * _screenWidth; +	byte *s = _backBuf + offs; +	byte *d = _frontBuf + offs; + +	do { +		memcpy(d, s, w); +		d += _screenWidth; +		s += _screenWidth; +	} while (--h); +} + +void SimonEngine::fillBackFromFront(uint x, uint y, uint w, uint h) { +	uint offs = x + y * _screenWidth; +	byte *s = _frontBuf + offs; +	byte *d = _backBuf + offs; + +	do { +		memcpy(d, s, w); +		d += _screenWidth; +		s += _screenWidth; +	} while (--h); +} + +void SimonEngine::fillBackGroundFromBack(uint lines) { +	memcpy(_backGroundBuf, _backBuf, lines * _screenWidth); +} + +void SimonEngine::dx_update_screen_and_palette() { +	_numScreenUpdates++; + +	if (_paletteColorCount == 0 && _paletteFlag == 1) { +		_paletteFlag = 0; +		if (memcmp(_palette, _paletteBackup, 1024) != 0) { +			memcpy(_paletteBackup, _palette, 1024); +			_system->setPalette(_palette, 0, 256); +		} +	} + +	_system->copyRectToScreen(_backBuf, _screenWidth, 0, 0, _screenWidth, _screenHeight); +	_system->updateScreen(); + +	memcpy(_backBuf, _frontBuf, _screenWidth * _screenHeight); + +	if (getGameType() == GType_FF && _scrollFlag) { +		scrollScreen(); +	} + +	if (_paletteColorCount != 0) { +		if (getGameType() == GType_SIMON1 && _usePaletteDelay) { +			delay(100); +			_usePaletteDelay = false; +		} +		fastFadeIn(); +	} +} + +void SimonEngine::fastFadeIn() { +	if (_paletteColorCount & 0x8000) { +		slowFadeIn(); +	} else { +		_paletteFlag = false; +		memcpy(_paletteBackup, _palette, 1024); +		_system->setPalette(_palette, 0, _paletteColorCount); +		_paletteColorCount = 0; +	} +} + +void SimonEngine::slowFadeIn() { +	uint8 paletteTmp[768]; +	uint8 *src, *dst; +	int c, p; + +	_paletteColorCount &= 0x7fff; +	_paletteFlag = false; + +	memcpy(_videoBuf1, _palette, 1024); // Difference +	memset(_videoBuf1, 0, 768); + +	memcpy(_paletteBackup, _palette, 768); +	memcpy(paletteTmp, _palette, 768); + +	for (c = 255; c > 0; c -= 4) { +	  	src = paletteTmp; + 		dst = _videoBuf1; + +		for (p = _paletteColorCount; p !=0 ; p--) { +			if (*src >= c) +				*dst = *dst + 4; +			 +			src++; +			dst++; + 		} + 		_system->setPalette(_videoBuf1, 0, _videoNumPalColors); +		if (_fade) +			_system->updateScreen(); + 		delay(5); + 	} +	_paletteColorCount = 0; +} + +} // End of namespace Simon diff --git a/engines/simon/event.cpp b/engines/simon/event.cpp index 15105e7f61..2706f075dd 100644 --- a/engines/simon/event.cpp +++ b/engines/simon/event.cpp @@ -287,4 +287,85 @@ void SimonEngine::scrollEvent() {  	}  } +void SimonEngine::timer_callback() { +	if (_timer5 != 0) { +		_syncFlag2 = true; +		_timer5--; +	} else { +		timer_proc1(); +	} +} + +void SimonEngine::timer_proc1() { +	_timer4++; + +	if (_lockWord & 0x80E9 || _lockWord & 2) +		return; + +	_syncCount++; + +	_lockWord |= 2; + +	if (!(_lockWord & 0x10)) { +		if (getGameType() == GType_FF) { +			_syncFlag2 ^= 1; +			if (!_syncFlag2) { +				processVgaEvents(); +			} else { +				// Double speed on Oracle +				if (getBitFlag(99)) { +					processVgaEvents(); +				} else if (_scrollCount == 0) { +					_lockWord &= ~2; +					return; +				} +			} +		} else { +			processVgaEvents(); +			processVgaEvents(); +			_syncFlag2 ^= 1; +			_cepeFlag ^= 1; +			if (!_cepeFlag) +				processVgaEvents(); + +			if (_mouseHideCount != 0 && _syncFlag2) { +				_lockWord &= ~2; +				return; +			} +		} +	} + +	if (getGameType() == GType_FF) +		_moviePlay->nextFrame(); + +	animateSprites(); +	if (_drawImagesDebug) +		animateSpritesDebug(); + +	if (_copyPartialMode == 1) { +		fillBackFromFront(80, 46, 208 - 80, 94 - 46); +	} + +	if (_copyPartialMode == 2) { +		fillFrontFromBack(176, 61, _screenWidth - 176, 134 - 61); +		_copyPartialMode = 0; +	} + +	if (_updateScreen) { +		if (getGameType() == GType_FF) { +			if (!getBitFlag(78)) { +				oracleLogo(); +			} +			if (getBitFlag(76)) { +				swapCharacterLogo(); +			} +		} +		handleMouseMoved(); +		dx_update_screen_and_palette(); +		_updateScreen = false; +	} + +	_lockWord &= ~2; +} +  } // End of namespace Simon diff --git a/engines/simon/module.mk b/engines/simon/module.mk index 1e55c0f0d6..4006a99ebc 100644 --- a/engines/simon/module.mk +++ b/engines/simon/module.mk @@ -6,6 +6,7 @@ MODULE_OBJS := \  	cursor.o \  	debug.o \  	debugger.o \ +	draw.o \  	event.o \  	game.o \  	icons.o \ diff --git a/engines/simon/res.cpp b/engines/simon/res.cpp index a2c25f3ef7..3a285da57b 100644 --- a/engines/simon/res.cpp +++ b/engines/simon/res.cpp @@ -193,6 +193,40 @@ void SimonEngine::loadOffsets(const char *filename, int number, uint32 &file, ui  	in.close();  } +int SimonEngine::allocGamePcVars(File *in) { +	uint item_array_size, item_array_inited, stringtable_num; +	uint32 version; +	uint i; + +	item_array_size = in->readUint32BE(); +	version = in->readUint32BE(); +	item_array_inited = in->readUint32BE(); +	stringtable_num = in->readUint32BE(); + +	item_array_inited += 2;				// first two items are predefined +	item_array_size += 2; + +	if (version != 0x80) +		error("Not a runtime database"); + +	_itemArrayPtr = (Item **)calloc(item_array_size, sizeof(Item *)); +	if (_itemArrayPtr == NULL) +		error("Out of memory for Item array"); + +	_itemArraySize = item_array_size; +	_itemArrayInited = item_array_inited; + +	for (i = 1; i < item_array_inited; i++) { +		_itemArrayPtr[i] = (Item *)allocateItem(sizeof(Item)); +	} + +	// The rest is cleared automatically by calloc +	allocateStringTable(stringtable_num + 10); +	_stringTabNum = stringtable_num; + +	return item_array_inited; +} +  void SimonEngine::loadGamePcFile() {  	Common::File in;  	int num_inited_objects; diff --git a/engines/simon/simon.cpp b/engines/simon/simon.cpp index a5fe75faf7..08374f001a 100644 --- a/engines/simon/simon.cpp +++ b/engines/simon/simon.cpp @@ -27,15 +27,14 @@  #include "common/config-manager.h"  #include "common/file.h" -#include "common/md5.h"  #include "common/system.h"  #include "gui/about.h" -#include "simon/simon.h" +#include "simon/debugger.h"  #include "simon/intern.h" +#include "simon/simon.h"  #include "simon/vga.h" -#include "simon/debugger.h"  #include "sound/mididrv.h"  #ifdef _WIN32_WCE @@ -649,40 +648,6 @@ byte *SimonEngine::allocateItem(uint size) {  	return org;  } -int SimonEngine::allocGamePcVars(File *in) { -	uint item_array_size, item_array_inited, stringtable_num; -	uint32 version; -	uint i; - -	item_array_size = in->readUint32BE(); -	version = in->readUint32BE(); -	item_array_inited = in->readUint32BE(); -	stringtable_num = in->readUint32BE(); - -	item_array_inited += 2;				// first two items are predefined -	item_array_size += 2; - -	if (version != 0x80) -		error("Not a runtime database"); - -	_itemArrayPtr = (Item **)calloc(item_array_size, sizeof(Item *)); -	if (_itemArrayPtr == NULL) -		error("Out of memory for Item array"); - -	_itemArraySize = item_array_size; -	_itemArrayInited = item_array_inited; - -	for (i = 1; i < item_array_inited; i++) { -		_itemArrayPtr[i] = (Item *)allocateItem(sizeof(Item)); -	} - -	// The rest is cleared automatically by calloc -	allocateStringTable(stringtable_num + 10); -	_stringTabNum = stringtable_num; - -	return item_array_inited; -} -  void SimonEngine::setUserFlag(Item *item, int a, int b) {  	SubUserFlag *subUserFlag; @@ -760,6 +725,10 @@ void SimonEngine::setItemState(Item *item, int value) {  	item->state = value;  } +byte SimonEngine::getByte() { +	return *_codePtr++; +} +  int SimonEngine::getNextWord() {  	int16 a = (int16)READ_BE_UINT16(_codePtr);  	_codePtr += 2; @@ -976,32 +945,6 @@ void SimonEngine::linkItem(Item *item, Item *parent) {  	}  } -void SimonEngine::playSting(uint a) { -	if (!midi._enable_sfx) -		return; - -	char filename[15]; - -	File mus_file; -	uint16 mus_offset; - -	sprintf(filename, "STINGS%i.MUS", _soundFileId); -	mus_file.open(filename); -	if (!mus_file.isOpen()) { -		warning("Can't load sound effect from '%s'", filename); -		return; -	} - -	mus_file.seek(a * 2, SEEK_SET); -	mus_offset = mus_file.readUint16LE(); -	if (mus_file.ioFailed()) -		error("Can't read sting %d offset", a); - -	mus_file.seek(mus_offset, SEEK_SET); -	midi.loadSMF(&mus_file, a, true); -	midi.startTrack(0); -} -  void SimonEngine::setup_cond_c_helper() {  	HitArea *last;  	uint id; @@ -1127,116 +1070,6 @@ void SimonEngine::endCutscene() {  	_runScriptReturn1 = true;  } -void SimonEngine::mouseOff() { -	_mouseHideCount++; -} - -void SimonEngine::mouseOn() { -	_lockWord |= 1; - -	if (_mouseHideCount != 0) -		_mouseHideCount--; - -	_lockWord &= ~1; -} - -void SimonEngine::handleMouseMoved() { -	uint x; - -	if (_mouseHideCount) { -		_system->showMouse(false); -		return; -	} - -	_system->showMouse(true); -	pollMouseXY(); - -	if (_mouseX <= 0) -		_mouseX = 0; -	if (_mouseX >= _screenWidth - 1) -		_mouseX = _screenWidth - 1; - -	if (_mouseY <= 0) -		_mouseY = 0; -	if (_mouseY >= _screenHeight - 1) -		_mouseY = _screenHeight - 1; - -	if (_defaultVerb) { -		uint id = 101; -		if (_mouseY >= 136) -			id = 102; -		if (_defaultVerb != id) -			resetVerbs(); -	} - -	if (getGameType() == GType_FF) { -		if (getBitFlag(99)) { // Oracle -			if (_mouseX >= 10 && _mouseX <= 635 && _mouseY >= 5 && _mouseY <= 475) { -				setBitFlag(98, true); -			} else { -				if (getBitFlag(98)) { -					_variableArray[254] = 63; -				} -			} -		} else if (getBitFlag(88)) { // Close Up -			if (_mouseX >= 10 && _mouseX <= 635 && _mouseY >= 5 && _mouseY <= 475) { -				setBitFlag(87, true); -			} else { -				if (getBitFlag(87)) { -					_variableArray[254] = 75; -				} -			} -		} - -		if (_rightButtonDown) { -			_rightButtonDown = 0; -			setVerb(NULL); -		} -	} -	if (getGameType() == GType_SIMON2) { -		if (getBitFlag(79)) { -			if (!_vgaVar9) { -				if (_mouseX >= 315 || _mouseX < 9) -					goto get_out2; -				_vgaVar9 = 1; -			} -			if (_scrollCount == 0) { -				if (_mouseX >= 315) { -					if (_scrollX != _scrollXMax) -						_scrollFlag = 1; -				} else if (_mouseX < 8) { -					if (_scrollX != 0) -						_scrollFlag = -1; -				} -			} -		} else { -		get_out2:; -			_vgaVar9 = 0; -		} -	} - -	if (_mouseX != _mouseXOld || _mouseY != _mouseYOld) -		_needHitAreaRecalc++; - -	x = 0; -	if (_lastHitArea3 == 0 && _leftButtonDown != 0) { -		_leftButtonDown = 0; -		x = 1; -	} else { -		if (_hitarea_unk_3 == 0 && _needHitAreaRecalc == 0) -			goto get_out; -	} - -	boxController(_mouseX, _mouseY, x); -	_lastHitArea3 = _lastHitArea; -	if (x == 1 && _lastHitArea == NULL) -		_lastHitArea3 = (HitArea *) -1; - -get_out: -	drawMousePointer(); -	_needHitAreaRecalc = 0; -} -  bool SimonEngine::has_item_childflag_0x10(Item *item) {  	SubObject *child = (SubObject *)findChildOfType(item, 2);  	return child && (child->objectFlags & kOFIcon) != 0; @@ -1253,104 +1086,6 @@ uint SimonEngine::itemGetIconNumber(Item *item) {  	return child->objectFlagValue[offs];  } -void SimonEngine::displayBoxStars() { -	HitArea *ha, *dha; -	uint count; -	uint y_, x_; -	byte *dst; -	uint b, color; - -	_lockWord |= 0x8000; - -	if (getGameType() == GType_SIMON2) -		color = 236; -	else -		color = 225; - -	uint limit = (getGameType() == GType_SIMON2) ? 200 : 134; - -	for (int i = 0; i < 5; i++) { -		ha = _hitAreas; -		count = ARRAYSIZE(_hitAreas); - -		animateSprites(); - -		do { -			if (ha->id != 0 && ha->flags & kBFBoxInUse && !(ha->flags & kBFBoxDead)) { - -				dha = _hitAreas; -				if (ha->flags & kBFTextBox) { -					while (dha != ha && dha->flags != ha->flags) -						++dha; -					if (dha != ha && dha->flags == ha->flags) -						continue; -				} else { -					dha = _hitAreas; -					while (dha != ha && dha->item_ptr != ha->item_ptr) -						++dha; -					if (dha != ha && dha->item_ptr == ha->item_ptr) -						continue; -				} - -				if (ha->y >= limit || ((getGameType() == GType_SIMON2) && ha->y >= _boxStarHeight)) -					continue; - -				y_ = (ha->height / 2) - 4 + ha->y; - -				x_ = (ha->width / 2) - 4 + ha->x - (_scrollX * 8); - -				if (x_ >= 311) -					continue; - -				dst = getBackBuf(); - -				dst += (((_dxSurfacePitch / 4) * y_) * 4) + x_; - -				b = _dxSurfacePitch; -				dst[4] = color; -				dst[b+1] = color; -				dst[b+4] = color; -				dst[b+7] = color; -				b += _dxSurfacePitch; -				dst[b+2] = color; -				dst[b+4] = color; -				dst[b+6] = color; -				b += _dxSurfacePitch; -				dst[b+3] = color; -				dst[b+5] = color; -				b += _dxSurfacePitch; -				dst[b] = color; -				dst[b+1] = color; -				dst[b+2] = color; -				dst[b+6] = color; -				dst[b+7] = color; -				dst[b+8] = color; -				b += _dxSurfacePitch; -				dst[b+3] = color; -				dst[b+5] = color; -				b += _dxSurfacePitch; -				dst[b+2] = color; -				dst[b+4] = color; -				dst[b+6] = color; -				b += _dxSurfacePitch; -				dst[b+1] = color; -				dst[b+4] = color; -				dst[b+7] = color; -				b += _dxSurfacePitch; -				dst[b+4] = color; -			} -		} while (ha++, --count); - -		dx_update_screen_and_palette(); -		delay(100); -		animateSprites(); -		dx_update_screen_and_palette(); -		delay(100); -	} - -	_lockWord &= ~0x8000; -} -  void SimonEngine::hitarea_stuff() {  	HitArea *ha;  	uint id; @@ -1501,69 +1236,6 @@ void SimonEngine::permitInput() {  	}  } -void SimonEngine::pollMouseXY() { -	_mouseX = _sdlMouseX; -	_mouseY = _sdlMouseY; -} - -void SimonEngine::handleVerbClicked(uint verb) { -	Subroutine *sub; -	int result; - -	_objectItem = _hitAreaObjectItem; -	if (_objectItem == _dummyItem2) { -		_objectItem = me(); -	} -	if (_objectItem == _dummyItem3) { -		_objectItem = derefItem(me()->parent); -	} - -	_subjectItem = _hitAreaSubjectItem; -	if (_subjectItem == _dummyItem2) { -		_subjectItem = me(); -	} -	if (_subjectItem == _dummyItem3) { -		_subjectItem = derefItem(me()->parent); -	} - -	if (_subjectItem) { -		_scriptNoun1 = _subjectItem->noun; -		_scriptAdj1 = _subjectItem->adjective; -	} else { -		_scriptNoun1 = -1; -		_scriptAdj1 = -1; -	} - -	if (_objectItem) { -		_scriptNoun2 = _objectItem->noun; -		_scriptAdj2 = _objectItem->adjective; -	} else { -		_scriptNoun2 = -1; -		_scriptAdj2 = -1; -	} - -	_scriptVerb = _verbHitArea; - -	sub = getSubroutineByID(0); -	if (sub == NULL) -		return; - -	result = startSubroutine(sub); -	if (result == -1) -		showMessageFormat("I don't understand"); - -	_runScriptReturn1 = false; - -	sub = getSubroutineByID(100); -	if (sub) -		startSubroutine(sub); - -	if (getGameType() == GType_SIMON2 || getGameType() == GType_FF) -		_runScriptReturn1 = false; - -	permitInput(); -} -  TextLocation *SimonEngine::getTextLocation(uint a) {  	switch (a) {  	case 1: @@ -1902,315 +1574,6 @@ void SimonEngine::skipSpeech() {  	}  } -void SimonEngine::animateSprites() { -	VgaSprite *vsp; -	VgaPointersEntry *vpe; -	const byte *vc_ptr_org = _vcPtr; -	uint16 params[5];							// parameters to vc10 - -	if (_paletteFlag == 2) -		_paletteFlag = 1; - -	if (getGameType() == GType_FF && _scrollCount) { -		scrollEvent(); -	} -	if (getGameType() == GType_SIMON2 && _scrollFlag) { -		scrollScreen(); -	} - -	if (getGameType() == GType_FF && getBitFlag(84)) { -		animateSpritesByY(); -		return; -	} - -	vsp = _vgaSprites; - -	while (vsp->id != 0) { -		vsp->windowNum &= 0x7FFF; - -		vpe = &_vgaBufferPointers[vsp->zoneNum]; -		_curVgaFile1 = vpe->vgaFile1; -		_curVgaFile2 = vpe->vgaFile2; -		_curSfxFile = vpe->sfxFile; -		_windowNum = vsp->windowNum; -		_vgaCurSpriteId = vsp->id; -		_vgaCurSpritePriority = vsp->priority; - -		params[0] = readUint16Wrapper(&vsp->image); -		params[1] = readUint16Wrapper(&vsp->palette); -		params[2] = readUint16Wrapper(&vsp->x); -		params[3] = readUint16Wrapper(&vsp->y); - -		if (getGameType() == GType_SIMON1) { -			params[4] = READ_BE_UINT16(&vsp->flags); -		} else { -			*(byte *)(¶ms[4]) = (byte)vsp->flags; -		} - -		_vcPtr = (const byte *)params; -		vc10_draw(); - -		vsp++; -	} - -	if (_drawImagesDebug) -		memset(_backBuf, 0, _screenWidth * _screenHeight); - -	_updateScreen++; -	_vcPtr = vc_ptr_org; -} - -void SimonEngine::animateSpritesDebug() { -	VgaSprite *vsp; -	VgaPointersEntry *vpe; -	const byte *vc_ptr_org = _vcPtr; -	uint16 params[5];							// parameters to vc10_draw - -	if (_paletteFlag == 2) -		_paletteFlag = 1; - -	vsp = _vgaSprites; -	while (vsp->id != 0) { -		vsp->windowNum &= 0x7FFF; - -		vpe = &_vgaBufferPointers[vsp->zoneNum]; -		_curVgaFile1 = vpe->vgaFile1; -		_curVgaFile2 = vpe->vgaFile2; -		_curSfxFile = vpe->sfxFile; -		_windowNum = vsp->windowNum; -		_vgaCurSpriteId = vsp->id; - -		if (vsp->image) -			fprintf(_dumpFile, "id:%5d image:%3d base-color:%3d x:%3d y:%3d flags:%x\n", -							vsp->id, vsp->image, vsp->palette, vsp->x, vsp->y, vsp->flags); -		params[0] = readUint16Wrapper(&vsp->image); -		params[1] = readUint16Wrapper(&vsp->palette); -		params[2] = readUint16Wrapper(&vsp->x); -		params[3] = readUint16Wrapper(&vsp->y); -		params[4] = readUint16Wrapper(&vsp->flags); -		_vcPtr = (const byte *)params; -		vc10_draw(); - -		vsp++; -	} - -	_updateScreen++; -	_vcPtr = vc_ptr_org; -} - -void SimonEngine::animateSpritesByY() { -	VgaSprite *vsp; -	VgaPointersEntry *vpe; -	const byte *vc_ptr_org = _vcPtr; -	uint16 params[5];							// parameters to vc10 -	int16 spriteTable[180][2]; -	 -	byte *src; -	int height, slot, y; -	uint i, numSprites = 0; - -	vsp = _vgaSprites; -	while (vsp->id != 0) { -		if (vsp->flags & kDFScaled) { -			y = vsp->y; -		} else if (vsp->flags & kDFMasked) { -			vpe = &_vgaBufferPointers[vsp->zoneNum]; -			src = vpe->vgaFile2 + vsp->image * 8; -			height = READ_LE_UINT16(src + 4) & 0x7FFF; -			y = vsp->y + height; -		} else { -			y = vsp->priority; -		} - -		spriteTable[numSprites][0] = y; -		spriteTable[numSprites][1] = numSprites; -		numSprites++; -		vsp++; -	} - -	while(1) { -		y = spriteTable[0][0]; -		slot = spriteTable[0][1]; - -		for (i = 0; i < numSprites; i++) { -			if (y >= spriteTable[i][0]) { -				y = spriteTable[i][0]; -				slot = spriteTable[i][1]; -			} -		} - -		if (y == 9999) -			break; - -		for (i = 0; i < numSprites; i++) { -			if (slot == spriteTable[i][1]) { -				spriteTable[i][0] = 9999; -				break; -			} -		} - -		vsp = &_vgaSprites[slot]; -		vsp->windowNum &= 0x7FFF; - -		vpe = &_vgaBufferPointers[vsp->zoneNum]; -		_curVgaFile1 = vpe->vgaFile1; -		_curVgaFile2 = vpe->vgaFile2; -		_curSfxFile = vpe->sfxFile; -		_windowNum = vsp->windowNum; -		_vgaCurSpriteId = vsp->id; -		_vgaCurSpritePriority = vsp->priority; - -		params[0] = readUint16Wrapper(&vsp->image); -		params[1] = readUint16Wrapper(&vsp->palette); -		params[2] = readUint16Wrapper(&vsp->x); -		params[3] = readUint16Wrapper(&vsp->y); -		*(byte *)(¶ms[4]) = (byte)vsp->flags; - -		_vcPtr = (const byte *)params; -		vc10_draw(); -	} - -	_updateScreen++; -	_vcPtr = vc_ptr_org; -} - -void SimonEngine::scrollScreen() { -	byte *dst = getFrontBuf(); -	const byte *src; -	uint x, y; - -	if (_scrollXMax == 0) { -		uint screenSize = 8 * _screenWidth; -		if (_scrollFlag < 0) { -			memmove(dst + screenSize, dst, _scrollWidth * _screenHeight - screenSize); -		} else { -			memmove(dst, dst + screenSize, _scrollWidth * _screenHeight - screenSize); -		} - -		y = _scrollY - 8; - -		if (_scrollFlag > 0) { -			dst += _screenHeight * _screenWidth - screenSize; -			y += 488; -		} - -		src = _scrollImage + y / 2; -		decodeRow(dst, src + readUint32Wrapper(src), _scrollWidth); - -		_scrollY += _scrollFlag; -		vcWriteVar(250, _scrollY); -	} else { -		if (_scrollFlag < 0) { -			memmove(dst + 8, dst, _screenWidth * _scrollHeight - 8); -		} else { -			memmove(dst, dst + 8, _screenWidth * _scrollHeight - 8); -		} - -		x = _scrollX; -		x -= (getGameType() == GType_FF) ? 8 : 1; - -		if (_scrollFlag > 0) { -			dst += _screenWidth - 8; -			x += (getGameType() == GType_FF) ? 648 : 41; -		} - -		if (getGameType() == GType_FF) -			src = _scrollImage + x / 2; -		else -			src = _scrollImage + x * 4; -		decodeColumn(dst, src + readUint32Wrapper(src), _scrollHeight); - -		_scrollX += _scrollFlag; -		vcWriteVar(251, _scrollX); -	} - -	memcpy(_backBuf, _frontBuf, _screenWidth * _screenHeight); -	memcpy(_backGroundBuf, _backBuf, _scrollHeight * _screenWidth); - -	_scrollFlag = 0; -} - -void SimonEngine::timer_proc1() { -	_timer4++; - -	if (_lockWord & 0x80E9 || _lockWord & 2) -		return; - -	_syncCount++; - -	_lockWord |= 2; - -	if (!(_lockWord & 0x10)) { -		if (getGameType() == GType_FF) { -			_syncFlag2 ^= 1; -			if (!_syncFlag2) { -				processVgaEvents(); -			} else { -				// Double speed on Oracle -				if (getBitFlag(99)) { -					processVgaEvents(); -				} else if (_scrollCount == 0) { -					_lockWord &= ~2; -					return; -				} -			} -		} else { -			processVgaEvents(); -			processVgaEvents(); -			_syncFlag2 ^= 1; -			_cepeFlag ^= 1; -			if (!_cepeFlag) -				processVgaEvents(); - -			if (_mouseHideCount != 0 && _syncFlag2) { -				_lockWord &= ~2; -				return; -			} -		} -	} - -	if (getGameType() == GType_FF) -		_moviePlay->nextFrame(); - -	animateSprites(); -	if (_drawImagesDebug) -		animateSpritesDebug(); - -	if (_copyPartialMode == 1) { -		fillBackFromFront(80, 46, 208 - 80, 94 - 46); -	} - -	if (_copyPartialMode == 2) { -		fillFrontFromBack(176, 61, _screenWidth - 176, 134 - 61); -		_copyPartialMode = 0; -	} - -	if (_updateScreen) { -		if (getGameType() == GType_FF) { -			if (!getBitFlag(78)) { -				oracleLogo(); -			} -			if (getBitFlag(76)) { -				swapCharacterLogo(); -			} -		} -		handleMouseMoved(); -		dx_update_screen_and_palette(); -		_updateScreen = false; -	} - -	_lockWord &= ~2; -} - -void SimonEngine::timer_callback() { -	if (_timer5 != 0) { -		_syncFlag2 = true; -		_timer5--; -	} else { -		timer_proc1(); -	} -} -  Item *SimonEngine::derefItem(uint item) {  	if (item >= _itemArraySize)  		error("derefItem: invalid item %d", item); @@ -2226,26 +1589,6 @@ uint SimonEngine::itemPtrToID(Item *id) {  	return 0;  } -void SimonEngine::delete_hitarea_by_index(uint index) { -	CHECK_BOUNDS(index, _hitAreas); -	_hitAreas[index].flags = 0; -} - -VgaSprite *SimonEngine::findCurSprite() { -	VgaSprite *vsp = _vgaSprites; -	while (vsp->id) { -		if (getGameType() == GType_SIMON1) { -			if (vsp->id == _vgaCurSpriteId) -				break; -		} else { -			if (vsp->id == _vgaCurSpriteId && vsp->zoneNum == _vgaCurZoneNum) -				break; -		} -		vsp++; -	} -	return vsp; -} -  bool SimonEngine::isSpriteLoaded(uint16 id, uint16 zoneNum) {  	VgaSprite *vsp = _vgaSprites;  	while (vsp->id) { @@ -2553,151 +1896,6 @@ void SimonEngine::playSpeech(uint speech_id, uint vgaSpriteId) {  	}  } -void SimonEngine::runSubroutine101() { -	Subroutine *sub; - -	sub = getSubroutineByID(101); -	if (sub != NULL) -		startSubroutineEx(sub); - -	permitInput(); -} - -void SimonEngine::restoreBlock(uint h, uint w, uint y, uint x) { -	byte *dst, *src; -	uint i; - -	dst = getFrontBuf(); -	src = _backGroundBuf; - -	dst += y * _dxSurfacePitch; -	src += y * _dxSurfacePitch; - -	while (y < h) { -		for (i = x; i < w; i++) -			dst[i] = src[i]; -		y++; -		dst += _dxSurfacePitch; -		src += _dxSurfacePitch; -	} -} - -void SimonEngine::dx_clear_surfaces(uint num_lines) { -	memset(_backBuf, 0, num_lines * _screenWidth); - -	_system->copyRectToScreen(_backBuf, _screenWidth, 0, 0, _screenWidth, num_lines); - -	if (_useBackGround) { -		memset(_frontBuf, 0, num_lines * _screenWidth); -		memset(_backGroundBuf, 0, num_lines * _screenWidth); -	} -} - -void SimonEngine::clearBackFromTop(uint lines) { -	memset(_backBuf, 0, lines * _screenWidth); -} - -void SimonEngine::fillFrontFromBack(uint x, uint y, uint w, uint h) { -	uint offs = x + y * _screenWidth; -	byte *s = _backBuf + offs; -	byte *d = _frontBuf + offs; - -	do { -		memcpy(d, s, w); -		d += _screenWidth; -		s += _screenWidth; -	} while (--h); -} - -void SimonEngine::fillBackFromFront(uint x, uint y, uint w, uint h) { -	uint offs = x + y * _screenWidth; -	byte *s = _frontBuf + offs; -	byte *d = _backBuf + offs; - -	do { -		memcpy(d, s, w); -		d += _screenWidth; -		s += _screenWidth; -	} while (--h); -} - -void SimonEngine::fillBackGroundFromBack(uint lines) { -	memcpy(_backGroundBuf, _backBuf, lines * _screenWidth); -} - -void SimonEngine::dx_update_screen_and_palette() { -	_numScreenUpdates++; - -	if (_paletteColorCount == 0 && _paletteFlag == 1) { -		_paletteFlag = 0; -		if (memcmp(_palette, _paletteBackup, 1024) != 0) { -			memcpy(_paletteBackup, _palette, 1024); -			_system->setPalette(_palette, 0, 256); -		} -	} - -	_system->copyRectToScreen(_backBuf, _screenWidth, 0, 0, _screenWidth, _screenHeight); -	_system->updateScreen(); - -	memcpy(_backBuf, _frontBuf, _screenWidth * _screenHeight); - -	if (getGameType() == GType_FF && _scrollFlag) { -		scrollScreen(); -	} - -	if (_paletteColorCount != 0) { -		if (getGameType() == GType_SIMON1 && _usePaletteDelay) { -			delay(100); -			_usePaletteDelay = false; -		} -		fastFadeIn(); -	} -} - -void SimonEngine::fastFadeIn() { -	if (_paletteColorCount & 0x8000) { -		slowFadeIn(); -	} else { -		_paletteFlag = false; -		memcpy(_paletteBackup, _palette, 1024); -		_system->setPalette(_palette, 0, _paletteColorCount); -		_paletteColorCount = 0; -	} -} - -void SimonEngine::slowFadeIn() { -	uint8 paletteTmp[768]; -	uint8 *src, *dst; -	int c, p; - -	_paletteColorCount &= 0x7fff; -	_paletteFlag = false; - -	memcpy(_videoBuf1, _palette, 1024); // Difference -	memset(_videoBuf1, 0, 768); - -	memcpy(_paletteBackup, _palette, 768); -	memcpy(paletteTmp, _palette, 768); - -	for (c = 255; c > 0; c -= 4) { -	  	src = paletteTmp; - 		dst = _videoBuf1; - -		for (p = _paletteColorCount; p !=0 ; p--) { -			if (*src >= c) -				*dst = *dst + 4; -			 -			src++; -			dst++; - 		} - 		_system->setPalette(_videoBuf1, 0, _videoNumPalColors); -		if (_fade) -			_system->updateScreen(); - 		delay(5); - 	} -	_paletteColorCount = 0; -} -  int SimonEngine::go() {  	if (!_dumpFile)  		_dumpFile = stdout; @@ -2960,34 +2158,36 @@ void SimonEngine::loadMusic(uint music) {  	}  } -byte *SimonEngine::getFrontBuf() { -	_dxSurfacePitch = _screenWidth; -	return _frontBuf; -} +void SimonEngine::playSting(uint a) { +	if (!midi._enable_sfx) +		return; -byte *SimonEngine::getBackBuf() { -	_dxSurfacePitch = _screenWidth; -	return _useBackGround ? _backGroundBuf : _backBuf; -} +	char filename[15]; -byte *SimonEngine::getBackGround() { -	_dxSurfacePitch = _screenWidth; -	return _backGroundBuf; -} +	File mus_file; +	uint16 mus_offset; + +	sprintf(filename, "STINGS%i.MUS", _soundFileId); +	mus_file.open(filename); +	if (!mus_file.isOpen()) { +		warning("Can't load sound effect from '%s'", filename); +		return; +	} + +	mus_file.seek(a * 2, SEEK_SET); +	mus_offset = mus_file.readUint16LE(); +	if (mus_file.ioFailed()) +		error("Can't read sting %d offset", a); -byte *SimonEngine::getScaleBuf() { -	_dxSurfacePitch = _screenWidth; -	return _scaleBuf; +	mus_file.seek(mus_offset, SEEK_SET); +	midi.loadSMF(&mus_file, a, true); +	midi.startTrack(0);  }  void SimonEngine::set_volume(int volume) {  	_mixer->setVolumeForSoundType(Audio::Mixer::kSFXSoundType, volume);  } -byte SimonEngine::getByte() { -	return *_codePtr++; -} -  } // End of namespace Simon  #ifdef PALMOS_68K diff --git a/engines/simon/subroutine.cpp b/engines/simon/subroutine.cpp index e700182899..6181bda5d4 100644 --- a/engines/simon/subroutine.cpp +++ b/engines/simon/subroutine.cpp @@ -212,6 +212,16 @@ SubroutineLine *SimonEngine::createSubroutineLine(Subroutine *sub, int where) {  	return sl;  } +void SimonEngine::runSubroutine101() { +	Subroutine *sub; + +	sub = getSubroutineByID(101); +	if (sub != NULL) +		startSubroutineEx(sub); + +	permitInput(); +} +  int SimonEngine::startSubroutine(Subroutine *sub) {  	int result = -1;  	SubroutineLine *sl; diff --git a/engines/simon/verb.cpp b/engines/simon/verb.cpp index b42b743188..ca3e63e25b 100644 --- a/engines/simon/verb.cpp +++ b/engines/simon/verb.cpp @@ -304,6 +304,64 @@ void SimonEngine::showActionString(const byte *string) {  		windowPutChar(window, *string);  } +void SimonEngine::handleVerbClicked(uint verb) { +	Subroutine *sub; +	int result; + +	_objectItem = _hitAreaObjectItem; +	if (_objectItem == _dummyItem2) { +		_objectItem = me(); +	} +	if (_objectItem == _dummyItem3) { +		_objectItem = derefItem(me()->parent); +	} + +	_subjectItem = _hitAreaSubjectItem; +	if (_subjectItem == _dummyItem2) { +		_subjectItem = me(); +	} +	if (_subjectItem == _dummyItem3) { +		_subjectItem = derefItem(me()->parent); +	} + +	if (_subjectItem) { +		_scriptNoun1 = _subjectItem->noun; +		_scriptAdj1 = _subjectItem->adjective; +	} else { +		_scriptNoun1 = -1; +		_scriptAdj1 = -1; +	} + +	if (_objectItem) { +		_scriptNoun2 = _objectItem->noun; +		_scriptAdj2 = _objectItem->adjective; +	} else { +		_scriptNoun2 = -1; +		_scriptAdj2 = -1; +	} + +	_scriptVerb = _verbHitArea; + +	sub = getSubroutineByID(0); +	if (sub == NULL) +		return; + +	result = startSubroutine(sub); +	if (result == -1) +		showMessageFormat("I don't understand"); + +	_runScriptReturn1 = false; + +	sub = getSubroutineByID(100); +	if (sub) +		startSubroutine(sub); + +	if (getGameType() == GType_SIMON2 || getGameType() == GType_FF) +		_runScriptReturn1 = false; + +	permitInput(); +} +  void SimonEngine::resetNameWindow() {  	WindowBlock *window; @@ -340,6 +398,11 @@ HitArea *SimonEngine::findEmptyHitArea() {  	return NULL;  } +void SimonEngine::delete_hitarea_by_index(uint index) { +	CHECK_BOUNDS(index, _hitAreas); +	_hitAreas[index].flags = 0; +} +  void SimonEngine::enableBox(uint hitarea) {  	HitArea *ha = findBox(hitarea);  	if (ha != NULL) diff --git a/engines/simon/vga.cpp b/engines/simon/vga.cpp index fcf10816fd..7dbaa74273 100644 --- a/engines/simon/vga.cpp +++ b/engines/simon/vga.cpp @@ -190,6 +190,21 @@ bool SimonEngine::vc_maybe_skip_proc_1(uint16 a, int16 b) {  	return item->state == b;  } +VgaSprite *SimonEngine::findCurSprite() { +	VgaSprite *vsp = _vgaSprites; +	while (vsp->id) { +		if (getGameType() == GType_SIMON1) { +			if (vsp->id == _vgaCurSpriteId) +				break; +		} else { +			if (vsp->id == _vgaCurSpriteId && vsp->zoneNum == _vgaCurZoneNum) +				break; +		} +		vsp++; +	} +	return vsp; +} +  int SimonEngine::vcReadVarOrWord() {  	int16 var = vcReadNextWord();  	if (var < 0) diff --git a/engines/simon/window.cpp b/engines/simon/window.cpp index ce4f989a6e..23443eb7f0 100644 --- a/engines/simon/window.cpp +++ b/engines/simon/window.cpp @@ -15,8 +15,8 @@   * along with this program; if not, write to the Free Software   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.   * - * $URL: https://svn.sourceforge.net/svnroot/scummvm/scummvm/trunk/engines/simon/string.cpp $ - * $Id: string.cpp 22062 2006-04-21 00:18:23Z kirben $ + * $URL$ + * $Id$   *   */ @@ -157,6 +157,25 @@ void SimonEngine::restoreWindow(WindowBlock *window) {  	_lockWord &= ~0x8000;  } +void SimonEngine::restoreBlock(uint h, uint w, uint y, uint x) { +	byte *dst, *src; +	uint i; + +	dst = getFrontBuf(); +	src = _backGroundBuf; + +	dst += y * _dxSurfacePitch; +	src += y * _dxSurfacePitch; + +	while (y < h) { +		for (i = x; i < w; i++) +			dst[i] = src[i]; +		y++; +		dst += _dxSurfacePitch; +		src += _dxSurfacePitch; +	} +} +  void SimonEngine::windowPutChar(uint a) {  	if (_textWindow != _windowArray[0])  		windowPutChar(_textWindow, a);  | 
