aboutsummaryrefslogtreecommitdiff
path: root/engines/kyra/kyra_v2.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/kyra/kyra_v2.cpp')
-rw-r--r--engines/kyra/kyra_v2.cpp2259
1 files changed, 116 insertions, 2143 deletions
diff --git a/engines/kyra/kyra_v2.cpp b/engines/kyra/kyra_v2.cpp
index 56512eb030..176f8e4e2f 100644
--- a/engines/kyra/kyra_v2.cpp
+++ b/engines/kyra/kyra_v2.cpp
@@ -23,775 +23,74 @@
*
*/
-#include "kyra/kyra.h"
#include "kyra/kyra_v2.h"
-#include "kyra/screen.h"
-#include "kyra/resource.h"
-#include "kyra/wsamovie.h"
-#include "kyra/sound.h"
-#include "kyra/script.h"
-#include "kyra/script_tim.h"
-#include "kyra/text_v2.h"
-#include "kyra/timer.h"
+#include "kyra/screen_v2.h"
#include "kyra/debugger.h"
-#include "common/system.h"
-#include "common/config-manager.h"
-
namespace Kyra {
-KyraEngine_v2::KyraEngine_v2(OSystem *system, const GameFlags &flags) : KyraEngine(system, flags), _updateFunctor(this, &KyraEngine_v2::update) {
- memset(_defaultShapeTable, 0, sizeof(_defaultShapeTable));
- _mouseSHPBuf = 0;
- _debugger = 0;
- _screen = 0;
- _text = 0;
-
- _seqProcessedString = 0;
- _activeWSA = 0;
- _activeText = 0;
- _seqWsa = 0;
- _sequences = 0;
- _sequenceSoundList = 0;
-
- _showCredits = false;
-
- _gamePlayBuffer = 0;
- _cCodeBuffer = _optionsBuffer = _chapterBuffer = 0;
+KyraEngine_v2::KyraEngine_v2(OSystem *system, const GameFlags &flags, const EngineDesc &desc) : KyraEngine(system, flags), _desc(desc) {
+ memset(&_sceneAnims, 0, sizeof(_sceneAnims));
+ memset(&_sceneAnimMovie, 0, sizeof(_sceneAnimMovie));
- _overwriteSceneFacing = false;
- _mainCharX = _mainCharY = -1;
- _drawNoShapeFlag = false;
- _charPalEntry = 0;
- _itemInHand = -1;
- _unkSceneScreenFlag1 = false;
- _noScriptEnter = true;
- _currentChapter = 0;
- _newChapterFile = 1;
- _oldTalkFile = -1;
- _currentTalkFile = 0;
- _lastSfxTrack = -1;
- _handItemSet = -1;
_lastProcessedSceneScript = 0;
_specialSceneScriptRunFlag = false;
- memset(_animObjects, 0, sizeof(_animObjects));
- _unkHandleSceneChangeFlag = false;
- _pathfinderFlag = 0;
- _mouseX = _mouseY = 0;
- _newShapeCount = 0;
- _newShapeFiledata = 0;
-
- _vocHigh = -1;
- _chatVocHigh = -1;
- _chatVocLow = -1;
- _chatText = 0;
- _chatObject = -1;
- _lastIdleScript = -1;
- _currentTalkSections.STATim = 0;
- _currentTalkSections.TLKTim = 0;
- _currentTalkSections.ENDTim = 0;
-
- memset(&_invWsa, 0, sizeof(_invWsa));
- _itemAnimData = 0;
- _demoAnimData = 0;
- _nextAnimItem = 0;
+ _itemList = 0;
+ _itemListSize = 0;
- for (int i = 0; i < 15; i++)
- memset(&_activeItemAnim[i], 0, sizeof(ActiveItemAnim));
+ _characterShapeFile = -1;
- _colorCodeFlag1 = 0;
- _colorCodeFlag2 = -1;
- _scriptCountDown = 0;
- _dbgPass = 0;
+ _updateCharPosNextUpdate = 0;
- _gamePlayBuffer = 0;
- _unkBuf500Bytes = 0;
- _screenBuffer = 0;
- _inventorySaved = false;
- _unkBuf200kByte = 0;
- memset(&_defaultShapeTable, 0, sizeof(_defaultShapeTable));
- memset(&_sceneShapeTable, 0, sizeof(_sceneShapeTable));
+ memset(&_sceneScriptState, 0, sizeof(_sceneScriptState));
memset(&_sceneScriptData, 0, sizeof(_sceneScriptData));
- _talkObjectList = 0;
- _shapeDescTable = 0;
- _gfxBackUpRect = 0;
- _sceneList = 0;
- memset(&_sceneAnimMovie, 0, sizeof(_sceneAnimMovie));
- memset(&_wsaSlots, 0, sizeof(_wsaSlots));
- memset(&_buttonShapes, 0, sizeof(_buttonShapes));
-
- _configTextspeed = 50;
-
- _inventoryButtons = _buttonList = 0;
-
- _dlgBuffer = 0;
- _conversationState = new int8*[19];
- for (int i = 0; i < 19; i++)
- _conversationState[i] = new int8[14];
- _npcTalkChpIndex = _npcTalkDlgIndex = -1;
- _mainCharacter.dlgIndex = 0;
- setNewDlgIndex(-1);
+ _animObjects = 0;
+ _runFlag = true;
+ _showOutro = false;
_deathHandler = -1;
+ _animNeedUpdate = false;
- _bookMaxPage = 6;
- _bookCurPage = 0;
- _bookNewPage = 0;
- _bookBkgd = 0;
-
- _cauldronState = 0;
- _cauldronUseCount = 0;
- memset(_cauldronStateTables, 0, sizeof(_cauldronStateTables));
-
- _menuDirectlyToLoad = false;
- _menu = 0;
-}
-
-KyraEngine_v2::~KyraEngine_v2() {
- cleanup();
- seq_uninit();
-
- delete [] _mouseSHPBuf;
- delete _screen;
- delete _text;
- delete _gui;
- delete _tim;
- _text = 0;
- delete _debugger;
- delete _invWsa.wsa;
-
- if (_sequenceSoundList) {
- for (int i = 0; i < _sequenceSoundListSize; i++) {
- if (_sequenceSoundList[i])
- delete [] _sequenceSoundList[i];
- }
- delete [] _sequenceSoundList;
- _sequenceSoundList = NULL;
- }
-
- if (_dlgBuffer)
- delete [] _dlgBuffer;
- for (int i = 0; i < 19; i++)
- delete [] _conversationState[i];
- delete [] _conversationState;
-
- for (Common::Array<const Opcode*>::iterator i = _opcodesTemporary.begin(); i != _opcodesTemporary.end(); ++i)
- delete *i;
- _opcodesTemporary.clear();
-
- for (Common::Array<const TIMOpcode*>::iterator i = _timOpcodes.begin(); i != _timOpcodes.end(); ++i)
- delete *i;
- _timOpcodes.clear();
-}
-
-Movie *KyraEngine_v2::createWSAMovie() {
- return new WSAMovieV2(this, _screen);
-}
-
-int KyraEngine_v2::init() {
- _screen = new Screen_v2(this, _system);
- assert(_screen);
-
- KyraEngine::init();
- initStaticResource();
-
- _debugger = new Debugger_v2(this);
- assert(_debugger);
- _text = new TextDisplayer_v2(this, _screen);
- assert(_text);
- _gui = new GUI_v2(this);
- assert(_gui);
- _tim = new TIMInterpreter(this, _system);
- assert(_tim);
-
- if (_flags.isDemo && !_flags.isTalkie) {
- _screen->loadFont(_screen->FID_8_FNT, "FONT9P.FNT");
- } else {
- _screen->loadFont(_screen->FID_6_FNT, "6.FNT");
- _screen->loadFont(_screen->FID_8_FNT, "8FAT.FNT");
- _screen->loadFont(_screen->FID_BOOKFONT_FNT, "BOOKFONT.FNT");
- }
- _screen->loadFont(_screen->FID_GOLDFONT_FNT, "GOLDFONT.FNT");
-
- _screen->setAnimBlockPtr(3504);
- _screen->setScreenDim(0);
-
- if (!_sound->init())
- error("Couldn't init sound");
-
- _abortIntroFlag = false;
-
- if (_sequenceStrings) {
- for (int i = 0; i < 33; i++)
- _sequenceStringsDuration[i] = (int) strlen(_sequenceStrings[i]) * 8;
- }
+ _animShapeCount = 0;
+ _animShapeFiledata = 0;
- // No mouse display in demo
- if (_flags.isDemo && !_flags.isTalkie)
- return 0;
-
- _mouseSHPBuf = _res->fileData("PWGMOUSE.SHP", 0);
- assert(_mouseSHPBuf);
-
- for (int i = 0; i < 2; i++) {
- _defaultShapeTable[i] = _screen->getPtrToShape(_mouseSHPBuf, i);
- assert(_defaultShapeTable[i]);
- }
-
- _screen->setMouseCursor(0, 0, _defaultShapeTable[0]);
- return 0;
-}
-
-int KyraEngine_v2::go() {
- if (_gameToLoad == -1) {
- if (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98)
- seq_showStarcraftLogo();
-
- if (_flags.isDemo && !_flags.isTalkie) {
- seq_playSequences(kSequenceDemoVirgin, kSequenceDemoFisher);
- _menuChoice = 4;
- } else {
- seq_playSequences(kSequenceVirgin, kSequenceZanfaun);
- }
- } else {
- _menuChoice = 1;
- }
-
- _res->unloadAllPakFiles();
-
- if (_menuChoice != 4) {
- // load just the pak files needed for ingame
- _res->loadPakFile(StaticResource::staticDataFilename());
- if (_flags.platform == Common::kPlatformPC && _flags.isTalkie)
- _res->loadFileList("FILEDATA.FDT");
- else
- _res->loadFileList(_ingamePakList, _ingamePakListSize);
- }
-
- _menuDirectlyToLoad = (_menuChoice == 3) ? true : false;
-
- if (_menuChoice & 1) {
- startup();
- if (!quit())
- runLoop();
- cleanup();
-
- if (_showCredits)
- seq_playSequences(kSequenceFunters, kSequenceFrash);
- }
-
- return 0;
-}
-
-void KyraEngine_v2::startup() {
- _sound->setSoundList(&_soundData[kMusicIngame]);
- // The track map is exactly the same
- // for FM-TOWNS and DOS
- _trackMap = _dosTrackMap;
- _trackMapSize = _dosTrackMapSize;
-
- _screen->_curPage = 0;
- delete [] _mouseSHPBuf;
- _mouseSHPBuf = 0;
-
- memset(_defaultShapeTable, 0, sizeof(_defaultShapeTable));
- memset(_sceneShapeTable, 0, sizeof(_sceneShapeTable));
- _gamePlayBuffer = new uint8[46080];
- _unkBuf500Bytes = new uint8[500];
-
- loadMouseShapes();
- loadItemShapes();
-
- _screen->setMouseCursor(0, 0, getShapePtr(0));
-
- _screenBuffer = new uint8[64000];
- _unkBuf200kByte = new uint8[200000];
-
- loadChapterBuffer(_newChapterFile);
-
- loadCCodeBuffer("C_CODE.XXX");
-
- if (_flags.isTalkie) {
- loadOptionsBuffer("OPTIONS.XXX");
-
- showMessageFromCCode(265, 150, 0);
- _screen->updateScreen();
- openTalkFile(0);
- _currentTalkFile = 1;
- openTalkFile(1);
- } else {
- _optionsBuffer = _cCodeBuffer;
- }
-
- showMessage(0, 207);
-
- _screen->setShapePages(5, 3);
-
- memset(&_mainCharacter, 0, sizeof(_mainCharacter));
- _mainCharacter.height = 0x30;
- _mainCharacter.facing = 4;
- _mainCharacter.animFrame = 0x12;
- memset(_mainCharacter.inventory, -1, sizeof(_mainCharacter.inventory));
-
- memset(_sceneAnims, 0, sizeof(_sceneAnims));
- for (int i = 0; i < ARRAYSIZE(_sceneAnimMovie); ++i)
- _sceneAnimMovie[i] = new WSAMovieV2(this, _screen);
- memset(_wsaSlots, 0, sizeof(_wsaSlots));
- for (int i = 0; i < ARRAYSIZE(_wsaSlots); ++i)
- _wsaSlots[i] = new WSAMovieV2(this, _screen);
-
- _screen->_curPage = 0;
-
- _talkObjectList = new TalkObject[72];
- memset(_talkObjectList, 0, sizeof(TalkObject)*72);
- _shapeDescTable = new ShapeDesc[55];
- memset(_shapeDescTable, 0, sizeof(ShapeDesc)*55);
-
- for (int i = 9; i <= 32; ++i) {
- _shapeDescTable[i-9].width = 30;
- _shapeDescTable[i-9].height = 55;
- _shapeDescTable[i-9].xAdd = -15;
- _shapeDescTable[i-9].yAdd = -50;
- }
-
- for (int i = 19; i <= 24; ++i) {
- _shapeDescTable[i-9].width = 53;
- _shapeDescTable[i-9].yAdd = -51;
- }
-
- _gfxBackUpRect = new uint8[_screen->getRectSize(32, 32)];
- _itemList = new Item[30];
- memset(_itemList, 0, sizeof(Item)*30);
- loadButtonShapes();
- resetItemList();
- _loadedZTable = 1;
- loadZShapes(_loadedZTable);
- initInventoryButtonList();
- setupLangButtonShapes();
- loadInventoryShapes();
-
- _res->loadFileToBuf("PALETTE.COL", _screen->_currentPalette, 0x300);
- _screen->loadBitmap("_PLAYFLD.CPS", 3, 3, 0);
- _screen->copyPage(3, 0);
- _screen->showMouse();
- _screen->hideMouse();
-
- clearAnimObjects();
+ _vocHigh = -1;
+ _chatVocHigh = -1;
+ _chatVocLow = -1;
+ _chatText = 0;
+ _chatObject = -1;
- for (int i = 0; i < 19; ++i)
- memset(_conversationState[i], -1, sizeof(int8)*14);
- clearCauldronTable();
- memset(_inputColorCode, -1, sizeof(_inputColorCode));
- memset(_newSceneDlgState, 0, sizeof(_newSceneDlgState));
memset(_hiddenItems, -1, sizeof(_hiddenItems));
- for (int i = 0; i < 23; ++i)
- resetCauldronStateTable(i);
-
- _sceneList = new SceneDesc[86];
- memset(_sceneList, 0, sizeof(SceneDesc)*86);
- _sceneListSize = 86;
- runStartScript(1, 0);
- loadNPCScript();
-
- if (_gameToLoad == -1) {
- snd_playWanderScoreViaMap(52, 1);
- enterNewScene(_mainCharacter.sceneId, _mainCharacter.facing, 0, 0, 1);
- saveGame(getSavegameFilename(0), "New Game");
- } else {
- loadGame(getSavegameFilename(_gameToLoad));
- }
-
- _screen->showMouse();
-
- if (_menuDirectlyToLoad)
- (*_inventoryButtons[0].buttonCallback)(&_inventoryButtons[0]);
-
- setNextIdleAnimTimer();
- //XXX
- setWalkspeed(_configWalkspeed);
-}
-
-void KyraEngine_v2::runLoop() {
- _screen->updateScreen();
-
- _quitFlag = false;
- _runFlag = true;
- while (!_quitFlag && _runFlag) {
- if (_deathHandler >= 0) {
- removeHandItem();
- delay(5);
- _drawNoShapeFlag = 0;
- _gui->optionsButton(0);
- _deathHandler = -1;
- }
-
- if (_system->getMillis() > _nextIdleAnim)
- showIdleAnim();
-
- if (queryGameFlag(0x159)) {
- dinoRide();
- resetGameFlag(0x159);
- }
-
- if (queryGameFlag(0x124) && !queryGameFlag(0x125)) {
- _mainCharacter.animFrame = 32;
- enterNewScene(39, -1, 0, 0, 0);
- }
-
- if (queryGameFlag(0xD8)) {
- resetGameFlag(0xD8);
- if (_mainCharacter.sceneId == 34) {
- if (queryGameFlag(0xD1)) {
- initTalkObject(28);
- npcChatSequence(getTableString(0xFA, _cCodeBuffer, 1), 28, 0x83, 0xFA);
- deinitTalkObject(28);
- enterNewScene(35, 4, 0, 0, 0);
- } else if (queryGameFlag(0xD0)) {
- initTalkObject(29);
- npcChatSequence(getTableString(0xFB, _cCodeBuffer, 1), 29, 0x83, 0xFB);
- deinitTalkObject(29);
- enterNewScene(33, 6, 0, 0, 0);
- }
- }
- }
-
- int inputFlag = checkInput(_buttonList, true);
- removeInputTop();
-
- update();
-
- if (inputFlag == 198 || inputFlag == 199) {
- _unk3 = _handItemSet;
- handleInput(_mouseX, _mouseY);
- }
-
- //if (queryGameFlag(0x1EE) && inputFlag)
- // sub_13B19(inputFlag);
-
- _system->delayMillis(10);
- }
-}
-
-void KyraEngine_v2::handleInput(int x, int y) {
- setNextIdleAnimTimer();
- if (_unk5) {
- _unk5 = 0;
- return;
- }
-
- if (!_screen->isMouseVisible())
- return;
-
- if (_unk3 == -2) {
- snd_playSoundEffect(13);
- return;
- }
-
- setNextIdleAnimTimer();
-
- if (x <= 6 || x >= 312 || y <= 6 || y >= 135) {
- bool exitOk = false;
- assert(_unk3 + 6 >= 0);
- switch (_unk3 + 6) {
- case 0:
- if (_sceneExit1 != 0xFFFF)
- exitOk = true;
- break;
-
- case 1:
- if (_sceneExit2 != 0xFFFF)
- exitOk = true;
- break;
-
- case 2:
- if (_sceneExit3 != 0xFFFF)
- exitOk = true;
- break;
-
- case 3:
- if (_sceneExit4 != 0xFFFF)
- exitOk = true;
- break;
-
- default:
- break;
- }
-
- if (exitOk) {
- inputSceneChange(x, y, 1, 1);
- return;
- }
- }
-
- if (checkCharCollision(x, y) >= 0 && _unk3 >= -1) {
- runSceneScript2();
- return;
- } else if (pickUpItem(x, y)) {
- return;
- } else {
- int skipHandling = 0;
-
- if (checkItemCollision(x, y) == -1) {
- resetGameFlag(0x1EF);
- skipHandling = handleInputUnkSub(x, y) ? 1 : 0;
-
- if (queryGameFlag(0x1EF)) {
- resetGameFlag(0x1EF);
- return;
- }
-
- if (_unk5) {
- _unk5 = 0;
- return;
- }
- }
-
- if (_deathHandler > -1)
- skipHandling = 1;
-
- if (skipHandling)
- return;
-
- if (checkCharCollision(x, y) >= 0) {
- runSceneScript2();
- return;
- }
-
- if (_itemInHand >= 0) {
- if (y > 136)
- return;
-
- dropItem(0, _itemInHand, x, y, 1);
- } else {
- if (_unk3 == -2 || y > 135)
- return;
-
- if (!_unk5) {
- inputSceneChange(x, y, 1, 1);
- return;
- }
-
- _unk5 = 0;
- }
- }
-}
-
-bool KyraEngine_v2::handleInputUnkSub(int x, int y) {
- if (y > 143 || _deathHandler > -1 || queryGameFlag(0x164))
- return false;
-
- if (_handItemSet <= -3 && findItem(_mainCharacter.sceneId, 13) >= 0) {
- updateCharFacing();
- objectChat(getTableString(0xFC, _cCodeBuffer, 1), 0, 0x83, 0xFC);
- return true;
- } else {
- _scriptInterpreter->initScript(&_sceneScriptState, &_sceneScriptData);
-
- _sceneScriptState.regs[1] = x;
- _sceneScriptState.regs[2] = y;
- _sceneScriptState.regs[3] = 0;
- _sceneScriptState.regs[4] = _itemInHand;
-
- _scriptInterpreter->startScript(&_sceneScriptState, 1);
-
- while (_scriptInterpreter->validScript(&_sceneScriptState))
- _scriptInterpreter->runScript(&_sceneScriptState);
-
- //XXXsys_unkKeyboad (flush? wait? whatever...)
-
- if (queryGameFlag(0x1ED)) {
- _sound->beginFadeOut();
- _screen->fadeToBlack();
- _showCredits = true;
- _runFlag = false;
- }
- return _sceneScriptState.regs[3] != 0;
- }
-}
-
-void KyraEngine_v2::update() {
- updateInput();
-
- refreshAnimObjectsIfNeed();
- updateMouse();
- updateSpecialSceneScripts();
- _timer->update();
- updateItemAnimations();
- updateInvWsa();
- fadeMessagePalette();
- _screen->updateScreen();
-}
-
-void KyraEngine_v2::updateWithText() {
- updateInput();
-
- updateMouse();
- fadeMessagePalette();
- updateSpecialSceneScripts();
- _timer->update();
- updateItemAnimations();
- updateInvWsa();
- restorePage3();
- drawAnimObjects();
-
- if (textEnabled() && _chatText) {
- int pageBackUp = _screen->_curPage;
- _screen->_curPage = 2;
- objectChatPrintText(_chatText, _chatObject);
- _screen->_curPage = pageBackUp;
- }
-
- refreshAnimObjects(0);
- _screen->updateScreen();
+ _debugger = 0;
+ _screenBuffer = 0;
}
-void KyraEngine_v2::updateMouse() {
- int shapeIndex = 0;
- int type = 0;
- int xOffset = 0, yOffset = 0;
- Common::Point mouse = getMousePos();
-
- if (mouse.y <= 145) {
- if (mouse.x <= 6) {
- if (_sceneExit4 != 0xFFFF) {
- type = -3;
- shapeIndex = 4;
- xOffset = 1;
- yOffset = 5;
- } else {
- type = -2;
- }
- } else if (mouse.x >= 312) {
- if (_sceneExit2 != 0xFFFF) {
- type = -5;
- shapeIndex = 2;
- xOffset = 7;
- yOffset = 5;
- } else {
- type = -2;
- }
- } else if (mouse.y >= 135) {
- if (_sceneExit3 != 0xFFFF) {
- type = -4;
- shapeIndex = 3;
- xOffset = 5;
- yOffset = 10;
- } else {
- type = -2;
- }
- } else if (mouse.y <= 6) {
- if (_sceneExit1 != 0xFFFF) {
- type = -6;
- shapeIndex = 1;
- xOffset = 5;
- yOffset = 1;
- } else {
- type = -2;
- }
- }
- }
-
- for (int i = 0; i < _specialExitCount; ++i) {
- if (checkSpecialSceneExit(i, mouse.x, mouse.y)) {
- switch (_specialExitTable[20+i]) {
- case 0:
- type = -6;
- shapeIndex = 1;
- xOffset = 5;
- yOffset = 1;
- break;
-
- case 2:
- type = -5;
- shapeIndex = 2;
- xOffset = 7;
- yOffset = 5;
- break;
-
- case 4:
- type = -4;
- shapeIndex = 3;
- xOffset = 5;
- yOffset = 7;
- break;
-
- case 6:
- type = -3;
- shapeIndex = 4;
- xOffset = 1;
- yOffset = 5;
- break;
-
- default:
- break;
- }
- }
- }
-
- if (type == -2) {
- shapeIndex = 5;
- xOffset = 5;
- yOffset = 9;
- }
-
- if (type != 0 && _handItemSet != type && _screen->isMouseVisible()) {
- _mouseState = _handItemSet = type;
- _screen->hideMouse();
- _screen->setMouseCursor(xOffset, yOffset, getShapePtr(shapeIndex));
- _screen->showMouse();
- }
-
- if (type == 0 && _handItemSet != _itemInHand && _screen->isMouseVisible()) {
- if ((mouse.y > 145) || (mouse.x > 6 && mouse.x < 312 && mouse.y > 6 && mouse.y < 135)) {
- _mouseState = 0;
- _handItemSet = _itemInHand;
- _screen->hideMouse();
- if (_itemInHand == -1)
- _screen->setMouseCursor(0, 0, getShapePtr(0));
- else
- _screen->setMouseCursor(8, 15, getShapePtr(_itemInHand+64));
- _screen->showMouse();
- }
+KyraEngine_v2::~KyraEngine_v2() {
+ for (ShapeMap::iterator i = _gameShapes.begin(); i != _gameShapes.end(); ++i) {
+ delete[] i->_value;
+ i->_value = 0;
}
-}
+ _gameShapes.clear();
-void KyraEngine_v2::updateInput() {
- Common::Event event;
+ delete[] _itemList;
- while (_eventMan->pollEvent(event)) {
- switch (event.type) {
- case Common::EVENT_QUIT:
- _quitFlag = true;
- break;
+ _emc->unload(&_sceneScriptData);
- case Common::EVENT_KEYDOWN:
- if (event.kbd.keycode == '.' || event.kbd.keycode == Common::KEYCODE_ESCAPE)
- _eventList.push_back(Event(event, true));
- else if (event.kbd.keycode == 'q' && event.kbd.flags == Common::KBD_CTRL)
- _quitFlag = true;
- else
- _eventList.push_back(event);
- break;
-
- case Common::EVENT_LBUTTONDOWN:
- _eventList.push_back(Event(event, true));
- break;
+ delete[] _animObjects;
- case Common::EVENT_LBUTTONUP:
- case Common::EVENT_MOUSEMOVE:
- _eventList.push_back(event);
- break;
+ for (Common::Array<const Opcode*>::iterator i = _opcodesAnimation.begin(); i != _opcodesAnimation.end(); ++i)
+ delete *i;
+ _opcodesAnimation.clear();
- default:
- break;
- }
- }
+ delete _debugger;
+ delete[] _screenBuffer;
}
int KyraEngine_v2::checkInput(Button *buttonList, bool mainLoop) {
+ debugC(9, kDebugLevelMain, "KyraEngine_v2::checkInput(%p, %d)", (const void*)buttonList, mainLoop);
updateInput();
int keys = 0;
@@ -825,7 +124,6 @@ int KyraEngine_v2::checkInput(Button *buttonList, bool mainLoop) {
Common::Point pos = getMousePos();
_mouseX = pos.x;
_mouseY = pos.y;
- _screen->updateScreen();
} break;
case Common::EVENT_LBUTTONDOWN:
@@ -833,7 +131,7 @@ int KyraEngine_v2::checkInput(Button *buttonList, bool mainLoop) {
Common::Point pos = getMousePos();
_mouseX = pos.x;
_mouseY = pos.y;
- keys = event.type == Common::EVENT_LBUTTONDOWN ? 199 : (200 | 0x800);
+ keys = (event.type == Common::EVENT_LBUTTONDOWN ? 199 : (200 | 0x800));
breakLoop = true;
} break;
@@ -850,7 +148,43 @@ int KyraEngine_v2::checkInput(Button *buttonList, bool mainLoop) {
_eventList.erase(_eventList.begin());
}
- return _gui->processButtonList(buttonList, keys | 0x8000);
+ return gui_v2()->processButtonList(buttonList, keys | 0x8000);
+}
+
+void KyraEngine_v2::updateInput() {
+ Common::Event event;
+
+ while (_eventMan->pollEvent(event)) {
+ switch (event.type) {
+ case Common::EVENT_QUIT:
+ _quitFlag = true;
+ break;
+
+ case Common::EVENT_KEYDOWN:
+ if (event.kbd.keycode == '.' || event.kbd.keycode == Common::KEYCODE_ESCAPE)
+ _eventList.push_back(Event(event, true));
+ else if (event.kbd.keycode == 'q' && event.kbd.flags == Common::KBD_CTRL)
+ _quitFlag = true;
+ else
+ _eventList.push_back(event);
+ break;
+
+ case Common::EVENT_LBUTTONDOWN:
+ _eventList.push_back(Event(event, true));
+ break;
+
+ case Common::EVENT_MOUSEMOVE:
+ screen_v2()->updateScreen();
+ // fall through
+
+ case Common::EVENT_LBUTTONUP:
+ _eventList.push_back(event);
+ break;
+
+ default:
+ break;
+ }
+ }
}
void KyraEngine_v2::removeInputTop() {
@@ -878,625 +212,54 @@ void KyraEngine_v2::resetSkipFlag(bool removeEvent) {
}
}
-void KyraEngine_v2::delay(uint32 amount, bool updateGame, bool isMainLoop) {
- uint32 start = _system->getMillis();
- do {
- if (updateGame) {
- if (_chatText)
- updateWithText();
- else
- update();
- } else {
- updateInput();
- }
-
- if (amount > 0)
- _system->delayMillis(amount > 10 ? 10 : amount);
- } while (!skipFlag() && _system->getMillis() < start + amount && !_quitFlag);
-}
-
-void KyraEngine_v2::cleanup() {
- delete [] _inventoryButtons; _inventoryButtons = 0;
-
- delete [] _gamePlayBuffer; _gamePlayBuffer = 0;
- delete [] _unkBuf500Bytes; _unkBuf500Bytes = 0;
- delete [] _screenBuffer; _screenBuffer = 0;
- delete [] _unkBuf200kByte; _unkBuf200kByte = 0;
-
- resetNewShapes(_newShapeCount, _newShapeFiledata);
- _newShapeFiledata = 0;
- _newShapeCount = 0;
-
- for (int i = 0; i < ARRAYSIZE(_defaultShapeTable); ++i) {
- delete [] _defaultShapeTable[i];
- _defaultShapeTable[i] = 0;
- }
- freeSceneShapePtrs();
-
- if (_optionsBuffer != _cCodeBuffer)
- delete [] _optionsBuffer;
- _optionsBuffer = 0;
- delete [] _cCodeBuffer; _cCodeBuffer = 0;
- delete [] _chapterBuffer; _chapterBuffer = 0;
-
- delete [] _talkObjectList; _talkObjectList = 0;
- delete [] _shapeDescTable; _shapeDescTable = 0;
-
- delete [] _gfxBackUpRect; _gfxBackUpRect = 0;
-
- delete [] _sceneList; _sceneList = 0;
-
- for (int i = 0; i < ARRAYSIZE(_sceneAnimMovie); ++i) {
- delete _sceneAnimMovie[i];
- _sceneAnimMovie[i] = 0;
- }
- for (int i = 0; i < ARRAYSIZE(_wsaSlots); ++i) {
- delete _wsaSlots[i];
- _wsaSlots[i] = 0;
- }
- for (int i = 0; i < ARRAYSIZE(_buttonShapes); ++i) {
- delete [] _buttonShapes[i];
- _buttonShapes[i] = 0;
- }
-}
-
-#pragma mark - Localization
-
-void KyraEngine_v2::loadCCodeBuffer(const char *file) {
- char tempString[13];
- strcpy(tempString, file);
- changeFileExtension(tempString);
-
- delete [] _cCodeBuffer;
- _cCodeBuffer = _res->fileData(tempString, 0);
-}
-
-void KyraEngine_v2::loadOptionsBuffer(const char *file) {
- char tempString[13];
- strcpy(tempString, file);
- changeFileExtension(tempString);
-
- delete [] _optionsBuffer;
- _optionsBuffer = _res->fileData(tempString, 0);
-}
-
-void KyraEngine_v2::loadChapterBuffer(int chapter) {
- char tempString[14];
-
- static const char *chapterFilenames[] = {
- "CH1.XXX", "CH2.XXX", "CH3.XXX", "CH4.XXX", "CH5.XXX"
- };
-
- assert(chapter >= 1 && chapter <= ARRAYSIZE(chapterFilenames));
- strcpy(tempString, chapterFilenames[chapter-1]);
- changeFileExtension(tempString);
-
- delete [] _chapterBuffer;
- _chapterBuffer = _res->fileData(tempString, 0);
- _currentChapter = chapter;
-}
-
-void KyraEngine_v2::changeFileExtension(char *buffer) {
- while (*buffer != '.')
- ++buffer;
-
- ++buffer;
- strcpy(buffer, _languageExtension[_lang]);
-}
-
-uint8 *KyraEngine_v2::getTableEntry(uint8 *buffer, int id) {
- return buffer + READ_LE_UINT16(buffer + (id<<1));
-}
-
-char *KyraEngine_v2::getTableString(int id, uint8 *buffer, int decode) {
- char *string = (char*)getTableEntry(buffer, id);
-
- if (decode && _flags.lang != Common::JA_JPN) {
- decodeString1(string, _internStringBuf);
- decodeString2(_internStringBuf, _internStringBuf);
- string = _internStringBuf;
- }
-
- return string;
-}
-
-const char *KyraEngine_v2::getChapterString(int id) {
- if (_currentChapter != _newChapterFile)
- loadChapterBuffer(_newChapterFile);
-
- return getTableString(id, _chapterBuffer, 1);
-}
-
-int KyraEngine_v2::decodeString1(const char *src, char *dst) {
- static const uint8 decodeTable1[] = {
- 0x20, 0x65, 0x74, 0x61, 0x69, 0x6E, 0x6F, 0x73, 0x72, 0x6C, 0x68,
- 0x63, 0x64, 0x75, 0x70, 0x6D
- };
-
- static const uint8 decodeTable2[] = {
- 0x74, 0x61, 0x73, 0x69, 0x6F, 0x20, 0x77, 0x62, 0x20, 0x72, 0x6E,
- 0x73, 0x64, 0x61, 0x6C, 0x6D, 0x68, 0x20, 0x69, 0x65, 0x6F, 0x72,
- 0x61, 0x73, 0x6E, 0x72, 0x74, 0x6C, 0x63, 0x20, 0x73, 0x79, 0x6E,
- 0x73, 0x74, 0x63, 0x6C, 0x6F, 0x65, 0x72, 0x20, 0x64, 0x74, 0x67,
- 0x65, 0x73, 0x69, 0x6F, 0x6E, 0x72, 0x20, 0x75, 0x66, 0x6D, 0x73,
- 0x77, 0x20, 0x74, 0x65, 0x70, 0x2E, 0x69, 0x63, 0x61, 0x65, 0x20,
- 0x6F, 0x69, 0x61, 0x64, 0x75, 0x72, 0x20, 0x6C, 0x61, 0x65, 0x69,
- 0x79, 0x6F, 0x64, 0x65, 0x69, 0x61, 0x20, 0x6F, 0x74, 0x72, 0x75,
- 0x65, 0x74, 0x6F, 0x61, 0x6B, 0x68, 0x6C, 0x72, 0x20, 0x65, 0x69,
- 0x75, 0x2C, 0x2E, 0x6F, 0x61, 0x6E, 0x73, 0x72, 0x63, 0x74, 0x6C,
- 0x61, 0x69, 0x6C, 0x65, 0x6F, 0x69, 0x72, 0x61, 0x74, 0x70, 0x65,
- 0x61, 0x6F, 0x69, 0x70, 0x20, 0x62, 0x6D
- };
-
- int size = 0;
- uint cChar = 0;
- while ((cChar = *src++) != 0) {
- if (cChar & 0x80) {
- cChar &= 0x7F;
- int index = (cChar & 0x78) >> 3;
- *dst++ = decodeTable1[index];
- ++size;
- assert(cChar < sizeof(decodeTable2));
- cChar = decodeTable2[cChar];
- }
-
- *dst++ = cChar;
- ++size;
- }
-
- *dst++ = 0;
- return size;
-}
-
-void KyraEngine_v2::decodeString2(const char *src, char *dst) {
- if (!src || !dst)
- return;
-
- char out = 0;
- while ((out = *src) != 0) {
- if (*src == 0x1B) {
- ++src;
- out = *src + 0x7F;
- }
- *dst++ = out;
- ++src;
- }
-
- *dst = 0;
-}
-
-#pragma mark -
-
-void KyraEngine_v2::showMessageFromCCode(int id, int16 palIndex, int) {
- const char *string = getTableString(id, _cCodeBuffer, 1);
- showMessage(string, palIndex);
-}
-
-void KyraEngine_v2::showMessage(const char *string, int16 palIndex) {
- _shownMessage = string;
- _screen->hideMouse();
- _screen->fillRect(0, 190, 319, 199, 0xCF);
-
- if (string) {
- if (palIndex != -1 || _fadeMessagePalette) {
- palIndex *= 3;
- memcpy(_messagePal, _screen->_currentPalette + palIndex, 3);
- memmove(_screen->_currentPalette + 765, _screen->_currentPalette + palIndex, 3);
- _screen->setScreenPalette(_screen->_currentPalette);
- }
-
- int x = _text->getCenterStringX(string, 0, 320);
- _text->printText(string, x, 190, 255, 207, 0);
-
- setTimer1DelaySecs(7);
- }
-
- _fadeMessagePalette = false;
- _screen->showMouse();
-}
-
-void KyraEngine_v2::showChapterMessage(int id, int16 palIndex) {
- showMessage(getChapterString(id), palIndex);
-}
-
-void KyraEngine_v2::updateCommandLineEx(int str1, int str2, int16 palIndex) {
- char buffer[0x51];
- char *src = buffer;
-
- strcpy(src, getTableString(str1, _cCodeBuffer, 1));
-
- if (_flags.lang != Common::JA_JPN) {
- while (*src != 0x20)
- ++src;
- ++src;
- *src = toupper(*src);
- }
-
- strcpy((char*)_unkBuf500Bytes, src);
-
- if (str2 > 0) {
- if (_flags.lang != Common::JA_JPN)
- strcat((char*)_unkBuf500Bytes, " ");
- strcat((char*)_unkBuf500Bytes, getTableString(str2, _cCodeBuffer, 1));
- }
-
- showMessage((char*)_unkBuf500Bytes, palIndex);
-}
-
-void KyraEngine_v2::fadeMessagePalette() {
- if (!_fadeMessagePalette)
- return;
-
- bool updatePalette = false;
- for (int i = 0; i < 3; ++i) {
- if (_messagePal[i] >= 4) {
- _messagePal[i] -= 4;
- updatePalette = true;
- } else if (_messagePal[i] != 0) {
- _messagePal[i] = 0;
- updatePalette = true;
- }
- }
-
- if (updatePalette) {
- memcpy(_screen->getPalette(0) + 765, _messagePal, 3);
- _screen->setScreenPalette(_screen->getPalette(0));
- } else {
- _fadeMessagePalette = false;
- }
-}
-
-#pragma mark -
-
-void KyraEngine_v2::loadMouseShapes() {
- _screen->loadBitmap("_MOUSE.CSH", 3, 3, 0);
-
- for (int i = 0; i <= 8; ++i) {
- _defaultShapeTable[i] = _screen->makeShapeCopy(_screen->getCPagePtr(3), i);
- assert(_defaultShapeTable[i]);
- }
-}
-
-void KyraEngine_v2::loadItemShapes() {
- _screen->loadBitmap("_ITEMS.CSH", 3, 3, 0);
-
- for (int i = 64; i <= 239; ++i) {
- _defaultShapeTable[i] = _screen->makeShapeCopy(_screen->getCPagePtr(3), i-64);
- assert(_defaultShapeTable[i]);
- }
-
- _res->loadFileToBuf("_ITEMHT.DAT", _itemHtDat, sizeof(_itemHtDat));
- assert(_res->getFileSize("_ITEMHT.DAT") == sizeof(_itemHtDat));
-
- _screen->_curPage = 0;
-}
-
-void KyraEngine_v2::loadZShapes(int shapes) {
- char file[10];
- strcpy(file, "_ZX.SHP");
-
- _loadedZTable = shapes;
- file[2] = '0' + shapes;
-
- uint8 *data = _res->fileData(file, 0);
- for (int i = 9; i <= 32; ++i) {
- delete [] _defaultShapeTable[i];
- _defaultShapeTable[i] = _screen->makeShapeCopy(data, i-9);
- assert(_defaultShapeTable[i]);
- }
- delete [] data;
-
- _loadedZTable = shapes;
-}
-
-void KyraEngine_v2::loadInventoryShapes() {
- int curPageBackUp = _screen->_curPage;
- _screen->_curPage = 2;
-
- _screen->loadBitmap("_PLAYALL.CPS", 3, 3, 0);
-
- for (int i = 0; i < 10; ++i) {
- _defaultShapeTable[240+i] = _screen->encodeShape(_inventoryX[i], _inventoryY[i], 16, 16, 0);
- assert(_defaultShapeTable[240+i]);
- }
-
- _screen->_curPage = curPageBackUp;
-}
-
-void KyraEngine_v2::runStartScript(int script, int unk1) {
- char filename[14];
- strcpy(filename, "_START0X.EMC");
- filename[7] = script + '0';
-
- ScriptData scriptData;
- ScriptState scriptState;
-
- _scriptInterpreter->loadScript(filename, &scriptData, &_opcodes);
- _scriptInterpreter->initScript(&scriptState, &scriptData);
- scriptState.regs[6] = unk1;
- _scriptInterpreter->startScript(&scriptState, 0);
- while (_scriptInterpreter->validScript(&scriptState))
- _scriptInterpreter->runScript(&scriptState);
- _scriptInterpreter->unloadScript(&scriptData);
-}
-
-void KyraEngine_v2::loadNPCScript() {
- char filename[12];
- strcpy(filename, "_NPC.EMC");
-
- if (_flags.platform != Common::kPlatformPC || _flags.isTalkie) {
- switch (_lang) {
- case 0:
- filename[5] = 'E';
- break;
-
- case 1:
- filename[5] = 'F';
- break;
-
- case 2:
- filename[5] = 'G';
- break;
-
- case 3:
- filename[5] = 'J';
- break;
-
- default:
- break;
- };
- }
-
- _scriptInterpreter->loadScript(filename, &_npcScriptData, &_opcodes);
-}
-
-void KyraEngine_v2::runTemporaryScript(const char *filename, int allowSkip, int resetChar, int newShapes, int shapeUnload) {
- memset(&_temporaryScriptData, 0, sizeof(_temporaryScriptData));
- memset(&_temporaryScriptState, 0, sizeof(_temporaryScriptState));
-
- if (!_scriptInterpreter->loadScript(filename, &_temporaryScriptData, &_opcodesTemporary))
- error("Couldn't load temporary script '%s'", filename);
-
- _scriptInterpreter->initScript(&_temporaryScriptState, &_temporaryScriptData);
- _scriptInterpreter->startScript(&_temporaryScriptState, 0);
-
- _newShapeFlag = -1;
-
- if (_newShapeFiledata && newShapes) {
- resetNewShapes(_newShapeCount, _newShapeFiledata);
- _newShapeFiledata = 0;
- _newShapeCount = 0;
- }
-
- while (_scriptInterpreter->validScript(&_temporaryScriptState))
- _scriptInterpreter->runScript(&_temporaryScriptState);
-
- uint8 *fileData = 0;
-
- if (newShapes)
- _newShapeFiledata = _res->fileData(_newShapeFilename, 0);
-
- fileData = _newShapeFiledata;
-
- if (!fileData) {
- _scriptInterpreter->unloadScript(&_temporaryScriptData);
- return;
- }
-
- if (newShapes)
- _newShapeCount = initNewShapes(fileData);
-
- processNewShapes(allowSkip, resetChar);
-
- if (shapeUnload) {
- resetNewShapes(_newShapeCount, fileData);
- _newShapeCount = 0;
- _newShapeFiledata = 0;
- }
-
- _scriptInterpreter->unloadScript(&_temporaryScriptData);
-}
-
-#pragma mark -
-
-void KyraEngine_v2::resetScaleTable() {
- Common::set_to(_scaleTable, _scaleTable + ARRAYSIZE(_scaleTable), 0x100);
-}
-
-void KyraEngine_v2::setScaleTableItem(int item, int data) {
- if (item >= 1 || item <= 15)
- _scaleTable[item-1] = (data << 8) / 100;
-}
-
-int KyraEngine_v2::getScale(int x, int y) {
- return _scaleTable[_screen->getLayer(x, y) - 1];
-}
-
-void KyraEngine_v2::setDrawLayerTableEntry(int entry, int data) {
- if (entry >= 1 || entry <= 15)
- _drawLayerTable[entry-1] = data;
-}
-
-int KyraEngine_v2::getDrawLayer(int x, int y) {
- int layer = _screen->getLayer(x, y);
- layer = _drawLayerTable[layer-1];
- if (layer < 0)
- layer = 0;
- else if (layer >= 7)
- layer = 6;
- return layer;
-}
-
-void KyraEngine_v2::restorePage3() {
- _screen->copyBlockToPage(2, 0, 0, 320, 144, _gamePlayBuffer);
-}
-
-void KyraEngine_v2::backUpPage0() {
- if (_screenBuffer) {
- _screen->hideMouse();
- memcpy(_screenBuffer, _screen->getCPagePtr(0), 64000);
- _screen->showMouse();
- }
-}
-
-void KyraEngine_v2::restorePage0() {
- restorePage3();
- if (_screenBuffer)
- _screen->copyBlockToPage(0, 0, 0, 320, 200, _screenBuffer);
+bool KyraEngine_v2::checkSpecialSceneExit(int num, int x, int y) {
+ if (_specialExitTable[0+num] > x || _specialExitTable[5+num] > y ||
+ _specialExitTable[10+num] < x || _specialExitTable[15+num] < y)
+ return false;
+ return true;
}
-void KyraEngine_v2::updateCharPal(int unk1) {
- static bool unkVar1 = false;
-
- if (!_useCharPal)
- return;
-
- int layer = _screen->getLayer(_mainCharacter.x1, _mainCharacter.y1);
- int palEntry = _charPalTable[layer];
-
- if (palEntry != _charPalEntry && unk1) {
- const uint8 *src = &_scenePal[(palEntry << 4) * 3];
- uint8 *ptr = _screen->getPalette(0) + 336;
- for (int i = 0; i < 48; ++i) {
- *ptr -= (*ptr - *src) >> 1;
- ++ptr;
- ++src;
- }
- _screen->setScreenPalette(_screen->getPalette(0));
- unkVar1 = true;
- _charPalEntry = palEntry;
- } else if (unkVar1 || !unk1) {
- memcpy(_screen->getPalette(0) + 336, &_scenePal[(palEntry << 4) * 3], 48);
- _screen->setScreenPalette(_screen->getPalette(0));
- unkVar1 = false;
- }
+void KyraEngine_v2::addShapeToPool(const uint8 *data, int realIndex, int shape) {
+ debugC(9, kDebugLevelMain, "KyraEngine_v2::addShapeToPool(%p, %d, %d)", data, realIndex, shape);
+ remShapeFromPool(realIndex);
+ _gameShapes[realIndex] = screen_v2()->makeShapeCopy(data, shape);
+ assert(_gameShapes[realIndex]);
}
-void KyraEngine_v2::setCharPalEntry(int entry, int value) {
- if (entry > 15 || entry < 1)
- entry = 1;
- if (value > 8 || value < 0)
- value = 0;
- _charPalTable[entry] = value;
- _useCharPal = 1;
- _charPalEntry = 0;
+void KyraEngine_v2::addShapeToPool(uint8 *shpData, int index) {
+ debugC(9, kDebugLevelMain, "KyraEngine_v2::addShapeToPool(%p, %d)", shpData, index);
+ remShapeFromPool(index);
+ _gameShapes[index] = shpData;
+ assert(_gameShapes[index]);
}
-int KyraEngine_v2::inputSceneChange(int x, int y, int unk1, int unk2) {
- bool refreshNPC = false;
- uint16 curScene = _mainCharacter.sceneId;
- _pathfinderFlag = 15;
-
- if (!_unkHandleSceneChangeFlag) {
- if (_unk3 == -3) {
- if (_sceneList[curScene].exit4 != 0xFFFF) {
- x = 4;
- y = _sceneEnterY4;
- _pathfinderFlag = 7;
- }
- } else if (_unk3 == -5) {
- if (_sceneList[curScene].exit2 != 0xFFFF) {
- x = 316;
- y = _sceneEnterY2;
- _pathfinderFlag = 7;
- }
- } else if (_unk3 == -6) {
- if (_sceneList[curScene].exit1 != 0xFFFF) {
- x = _sceneEnterX1;
- y = _sceneEnterY1 - 2;
- _pathfinderFlag = 14;
- }
- } else if (_unk3 == -4) {
- if (_sceneList[curScene].exit3 != 0xFFFF) {
- x = _sceneEnterX3;
- y = 147;
- _pathfinderFlag = 11;
- }
- }
- }
-
- int strId = 0;
- int vocH = _flags.isTalkie ? 131 : -1;
-
- if (_pathfinderFlag) {
- if (findItem(curScene, 13) >= 0 && _unk3 <= -3) {
- strId = 252;
- } else if (_itemInHand == 72) {
- strId = 257;
- } else if (findItem(curScene, 72) >= 0 && _unk3 <= -3) {
- strId = 256;
- } else if (getInventoryItemSlot(72) != -1 && _unk3 <= -3) {
- strId = 257;
- }
- }
-
- if (strId) {
- updateCharFacing();
- objectChat(getTableString(strId, _cCodeBuffer, 1), 0, vocH, strId);
- _pathfinderFlag = 0;
- return 0;
- }
-
- if (ABS(_mainCharacter.x1 - x) < 4 && ABS(_mainCharacter.y1 - y) < 2) {
- _pathfinderFlag = 0;
- return 0;
- }
-
- int curX = _mainCharacter.x1 & ~3;
- int curY = _mainCharacter.y1 & ~1;
- int dstX = x & ~3;
- int dstY = y & ~1;
-
- int wayLength = findWay(curX, curY, dstX, dstY, _movFacingTable, 600);
- _pathfinderFlag = 0;
- _timer->disable(5);
-
- if (wayLength != 0 && wayLength != 0x7D00)
- refreshNPC = (trySceneChange(_movFacingTable, unk1, unk2) != 0);
-
- int charLayer = _screen->getLayer(_mainCharacter.x1, _mainCharacter.y1);
- if (_layerFlagTable[charLayer] != 0 && !queryGameFlag(0x163)) {
- if (queryGameFlag(0x164)) {
- _screen->hideMouse();
- _timer->disable(5);
- runTemporaryScript("_ZANBURN.EMC", 0, 1, 1, 0);
- _deathHandler = 7;
- snd_playWanderScoreViaMap(0x53, 1);
- } else {
- objectChat(getTableString(0xFD, _cCodeBuffer, 1), 0, 0x83, 0xFD);
- setGameFlag(0x164);
- _timer->enable(5);
- _timer->setCountdown(5, 120);
- }
- } else if (queryGameFlag(0x164)) {
- objectChat(getTableString(0xFE, _cCodeBuffer, 1), 0, 0x83, 0xFE);
- resetGameFlag(0x164);
- _timer->disable(5);
+void KyraEngine_v2::remShapeFromPool(int idx) {
+ ShapeMap::iterator iter = _gameShapes.find(idx);
+ if (iter != _gameShapes.end()) {
+ delete [] iter->_value;
+ iter->_value = 0;
}
-
- if (refreshNPC)
- enterNewSceneUnk2(0);
-
- _pathfinderFlag = 0;
- return refreshNPC;
}
-bool KyraEngine_v2::checkSpecialSceneExit(int num, int x, int y) {
- if (_specialExitTable[0+num] > x || _specialExitTable[5+num] > y ||
- _specialExitTable[10+num] < x || _specialExitTable[15+num] < y)
+uint8 *KyraEngine_v2::getShapePtr(int shape) const {
+ debugC(9, kDebugLevelMain, "KyraEngine_v2::getShapePtr(%d)", shape);
+ ShapeMap::iterator iter = _gameShapes.find(shape);
+ if (iter == _gameShapes.end())
return 0;
- return 1;
+ return iter->_value;
}
void KyraEngine_v2::moveCharacter(int facing, int x, int y) {
- _mainCharacter.facing = facing;
+ debugC(9, kDebugLevelMain, "KyraEngine_v2::moveCharacter(%d, %d, %d)", facing, x, y);
x &= ~3;
y &= ~1;
+ _mainCharacter.facing = facing;
- _screen->hideMouse();
+ Screen *scr = screen();
+ scr->hideMouse();
switch (facing) {
case 0:
- while (y < _mainCharacter.y1)
+ while (_mainCharacter.y1 > y)
updateCharPosWithUpdate();
break;
@@ -1506,7 +269,7 @@ void KyraEngine_v2::moveCharacter(int facing, int x, int y) {
break;
case 4:
- while (y > _mainCharacter.y1)
+ while (_mainCharacter.y1 < y)
updateCharPosWithUpdate();
break;
@@ -1518,815 +281,25 @@ void KyraEngine_v2::moveCharacter(int facing, int x, int y) {
default:
break;
}
-
- _screen->showMouse();
-}
-
-int KyraEngine_v2::updateCharPos(int *table) {
- static uint32 nextUpdate = 0;
- static const int updateX[] = { 0, 4, 4, 4, 0, -4, -4, -4 };
- static const int updateY[] = { -2, -2, 0, 2, 2, 2, 0, -2 };
-
- if (_system->getMillis() < nextUpdate)
- return 0;
-
- int facing = _mainCharacter.facing;
- _mainCharacter.x1 += updateX[facing];
- _mainCharacter.y1 += updateY[facing];
- updateCharAnimFrame(0, table);
- nextUpdate = _system->getMillis() + _timer->getDelay(0) * _tickLength;
- return 1;
+ scr->showMouse();
}
void KyraEngine_v2::updateCharPosWithUpdate() {
- updateCharPos(0);
+ debugC(9, kDebugLevelMain, "KyraEngine_v2::updateCharPosWithUpdate()");
+ updateCharPos(0, 0);
update();
}
-void KyraEngine_v2::updateCharAnimFrame(int charId, int *table) {
- static int unkTable1[] = { 0, 0 };
- static const int unkTable2[] = { 17, 0 };
- static const int unkTable3[] = { 10, 0 };
- static const int unkTable4[] = { 24, 0 };
- static const int unkTable5[] = { 19, 0 };
- static const int unkTable6[] = { 21, 0 };
- static const int unkTable7[] = { 31, 0 };
- static const int unkTable8[] = { 26, 0 };
-
- Character *character = &_mainCharacter;
- ++character->animFrame;
-
- int facing = character->facing;
-
- if (table) {
- if (table[0] != table[-1] && table[-1] == table[1]) {
- facing = getOppositeFacingDirection(table[-1]);
- table[0] = table[-1];
- }
- }
-
- if (!facing) {
- ++unkTable1[charId];
- } else if (facing == 4) {
- ++unkTable1[charId+1];
- } else if (facing == 7 || facing == 1 || facing == 5 || facing == 3) {
- if (facing == 7 || facing == 1) {
- if (unkTable1[charId] > 2)
- facing = 0;
- } else {
- if (unkTable1[charId+1] > 2)
- facing = 4;
- }
-
- unkTable1[charId] = 0;
- unkTable1[charId+1] = 0;
- }
-
- if (facing == 0) {
- if (character->animFrame < unkTable8[charId])
- character->animFrame = unkTable8[charId];
-
- if (character->animFrame > unkTable7[charId])
- character->animFrame = unkTable8[charId];
- } else if (facing == 4) {
- if (character->animFrame < unkTable5[charId])
- character->animFrame = unkTable5[charId];
-
- if (character->animFrame > unkTable4[charId])
- character->animFrame = unkTable5[charId];
- } else {
- if (character->animFrame > unkTable5[charId])
- character->animFrame = unkTable6[charId];
-
- if (character->animFrame == unkTable2[charId])
- character->animFrame = unkTable3[charId];
-
- if (character->animFrame > unkTable2[charId])
- character->animFrame = unkTable3[charId] + 2;
- }
-
- updateCharacterAnim(charId);
-}
-
-int KyraEngine_v2::checkCharCollision(int x, int y) {
- int scale1 = 0, scale2 = 0, scale3 = 0;
- int x1 = 0, x2 = 0, y1 = 0, y2 = 0;
- scale1 = getScale(_mainCharacter.x1, _mainCharacter.y1);
- scale2 = (scale1 * 24) >> 8;
- scale3 = (scale1 * 48) >> 8;
-
- x1 = _mainCharacter.x1 - (scale2 >> 1);
- x2 = _mainCharacter.x1 + (scale2 >> 1);
- y1 = _mainCharacter.y1 - scale3;
- y2 = _mainCharacter.y1;
-
- if (x >= x1 && x <= x2 && y >= y1 && y <= y2)
+int KyraEngine_v2::updateCharPos(int *table, int force) {
+ debugC(9, kDebugLevelMain, "KyraEngine_v2::updateCharPos(%p, %d)", (const void*)table, force);
+ if (_updateCharPosNextUpdate > _system->getMillis() && !force)
return 0;
-
- return -1;
-}
-
-int KyraEngine_v2::initNewShapes(uint8 *filedata) {
- const int lastEntry = MIN(_newShapeLastEntry, 31);
- for (int i = 0; i < lastEntry; ++i) {
- _defaultShapeTable[33+i] = _screen->getPtrToShape(filedata, i);
- ShapeDesc *desc = &_shapeDescTable[24+i];
- desc->xAdd = _newShapeXAdd;
- desc->yAdd = _newShapeYAdd;
- desc->width = _newShapeWidth;
- desc->height = _newShapeHeight;
- }
- return lastEntry;
-}
-
-void KyraEngine_v2::processNewShapes(int allowSkip, int resetChar) {
- setCharacterAnimDim(_newShapeWidth, _newShapeHeight);
-
- _scriptInterpreter->initScript(&_temporaryScriptState, &_temporaryScriptData);
- _scriptInterpreter->startScript(&_temporaryScriptState, 1);
-
- resetSkipFlag();
-
- while (_scriptInterpreter->validScript(&_temporaryScriptState)) {
- _temporaryScriptExecBit = false;
- while (_scriptInterpreter->validScript(&_temporaryScriptState) && !_temporaryScriptExecBit)
- _scriptInterpreter->runScript(&_temporaryScriptState);
-
- if (_newShapeAnimFrame < 0)
- continue;
-
- _mainCharacter.animFrame = _newShapeAnimFrame + 33;
- updateCharacterAnim(0);
- if (_chatText)
- updateWithText();
- else
- update();
-
- uint32 delayEnd = _system->getMillis() + _newShapeDelay * _tickLength;
-
- while ((!skipFlag() || !allowSkip) && _system->getMillis() < delayEnd) {
- if (_chatText)
- updateWithText();
- else
- update();
-
- delay(10);
- }
-
- if (skipFlag())
- resetSkipFlag();
- }
-
- if (resetChar) {
- if (_newShapeFlag >= 0) {
- _mainCharacter.animFrame = _newShapeFlag + 33;
- updateCharacterAnim(0);
- if (_chatText)
- updateWithText();
- else
- update();
- }
-
- _mainCharacter.animFrame = _characterFrameTable[_mainCharacter.facing];
- updateCharacterAnim(0);
- }
-
- _newShapeFlag = -1;
- resetCharacterAnimDim();
-}
-
-void KyraEngine_v2::resetNewShapes(int count, uint8 *filedata) {
- Common::set_to(_defaultShapeTable+33, _defaultShapeTable+33+count, (uint8*)0);
- delete [] filedata;
- setNextIdleAnimTimer();
-}
-
-void KyraEngine_v2::setNextIdleAnimTimer() {
- _nextIdleAnim = _system->getMillis() + _rnd.getRandomNumberRng(10, 15) * 60 * _tickLength;
-}
-
-void KyraEngine_v2::showIdleAnim() {
- static const uint8 scriptMinTable[] = {
- 0x00, 0x05, 0x07, 0x08, 0x00, 0x09, 0x0A, 0x0B, 0xFF, 0x00
- };
-
- static const uint8 scriptMaxTable[] = {
- 0x04, 0x06, 0x07, 0x08, 0x04, 0x09, 0x0A, 0x0B, 0xFF, 0x00
- };
-
- if (queryGameFlag(0x159) && _flags.isTalkie)
- return;
-
- static bool scriptAnimation = false;
- if (!scriptAnimation && _flags.isTalkie) {
- scriptAnimation = true;
- zanthRandomIdleChat();
- } else {
- scriptAnimation = false;
- if (_loadedZTable > 8)
- return;
-
- int scriptMin = scriptMinTable[_loadedZTable-1];
- int scriptMax = scriptMaxTable[_loadedZTable-1];
- int script = 0;
-
- if (scriptMin < scriptMax) {
- do {
- script = _rnd.getRandomNumberRng(scriptMin, scriptMax);
- } while (script == _lastIdleScript);
- } else {
- script = scriptMin;
- }
-
- runIdleScript(script);
- _lastIdleScript = script;
- }
-}
-
-void KyraEngine_v2::runIdleScript(int script) {
- if (script < 0 || script >= 12)
- script = 0;
-
- if (_mainCharacter.animFrame != 18) {
- setNextIdleAnimTimer();
- } else {
- // FIXME: move this to staticres.cpp?
- static const char *idleScriptFiles[] = {
- "_IDLHAIR.EMC", "_IDLDUST.EMC", "_IDLLEAN.EMC", "_IDLDIRT.EMC", "_IDLTOSS.EMC", "_IDLNOSE.EMC",
- "_IDLBRSH.EMC", "_Z3IDLE.EMC", "_Z4IDLE.EMC", "_Z6IDLE.EMC", "_Z7IDLE.EMC", "_Z8IDLE.EMC"
- };
-
- runTemporaryScript(idleScriptFiles[script], 1, 1, 1, 1);
- }
-}
-
-#pragma mark -
-
-void KyraEngine_v2::backUpGfxRect24x24(int x, int y) {
- _screen->copyRegionToBuffer(_screen->_curPage, x, y, 24, 24, _gfxBackUpRect);
-}
-
-void KyraEngine_v2::restoreGfxRect24x24(int x, int y) {
- _screen->copyBlockToPage(_screen->_curPage, x, y, 24, 24, _gfxBackUpRect);
-}
-
-void KyraEngine_v2::backUpGfxRect32x32(int x, int y) {
- _screen->copyRegionToBuffer(_screen->_curPage, x, y, 32, 32, _gfxBackUpRect);
-}
-
-void KyraEngine_v2::restoreGfxRect32x32(int x, int y) {
- _screen->copyBlockToPage(_screen->_curPage, x, y, 32, 32, _gfxBackUpRect);
-}
-
-#pragma mark -
-
-void KyraEngine_v2::openTalkFile(int newFile) {
- debugC(9, kDebugLevelMain | kDebugLevelSound, "KyraEngine_v2::openTalkFile(%d)", newFile);
- char talkFilename[16];
-
- if (_oldTalkFile > 0) {
- sprintf(talkFilename, "CH%dVOC.TLK", _oldTalkFile);
- _res->unloadPakFile(talkFilename);
- _oldTalkFile = -1;
- }
-
- if (newFile == 0) {
- strcpy(talkFilename, "ANYTALK.TLK");
- _res->loadPakFile(talkFilename);
- } else {
- sprintf(talkFilename, "CH%dVOC.TLK", newFile);
- _res->loadPakFile(talkFilename);
- }
-
- _oldTalkFile = newFile;
-}
-
-void KyraEngine_v2::snd_playVoiceFile(int id) {
- debugC(9, kDebugLevelMain | kDebugLevelSound, "KyraEngine_v2::snd_playVoiceFile(%d)", id);
- char vocFile[9];
- assert(id >= 0 && id <= 9999999);
- sprintf(vocFile, "%07d", id);
- if (_sound->voiceFileIsPresent(vocFile)) {
- snd_stopVoice();
-
- while (!_sound->voicePlay(vocFile)) {
- updateWithText();
- _system->delayMillis(10);
- }
-
- _speechFile = vocFile;
- }
-}
-
-void KyraEngine_v2::snd_loadSoundFile(int id) {
- debugC(9, kDebugLevelMain | kDebugLevelSound, "KyraEngine_v2::snd_loadSoundFile(%d)", id);
- if (id < 0 || !_trackMap)
- return;
-
- assert(id < _trackMapSize);
- int file = _trackMap[id*2];
- _curSfxFile = _curMusicTheme = file;
- _sound->loadSoundFile(file);
-}
-
-void KyraEngine_v2::playVoice(int high, int low) {
- debugC(9, kDebugLevelMain | kDebugLevelSound, "KyraEngine_v2::playVoice(%d, %d)", high, low);
- if (!_flags.isTalkie)
- return;
- int vocFile = high * 10000 + low * 10;
- snd_playVoiceFile(vocFile);
-}
-
-void KyraEngine_v2::snd_playSoundEffect(int track) {
- debugC(9, kDebugLevelMain | kDebugLevelSound, "KyraEngine_v2::snd_playSoundEffect(%d)", track);
-
- if (_flags.platform == Common::kPlatformFMTowns || _flags.platform == Common::kPlatformPC98) {
- if (track == 10)
- track = _lastSfxTrack;
-
- if (track == 10 || track == -1)
- return;
-
- _lastSfxTrack = track;
- }
-
- int16 vocIndex = (int16)READ_LE_UINT16(&_ingameSoundIndex[track * 2]);
- if (vocIndex != -1)
- _sound->voicePlay(_ingameSoundList[vocIndex], true);
- else if (_flags.platform == Common::kPlatformPC)
- // TODO ?? Maybe there is a way to let users select whether they want
- // voc, midi or adl sfx (even though it makes no sense to choose anything but voc).
- // For now this is used as a fallback only (if no voc file exists).
- KyraEngine::snd_playSoundEffect(track);
-}
-
-#pragma mark -
-
-void KyraEngine_v2::loadInvWsa(const char *filename, int run, int delayTime, int page, int sfx, int sFrame, int flags) {
- int wsaFlags = 1;
- if (flags)
- wsaFlags |= 2;
-
- if (!_invWsa.wsa)
- _invWsa.wsa = new WSAMovieV2(this, _screen);
-
- if (!_invWsa.wsa->open(filename, wsaFlags, 0))
- error("Couldn't open inventory WSA file '%s'", filename);
-
- _invWsa.curFrame = 0;
- _invWsa.lastFrame = _invWsa.wsa->frames();
-
- _invWsa.x = _invWsa.wsa->xAdd();
- _invWsa.y = _invWsa.wsa->yAdd();
- _invWsa.w = _invWsa.wsa->width();
- _invWsa.h = _invWsa.wsa->height();
- _invWsa.x2 = _invWsa.x + _invWsa.w - 1;
- _invWsa.y2 = _invWsa.y + _invWsa.h - 1;
-
- _invWsa.delay = delayTime;
- _invWsa.page = page;
- _invWsa.sfx = sfx;
-
- _invWsa.specialFrame = sFrame;
-
- if (_invWsa.page)
- _screen->copyRegion(_invWsa.x, _invWsa.y, _invWsa.x, _invWsa.y, _invWsa.w, _invWsa.h, 0, _invWsa.page, Screen::CR_NO_P_CHECK);
-
- _invWsa.running = true;
- _invWsa.timer = _system->getMillis();
-
- if (run) {
- while (_invWsa.running && !skipFlag() && !_quitFlag) {
- update();
- _system->delayMillis(10);
- }
-
- if (skipFlag()) {
- resetSkipFlag();
- displayInvWsaLastFrame();
- }
- }
-}
-
-void KyraEngine_v2::closeInvWsa() {
- _invWsa.wsa->close();
- delete _invWsa.wsa;
- _invWsa.wsa = 0;
- _invWsa.running = false;
-}
-
-void KyraEngine_v2::updateInvWsa() {
- if (!_invWsa.running || !_invWsa.wsa)
- return;
-
- if (_invWsa.timer > _system->getMillis())
- return;
-
- _invWsa.wsa->setX(0);
- _invWsa.wsa->setY(0);
- _invWsa.wsa->setDrawPage(_invWsa.page);
- _invWsa.wsa->displayFrame(_invWsa.curFrame, 0, 0, 0);
-
- if (_invWsa.page)
- _screen->copyRegion(_invWsa.x, _invWsa.y, _invWsa.x, _invWsa.y, _invWsa.w, _invWsa.h, _invWsa.page, 0, Screen::CR_NO_P_CHECK);
-
- _invWsa.timer = _system->getMillis() + _invWsa.delay * _tickLength;
-
- ++_invWsa.curFrame;
- if (_invWsa.curFrame >= _invWsa.lastFrame)
- displayInvWsaLastFrame();
-
- if (_invWsa.curFrame == _invWsa.specialFrame)
- snd_playSoundEffect(_invWsa.sfx);
-
- if (_invWsa.sfx == -2) {
- switch (_invWsa.curFrame) {
- case 9: case 27: case 40:
- snd_playSoundEffect(0x39);
- break;
-
- case 18: case 34: case 44:
- snd_playSoundEffect(0x33);
- break;
-
- case 48:
- snd_playSoundEffect(0x38);
- break;
-
- default:
- break;
- }
- }
-}
-
-void KyraEngine_v2::displayInvWsaLastFrame() {
- if (!_invWsa.wsa)
- return;
-
- _invWsa.wsa->setX(0);
- _invWsa.wsa->setY(0);
- _invWsa.wsa->setDrawPage(_invWsa.page);
- _invWsa.wsa->displayFrame(_invWsa.lastFrame-1, 0, 0, 0);
-
- if (_invWsa.page)
- _screen->copyRegion(_invWsa.x, _invWsa.y, _invWsa.x, _invWsa.y, _invWsa.w, _invWsa.h, _invWsa.page, 0, Screen::CR_NO_P_CHECK);
-
- closeInvWsa();
-
- int32 countdown = _rnd.getRandomNumberRng(45, 80);
- _timer->setCountdown(2, countdown * 60);
-}
-
-#pragma mark -
-
-void KyraEngine_v2::setCauldronState(uint8 state, bool paletteFade) {
- memcpy(_screen->getPalette(2), _screen->getPalette(0), 768);
- Common::SeekableReadStream *file = _res->getFileStream("_POTIONS.PAL");
- if (!file)
- error("Couldn't load cauldron palette");
- file->seek(state*18, SEEK_SET);
- file->read(_screen->getPalette(2)+723, 18);
- delete file;
- file = 0;
-
- if (paletteFade) {
- snd_playSoundEffect((state == 0) ? 0x6B : 0x66);
- _screen->fadePalette(_screen->getPalette(2), 0x4B, &_updateFunctor);
- } else {
- _screen->setScreenPalette(_screen->getPalette(2));
- _screen->updateScreen();
- }
-
- memcpy(_screen->getPalette(0)+723, _screen->getPalette(2)+723, 18);
- _cauldronState = state;
- _cauldronUseCount = 0;
- //if (state == 5)
- // sub_27149();
-}
-
-void KyraEngine_v2::clearCauldronTable() {
- Common::set_to(_cauldronTable, _cauldronTable+ARRAYSIZE(_cauldronTable), -1);
-}
-
-void KyraEngine_v2::addFrontCauldronTable(int item) {
- for (int i = 23; i >= 0; --i)
- _cauldronTable[i+1] = _cauldronTable[i];
- _cauldronTable[0] = item;
-}
-
-void KyraEngine_v2::cauldronItemAnim(int item) {
- const int x = 282;
- const int y = 135;
- const int mouseDstX = (x + 7) & (~1);
- const int mouseDstY = (y + 15) & (~1);
- int mouseX = _mouseX & (~1);
- int mouseY = _mouseY & (~1);
-
- while (mouseY != mouseDstY) {
- if (mouseY < mouseDstY)
- mouseY += 2;
- else if (mouseY > mouseDstY)
- mouseY -= 2;
- uint32 waitEnd = _system->getMillis() + _tickLength;
- setMousePos(mouseX, mouseY);
- _system->updateScreen();
- delayUntil(waitEnd);
- }
-
- while (mouseX != mouseDstX) {
- if (mouseX < mouseDstX)
- mouseX += 2;
- else if (mouseX > mouseDstX)
- mouseX -= 2;
- uint32 waitEnd = _system->getMillis() + _tickLength;
- setMousePos(mouseX, mouseY);
- _system->updateScreen();
- delayUntil(waitEnd);
- }
-
- if (itemIsFlask(item)) {
- setHandItem(19);
- delayUntil(_system->getMillis()+_tickLength*30);
- setHandItem(18);
- } else {
- _screen->hideMouse();
- backUpGfxRect32x32(x, y);
- uint8 *shape = getShapePtr(item+64);
-
- int curY = y;
- for (int i = 0; i < 12; i += 2, curY += 2) {
- restoreGfxRect32x32(x, y);
- uint32 waitEnd = _system->getMillis() + _tickLength;
- _screen->drawShape(0, shape, x, curY, 0, 0);
- _screen->updateScreen();
- delayUntil(waitEnd);
- }
-
- snd_playSoundEffect(0x17);
-
- for (int i = 16; i > 0; i -= 2, curY += 2) {
- _screen->setNewShapeHeight(shape, i);
- restoreGfxRect32x32(x, y);
- uint32 waitEnd = _system->getMillis() + _tickLength;
- _screen->drawShape(0, shape, x, curY, 0, 0);
- _screen->updateScreen();
- delayUntil(waitEnd);
- }
-
- restoreGfxRect32x32(x, y);
- _screen->resetShapeHeight(shape);
- removeHandItem();
- _screen->showMouse();
- }
-}
-
-bool KyraEngine_v2::updateCauldron() {
- for (int i = 0; i < 23; ++i) {
- const int16 *curStateTable = _cauldronStateTables[i];
- if (*curStateTable == -2)
- continue;
-
- int cauldronState = i;
- int16 cauldronTable[25];
- memcpy(cauldronTable, _cauldronTable, sizeof(cauldronTable));
-
- while (*curStateTable != -2) {
- int stateValue = *curStateTable++;
- int j = 0;
- for (; j < 25; ++j) {
- int val = cauldronTable[j];
-
- switch (val) {
- case 68:
- val = 70;
- break;
-
- case 133:
- case 167:
- val = 119;
- break;
-
- case 130:
- case 143:
- case 100:
- val = 12;
- break;
-
- case 132:
- case 65:
- case 69:
- case 74:
- val = 137;
- break;
-
- case 157:
- val = 134;
- break;
-
- default:
- break;
- }
-
- if (val == stateValue) {
- cauldronTable[j] = -1;
- j = 26;
- }
- }
-
- if (j == 25)
- cauldronState = -1;
- }
-
- if (cauldronState >= 0) {
- showMessage(0, 0xCF);
- setCauldronState(cauldronState, true);
- if (cauldronState == 7)
- objectChat(getTableString(0xF2, _cCodeBuffer, 1), 0, 0x83, 0xF2);
- clearCauldronTable();
- return true;
- }
- }
-
- return false;
-}
-
-void KyraEngine_v2::cauldronRndPaletteFade() {
- showMessage(0, 0xCF);
- int index = _rnd.getRandomNumberRng(0x0F, 0x16);
- Common::SeekableReadStream *file = _res->getFileStream("_POTIONS.PAL");
- if (!file)
- error("Couldn't load cauldron palette");
- file->seek(index*18, SEEK_SET);
- file->read(_screen->getPalette(0)+723, 18);
- snd_playSoundEffect(0x6A);
- _screen->fadePalette(_screen->getPalette(0), 0x1E, &_updateFunctor);
- file->seek(0, SEEK_SET);
- file->read(_screen->getPalette(0)+723, 18);
- delete file;
- _screen->fadePalette(_screen->getPalette(0), 0x1E, &_updateFunctor);
-}
-
-void KyraEngine_v2::resetCauldronStateTable(int idx) {
- for (int i = 0; i < 7; ++i)
- _cauldronStateTables[idx][i] = -2;
-}
-
-bool KyraEngine_v2::addToCauldronStateTable(int data, int idx) {
- for (int i = 0; i < 7; ++i) {
- if (_cauldronStateTables[idx][i] == -2) {
- _cauldronStateTables[idx][i] = data;
- return true;
- }
- }
- return false;
-}
-
-void KyraEngine_v2::listItemsInCauldron() {
- int itemsInCauldron = 0;
- for (int i = 0; i < 25; ++i) {
- if (_cauldronTable[i] != -1)
- ++itemsInCauldron;
- else
- break;
- }
-
- if (!itemsInCauldron) {
- if (!_cauldronState)
- objectChat(getTableString(0xF4, _cCodeBuffer, 1), 0, 0x83, 0xF4);
- else
- objectChat(getTableString(0xF3, _cCodeBuffer, 1), 0, 0x83, 0xF3);
- } else {
- objectChat(getTableString(0xF7, _cCodeBuffer, 1), 0, 0x83, 0xF7);
-
- char buffer[80];
- for (int i = 0; i < itemsInCauldron-1; ++i) {
- char *str = buffer;
- strcpy(str, getTableString(_cauldronTable[i]+54, _cCodeBuffer, 1));
- if (_lang == 1) {
- if (*str == 37)
- str += 2;
- }
- strcpy((char*)_unkBuf500Bytes, "...");
- strcat((char*)_unkBuf500Bytes, str);
- strcat((char*)_unkBuf500Bytes, "...");
- objectChat((const char*)_unkBuf500Bytes, 0, 0x83, _cauldronTable[i]+54);
- }
-
- char *str = buffer;
- strcpy(str, getTableString(_cauldronTable[itemsInCauldron-1]+54, _cCodeBuffer, 1));
- if (_lang == 1) {
- if (*str == 37)
- str += 2;
- }
- strcpy((char*)_unkBuf500Bytes, "...");
- strcat((char*)_unkBuf500Bytes, str);
- strcat((char*)_unkBuf500Bytes, ".");
- objectChat((const char*)_unkBuf500Bytes, 0, 0x83, _cauldronTable[itemsInCauldron-1]+54);
- }
-}
-
-#pragma mark -
-
-void KyraEngine_v2::dinoRide() {
- _mainCharX = _mainCharY = -1;
-
- setGameFlag(0x15A);
- enterNewScene(41, -1, 0, 0, 0);
- resetGameFlag(0x15A);
-
- setGameFlag(0x15B);
- enterNewScene(39, -1, 0, 0, 0);
- resetGameFlag(0x15B);
-
- setGameFlag(0x16F);
-
- setGameFlag(0x15C);
- enterNewScene(42, -1, 0, 0, 0);
- resetGameFlag(0x15C);
-
- setGameFlag(0x15D);
- enterNewScene(39, -1, 0, 0, 0);
- resetGameFlag(0x15D);
-
- setGameFlag(0x15E);
- enterNewScene(40, -1, 0, 0, 0);
- resetGameFlag(0x15E);
-
- _mainCharX = 262;
- _mainCharY = 28;
- _mainCharacter.facing = 5;
- _mainCharacter.animFrame = _characterFrameTable[5];
- enterNewScene(39, 4, 0, 0, 0);
- setHandItem(0x61);
- _screen->showMouse();
- resetGameFlag(0x159);
-}
-
-#pragma mark -
-
-void KyraEngine_v2::playTim(const char *filename) {
- TIM *tim = _tim->load(filename, &_timOpcodes);
- if (!tim)
- return;
-
- _tim->resetFinishedFlag();
- while (!_quitFlag && !_tim->finished()) {
- _tim->exec(tim, 0);
- if (_chatText)
- updateWithText();
- else
- update();
- delay(10);
- }
-
- _tim->unload(tim);
-}
-
-#pragma mark -
-
-void KyraEngine_v2::registerDefaultSettings() {
- KyraEngine::registerDefaultSettings();
-
- // Most settings already have sensible defaults. This one, however, is
- // specific to the Kyra engine.
- ConfMan.registerDefault("walkspeed", 5);
-}
-
-void KyraEngine_v2::writeSettings() {
- ConfMan.setInt("talkspeed", ((_configTextspeed-2) * 255) / 95);
-
- switch (_lang) {
- case 1:
- _flags.lang = Common::FR_FRA;
- break;
-
- case 2:
- _flags.lang = Common::DE_DEU;
- break;
-
- case 3:
- _flags.lang = Common::JA_JPN;
- break;
-
- case 0:
- default:
- _flags.lang = Common::EN_ANY;
- break;
- }
-
- ConfMan.set("language", Common::getLanguageCode(_flags.lang));
-
- KyraEngine::writeSettings();
-}
-
-void KyraEngine_v2::readSettings() {
- int talkspeed = ConfMan.getInt("talkspeed");
- _configTextspeed = (talkspeed*95)/255 + 2;
- KyraEngine::readSettings();
+ _mainCharacter.x1 += _updateCharPosXTable[_mainCharacter.facing];
+ _mainCharacter.y1 += _updateCharPosYTable[_mainCharacter.facing];
+ updateCharAnimFrame(0, table);
+ _updateCharPosNextUpdate = _system->getMillis() + getCharacterWalkspeed() * _tickLength;
+ return 1;
}
} // end of namespace Kyra
-
-
-