From 16e90765a9103e8c1c39b2e009b5f152e56cc2b8 Mon Sep 17 00:00:00 2001 From: Travis Howell Date: Sat, 29 Apr 2006 14:11:29 +0000 Subject: Split more functions of simon.cpp into separate files svn-id: r22224 --- engines/simon/cursor.cpp | 115 ++++++ engines/simon/draw.cpp | 494 +++++++++++++++++++++++++ engines/simon/event.cpp | 81 ++++ engines/simon/module.mk | 1 + engines/simon/res.cpp | 34 ++ engines/simon/simon.cpp | 854 ++----------------------------------------- engines/simon/subroutine.cpp | 10 + engines/simon/verb.cpp | 63 ++++ engines/simon/vga.cpp | 15 + engines/simon/window.cpp | 23 +- 10 files changed, 861 insertions(+), 829 deletions(-) create mode 100644 engines/simon/draw.cpp 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); -- cgit v1.2.3