diff options
author | Johannes Schickel | 2008-04-16 23:09:07 +0000 |
---|---|---|
committer | Johannes Schickel | 2008-04-16 23:09:07 +0000 |
commit | 2b87cd1fa959304ee8a9aecdbd6cfc3ee317bcc3 (patch) | |
tree | ff363e3863d3960f5ac564714d25c3721c3938f0 /engines/kyra/kyra_v3.cpp | |
parent | ac25887670858ef559a042776cd3c9e0166e955c (diff) | |
download | scummvm-rg350-2b87cd1fa959304ee8a9aecdbd6cfc3ee317bcc3.tar.gz scummvm-rg350-2b87cd1fa959304ee8a9aecdbd6cfc3ee317bcc3.tar.bz2 scummvm-rg350-2b87cd1fa959304ee8a9aecdbd6cfc3ee317bcc3.zip |
- Some more mask page handling fixes for Kyra3.
- Implemented a few scene animation opcodes
- basic run loop (all the user can do is quit though)
- music related fix
Wee you can see the squirrel animation and listen to the music now!
svn-id: r31523
Diffstat (limited to 'engines/kyra/kyra_v3.cpp')
-rw-r--r-- | engines/kyra/kyra_v3.cpp | 169 |
1 files changed, 167 insertions, 2 deletions
diff --git a/engines/kyra/kyra_v3.cpp b/engines/kyra/kyra_v3.cpp index 0de35a0d20..024907c0e1 100644 --- a/engines/kyra/kyra_v3.cpp +++ b/engines/kyra/kyra_v3.cpp @@ -31,6 +31,7 @@ #include "kyra/text_v3.h" #include "kyra/vqa.h" #include "kyra/gui.h" +#include "kyra/timer.h" #include "common/system.h" #include "common/config-manager.h" @@ -92,6 +93,8 @@ KyraEngine_v3::KyraEngine_v3(OSystem *system, const GameFlags &flags) : KyraEngi _unk4 = 0; _loadingState = false; _noStartupChat = false; + _lastProcessedSceneScript = 0; + _specialSceneScriptRunFlag = false; } KyraEngine_v3::~KyraEngine_v3() { @@ -201,7 +204,7 @@ int KyraEngine_v3::go() { uninitMainMenu(); startup(); - // XXX + runLoop(); running = false; break; @@ -333,7 +336,7 @@ void KyraEngine_v3::playMusicTrack(int track, int force) { _musicSoundChannel = _soundDigital->playSound(stream); } - _musicSoundChannel = track; + _curMusicTrack = track; } void KyraEngine_v3::stopMusicTrack() { @@ -869,15 +872,177 @@ void KyraEngine_v3::updateCharPal(int unk1) { #pragma mark - +void KyraEngine_v3::runLoop() { + debugC(9, kDebugLevelMain, "KyraEngine_v3::runLoop()"); + + _runFlag = true; + while (_runFlag && !_quitFlag) { + //XXX deathHandler + //XXX + int inputFlag = checkInput(0/*_mainButtonList*/); + removeInputTop(); + + update(); + _timer->update(); + + if (inputFlag == 198 || inputFlag == 199) { + _unk3 = _handItemSet; + Common::Point mouse = getMousePos(); + handleInput(mouse.x, mouse.y); + } + + _system->delayMillis(10); + } +} + +void KyraEngine_v3::handleInput(int x, int y) { + debugC(9, kDebugLevelMain, "KyraEngine_v3::handleInput(%d, %d)"), x, y; +} + void KyraEngine_v3::update() { debugC(9, kDebugLevelMain, "KyraEngine_v3::update()"); + updateInput(); + + musicUpdate(0); + refreshAnimObjectsIfNeed(); + musicUpdate(0); + //XXX + updateSpecialSceneScripts(); //XXX + musicUpdate(0); _screen->updateScreen(); } #pragma mark - +void KyraEngine_v3::updateInput() { + debugC(9, kDebugLevelMain, "KyraEngine_v3::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_LBUTTONUP: + case Common::EVENT_MOUSEMOVE: + _eventList.push_back(event); + break; + + default: + break; + } + } +} + +int KyraEngine_v3::checkInput(Button *buttonList, bool mainLoop) { + debugC(9, kDebugLevelMain, "KyraEngine_v3::checkInput(%p, %d)", (const void*)buttonList, mainLoop); + updateInput(); + + int keys = 0; + + while (_eventList.size()) { + Common::Event event = *_eventList.begin(); + bool breakLoop = false; + + switch (event.type) { + case Common::EVENT_KEYDOWN: + /*if (event.kbd.keycode >= '1' && event.kbd.keycode <= '9' && + (event.kbd.flags == Common::KBD_CTRL || event.kbd.flags == Common::KBD_ALT) && mainLoop) { + const char *saveLoadSlot = getSavegameFilename(9 - (event.kbd.keycode - '0') + 990); + + if (event.kbd.flags == Common::KBD_CTRL) { + loadGame(saveLoadSlot); + _eventList.clear(); + breakLoop = true; + } else { + char savegameName[14]; + sprintf(savegameName, "Quicksave %d", event.kbd.keycode - '0'); + saveGame(saveLoadSlot, savegameName); + } + } else if (event.kbd.flags == Common::KBD_CTRL) { + if (event.kbd.keycode == 'd') + _debugger->attach(); + }*/ + break; + + case Common::EVENT_MOUSEMOVE: { + Common::Point pos = getMousePos(); + _mouseX = pos.x; + _mouseY = pos.y; + _screen->updateScreen(); + } break; + + case Common::EVENT_LBUTTONDOWN: + case Common::EVENT_LBUTTONUP: { + Common::Point pos = getMousePos(); + _mouseX = pos.x; + _mouseY = pos.y; + keys = event.type == Common::EVENT_LBUTTONDOWN ? 199 : (200 | 0x800); + breakLoop = true; + } break; + + default: + break; + } + + //if (_debugger->isAttached()) + // _debugger->onFrame(); + + if (breakLoop) + break; + + _eventList.erase(_eventList.begin()); + } + + return /*_gui->processButtonList(buttonList, */keys/* | 0x8000)*/; +} + +void KyraEngine_v3::removeInputTop() { + debugC(9, kDebugLevelMain, "KyraEngine_v3::removeInputTop()"); + if (!_eventList.empty()) + _eventList.erase(_eventList.begin()); +} + +bool KyraEngine_v3::skipFlag() const { + debugC(9, kDebugLevelMain, "KyraEngine_v3::skipFlag()"); + for (Common::List<Event>::const_iterator i = _eventList.begin(); i != _eventList.end(); ++i) { + if (i->causedSkip) + return true; + } + return false; +} + +void KyraEngine_v3::resetSkipFlag(bool removeEvent) { + debugC(9, kDebugLevelMain, "KyraEngine_v3::resetSkipFlag(%d)", removeEvent); + for (Common::List<Event>::iterator i = _eventList.begin(); i != _eventList.end(); ++i) { + if (i->causedSkip) { + if (removeEvent) + _eventList.erase(i); + else + i->causedSkip = false; + return; + } + } +} + +#pragma mark - + int KyraEngine_v3::getDrawLayer(int x, int y) { debugC(9, kDebugLevelMain, "KyraEngine_v3::getDrawLayer(%d, %d)", x, y); int layer = _screen->getLayer(x, y) - 1; |