diff options
Diffstat (limited to 'engines/simon/simon.cpp')
-rw-r--r-- | engines/simon/simon.cpp | 854 |
1 files changed, 27 insertions, 827 deletions
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 |