/* ScummVM - Graphic Adventure Engine * * ScummVM is the legal property of its developers, whose names * are too numerous to list here. Please refer to the COPYRIGHT * file distributed with this source distribution. * * 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. * */ #include "tucker/tucker.h" #include "tucker/graphics.h" #include "common/system.h" #include "graphics/palette.h" namespace Tucker { static const int _data3UpdateLocation1_xTable[] = { 287, 120, 61 }; static const int _data3UpdateLocation1_yTable[] = { 152, 8, 95 }; void TuckerEngine::execData3PreUpdate_locationNum1() { if (_flagsTable[1] == 1) { _flagsTable[1] = 2; _locationSoundsTable[3]._type = 2; startSound(_locationSoundsTable[3]._offset, 3, _locationSoundsTable[3]._volume); } _mapSequenceFlagsLocationTable[0] = (_flagsTable[1] > 0) ? 1 : 0; if (_updateLocationCounter == 0) { execData3PreUpdate_locationNum1Helper1(); execData3PreUpdate_locationNum1Helper2(); } else { --_updateLocationCounter; if (_updateLocationCounter == 0) { ++_updateLocationPos; if (_updateLocationPos > 1) { _updateLocationPos = 0; } for (int i = 0; i < 5; ++i) { _updateLocationXPosTable[i] = _data3UpdateLocation1_xTable[_updateLocationPos]; _updateLocationYPosTable[i] = _data3UpdateLocation1_yTable[_updateLocationPos]; _updateLocationFlagsTable[i] = 0; } } } } void TuckerEngine::execData3PreUpdate_locationNum1Helper1() { int code = 0; if (_updateLocationXPosTable[0] > 0 && _updateLocationYPosTable[0] > 0) { for (int i = 4; i > 0; --i) { _updateLocationXPosTable[i] = _updateLocationXPosTable[i - 1]; _updateLocationYPosTable[i] = _updateLocationYPosTable[i - 1]; _updateLocationFlagsTable[i] = _updateLocationFlagsTable[i - 1]; } } if (_updateLocationFlagsTable[0] == 1 && _updateLocationCounter == 0) { setVolumeSound(12, _locationSoundsTable[12]._volume); } else { setVolumeSound(12, 0); } static const int dxTable[] = { 0, -1, -1, -1, 0, 1, 1, 1 }; static const int dyTable[] = { -1, -1, 0, 1, 1, 1, 0, -1 }; for (int i = 0; code == 0 && i < 8; ++i) { code = execData3PreUpdate_locationNum1Helper3(dxTable[i], dyTable[i]); } _updateLocationFlagsTable[0] = code; } void TuckerEngine::execData3PreUpdate_locationNum1Helper2() { static const int dxTable[] = { -95, 84, 110 }; static const int dyTable[] = { -50, 46, 0 }; int xPos = 0; int yPos = 0; for (int i = 0; i < 6; i += 2) { if (_updateLocationFlagsTable[i] == 1) { xPos = _updateLocationXPosTable[i] + dxTable[_updateLocationPos]; yPos = _updateLocationYPosTable[i] + dyTable[_updateLocationPos]; } if (xPos > 319 || yPos > 199 || xPos < 0 || yPos < 0) { xPos = 0; yPos = 0; } _locationBackgroundGfxBuf[yPos * 640 + xPos] = 100; addDirtyRect(xPos, yPos, 1, 1); } } int TuckerEngine::execData3PreUpdate_locationNum1Helper3(int dx, int dy) { static const int counterTable[3] = { 30, 50, 70 }; const int xPos = _updateLocationXPosTable[0] + dx; const int yPos = _updateLocationYPosTable[0] + dy; static const int num[] = { 2, 3, 4, 1 }; for (int i = 0; i < 4; ++i) { if (xPos == _updateLocationXPosTable[num[i]] && yPos == _updateLocationYPosTable[num[i]]) { return 0; } } const int code = (int8)_loadLocBufPtr[yPos * 320 + xPos]; if (code > 0) { _updateLocationXPosTable[0] = xPos; _updateLocationYPosTable[0] = yPos; if (xPos == _data3UpdateLocation1_xTable[_updateLocationPos] && yPos == _data3UpdateLocation1_yTable[_updateLocationPos]) { _updateLocationCounter = counterTable[_updateLocationPos]; } } return code; } void TuckerEngine::execData3PostUpdate_locationNum1() { if (_flagsTable[63] == 0) { if (getRandomNumber() < 400) { _flagsTable[63] = 1; startSound(_locationSoundsTable[2]._offset, 2, _locationSoundsTable[2]._volume); } } _locationHeightTable[1] = (_yPosCurrent > 104) ? 60 : 0; } void TuckerEngine::updateSprite_locationNum2() { if (_flagsTable[9] == 2) { _spritesTable[0]._state = -1; return; } if (_flagsTable[9] == 1) { if (_flagsTable[10] == 1) { _spritesTable[0]._state = -1; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == 0) { _spritesTable[0]._state = 4; _spritesTable[0]._needUpdate = true; } else { _spritesTable[0]._needUpdate = false; _spritesTable[0]._state = 5; _flagsTable[10] = 1; _spritesTable[0]._gfxBackgroundOffset = 0; } return; } if (_charSpeechSoundCounter > 0 && _actionCharacterNum == 0) { _spritesTable[0]._state = 3; _spritesTable[0]._needUpdate = true; return; } if (_csDataHandled) { _spritesTable[0]._needUpdate = false; if (_flagsTable[199] == 0) { _flagsTable[199] = 1; setCharacterAnimation(0, 0); } else if (getRandomNumber() > 20000) { _spritesTable[0]._state = 6; } else { _spritesTable[0]._state = 3; _spritesTable[0]._updateDelay = 5; } } else { if (_flagsTable[199] == 0) { _flagsTable[199] = 1; setCharacterAnimation(1, 0); } else if (getRandomNumber() < 20000) { _spritesTable[0]._state = 1; _spritesTable[0]._updateDelay = 5; } else { _spritesTable[0]._state = 1; } } } void TuckerEngine::execData3PreUpdate_locationNum2() { static const int xPosTable[] = { 110, 117, 127, 146, 160, 183, 195, 210 }; static const int yPosTable[] = { 50, 60, 60, 60, 50, 55, 50, 50 }; static const int yMaxTable[] = { 100, 97, 94, 91, 89, 86, 83, 80 }; if (_execData3Counter == 0) { _execData3Counter = 1; for (int i = 0; i < 3; ++i) { _updateLocationYPosTable2[i] = 0; } if (_flagsTable[10] == 0) { copyLocBitmap("path02b.pcx", 0, true); } for (int i = 0; i < 3; ++i) { if (_updateLocationYPosTable2[i] > 0) { for (int j = 0; j < 2; ++j) { const int offset = (_updateLocationYPosTable2[i] + j) * 640 + _updateLocationXPosTable2[i]; _locationBackgroundGfxBuf[offset] = 142 + j * 2; } addDirtyRect(_updateLocationXPosTable2[i], _updateLocationYPosTable2[i], 1, 2); _updateLocationYPosTable2[i] += 2; if (_updateLocationYPosTable2[i] > _updateLocationYMaxTable[i]) { _updateLocationYPosTable2[i] = 0; const int num = (getRandomNumber() < 16000) ? 2 : 3; startSound(_locationSoundsTable[num]._offset, num, _locationSoundsTable[num]._volume); } } else if (getRandomNumber() > 32000) { const int num = getRandomNumber() / 8192; _updateLocationXPosTable2[i] = xPosTable[num]; _updateLocationYPosTable2[i] = yPosTable[num]; _updateLocationYMaxTable[i] = yMaxTable[num]; } } } execData3PreUpdate_locationNum2Helper(); } void TuckerEngine::execData3PreUpdate_locationNum2Helper() { if (_fadePaletteCounter != 16) { return; } int start, end; if (_location == kLocationBackAlley) { start = 116; end = 125; } else { start = 215; end = 223; } ++_updateLocationFadePaletteCounter; if (_updateLocationFadePaletteCounter > 10 || _updateLocationFadePaletteCounter < 0) { _updateLocationFadePaletteCounter = 0; } int step; if (_updateLocationFadePaletteCounter < 6) { step = _updateLocationFadePaletteCounter; } else { step = 10 - _updateLocationFadePaletteCounter; } for (int i = start; i < end; ++i) { fadePaletteColor(i, step); } } void TuckerEngine::updateSprite_locationNum3_0(int i) { int num; if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { num = 5; _spritesTable[i]._needUpdate = true; } else if (_spritesTable[i]._prevState == 5 && _spritesTable[i]._animationFrame == 1) { _spritesTable[i]._needUpdate = false; int r = getRandomNumber(); if (r < 12000) { num = 3; } else if (r < 24000) { num = 1; } else { num = 2; } } else { num = 5; _spritesTable[i]._animationFrame = 1; _spritesTable[i]._updateDelay = 10; } _spritesTable[i]._state = num; _spritesTable[i]._prevAnimationFrame = true; } void TuckerEngine::updateSprite_locationNum3_1(int i) { int num; if (_flagsTable[207] == 1) { num = -1; } else if (_flagsTable[203] == 1) { _spritesTable[i]._needUpdate = true; num = 20; _flagsTable[203] = 2; } else if (_flagsTable[203] == 2) { num = 12; } else if (_flagsTable[203] == 3) { _spritesTable[i]._needUpdate = false; num = 19; _flagsTable[203] = 0; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; if (_flagsTable[21] == 0) { num = 7; } else { num = 8; } } else { _spritesTable[i]._needUpdate = false; if (_csDataHandled) { num = 6; if (getRandomNumber() < 32000) { _spritesTable[i]._updateDelay = 5; } } else if (_spritesTable[i]._state == 6 && _spritesTable[i]._animationFrame == 1) { if (getRandomNumber() < 20000) { num = 11; _spritesTable[i]._defaultUpdateDelay = 5; } else { num = 10; } } else { num = 6; _spritesTable[i]._animationFrame = 1; _spritesTable[i]._updateDelay = 10; } } _spritesTable[i]._state = num; _spritesTable[i]._gfxBackgroundOffset = 320; } void TuckerEngine::updateSprite_locationNum3_2(int i) { int num; if (_flagsTable[205] == 1) { _flagsTable[205] = 0; num = 18; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; num = 17; } else if (_flagsTable[45] == 1) { _flagsTable[45] = 2; num = 16; } else if (_flagsTable[45] == 2) { num = 17; _spritesTable[i]._updateDelay = 5; _spritesTable[i]._needUpdate = false; } else if (_flagsTable[45] == 3) { _flagsTable[45] = 0; num = 16; _updateSpriteFlag2 = true; } else { _spritesTable[i]._needUpdate = false; ++_spritesTable[i]._counter; if (_spritesTable[i]._counter <= 5) { num = 14; } else { if (_spritesTable[i]._counter > 8) { _spritesTable[i]._counter = 0; } num = 15; } } _spritesTable[i]._state = num; } void TuckerEngine::execData3PreUpdate_locationNum3() { execData3PreUpdate_locationNum2Helper(); if (_flagsTable[7] == 0) { _flagsTable[7] = 1; } if (_flagsTable[20] == 1 && _inventoryItemsState[7] == 1) { _flagsTable[20] = 2; } if (_inventoryItemsState[19] == 1 && _flagsTable[54] == 1) { _flagsTable[43] = 1; } else { _flagsTable[43] = 0; } } void TuckerEngine::updateSprite_locationNum4(int i) { int state = -1; if (_flagsTable[9] == 2) { if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { state = 1; _spritesTable[i]._needUpdate = true; } else { state = 2; _spritesTable[i]._needUpdate = false; } } _spritesTable[i]._state = state; } void TuckerEngine::execData3PreUpdate_locationNum4() { if (_flagsTable[6] == 0) { setVolumeSound(0, 0); } else { setVolumeSound(0, _locationSoundsTable[0]._volume); } } void TuckerEngine::updateSprite_locationNum5_0() { ++_spritesTable[0]._counter; if (_spritesTable[0]._counter > 100) { _spritesTable[0]._counter = 0; _spritesTable[0]._state = 1; _locationSoundsTable[1]._type = 2; startSound(_locationSoundsTable[1]._offset, 1, _locationSoundsTable[1]._volume); } else if (_spritesTable[0]._counter == 50) { _locationSoundsTable[1]._type = 2; _spritesTable[0]._state = 2; startSound(_locationSoundsTable[1]._offset, 1, _locationSoundsTable[1]._volume); } else { _spritesTable[0]._state = -1; if (isSoundPlaying(1)) { stopSound(1); } } } void TuckerEngine::updateSprite_locationNum5_1(int i) { _spritesTable[i]._state = 3; } void TuckerEngine::updateSprite_locationNum6_0(int i) { int state; if (_flagsTable[184] == 1) { state = -1; } else if (_flagsTable[26] > 0 && _flagsTable[26] < 4 && _flagsTable[27] > 0) { state = 14; } else if (_flagsTable[26] == 4 || _flagsTable[26] == 5) { if (_charSpeechSoundCounter > 0 && _actionCharacterNum == 0) { _spritesTable[0]._needUpdate = true; state = 3; _spritesTable[0]._counter = 0; } else if (_xPosCurrent < 370 && _flagsTable[26] == 4) { state = 2; } else if (_spritesTable[0]._counter == 0) { setCharacterAnimation(0, 0); _updateSpriteFlag1 = true; ++_spritesTable[0]._counter; return; } else { state = 1; _spritesTable[0]._updateDelay = 2; ++_spritesTable[0]._counter; if (_spritesTable[0]._counter > 100) { _spritesTable[0]._counter = 0; } } } else { state = -1; } _spritesTable[i]._state = state; _spritesTable[i]._gfxBackgroundOffset = 320; } void TuckerEngine::updateSprite_locationNum6_1(int i) { int state; if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { if (_flagsTable[209] == 1) { state = 9; _spritesTable[i]._needUpdate = true; } else { _spritesTable[i]._needUpdate = true; state = 10; } } else { if (getRandomNumber() < 30000 || (_csDataHandled && _xPosCurrent == 248)) { _spritesTable[i]._needUpdate = false; state = 7; _spritesTable[i]._updateDelay = 5; } else { _spritesTable[i]._needUpdate = false; state = 7; _miscSoundFxNum[0] = 3; _miscSoundFxDelayCounter[0] = 70; _miscSoundFxNum[1] = 4; _miscSoundFxDelayCounter[1] = 25; } } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum6_2(int i) { int state; if (_flagsTable[26] < 5 || _flagsTable[207] > 0) { state = -1; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 12; } else { state = 12; _spritesTable[i]._updateDelay = 2; } _spritesTable[i]._state = state; } void TuckerEngine::execData3PreUpdate_locationNum6() { if (_flagsTable[26] > 3) { execData3PreUpdate_locationNum6Helper1(); } if (_flagsTable[26] == 2) { _currentSpriteAnimationLength = 2; _currentSpriteAnimationFrame = 112; if (_spritesTable[0]._xSource < 45) { _currentSpriteAnimationFrame2 = 144; } else if (_spritesTable[0]._xSource > 80) { _currentSpriteAnimationFrame2 = 147; } else if (_spritesTable[0]._xSource < 60) { _currentSpriteAnimationFrame2 = 145; } else { _currentSpriteAnimationFrame2 = 146; } } } void TuckerEngine::execData3PreUpdate_locationNum6Helper1() { if (_mainLoopCounter1 < 2) { if (_flagsTable[26] == 1) { if (_flagsTable[27] < 15) { if (_flagsTable[27] == 0) { startSound(_locationSoundsTable[2]._offset, 2, _locationSoundsTable[2]._volume); startSound(_locationSoundsTable[1]._offset, 1, _locationSoundsTable[1]._volume); } ++_flagsTable[27]; setVolumeSound(0, _locationSoundsTable[0]._volume - _flagsTable[27] * 5); setVolumeMusic(0, _locationMusicsTable[0]._volume - _flagsTable[27] * 5); } } else if (_flagsTable[26] == 3) { if (_flagsTable[27] > 0) { if (_flagsTable[27] == 15) { startSound(_locationSoundsTable[2]._offset, 2, _locationSoundsTable[2]._volume); } --_flagsTable[27]; setVolumeSound(0, _locationSoundsTable[0]._volume - _flagsTable[27] * 5); setVolumeMusic(0, _locationMusicsTable[0]._volume - _flagsTable[27] * 5); int volume = _flagsTable[27]; if (volume < _locationSoundsTable[1]._volume) { volume = _locationSoundsTable[1]._volume; } setVolumeSound(1, volume); } } } int x1, x2; if (_flagsTable[27] == 0) { x1 = 8; x2 = 0; } else if (_flagsTable[27] == 15) { x1 = 1; x2 = 0; } else if (_flagsTable[27] < 8) { x1 = 8 - _flagsTable[27]; x2 = _flagsTable[27]; } else { x1 = 1; x2 = 15 - _flagsTable[27]; } for (int i = 0; i < x1; ++i) { execData3PreUpdate_locationNum6Helper2(20 * 640 + 325 + i * 8, _data3GfxBuf + _dataTable[238]._sourceOffset); execData3PreUpdate_locationNum6Helper2(20 * 640 + 445 - i * 8, _data3GfxBuf + _dataTable[238]._sourceOffset); } for (int i = 0; i < x2; ++i) { execData3PreUpdate_locationNum6Helper3(20 * 640 + 325 + x1 * 8 + i * 4, _data3GfxBuf + _dataTable[238]._sourceOffset); execData3PreUpdate_locationNum6Helper3(20 * 640 + 449 - x1 * 8 - i * 4, _data3GfxBuf + _dataTable[238]._sourceOffset); } addDirtyRect(0, 20, 640, 51); } void TuckerEngine::execData3PreUpdate_locationNum6Helper2(int dstOffset, const uint8 *src) { for (int j = 0; j < 46; ++j) { memcpy(_locationBackgroundGfxBuf + dstOffset + j * 640, src + j * 8, 8); } for (int j = 46; j < 51; ++j) { for (int i = 0; i < 8; ++i) { const int offset = dstOffset + j * 640 + i; uint8 color = _locationBackgroundGfxBuf[offset]; if (color < 224) { _locationBackgroundGfxBuf[offset] = src[j * 8 + i]; } } } } void TuckerEngine::execData3PreUpdate_locationNum6Helper3(int dstOffset, const uint8 *src) { for (int j = 0; j < 51; ++j) { for (int i = 0; i < 4; ++i) { const int offset = dstOffset + j * 640 + i; uint8 color = _locationBackgroundGfxBuf[offset]; if (color < 224) { _locationBackgroundGfxBuf[offset] = src[j * 8 + i * 2]; } } } } void TuckerEngine::execData3PostUpdate_locationNum6() { if (_flagsTable[26] < 4) { execData3PreUpdate_locationNum6Helper1(); } } void TuckerEngine::updateSprite_locationNum7_0(int i) { int state; ++_spritesTable[i]._counter; if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 4; } else { _spritesTable[i]._needUpdate = false; if (_spritesTable[i]._counter > 0) { state = 2; _spritesTable[i]._counter = 0; } else { state = 1; } } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum7_1(int i) { int state; if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 5; } else { _spritesTable[i]._needUpdate = false; state = 5; _spritesTable[i]._updateDelay = 5; } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum8_0(int i) { _spritesTable[i]._state = (_flagsTable[28] < 20) ? -1 : 7; } void TuckerEngine::updateSprite_locationNum8_1(int i) { int state; if (_flagsTable[207] == 1) { state = -1; } else if (_flagsTable[28] == 18) { state = 6; _spritesTable[i]._needUpdate = false; } else if (_flagsTable[29] == 0) { state = 1; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == 1) { _spritesTable[i]._needUpdate = true; state = 5; } else { _spritesTable[i]._needUpdate = false; state = 3; } if (_flagsTable[28] == 19) { _flagsTable[28] = 20; } _spritesTable[i]._state = state; } void TuckerEngine::execData3PostUpdate_locationNum8() { if (_execData3Counter == 0) { _updateLocationYPosTable2[0] = 0; } if (_updateLocationYPosTable2[0] == 0) { ++_execData3Counter; if (_execData3Counter > 30) { _updateLocationYPosTable2[0] = 16; _updateLocationXPosTable2[0] = 264; } } if (_updateLocationYPosTable2[0] > 0) { const int offset = _updateLocationYPosTable2[0] * 640 + _updateLocationXPosTable2[0]; static const int colorsTable[] = { 143, 143, 144, 144, 144, 145, 147, 143, 147 }; _locationBackgroundGfxBuf[offset] = 142; for (int j = 1; j <= 3; ++j) { for (int i = -1; i <= 1; ++i) { _locationBackgroundGfxBuf[offset + 640 * j + i] = colorsTable[(j - 1) * 3 + i + 1]; } } addDirtyRect(_updateLocationXPosTable2[0] - 1, _updateLocationYPosTable2[0], 3, 4); _updateLocationYPosTable2[0] += 2; if (_updateLocationYPosTable2[0] > 120) { _updateLocationYPosTable2[0] = 0; startSound(_locationSoundsTable[2]._offset, 2, _locationSoundsTable[2]._volume); } } if (_flagsTable[28] > 1 && _flagsTable[28] < 5) { _locationHeightTable[8] = 60; } else { _locationHeightTable[8] = 0; } } void TuckerEngine::updateSprite_locationNum9_0(int i) { if (_charSpeechSoundCounter > 0 && _actionCharacterNum == 0) { _spritesTable[i]._needUpdate = true; _spritesTable[i]._state = 3; } else if (_updateLocationCounter2 > 0 || getRandomNumber() > 30000) { _spritesTable[i]._state = 1; if (_updateLocationCounter2 == 0) { _updateLocationCounter2 = 6; } } else if (getRandomNumber() > 30000) { _spritesTable[i]._state = 2; _spritesTable[i]._defaultUpdateDelay = 5; } else { _spritesTable[i]._state = 1; _spritesTable[i]._animationFrame = 1; _spritesTable[i]._updateDelay = 10; } } void TuckerEngine::updateSprite_locationNum9_1(int i) { ++_spritesTable[i]._counter; if (_spritesTable[i]._counter > 10) { _spritesTable[i]._counter = 0; _spritesTable[i]._state = 5; _spritesTable[i]._defaultUpdateDelay = 5; } else { _spritesTable[i]._state = 4; } } void TuckerEngine::updateSprite_locationNum9_2(int i) { _spritesTable[i]._state = 6; _spritesTable[i]._gfxBackgroundOffset = 320; } void TuckerEngine::execData3PreUpdate_locationNum9() { if (_flagsTable[7] < 2) { _flagsTable[7] = 2; } // If the door to the dentist is open play the dentist room music based on // Bud's proximity to the door (the closer the louder the music is played) _locationMusicsTable[0]._volume = _flagsTable[8] == 0 ? 0 : _xPosCurrent / 40; setVolumeMusic(0, _locationMusicsTable[0]._volume); if (!isSoundPlaying(1) && getRandomNumber() > 32000) { int i = getRandomNumber() / 5500 + 3; assert(i >= 0 && i < kLocationSoundsTableSize); startSound(_locationSoundsTable[i]._offset, i, _locationSoundsTable[i]._volume); } if (_flagsTable[8] == 2 && _locationMaskType == 0) { _flagsTable[8] = 0; startSound(_locationSoundsTable[7]._offset, 7, _locationSoundsTable[7]._volume); } } void TuckerEngine::execData3PostUpdate_locationNum9() { if (_spritesTable[1]._state == 4) { if (_spritesTable[1]._flipX) { --_updateLocationXPosTable2[0]; if (_updateLocationXPosTable2[0] < -50) { _spritesTable[1]._flipX = false; _updateLocationXPosTable2[0] = -50; } } else { ++_updateLocationXPosTable2[0]; if (_updateLocationXPosTable2[0] > 500) { _spritesTable[1]._flipX = true; _updateLocationXPosTable2[0] = 500; } } } _spritesTable[1]._gfxBackgroundOffset = _updateLocationXPosTable2[0] + 8320; for (int i = 1; i < 3; ++i) { _spritesTable[i]._colorType = 1; _spritesTable[i]._yMaxBackground = 60; drawSprite(i); _spritesTable[i]._colorType = 0; } } void TuckerEngine::updateSprite_locationNum10() { int state = 0; const int r = getRandomNumber(); if (_flagsTable[99] == 1) { state = -1; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == 0) { _spritesTable[0]._needUpdate = true; if (r < 26000) { state = 1; } else if (r < 29000) { state = 2; } else { state = 3; } } else if (_csDataHandled) { state = 2; _spritesTable[0]._updateDelay = 4; } else { _spritesTable[0]._needUpdate = false; if (r > 26000) { state = 5; _spritesTable[0]._prevAnimationFrame = true; } else if (r > 24000) { state = 6; _miscSoundFxDelayCounter[0] = 120; _miscSoundFxNum[0] = 0; } else { setCharacterAnimation(0, 0); } } _spritesTable[0]._state = state; } void TuckerEngine::execData3PreUpdate_locationNum10() { if (_execData3Counter == 0) { _execData3Counter = 1; ++_flagsTable[68]; if (_flagsTable[68] > 2) { _flagsTable[68] = 0; } } if (_flagsTable[47] == 1 && _inventoryItemsState[26] == 1) { _flagsTable[47] = 2; } if (_spritesTable[0]._state == 6 && _spritesTable[0]._animationFrame == 18 && !isSoundPlaying(0)) { startSound(_locationSoundsTable[0]._offset, 0, _locationSoundsTable[0]._volume); } if (_flagsTable[230] == 1 && getRandomNumber() > 32000) { _flagsTable[230] = 0; } } void TuckerEngine::updateSprite_locationNum11_0(int i) { const int r = getRandomNumber(); if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; _spritesTable[i]._state = 2; } else { _spritesTable[i]._needUpdate = false; if (r > 28000) { _spritesTable[i]._state = 3; } else if (r > 20000) { _spritesTable[i]._state = 4; } else { _spritesTable[i]._state = 3; _spritesTable[i]._animationFrame = 1; _spritesTable[i]._updateDelay = 5; } } } void TuckerEngine::updateSprite_locationNum11_1(int i) { if (getRandomNumber() > 20000) { _spritesTable[i]._state = 5; } else { _spritesTable[i]._animationFrame = 14; _updateSpriteFlag1 = true; _spritesTable[i]._state = 5; } } void TuckerEngine::updateSprite_locationNum11_2(int i) { if (getRandomNumber() > 20000) { _spritesTable[i]._state = 6; } else { _spritesTable[i]._animationFrame = 17; _spritesTable[i]._state = 6; _updateSpriteFlag1 = true; } } void TuckerEngine::updateSprite_locationNum11_3(int i) { _spritesTable[i]._state = 7; } void TuckerEngine::updateSprite_locationNum11_4(int i) { if (getRandomNumber() > 30000 && _flagsTable[55] < 2) { _spritesTable[i]._state = 1; startSound(_locationSoundsTable[6]._offset, 6, _locationSoundsTable[6]._volume); } else { _spritesTable[i]._state = -1; } } void TuckerEngine::updateSprite_locationNum12_0(int i) { ++_updateLocationCounter2; if (_updateLocationCounter2 > 11) { _updateLocationCounter2 = 0; } int state; if (_flagsTable[207] > 0) { state = -1; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 5; } else { _spritesTable[i]._needUpdate = false; if (_updateLocationCounter2 < 4) { state = 1; } else if (_updateLocationCounter2 < 8) { state = 2; } else { state = 4; } } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum12_1(int i) { int state; const int r = getRandomNumber(); if (r > 22000) { state = 6; } else if (r > 10000) { state = 7; } else { state = 8; } _spritesTable[i]._state = state; } void TuckerEngine::execData3PreUpdate_locationNum12() { if (_inventoryItemsState[12] == 1 && _flagsTable[38] == 0) { _flagsTable[38] = 1; } if (_flagsTable[41] == 0) { if (_locationMusicsTable[0]._volume != 100) { _locationMusicsTable[0]._volume = 100; setVolumeMusic(0, 100); } } else { if (_locationMusicsTable[0]._volume != 20) { _locationMusicsTable[0]._volume = 20; setVolumeMusic(0, 20); } } } void TuckerEngine::updateSprite_locationNum13(int i) { int state = 0; if (_csDataHandled) { if (_flagsTable[202] == 0) { _flagsTable[202] = 1; state = 3; _spritesTable[i]._stateIndex = -1; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { state = 4; _spritesTable[i]._needUpdate = true; } else { _spritesTable[i]._needUpdate = false; state = 5; } } else if (_flagsTable[202] == 1) { _spritesTable[i]._needUpdate = false; _flagsTable[202] = 0; state = 6; } else { setCharacterAnimation(0, 0); return; } _spritesTable[i]._state = state; } void TuckerEngine::execData3PreUpdate_locationNum13() { if (_flagsTable[69] == 0) { if (getRandomNumber() > 31000) { _flagsTable[69] = 1; startSound(_locationSoundsTable[1]._offset, 1, _locationSoundsTable[1]._volume); } else if (isSoundPlaying(1)) { stopSound(1); } } _flagsTable[8] = 2; if (_spritesTable[0]._state == 1) { if (_spritesTable[0]._animationFrame > 10 && _spritesTable[0]._animationFrame < 20) { if (!isSoundPlaying(0)) { startSound(_locationSoundsTable[0]._offset, 0, _locationSoundsTable[0]._volume); } } } if (isSoundPlaying(0)) { if (_spritesTable[0]._animationFrame > 10 && _spritesTable[0]._animationFrame < 20) { stopSound(0); } } } void TuckerEngine::updateSprite_locationNum14(int i) { int state = 2; if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = (getRandomNumber() < 12000) ? 1 : 3; } else if (getRandomNumber() < 26000) { _spritesTable[i]._updateDelay = 5; } _spritesTable[i]._state = state; } void TuckerEngine::execData3PreUpdate_locationNum14() { if (_yPosCurrent >= 127) { execData3Update_locationNum14(); } } void TuckerEngine::execData3Update_locationNum14() { if (!isSoundPlaying(0)) { int num = -1; const int i = getRandomNumber(); if (i > 32000) { num = 0; } else if (i > 31800) { num = 3; } else if (i > 31600) { num = 4; } else if (i > 31400) { num = 7; } if (num != -1) { startSound(_locationSoundsTable[num]._offset, num, _locationSoundsTable[num]._volume); } } _locationHeightTable[14] = (_xPosCurrent < 100) ? 0 : 60; if (_updateLocationFadePaletteCounter == 0) { for (int i = 0; i < 10; ++i) { _updateLocation14ObjNum[i] = 0; } } ++_updateLocationFadePaletteCounter; if (_updateLocationFadePaletteCounter > 4) { _updateLocationFadePaletteCounter = 1; } for (int i = 0; i < 10; ++i) { execData3PreUpdate_locationNum14Helper1(i); if (_updateLocationFadePaletteCounter == 1 && _updateLocation14ObjNum[i] > 0) { execData3PreUpdate_locationNum14Helper2(i); } const int num = _updateLocation14ObjNum[i]; if (num > 0) { const int w = _dataTable[num]._xSize; const int h = _dataTable[num]._ySize; const int x = _updateLocationXPosTable2[i] - w / 2; const int y = _updateLocationYPosTable2[i] / 16 - h / 2; Graphics::decodeRLE_248(_locationBackgroundGfxBuf + y * 640 + x, _data3GfxBuf + _dataTable[num]._sourceOffset, w, h, 0, 0, false); addDirtyRect(x, y, w, h); } } } void TuckerEngine::execData3PreUpdate_locationNum14Helper1(int i) { const int y = 117 * 16; if (_updateLocation14ObjNum[i] == 0) { if (getRandomNumber() <= 30000) { return; } _updateLocationXPosTable2[i] = 155; _updateLocationYPosTable2[i] = y; _updateLocation14Step[i] = -55 - getRandomNumber() / 512; _updateLocation14ObjNum[i] = 231; _updateLocation14Delay[i] = 16 + getRandomNumber() / 2048; } _updateLocation14Step[i] += 4; _updateLocationYPosTable2[i] += _updateLocation14Step[i]; if (_updateLocationYPosTable2[i] > y) { _updateLocationYPosTable2[i] = y; _updateLocation14Step[i] = (-(getRandomNumber() + 32000) * _updateLocation14Step[i]) / 65536; } --_updateLocationXPosTable2[i]; if (_updateLocationXPosTable2[i] == 0) { _updateLocation14ObjNum[i] = 0; } } void TuckerEngine::execData3PreUpdate_locationNum14Helper2(int i) { --_updateLocation14Delay[i]; if (_updateLocation14Delay[i] == 0) { _updateLocation14ObjNum[i] = 236; } else { ++_updateLocation14ObjNum[i]; if (_updateLocation14ObjNum[i] > 237) { _updateLocation14ObjNum[i] = 0; } else if (_updateLocation14ObjNum[i] == 235) { _updateLocation14ObjNum[i] = 231; } } } void TuckerEngine::execData3PostUpdate_locationNum14() { if (_yPosCurrent < 127) { execData3Update_locationNum14(); } } void TuckerEngine::updateSprite_locationNum15_0(int i) { _spritesTable[i]._state = -1; } void TuckerEngine::updateSprite_locationNum15_1(int i) { int state; int r = getRandomNumber(); if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 6; } else { _spritesTable[i]._needUpdate = false; if (r < 26000) { state = 5; } else if (r < 29000) { state = 2; _spritesTable[i]._prevAnimationFrame = true; } else { state = 4; _spritesTable[4]._counter = 1; } } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum15_2(int i) { _spritesTable[i]._state = 3; if (_spritesTable[4]._counter > 0) { ++_spritesTable[4]._counter; if (_spritesTable[4]._counter > 6) { _spritesTable[4]._counter = 0; } else { _spritesTable[i]._updateDelay = 2; } } else { _spritesTable[i]._updateDelay = 2; } } void TuckerEngine::execData3PreUpdate_locationNum15() { ++_updateLocationFadePaletteCounter; if (_updateLocationFadePaletteCounter > 500) { if (!isSoundPlaying(1) && getRandomNumber() > 31000) { const int i = getRandomNumber() / 4714; startSound(_locationSoundsTable[i]._offset, i, _locationSoundsTable[i]._volume); _updateLocationFadePaletteCounter = 0; } } } void TuckerEngine::updateSprite_locationNum16_0(int i) { int state = 0; int r = getRandomNumber(); if (_flagsTable[210] > 0) { state = -1; } else if (_flagsTable[82] == 1) { state = 2; _flagsTable[82] = 2; } else if (_flagsTable[82] == 2) { state = -1; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == 0) { if (!_spritesTable[0]._needUpdate) { _spritesTable[0]._needUpdate = true; state = 1; } else { state = 1; _spritesTable[0]._animationFrame = 2; _updateSpriteFlag1 = true; } } else if (_csDataHandled) { _spritesTable[0]._needUpdate = false; state = 4; _spritesTable[0]._updateDelay = 5; } else if (r < 30000) { state = 4; _spritesTable[0]._updateDelay = 5; } else if (r < 31000) { state = 4; if (_xPosCurrent < 300) { _miscSoundFxDelayCounter[0] = 2; _miscSoundFxNum[0] = 9; } } else if (r < 32000) { state = 5; } else { state = 6; } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum16_1(int i) { int state; if (_flagsTable[61] == 0) { state = -1; if (isSoundPlaying(0)) { stopSound(0); } else if (isSoundPlaying(1)) { stopSound(1); } } else if (_flagsTable[60] == 0) { state = 10; if (isSoundPlaying(1)) { _locationSoundsTable[1]._type = 2; startSound(_locationSoundsTable[1]._offset, 1, _locationSoundsTable[1]._volume); } } else { state = 9; if (isSoundPlaying(0)) { _locationSoundsTable[0]._type = 2; startSound(_locationSoundsTable[0]._offset, 0, _locationSoundsTable[0]._volume); } } _spritesTable[i]._state = state; _spritesTable[i]._gfxBackgroundOffset = 320; } void TuckerEngine::updateSprite_locationNum16_2(int i) { int state = -1; if (_flagsTable[78] == 0) { if (_flagsTable[60] == 1 && _flagsTable[61] == 1) { _flagsTable[78] = 1; startSound(_locationSoundsTable[5]._offset, 5, _locationSoundsTable[5]._volume); state = 7; } } else if (_flagsTable[78] == 1) { if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 8; } else { if (getRandomNumber() > 32000) { state = 7; } else if (getRandomNumber() > 10000) { state = 13; _spritesTable[i]._updateDelay = 5; } else { state = 13; } _spritesTable[i]._needUpdate = true; } } _spritesTable[i]._state = state; _spritesTable[i]._gfxBackgroundOffset = 320; } void TuckerEngine::execData3PreUpdate_locationNum16() { _locationHeightTable[16] = (_xPosCurrent < 320) ? 60 : 0; } void TuckerEngine::updateSprite_locationNum17() { int state; if (_flagsTable[76] > 0) { state = -1; _disableCharactersPath = false; } else if (_flagsTable[82] == 2) { _flagsTable[82] = 3; _disableCharactersPath = true; _spritesTable[0]._gfxBackgroundOffset = 100; state = 1; _spritesTable[0]._backgroundOffset = -1; } else if (_spritesTable[0]._gfxBackgroundOffset < -160) { state = -1; } else { state = 1; _spritesTable[0]._yMaxBackground = 0; _spritesTable[0]._colorType = 1; } _spritesTable[0]._state = state; } void TuckerEngine::updateSprite_locationNum18() { int state; if (_charSpeechSoundCounter > 0 && _actionCharacterNum == 0) { _spritesTable[0]._needUpdate = true; state = 2; } else { _spritesTable[0]._needUpdate = false; state = 1; const int r = getRandomNumber(); if (r > 31000) { state = 3; } else if (r > 30000) { state = 4; } } _spritesTable[0]._gfxBackgroundOffset = 0; _spritesTable[0]._backgroundOffset = 0; _spritesTable[0]._state = state; } void TuckerEngine::updateSprite_locationNum19_0(int i) { int state; if (_flagsTable[206] == 1) { state = 7; _spritesTable[i]._needUpdate = false; _flagsTable[206] = 0; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { ++_spritesTable[i]._counter; _spritesTable[i]._needUpdate = true; if (_spritesTable[i]._counter > 10) { _spritesTable[i]._counter = 0; state = 2; } else { state = 1; } } else { _spritesTable[i]._needUpdate = false; if (_spritesTable[i]._counter > 10) { _spritesTable[i]._counter = 0; } if (_spritesTable[i]._counter == 2) { state = 4; _spritesTable[i]._prevAnimationFrame = true; } else if (_spritesTable[i]._counter == 5) { state = 5; _spritesTable[i]._prevAnimationFrame = true; } else { state = 5; _spritesTable[i]._updateDelay = 6; } } _spritesTable[i]._state = state; _spritesTable[i]._prevAnimationFrame = true; } void TuckerEngine::updateSprite_locationNum19_1(int i) { _spritesTable[i]._state = 9; _spritesTable[i]._gfxBackgroundOffset = 320; } void TuckerEngine::updateSprite_locationNum19_2(int i) { _spritesTable[i]._gfxBackgroundOffset = 320; _spritesTable[i]._state = -1; } void TuckerEngine::updateSprite_locationNum19_3(int i) { setCharacterAnimation(0, i); } void TuckerEngine::execData3PreUpdate_locationNum19() { _locationHeightTable[19] = (_locationMaskType == 0) ? 0 : 60; } void TuckerEngine::updateSprite_locationNum21() { int state; if (_flagsTable[58] == 2) { state = 5; _flagsTable[58] = 3; setVolumeSound(2, 0); } else if (_flagsTable[58] == 3) { state = 6; _flagsTable[58] = 4; _locationSoundsTable[0]._volume = 60; _locationSoundsTable[5]._volume = 60; } else if (_flagsTable[58] == 4) { state = 7; _locationSoundsTable[4]._volume = 60; } else if (_flagsTable[59] == 4) { _spritesTable[0]._needUpdate = true; _flagsTable[59] = 2; state = 2; setVolumeSound(2, 0); } else if (_flagsTable[59] == 3) { _flagsTable[59] = 0; state = 4; setVolumeSound(2, _locationSoundsTable[2]._volume); } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == 0) { _spritesTable[0]._needUpdate = true; state = 3; } else if (_flagsTable[59] == 2) { _spritesTable[0]._needUpdate = false; state = 3; _spritesTable[0]._updateDelay = 5; } else if (_flagsTable[15] == 1) { state = 3; _spritesTable[0]._updateDelay = 5; } else { _spritesTable[0]._needUpdate = false; state = 1; } _spritesTable[0]._state = state; _spritesTable[0]._gfxBackgroundOffset = 320; } void TuckerEngine::execData3PreUpdate_locationNum21() { if (_xPosCurrent > 460 && _flagsTable[58] == 0 && _nextAction == 0) { _currentActionVerb = kVerbWalk; _pendingActionDelay = 0; _flagsTable[59] = 1; _nextAction = 2; _csDataLoaded = false; } if (_flagsTable[58] > 0 && !isSoundPlaying(0)) { const int r = getRandomNumber(); if (r > 10000) { int num; if (r > 25000) { num = 0; } else if (r > 17000) { num = 4; } else { num = 5; } startSound(_locationSoundsTable[num]._offset, num, _locationSoundsTable[num]._volume); } } if (_spritesTable[0]._state == 6) { if (_spritesTable[0]._animationFrame < 18) { _spritesTable[0]._gfxBackgroundOffset = 320 + _spritesTable[0]._animationFrame * 638; } else { _spritesTable[0]._gfxBackgroundOffset = 11840 - _spritesTable[0]._animationFrame * 2; } } else { _spritesTable[0]._gfxBackgroundOffset = 320; } if (_inventoryItemsState[19] > 0) { _flagsTable[43] = 1; } } void TuckerEngine::execData3PostUpdate_locationNum21() { if (_flagsTable[58] > 3) { drawSprite(0); } } void TuckerEngine::execData3PreUpdate_locationNum22() { if (_flagsTable[53] > 1 && _flagsTable[53] != 4) { if (_inventoryItemsState[5] > 0 && _inventoryItemsState[20] > 0 && _inventoryItemsState[16] > 0 && _inventoryItemsState[27] > 0) { _flagsTable[53] = 3; } else if (_inventoryItemsState[5] > 0 || _inventoryItemsState[20] > 0 || _inventoryItemsState[16] > 0 || _inventoryItemsState[27] > 0) { _flagsTable[53] = 5; } } if (_flagsTable[210] < 2 && !_csDataHandled && _flagsTable[54] == 1) { _nextAction = 25; _csDataLoaded = false; _flagsTable[210] = 2; } } void TuckerEngine::updateSprite_locationNum22() { if (_flagsTable[207] == 1) { _spritesTable[0]._state = -1; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == 0) { _spritesTable[0]._needUpdate = true; _spritesTable[0]._state = 2; } else { _spritesTable[0]._needUpdate = false; _spritesTable[0]._state = 1; } } void TuckerEngine::updateSprite_locationNum23_0(int i) { int state; if (_flagsTable[210] == 3) { state = 12; } else { state = -1; } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum23_1(int i) { int state; if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 14; } else if (getRandomNumber() < 30000) { _spritesTable[i]._needUpdate = false; state = 25; } else { _spritesTable[i]._needUpdate = false; state = 13; } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum23_2(int i) { int state = 0; if (_flagsTable[210] == 0) { if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 6; } else { _spritesTable[i]._needUpdate = false; state = (getRandomNumber() < 25000) ? 4 : 5; } } else if (_flagsTable[210] == 1) { if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; if (_flagsTable[211] == 10) { state = 34; } else if (_flagsTable[211] == 0) { state = 30; _flagsTable[211] = 1; } else { state = 31; } } else { _spritesTable[i]._needUpdate = false; if (_flagsTable[211] == 1) { state = 32; _flagsTable[211] = 0; } else { state = (getRandomNumber() < 25000) ? 10 : 11; } } } else if (_flagsTable[210] == 2) { if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 33; } else { _spritesTable[i]._needUpdate = false; if (_flagsTable[212] == 0) { state = 3; _flagsTable[212] = 1; } else if (_flagsTable[212] == 2) { state = 29; _flagsTable[212] = 3; } else { state = (getRandomNumber() < 25000) ? 22 : 23; } } } else { state = 24; } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum23_3(int i) { int state; if (_flagsTable[210] == 0 || _flagsTable[210] == 2) { state = -1; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 8; } else { _spritesTable[i]._needUpdate = false; state = 9; } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum24_0(int i) { int state; if (_flagsTable[103] == 4) { _flagsTable[103] = 3; state = 5; } else if (_flagsTable[103] == 0) { if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 2; } else { _spritesTable[i]._needUpdate = true; state = 1; if (getRandomNumber() < 30000) { _spritesTable[i]._updateDelay = 5; } } } else if (_flagsTable[103] == 1 || _flagsTable[103] == 3) { state = -1; } else { if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 4; } else { if (getRandomNumber() < 30000) { _spritesTable[i]._needUpdate = false; state = 6; _spritesTable[i]._updateDelay = 5; } else { _spritesTable[i]._needUpdate = false; state = 6; } } } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum24_1(int i) { if (_flagsTable[103] > 1) { _spritesTable[i]._state = 3; } else { _spritesTable[i]._state = -1; } } void TuckerEngine::updateSprite_locationNum24_2(int i) { int state; if (_flagsTable[214] > 1) { state = -1; } else if (_flagsTable[214] == 1) { _spritesTable[i]._needUpdate = false; _flagsTable[214] = 2; state = 9; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; if (_flagsTable[213] == 1) { state = 10; } else if (_flagsTable[213] == 2) { state = 14; } else { state = 8; } } else { _spritesTable[i]._needUpdate = true; state = 7; } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum24_3(int i) { int state; if (_flagsTable[239] == 1) { state = -1; } else if (_flagsTable[214] == 2) { _flagsTable[239] = 1; state = 13; } else if (getRandomNumber() > 32000) { state = 12; } else { state = 11; } _spritesTable[i]._state = state; } void TuckerEngine::execData3PreUpdate_locationNum24() { _characterPrevBackFrontFacing = false; if (_flagsTable[112] == 0) { _yPosCurrent = 132; _xPosCurrent = 112; } else if (_inventoryItemsState[2] == 1 && _inventoryItemsState[11] == 1 && _flagsTable[156] == 1 && _flagsTable[145] == 3) { _flagsTable[156] = 2; _nextAction = 61; _csDataLoaded = false; } if (_flagsTable[103] > 0 && (_inventoryItemsState[2] > 0 || _inventoryItemsState[11] > 0 || _flagsTable[156] > 0 || _flagsTable[145] == 3) && _flagsTable[217] == 0) { _flagsTable[217] = 1; } _locationHeightTable[24] = (_yPosCurrent < 125) ? 60 : 0; } void TuckerEngine::execData3PostUpdate_locationNum24() { if (_yPosCurrent < 132) { drawSprite(1); drawSprite(0); } } void TuckerEngine::execData3PreUpdate_locationNum25() { _backgroundSprOffset = _xPosCurrent - 160; } void TuckerEngine::updateSprite_locationNum26_0(int i) { if (_flagsTable[125] > 0 && _flagsTable[125] < 300) { _flagsTable[126] = 1; } _spritesTable[i]._gfxBackgroundOffset = _flagsTable[125]; _spritesTable[i]._state = 1; _spritesTable[i]._colorType = 99; } void TuckerEngine::updateSprite_locationNum26_1(int i) { int state; if (_flagsTable[125] == 0) { state = -1; } else if (_flagsTable[125] > 299) { state = 2; _spritesTable[i]._updateDelay = 5; } else { state = 2; } _spritesTable[i]._gfxBackgroundOffset = _flagsTable[125]; _spritesTable[i]._colorType = 1; _spritesTable[i]._state = state; } void TuckerEngine::execData3PreUpdate_locationNum26() { _characterPrevBackFrontFacing = true; _spritesTable[1]._gfxBackgroundOffset = _flagsTable[125]; _spritesTable[0]._gfxBackgroundOffset = _flagsTable[125]; if (_flagsTable[125] > 0 && _flagsTable[125] < 300) { if (!isSoundPlaying(5)) { startSound(_locationSoundsTable[5]._offset, 5, _locationSoundsTable[5]._volume); startSound(_locationSoundsTable[6]._offset, 6, _locationSoundsTable[6]._volume); } ++_flagsTable[125]; _flagsTable[126] = 1; } else { if (isSoundPlaying(5)) { stopSound(5); stopSound(6); } } if (!_panelLockedFlag) { if (_xPosCurrent > 207 && _xPosCurrent < 256) { _objectKeysLocationTable[26] = 0; _objectKeysPosXTable[26] = 260; } else { _objectKeysLocationTable[26] = 1; } } } void TuckerEngine::updateSprite_locationNum27(int i) { int state; if (_flagsTable[155] < 3 || _flagsTable[155] == 5) { state = -1; } else if (_flagsTable[155] == 3) { state = 1; _flagsTable[155] = 4; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 2; } else if (getRandomNumber() < 30000) { _spritesTable[i]._needUpdate = false; state = 3; _spritesTable[i]._updateDelay = 5; } else { _spritesTable[i]._needUpdate = false; state = 3; } _spritesTable[i]._state = state; } void TuckerEngine::execData3PreUpdate_locationNum27() { _characterPrevBackFrontFacing = false; } void TuckerEngine::execData3PostUpdate_locationNum27() { if (_flagsTable[155] == 4 && _yPosCurrent < 125) { drawSprite(0); } } void TuckerEngine::updateSprite_locationNum28_0(int i) { int state; if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { state = 4; _spritesTable[i]._needUpdate = true; } else { _spritesTable[i]._needUpdate = false; ++_spritesTable[i]._counter; if (_spritesTable[i]._counter > 30) { _spritesTable[i]._counter = 0; } if (_flagsTable[86] == 1) { if (_spritesTable[i]._counter == 16 || _spritesTable[i]._counter == 27) { state = 3; } else { state = 3; _spritesTable[i]._updateDelay = 5; } } else { if (_spritesTable[i]._counter == 5 || _spritesTable[i]._counter == 11) { state = 5; } else if (_spritesTable[i]._counter == 16 || _spritesTable[i]._counter == 27) { state = 6; } else { state = 6; _spritesTable[i]._updateDelay = 5; } } } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum28_1(int i) { _spritesTable[i]._state = (_flagsTable[86] == 1) ? 1 : -1; } void TuckerEngine::updateSprite_locationNum28_2(int i) { int state; if (_flagsTable[155] == 1) { state = 8; _flagsTable[155] = 2; } else { state = -1; } _spritesTable[i]._state = state; } void TuckerEngine::execData3PreUpdate_locationNum28() { if (_flagsTable[86] == 0 && _xPosCurrent > 265 && _nextAction == 0) { _panelLockedFlag = false; _nextAction = 21; _csDataLoaded = false; _pendingActionDelay = 0; _pendingActionIndex = 0; _currentActionVerb = kVerbWalk; } } void TuckerEngine::execData3PostUpdate_locationNum28() { if (_yPosCurrent < 135) { drawSprite(1); } } void TuckerEngine::updateSprite_locationNum29_0(int i) { _spritesTable[i]._state = (getRandomNumber() < 32000) ? -1 : 2; } void TuckerEngine::updateSprite_locationNum29_1(int i) { int state = -1; if (getRandomNumber() >= 32000) { state = 1; _spritesTable[i]._gfxBackgroundOffset = 320; } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum29_2(int i) { _spritesTable[i]._state = 3; _spritesTable[i]._gfxBackgroundOffset = 320; } void TuckerEngine::execData3PreUpdate_locationNum29() { static const uint8 r[] = { 0x0D, 0x0E, 0x0E, 0x0E, 0x0D, 0x0E, 0x0D, 0x0E, 0x0E, 0x0E, 0x0D }; static const uint8 g[] = { 0x0E, 0x14, 0x1B, 0x14, 0x0E, 0x0D, 0x0E, 0x14, 0x1B, 0x14, 0x0E }; static const uint8 b[] = { 0x2C, 0x34, 0x3B, 0x34, 0x2C, 0x24, 0x2C, 0x34, 0x3B, 0x34, 0x2C }; if (_fadePaletteCounter == 16) { ++_updateLocationFadePaletteCounter; if (_updateLocationFadePaletteCounter > 10) { _updateLocationFadePaletteCounter = 0; } const int d = _updateLocationFadePaletteCounter / 2; uint8 scrollPal[5 * 3]; for (int i = 0; i < 5; ++i) { // Bug Trac#6378. Shift the palette two bits to the left. // The original was writing to 0x3C8-0x3c9 VGA registers which are // 6-bit scrollPal[i * 3 + 0] = r[i + d] << 2; scrollPal[i * 3 + 1] = g[i + d] << 2; scrollPal[i * 3 + 2] = b[i + d] << 2; } _system->getPaletteManager()->setPalette(scrollPal, 118, 5); if (_flagsTable[143] == 1) { _locationObjectsTable[2]._xPos = 999; _locationObjectsTable[3]._xPos = 187; } else { _locationObjectsTable[2]._xPos = 187; _locationObjectsTable[3]._xPos = 999; } } } void TuckerEngine::updateSprite_locationNum30_34(int i) { _spritesTable[i]._state = i + 1; } void TuckerEngine::execData3PreUpdate_locationNum30() { if (!isSoundPlaying(1) && getRandomNumber() > 32500) { startSound(_locationSoundsTable[1]._offset, 1, _locationSoundsTable[1]._volume); } } void TuckerEngine::execData3PreUpdate_locationNum31() { if (getRandomNumber() > 32000 && _flagsTable[110] == 0) { _flagsTable[110] = 1; } if (getRandomNumber() > 31000 && _flagsTable[111] == 0) { _flagsTable[111] = 1; } if (_xPosCurrent < 112 && _flagsTable[104] == 0) { _flagsTable[104] = 1; } } void TuckerEngine::execData3PreUpdate_locationNum32() { if (_spritesTable[0]._state == 12 && _spritesTable[0]._animationFrame < 22) { _flagsTable[113] = 1; } else { _flagsTable[113] = 0; } } void TuckerEngine::execData3PostUpdate_locationNum32() { if (_yPosCurrent < 120) { drawSprite(0); } } void TuckerEngine::updateSprite_locationNum31_0(int i) { _spritesTable[i]._state = (getRandomNumber() < 32000) ? 3 : 1; } void TuckerEngine::updateSprite_locationNum31_1(int i) { _spritesTable[i]._state = (_flagsTable[86] == 1) ? 2 : -1; } void TuckerEngine::updateSprite_locationNum32_0(int i) { static const uint8 stateTable[] = { 12, 1, 11, 1, 11, 2, 1, 5, 5, 11, 1, 5, 5, 5 }; ++_spritesTable[i]._counter; if (_flagsTable[123] == 2) { _flagsTable[123] = 0; } int state; if (_flagsTable[222] == 1) { state = 19; _flagsTable[222] = 2; } else if (_flagsTable[222] == 2) { state = 19; _spritesTable[i]._animationFrame = 23; _updateSpriteFlag1 = true; } else if (_flagsTable[123] == 1) { state = 17; _flagsTable[123] = 2; } else if (_flagsTable[222] == 3) { state = 18; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 4; } else if (_csDataHandled) { state = 5; } else { _spritesTable[i]._needUpdate = false; if (_spritesTable[i]._counter > 13) { _spritesTable[i]._counter = 0; } state = stateTable[_spritesTable[i]._counter]; } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum33_0(int i) { int state = 5; if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 7; } else if (_flagsTable[87] == 1) { state = 8; } else if (_flagsTable[222] == 5) { state = 4; } else { _spritesTable[i]._needUpdate = false; state = (getRandomNumber() < 30000) ? 5 : 6; } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum33_1(int i) { int state; if (_flagsTable[87] == 1) { state = 3; } else if (_flagsTable[222] == 5) { state = 2; } else { state = 1; } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum33_2(int i) { int state; if (_flagsTable[87] == 1) { state = 11; } else if (_flagsTable[222] == 5) { state = 10; } else { state = 9; } _spritesTable[i]._state = state; } void TuckerEngine::execData3PreUpdate_locationNum33() { if (_xPosCurrent < 90) { if (_flagsTable[105] == 0) { _flagsTable[105] = 3; startSound(_locationSoundsTable[5]._offset, 5, _locationSoundsTable[5]._volume); } } else { if (_flagsTable[105] == 1) { _flagsTable[105] = 2; startSound(_locationSoundsTable[5]._offset, 5, _locationSoundsTable[5]._volume); } } if (_xPosCurrent > 230) { if (_flagsTable[106] == 0) { _flagsTable[106] = 3; startSound(_locationSoundsTable[5]._offset, 5, _locationSoundsTable[5]._volume); } } else { if (_flagsTable[106] == 1) { _flagsTable[106] = 2; startSound(_locationSoundsTable[5]._offset, 5, _locationSoundsTable[5]._volume); } } } void TuckerEngine::execData3PreUpdate_locationNum34() { if (_flagsTable[143] == 1) { _locationObjectsTable[0]._xPos = 0; } } void TuckerEngine::execData3PreUpdate_locationNum35() { if (_flagsTable[250] > 0) { _currentFxVolume = 0; } } void TuckerEngine::updateSprite_locationNum36(int i) { _spritesTable[i]._state = (getRandomNumber() < 32000) ? 1 : 2; } void TuckerEngine::execData3PreUpdate_locationNum36() { if (_execData3Counter == 0) { _execData3Counter = 1; _flagsTable[107] = 1; } else if (_flagsTable[107] == 0 && _locationMaskType == 1 && _execData3Counter == 1) { _execData3Counter = 2; _flagsTable[107] = 1; } } void TuckerEngine::updateSprite_locationNum37(int i) { int j = i + 1; int offset = 200 - i * 45; ++_spritesTable[i]._counter; if (_spritesTable[i]._counter > offset) { _spritesTable[i]._state = j; _spritesTable[i]._counter = 0; } else { _spritesTable[i]._state = -1; } } void TuckerEngine::execData3PreUpdate_locationNum38() { if (_flagsTable[117] == 0 && _flagsTable[116] == 1) { _flagsTable[116] = 0; } } void TuckerEngine::updateSprite_locationNum41(int i) { int state; if (_flagsTable[223] > 1) { state = -1; } else if (_flagsTable[223] == 1) { state = 1; _flagsTable[158] = 2; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 3; } else if (getRandomNumber() < 30000) { _spritesTable[i]._needUpdate = false; state = 5; } else { _spritesTable[i]._needUpdate = false; state = 4; } _spritesTable[i]._state = state; } void TuckerEngine::execData3PreUpdate_locationNum41() { if (_backgroundSpriteCurrentAnimation == 4) { if (_backgroundSpriteCurrentFrame == 8) { _flagsTable[77] = 2; } else if (_backgroundSpriteCurrentFrame == 7) { _flagsTable[77] = 0; } if (!_changeBackgroundSprite) { if (_backgroundSpriteCurrentFrame == 16 && !isSoundPlaying(4)) { _locationSoundsTable[4]._type = 2; startSound(_locationSoundsTable[4]._offset, 4, _locationSoundsTable[4]._volume); } else { if (_backgroundSpriteCurrentFrame == 28) { stopSound(4); } } } else { if (_backgroundSpriteCurrentFrame == 28 && !isSoundPlaying(4)) { _locationSoundsTable[4]._type = 2; startSound(_locationSoundsTable[4]._offset, 4, _locationSoundsTable[4]._volume); } else { if (_backgroundSpriteCurrentFrame == 18) { stopSound(4); } } } } if (_panelLockedFlag && _yPosCurrent > 130 && _selectedObject._yPos > 135 && _nextAction == 0 && _flagsTable[223] == 0) { _panelLockedFlag = false; _csDataLoaded = false; _nextLocation = kLocationNone; _selectedObject._locationObjectLocation = kLocationNone; _locationMaskType = 0; _nextAction = _flagsTable[163] + 32; ++_flagsTable[163]; if (_flagsTable[163] > 2) { _flagsTable[163] = 0; } if (_flagsTable[223] > 0 && _mapSequenceFlagsLocationTable[40] == 0) { for (int i = 41; i < 53; ++i) { _mapSequenceFlagsLocationTable[i - 1] = 1; } } if (_flagsTable[77] == 0) { _locationObjectsTable[3]._xPos = 230; } else { _locationObjectsTable[3]._xPos = 930; } } } void TuckerEngine::updateSprite_locationNum42(int i) { int state; if (_flagsTable[223] == 0 || _flagsTable[223] > 3) { state = -1; } else if (_flagsTable[223] == 1) { state = 1; _flagsTable[223] = 2; } else if (_flagsTable[223] == 2) { state = 5; _flagsTable[223] = 3; } else if (_flagsTable[223] == 3) { state = 5; _spritesTable[i]._updateDelay = 5; _spritesTable[i]._state = _spritesTable[i]._firstFrame - 1; _updateSpriteFlag1 = true; } else { state = 2; } _spritesTable[i]._state = state; } void TuckerEngine::execData3PreUpdate_locationNum42() { _flagsTable[167] = 1; } void TuckerEngine::updateSprite_locationNum43_2(int i) { int state; if (_flagsTable[237] > 0) { state = -1; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 5; } else if (_csDataHandled || _spritesTable[i]._counter == 2) { _spritesTable[i]._needUpdate = false; state = 6; } else if (_spritesTable[i]._counter == 0) { state = 3; } else { state = 4; _spritesTable[i]._counter = 2; } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum43_3(int i) { int state; if (_flagsTable[236] < 4) { state = -1; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { state = 7; _spritesTable[i]._needUpdate = true; } else { state = 8; _spritesTable[i]._needUpdate = false; } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum43_4(int i) { int state; if (_flagsTable[236] < 4) { state = -1; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { state = 9; _spritesTable[i]._needUpdate = true; } else { state = 10; _spritesTable[i]._needUpdate = false; } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum43_5(int i) { _spritesTable[i]._state = (_flagsTable[236] < 4) ? -1 : 11; } void TuckerEngine::updateSprite_locationNum43_6(int i) { _spritesTable[i]._state = (_flagsTable[236] < 4) ? -1 : 12; } void TuckerEngine::execData3PreUpdate_locationNum43() { if (_panelLockedFlag && _xPosCurrent > 67 && _selectedObject._xPos > 68 && _locationMaskType == 0) { _panelLockedFlag = false; _csDataLoaded = false; _nextAction = 5; } if (_xPosCurrent > 55 && _spritesTable[2]._counter == 0) { _spritesTable[2]._counter = 1; } } void TuckerEngine::execData3PreUpdate_locationNum44() { if (_backgroundSpriteCurrentAnimation == 1) { if (!isSoundPlaying(3) && _backgroundSpriteCurrentFrame == 1) { _locationSoundsTable[3]._type = 2; startSound(_locationSoundsTable[3]._offset, 3, _locationSoundsTable[3]._volume); } if (_backgroundSpriteCurrentFrame == 21) { _flagsTable[77] = 1; } else if (_backgroundSpriteCurrentFrame == 20) { _flagsTable[77] = 2; stopSound(3); } } else if (_backgroundSpriteCurrentAnimation == 4) { if (_backgroundSpriteCurrentFrame == 20 && !isSoundPlaying(3)) { startSound(_locationSoundsTable[3]._offset, 3, _locationSoundsTable[3]._volume); } } } void TuckerEngine::updateSprite_locationNum48(int i) { int state; if (_flagsTable[160] == 0 || _flagsTable[160] > 2 || _flagsTable[207] > 0) { state = -1; } else if (_flagsTable[160] == 2) { _flagsTable[160] = 3; state = 3; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 2; } else { _spritesTable[i]._needUpdate = false; state = 2; _spritesTable[i]._updateDelay = 5; } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum49(int i) { if (_flagsTable[136] == 1 && _flagsTable[207] == 0) { _flagsTable[136] = 2; } if (_flagsTable[185] == 0 && _yPosCurrent < 125) { _flagsTable[185] = 1; } else if (_flagsTable[185] == 2 && (_yPosCurrent > 130 || _flagsTable[236] == 4)) { _flagsTable[185] = 3; } int state; if (_flagsTable[185] == 0 || _flagsTable[160] < 3) { state = -1; } else if (_flagsTable[185] == 1) { _flagsTable[185] = 2; state = 1; } else if (_flagsTable[185] == 3) { _flagsTable[185] = 0; state = 4; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 2; } else { _spritesTable[i]._needUpdate = false; if (getRandomNumber() < 30000 || _backgroundSpriteCurrentAnimation <= -1) { state = 3; _spritesTable[i]._updateDelay = 1; } else if (getRandomNumber() < 16000) { state = 5; } else { state = 6; } } _spritesTable[i]._state = state; } void TuckerEngine::execData3PreUpdate_locationNum49() { _flagsTable[132] = 0; if (_execData3Counter == 0) { _execData3Counter = 1; if (_flagsTable[181] == 2) { _flagsTable[181] = 3; } } static const int items[] = { 15, 44, 25, 27, 19, 21, 24, 13, 20, 29, 35, 23, 3 }; for (int i = 0; i < 13; ++i) { if (_inventoryItemsState[items[i]] == 1) { _flagsTable[168 + i] = 1; } } int counter = 0; for (int i = 168; i < 181; ++i) { if (_flagsTable[i] == 2) { ++counter; } } if (_nextAction == 0) { if (counter == 2 && _flagsTable[236] == 0) { _nextAction = 56; _csDataLoaded = false; } else if (counter == 6 && _flagsTable[236] == 1) { _nextAction = 59; _csDataLoaded = false; } else if (counter == 10 && _flagsTable[236] == 2) { _nextAction = 62; _csDataLoaded = false; } else if (counter == 13 && _flagsTable[236] == 3) { _nextAction = 65; _csDataLoaded = false; } } } void TuckerEngine::updateSprite_locationNum50(int i) { int state; if (_flagsTable[240] == 0) { state = i + 1; if (i == 5) { _flagsTable[240] = 1; } } else { _spritesTable[i]._animationFrame = _spritesTable[i]._firstFrame - 1; _spritesTable[i]._updateDelay = 5; _updateSpriteFlag1 = true; state = i + 1; } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum51(int i) { if (i == 2) { _spritesTable[i]._state = 1; } else if (i == 0) { static const int stateTable[] = { 3, 3, 4, 5, 3, 3, 5, 4, 3, 3, 4, 5, 4, 4 }; ++_spritesTable[i]._counter; if (_spritesTable[i]._counter > 13) { _spritesTable[i]._counter = 0; } _spritesTable[i]._state = stateTable[_spritesTable[i]._counter]; } else { i = 1; _spritesTable[i]._state = 6; } _spritesTable[i]._colorType = 1; _spritesTable[i]._yMaxBackground = 0; } void TuckerEngine::execData3PreUpdate_locationNum52() { if (_selectedObject._xPos > 108 && _panelLockedFlag && _nextAction == 0 && _locationMaskType == 0) { _nextAction = 1; _csDataLoaded = false; } } void TuckerEngine::updateSprite_locationNum53_0(int i) { if (_flagsTable[197] == 2) { _flagsTable[197] = 3; } int state; if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 1; } else if (_flagsTable[197] == 1) { state = 3; _spritesTable[i]._needUpdate = false; _flagsTable[197] = 2; } else if (_flagsTable[192] == 1) { _spritesTable[i]._needUpdate = false; state = 5; } else { _spritesTable[i]._needUpdate = false; state = 5; _spritesTable[i]._updateDelay = 5; } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum53_1(int i) { int state; if (_flagsTable[197] == 3) { state = 6; } else if (_flagsTable[197] == 4) { state = 7; } else { state = -1; } _spritesTable[i]._state = state; } void TuckerEngine::execData3PreUpdate_locationNum53() { if (_flagsTable[192] == 0 && _xPosCurrent < 200 && _nextAction == 0) { _panelLockedFlag = false; _nextAction = 14; _csDataLoaded = false; _pendingActionDelay = 0; _pendingActionIndex = 0; _currentActionVerb = kVerbWalk; } } void TuckerEngine::updateSprite_locationNum54(int i) { if (_flagsTable[141] == 2) { _spritesTable[i]._needUpdate = false; setCharacterAnimation(0, i); _flagsTable[141] = 1; _spritesTable[i]._counter = 0; } else if (_flagsTable[141] == 1 && _spritesTable[i]._counter < 40) { setCharacterAnimation(1, i); ++_spritesTable[i]._counter; } else if (_flagsTable[141] == 1) { setCharacterAnimation(2, i); _flagsTable[141] = 3; } else { int state = 3; if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = (getRandomNumber() < 12000) ? 2 : 4; } else if (_flagsTable[141] == 3) { _flagsTable[141] = 0; _flagsTable[224] = 1; _spritesTable[i]._counter = 0; if (!_panelLockedFlag && _xPosCurrent > 130 && _inventoryItemsState[17] == 0) { _nextAction = 18; _csDataLoaded = false; } } else if (getRandomNumber() < 26000) { _spritesTable[i]._needUpdate = false; _spritesTable[i]._updateDelay = 5; } else { _spritesTable[i]._needUpdate = false; } if (_inventoryItemsState[17] == 1) { _flagsTable[224] = 2; } _spritesTable[i]._state = state; } } void TuckerEngine::updateSprite_locationNum55(int i) { if (_flagsTable[193] > 0 && _flagsTable[193] < 14) { setCharacterAnimation(_flagsTable[193] - 1, i); _updateSpriteFlag1 = true; if (_flagsTable[193] == 1 || _flagsTable[193] == 3 || _flagsTable[193] == 5 || _flagsTable[193] == 7 || _flagsTable[193] == 11 || _flagsTable[193] == 13) { ++_flagsTable[193]; } } else { _spritesTable[i]._state = -1; if (_flagsTable[193] == 14) { _flagsTable[193] = 15; } } } void TuckerEngine::updateSprite_locationNum56(int i) { int state; ++_spritesTable[i]._counter; if (_flagsTable[153] == 1) { state = -1; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 2; } else { _spritesTable[i]._needUpdate = false; state = 1; } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum57_0(int i) { int state; if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 5; } else { _spritesTable[i]._needUpdate = false; if (getRandomNumber() < 30000) { state = 1; } else if (getRandomNumber() < 16000) { state = 4; } else { state = 2; } } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum57_1(int i) { int state = 6; if (getRandomNumber() < 30000) { _spritesTable[i]._updateDelay = 5; } _spritesTable[i]._state = state; } void TuckerEngine::execData3PreUpdate_locationNum57() { if (_flagsTable[137] == 2 && _xPosCurrent < 42 && _yPosCurrent == 135) { _flagsTable[137] = 0; _backgroundSpriteCurrentAnimation = 2; _backgroundSpriteCurrentFrame = 0; _backgroundSprOffset = 0; } } void TuckerEngine::updateSprite_locationNum58(int i) { int state; if (_flagsTable[190] == 0) { state = 1; } else if (_flagsTable[190] == 1) { state = 2; _flagsTable[190] = 2; } else { state = 3; if (_flagsTable[190] == 2) { _flagsTable[190] = 3; } } _spritesTable[i]._state = state; _spritesTable[i]._gfxBackgroundOffset = 320; } void TuckerEngine::execData3PreUpdate_locationNum58() { // workaround original game glitch #4638: do not change position on location change if (_nextLocation == kLocationNone && _flagsTable[190] < 3 && _xPosCurrent > 310) { _xPosCurrent = 310; _panelLockedFlag = false; } if (_flagsTable[190] > 0 && _locationSoundsTable[0]._volume > 0) { _locationSoundsTable[0]._volume = 0; _locationSoundsTable[4]._volume = 0; _locationSoundsTable[5]._volume = 0; if (isSoundPlaying(0)) { stopSound(0); } } } void TuckerEngine::updateSprite_locationNum59(int i) { int state; if (_flagsTable[207] == 1) { state = -1; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { state = 3; _spritesTable[i]._needUpdate = true; } else if (_csDataHandled) { _spritesTable[i]._needUpdate = false; if (_flagsTable[199] == 0) { _flagsTable[199] = 1; setCharacterAnimation(0, 0); return; } _spritesTable[i]._needUpdate = false; state = 3; _spritesTable[i]._updateDelay = 5; } else if (_flagsTable[199] == 1) { _flagsTable[199] = 0; _spritesTable[i]._needUpdate = false; setCharacterAnimation(1, 0); return; } else { _spritesTable[i]._needUpdate = false; state = 1; } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum60_0(int i) { int state; if (_flagsTable[186] > 0) { state = -1; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 9; } else { _spritesTable[i]._needUpdate = false; state = (getRandomNumber() > 32000) ? 8 : 7; } _spritesTable[i]._state = state; _spritesTable[i]._gfxBackgroundOffset = 320; } void TuckerEngine::updateSprite_locationNum60_1(int i) { int state; if (_flagsTable[186] == 1) { _flagsTable[186] = 2; _spritesTable[i]._needUpdate = false; state = 2; } else if (_flagsTable[186] == 2) { state = 6; _flagsTable[187] = 1; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 1; } else { _spritesTable[i]._needUpdate = false; state = (getRandomNumber() > 32000) ? 5 : 4; } _spritesTable[i]._state = state; _spritesTable[i]._gfxBackgroundOffset = 320; } void TuckerEngine::execData3PostUpdate_locationNum60() { drawSprite(0); } void TuckerEngine::updateSprite_locationNum61_0(int i) { int state; const int r = getRandomNumber(); if (_flagsTable[88] == 1) { state = 3; _flagsTable[88] = 2; } else if (_flagsTable[88] == 2) { state = -1; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == 0) { if (!_spritesTable[i]._needUpdate) { _spritesTable[i]._needUpdate = true; state = 2; } else { state = 2; _spritesTable[0]._animationFrame = 2; _updateSpriteFlag1 = true; } } else { _spritesTable[i]._needUpdate = false; if (r < 30000) { state = 7; _spritesTable[i]._updateDelay = 5; } else if (r < 31000) { state = 7; } else if (r < 32000) { state = 5; } else { state = 6; } } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum61_1(int i) { int state; if (_flagsTable[151] == 1) { state = -1; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 14; } else if (_csDataHandled || getRandomNumber() < 29000) { _spritesTable[i]._needUpdate = false; state = 12; _spritesTable[i]._updateDelay = 5; } else if (getRandomNumber() < 20000) { state = 12; } else { state = 13; } _spritesTable[i]._state = state; _spritesTable[i]._gfxBackgroundOffset = 320; } void TuckerEngine::updateSprite_locationNum61_2(int i) { int state; const int r = getRandomNumber(); _flagsTable[150] = 1; if (_flagsTable[198] == 2) { _flagsTable[150] = 2; state = 16; } else if (_flagsTable[198] == 1) { if (_flagsTable[150] == 2) { state = 10; } else { state = 18; } _flagsTable[198] = 2; _flagsTable[150] = 0; } else if (r < 32000) { state = 15; } else if (r < 32100) { state = 1; if (_xPosCurrent < 340 || _xPosCurrent > 380) { _flagsTable[150] = 0; if (_flagsTable[136] == 0) { state = 17; } } else { state = 15; } } else if (r < 32200) { state = 4; } else if (r < 32300) { state = 8; } else { state = 9; } _flagsTable[248] = _flagsTable[150]; if (_flagsTable[136] != 2) { _flagsTable[150] = 0; } _spritesTable[i]._state = state; _spritesTable[i]._gfxBackgroundOffset = 320; } void TuckerEngine::execData3PreUpdate_locationNum61() { if (_inventoryItemsState[36] == 1) { _flagsTable[93] = (_inventoryItemsState[6] == 1) ? 3 : 1; } else { _flagsTable[93] = (_inventoryItemsState[6] == 1) ? 2 : 0; } _flagsTable[154] = _inventoryItemsState[16]; if (_inventoryItemsState[16] == 2 && _inventoryItemsState[36] == 2) { if (!_csDataHandled && _flagsTable[88] == 0) { _flagsTable[88] = 1; } } } void TuckerEngine::updateSprite_locationNum63_0(int i) { int state; if (_flagsTable[136] > 0 && _flagsTable[132] == 2) { state = 12; } else if (_flagsTable[132] != 2 || _flagsTable[133] != 1 || _flagsTable[136] > 0) { state = -1; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 6; } else { _spritesTable[i]._needUpdate = false; state = -1; } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum63_1(int i) { int state = -1; if (_flagsTable[132] == 2 && _flagsTable[133] == 1 && _flagsTable[136] <= 0) { if (getRandomNumber() > 30000) { state = 5; } else if (getRandomNumber() > 30000) { state = 8; } } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum63_2(int i) { ++_spritesTable[i]._counter; int state = -1; if (_flagsTable[132] == 2 && _flagsTable[133] == 1 && _flagsTable[136] <= 0) { if (_flagsTable[226] == 0) { state = 9; _spritesTable[i]._updateDelay = 5; } else if (_flagsTable[226] == 1) { state = 9; _flagsTable[226] = 2; } else if (_flagsTable[226] == 2) { state = 3; } else { _flagsTable[226] = 0; state = 10; } } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum63_3(int i) { ++_spritesTable[i]._counter; int state = -1; if (_flagsTable[132] == 2 && _flagsTable[133] == 1 && _flagsTable[136] <= 0) { if (_spritesTable[i]._counter > 80) { state = 7; _spritesTable[i]._counter = 0; } else if (getRandomNumber() > 32000) { state = 2; } else if (getRandomNumber() > 32000) { state = 4; } else if (getRandomNumber() > 28000) { state = 8; } } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum63_4(int i) { int state = -1; if (_flagsTable[132] == 2 && _flagsTable[133] == 1 && _flagsTable[136] == 0) { state = 1; } _spritesTable[i]._state = state; } void TuckerEngine::execData3PreUpdate_locationNum63() { _currentGfxBackgroundCounter = 20 - _flagsTable[132] * 10; if (_flagsTable[132] != _execData3Counter) { _mainLoopCounter1 = 0; _execData3Counter = _flagsTable[132]; } if (_flagsTable[133] == 0) { _currentGfxBackgroundCounter = 30; } if (_flagsTable[136] > 0 && _flagsTable[132] == 2) { _currentGfxBackgroundCounter = 20; } if (_flagsTable[133] == 0) { for (int i = 0; i < 3; ++i) { if (isSoundPlaying(i)) { stopSound(i); } } } else { if (_flagsTable[132] == 0 || (_flagsTable[132] == 2 && _flagsTable[136] > 0)) { if (!isSoundPlaying(1)) { _locationSoundsTable[1]._type = 2; startSound(_locationSoundsTable[1]._offset, 1, _locationSoundsTable[1]._volume); } } else { if (isSoundPlaying(1)) { stopSound(1); } } if (_flagsTable[132] == 1) { if (!isSoundPlaying(0)) { _locationSoundsTable[0]._type = 2; startSound(_locationSoundsTable[0]._offset, 0, _locationSoundsTable[0]._volume); } } else { if (isSoundPlaying(0)) { stopSound(0); } } if (_flagsTable[132] == 2 && _flagsTable[136] == 0) { if (!isSoundPlaying(2)) { startSound(_locationSoundsTable[2]._offset, 2, _locationSoundsTable[2]._volume); } } else { if (isSoundPlaying(2)) { stopSound(2); } } } } void TuckerEngine::execData3PreUpdate_locationNum64() { if (_currentGfxBackgroundCounter < 30) { _locationHeightTable[64] = 48 - (_currentGfxBackgroundCounter / 10); } else { _locationHeightTable[64] = 47; } } void TuckerEngine::updateSprite_locationNum65(int i) { int state; if (_flagsTable[188] == 1) { _flagsTable[188] = 2; state = 1; _spritesTable[i]._gfxBackgroundOffset = 100; } else if (_flagsTable[188] > 0 && _flagsTable[189] > 0) { state = -1; if (_xPosCurrent < 150 || _yPosCurrent > 240) { _flagsTable[189] = 0; } } else { if (_xPosCurrent >= 150 && _yPosCurrent < 240) { // FIXME: bug if (getRandomNumber() > 32000) { state = 2; _flagsTable[189] = 1; } else { state = -1; } } else { state = -1; _flagsTable[189] = 0; } } _spritesTable[i]._state = state; } void TuckerEngine::execData3PreUpdate_locationNum65() { _flagsTable[137] = 0; } void TuckerEngine::updateSprite_locationNum66_0(int i) { int state; if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 2; } else { _spritesTable[i]._needUpdate = false; state = 2; _spritesTable[i]._updateDelay = 5; } _spritesTable[i]._state = state; _spritesTable[i]._gfxBackgroundOffset = 320; } void TuckerEngine::updateSprite_locationNum66_1(int i) { int state; if (_flagsTable[191] == 0 && _xPosCurrent > 568) { if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 8; } else { state = 10; _spritesTable[i]._needUpdate = false; } } else { if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 9; } else if (getRandomNumber() > 30000) { state = 6; _spritesTable[i]._needUpdate = false; } else { _spritesTable[i]._needUpdate = false; state = 7; _spritesTable[i]._updateDelay = 5; } } _spritesTable[i]._state = state; _spritesTable[i]._gfxBackgroundOffset = 320; } void TuckerEngine::updateSprite_locationNum66_2(int i) { _spritesTable[i]._disabled = true; _spritesTable[i]._state = 3; } void TuckerEngine::updateSprite_locationNum66_3(int i) { _spritesTable[i]._state = 4; } void TuckerEngine::updateSprite_locationNum66_4(int i) { _spritesTable[i]._state = 5; _spritesTable[i]._gfxBackgroundOffset = 320; } void TuckerEngine::execData3PreUpdate_locationNum66() { // WORKAROUND // If you don't have the appointment card yet and use the map to go to // Seedy Street Bud ends up being teleported back to the mall. // Because of the destination coordinates which warp Bud past x==583 the // below 'if' triggers and automatically makes Violet refuse Bud entrance // to the dentist. On top of that the graphics end up all garbled which // indicates that even worse things happen under the hood. // To work around this we only trigger Violet if Bud actually _walked_ past // the trigger coordinates (as opposed to using the map). // Fixes Trac#10452. if (_nextLocation != kLocationNone) return; _flagsTable[137] = 0; if (_xPosCurrent > 583 && _flagsTable[191] == 0 && _nextAction == 0 && _locationMaskType == 0) { _panelLockedFlag = false; _csDataLoaded = false; _nextLocation = kLocationNone; _selectedObject._locationObjectLocation = kLocationNone; if (_flagsTable[131] == 0) { _nextAction = 13; } else if (_flagsTable[130] == 0) { _nextAction = 14; } else { _nextAction = 35; } } } void TuckerEngine::execData3PostUpdate_locationNum66() { if (_spritesTable[2]._flipX) { --_updateLocationXPosTable2[0]; if (_updateLocationXPosTable2[0] < -50) { _spritesTable[2]._flipX = false; _updateLocationXPosTable2[0] = -50; } } else { ++_updateLocationXPosTable2[0]; if (_updateLocationXPosTable2[0] > 500) { _spritesTable[2]._flipX = true; _updateLocationXPosTable2[0] = 500; } } _spritesTable[2]._gfxBackgroundOffset = _updateLocationXPosTable2[0] + 8320; const int spr = 2; _spritesTable[spr]._colorType = 1; _spritesTable[spr]._yMaxBackground = 0; drawSprite(spr); _spritesTable[spr]._colorType = 0; } void TuckerEngine::updateSprite_locationNum69_1(int i) { int state; if (_flagsTable[236] == 1) { state = 4; } else if (_flagsTable[236] == 2) { state = 3; } else if (_flagsTable[236] == 3) { state = 2; } else if (_flagsTable[236] == 4) { if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { state = 9; _spritesTable[i]._needUpdate = true; } else { state = 14; _spritesTable[i]._needUpdate = false; } } else if (_flagsTable[236] == 5) { state = 7; _flagsTable[236] = 6; } else { state = -1; } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum69_2(int i) { if (_flagsTable[237] == 2) { _flagsTable[237] = 3; } int state; if (_flagsTable[236] < 4 || _flagsTable[237] == 0) { state = -1; } else if (_flagsTable[237] == 1) { state = 5; _flagsTable[237] = 2; } else if (_flagsTable[237] == 4 || _flagsTable[237] == 2 || _flagsTable[237] == 3 || _flagsTable[237] == 7) { if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { state = 10; _spritesTable[i]._needUpdate = true; } else { state = 12; _spritesTable[i]._needUpdate = false; } } else if (_flagsTable[237] == 5) { state = 16; _flagsTable[237] = 6; } else if (_flagsTable[237] == 6) { state = 15; _flagsTable[237] = 7; } else if (_flagsTable[237] == 8) { state = 6; _flagsTable[237] = 9; } else { state = -1; } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum69_3(int i) { int state; if (_flagsTable[236] > 4) { state = -1; } else if (_flagsTable[237] == 3) { state = 8; _flagsTable[237] = 4; } else if (_flagsTable[237] > 2 && _flagsTable[237] < 9) { _flagsTable[238] = 1; if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { state = 11; _spritesTable[i]._needUpdate = true; } else { state = 13; _spritesTable[i]._needUpdate = false; } } else { state = -1; } _spritesTable[i]._state = state; } void TuckerEngine::execData3PreUpdate_locationNum70() { const uint8 color = 103; if (_execData3Counter == 0) { startSound(_locationSoundsTable[6]._offset, 6, _locationSoundsTable[6]._volume); _execData3Counter = 1; _flagsTable[143] = 0; _updateLocation70StringLen = 0; _forceRedrawPanelItems = true; _panelType = kPanelTypeEmpty; setCursorState(kCursorStateDisabledHidden); } _forceRedrawPanelItems = true; _panelType = kPanelTypeEmpty; setCursorState(kCursorStateDisabledHidden); int pos = getPositionForLine(22, _infoBarBuf); const int yPos = (_flagsTable[143] == 0) ? 90 : 72; drawStringAlt(88, yPos, color, &_infoBarBuf[pos]); Graphics::drawStringChar(_locationBackgroundGfxBuf, 88, yPos + 9, 640, 62, color, _charsetGfxBuf); if (_flagsTable[143] != 0) { pos = getPositionForLine(_flagsTable[143] * 2 + 23, _infoBarBuf); drawStringAlt(88, yPos + 18, color, &_infoBarBuf[pos]); pos = getPositionForLine(_flagsTable[143] * 2 + 24, _infoBarBuf); drawStringAlt(88, yPos + 27, color, &_infoBarBuf[pos]); } execData3PreUpdate_locationNum70Helper(); drawStringAlt(88 + 8, yPos + 9, color, _updateLocation70String, _updateLocation70StringLen); } void TuckerEngine::execData3PreUpdate_locationNum70Helper() { if (_lastKeyPressed != 0 && _flagsTable[143] <= 0) { if (_lastKeyPressed == Common::KEYCODE_BACKSPACE || _lastKeyPressed == Common::KEYCODE_DELETE) { if (_updateLocation70StringLen > 0) { --_updateLocation70StringLen; startSound(_locationSoundsTable[0]._offset, 0, _locationSoundsTable[0]._volume); } } else if (_lastKeyPressed == Common::KEYCODE_RETURN) { _flagsTable[143] = 1; _nextAction = 1; _csDataLoaded = false; const int pos = getPositionForLine(23, _infoBarBuf); if (memcmp(&_infoBarBuf[pos + 3], _updateLocation70String, 16) != 0) { _flagsTable[143] = 2; } const int num = (_flagsTable[143] == 1) ? 4 : 5; startSound(_locationSoundsTable[num]._offset, num, _locationSoundsTable[num]._volume); } else if (_updateLocation70StringLen < 19) { uint8 chr = 0; switch (_lastKeyPressed) { case Common::KEYCODE_SPACE: chr = 32; break; case Common::KEYCODE_BACKQUOTE: chr = 35; break; case Common::KEYCODE_LEFTPAREN: chr = 40; break; case Common::KEYCODE_RIGHTPAREN: chr = 41; break; case Common::KEYCODE_LESS: chr = 44; break; case Common::KEYCODE_GREATER: chr = 46; break; case Common::KEYCODE_COLON: chr = 56; break; case Common::KEYCODE_QUESTION: chr = 92; break; case Common::KEYCODE_QUOTE: chr = 96; break; default: if (_lastKeyPressed >= Common::KEYCODE_a && _lastKeyPressed <= Common::KEYCODE_z) { chr = 'A' + (_lastKeyPressed - Common::KEYCODE_a); } break; } startSound(_locationSoundsTable[0]._offset, 0, _locationSoundsTable[0]._volume); if (chr > 0) { _updateLocation70String[_updateLocation70StringLen] = chr; ++_updateLocation70StringLen; } } _lastKeyPressed = 0; } } void TuckerEngine::updateSprite_locationNum71(int i) { int state; if (_flagsTable[155] != 6 || _flagsTable[207] == 1) { state = -1; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 1; } else if (getRandomNumber() < 30000) { _spritesTable[i]._needUpdate = false; state = 2; _spritesTable[i]._updateDelay = 5; } else { _spritesTable[i]._needUpdate = false; state = 2; } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum72(int i) { int state; if (_flagsTable[155] == 7 || _flagsTable[207] == 1) { state = -1; } else if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 2; } else { _spritesTable[i]._needUpdate = false; state = 1; } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum74(int i) { static const uint8 stateTable[] = { 1, 3, 5, 5, 10, 16, 16 }; int num = _flagsTable[236] - 74; if (stateTable[num] + i == 21) { if (!_updateLocationFlag) { _updateLocationFlag = true; } else { _spritesTable[i]._animationFrame = _spritesTable[i]._firstFrame - 1; _spritesTable[i]._updateDelay = 5; _updateSpriteFlag1 = true; } } _spritesTable[i]._state = stateTable[num] + i; } void TuckerEngine::updateSprite_locationNum79(int i) { int state; if (_flagsTable[227] == 0) { state = 1; _flagsTable[227] = 1; } else if (_flagsTable[227] == 1 && _charSpeechSoundCounter > 0) { state = 2; _spritesTable[i]._needUpdate = true; } else if (_flagsTable[227] == 2) { state = 3; _flagsTable[227] = 3; _spritesTable[i]._needUpdate = true; } else { _spritesTable[i]._animationFrame = _spritesTable[i]._firstFrame - 1; _spritesTable[i]._updateDelay = 5; _updateSpriteFlag1 = true; state = 3; } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum81_0(int i) { int state; if (_charSpeechSoundCounter > 0 && _actionCharacterNum == i) { _spritesTable[i]._needUpdate = true; state = 3; _flagsTable[288] = 1; } else if (_flagsTable[288] < 2) { _spritesTable[i]._needUpdate = false; state = 2; if (_flagsTable[288] == 1) { _flagsTable[288] = 2; } } else { _spritesTable[i]._animationFrame = _spritesTable[i]._firstFrame - 1; _spritesTable[i]._updateDelay = 5; _updateSpriteFlag1 = true; state = 2; } _spritesTable[i]._state = state; } void TuckerEngine::updateSprite_locationNum81_1(int i) { _spritesTable[i]._state = 1; } void TuckerEngine::updateSprite_locationNum82(int i) { int state; if (_charSpeechSoundCounter > 0) { state = 1; _flagsTable[229] = 1; _spritesTable[i]._needUpdate = true; } else if (_flagsTable[229] == 0) { state = 1; } else if (_flagsTable[229] == 1) { state = 2; _flagsTable[229] = 2; _spritesTable[i]._needUpdate = false; } else { _spritesTable[i]._animationFrame = _spritesTable[i]._firstFrame - 1; _spritesTable[i]._updateDelay = 5; _updateSpriteFlag1 = true; state = 2; } _spritesTable[i]._state = state; } } // namespace Tucker