2006-04-29 13:38:07 +00:00
|
|
|
/* ScummVM - Scumm Interpreter
|
2006-05-05 00:42:37 +00:00
|
|
|
* Copyright (C) 2001 Ludvig Strigeus
|
2006-04-29 13:38:07 +00:00
|
|
|
* Copyright (C) 2001-2006 The ScummVM project
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*
|
|
|
|
* $URL$
|
|
|
|
* $Id$
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
#include "common/stdafx.h"
|
|
|
|
|
2006-09-29 08:14:27 +00:00
|
|
|
#include "agos/agos.h"
|
2006-10-11 15:10:59 +00:00
|
|
|
#include "agos/debugger.h"
|
2006-09-29 08:14:27 +00:00
|
|
|
#include "agos/intern.h"
|
2006-04-29 13:38:07 +00:00
|
|
|
|
2007-03-17 00:53:21 +00:00
|
|
|
#include "common/events.h"
|
2006-10-11 15:10:59 +00:00
|
|
|
#include "common/system.h"
|
|
|
|
|
|
|
|
#include "gui/about.h"
|
|
|
|
|
2007-02-16 13:55:01 +00:00
|
|
|
#include "sound/audiocd.h"
|
|
|
|
|
2006-09-29 09:44:30 +00:00
|
|
|
namespace AGOS {
|
2006-04-29 13:38:07 +00:00
|
|
|
|
2006-09-29 09:44:30 +00:00
|
|
|
void AGOSEngine::addTimeEvent(uint timeout, uint subroutine_id) {
|
2006-04-29 13:38:07 +00:00
|
|
|
TimeEvent *te = (TimeEvent *)malloc(sizeof(TimeEvent)), *first, *last = NULL;
|
|
|
|
time_t cur_time;
|
|
|
|
|
|
|
|
time(&cur_time);
|
|
|
|
|
|
|
|
te->time = cur_time + timeout - _gameStoppedClock;
|
2006-10-02 06:11:05 +00:00
|
|
|
if (getGameType() == GType_FF && _clockStopped)
|
2006-04-29 13:38:07 +00:00
|
|
|
te->time -= ((uint32)time(NULL) - _clockStopped);
|
|
|
|
te->subroutine_id = subroutine_id;
|
|
|
|
|
|
|
|
first = _firstTimeStruct;
|
|
|
|
while (first) {
|
|
|
|
if (te->time <= first->time) {
|
|
|
|
if (last) {
|
|
|
|
last->next = te;
|
|
|
|
te->next = first;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
te->next = _firstTimeStruct;
|
|
|
|
_firstTimeStruct = te;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
last = first;
|
|
|
|
first = first->next;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (last) {
|
|
|
|
last->next = te;
|
|
|
|
te->next = NULL;
|
|
|
|
} else {
|
|
|
|
_firstTimeStruct = te;
|
|
|
|
te->next = NULL;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-09-29 09:44:30 +00:00
|
|
|
void AGOSEngine::delTimeEvent(TimeEvent *te) {
|
2006-04-29 13:38:07 +00:00
|
|
|
TimeEvent *cur;
|
|
|
|
|
|
|
|
if (te == _pendingDeleteTimeEvent)
|
|
|
|
_pendingDeleteTimeEvent = NULL;
|
|
|
|
|
|
|
|
if (te == _firstTimeStruct) {
|
|
|
|
_firstTimeStruct = te->next;
|
|
|
|
free(te);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
cur = _firstTimeStruct;
|
|
|
|
if (cur == NULL)
|
|
|
|
error("delTimeEvent: none available");
|
|
|
|
|
|
|
|
for (;;) {
|
|
|
|
if (cur->next == NULL)
|
|
|
|
error("delTimeEvent: no such te");
|
|
|
|
if (te == cur->next) {
|
|
|
|
cur->next = te->next;
|
|
|
|
free(te);
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
cur = cur->next;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-09-29 09:44:30 +00:00
|
|
|
void AGOSEngine::invokeTimeEvent(TimeEvent *te) {
|
2006-04-29 13:38:07 +00:00
|
|
|
Subroutine *sub;
|
|
|
|
|
|
|
|
_scriptVerb = 0;
|
|
|
|
|
|
|
|
if (_runScriptReturn1)
|
|
|
|
return;
|
|
|
|
|
|
|
|
sub = getSubroutineByID(te->subroutine_id);
|
|
|
|
if (sub != NULL)
|
|
|
|
startSubroutineEx(sub);
|
|
|
|
|
|
|
|
_runScriptReturn1 = false;
|
|
|
|
}
|
|
|
|
|
2006-09-29 09:44:30 +00:00
|
|
|
void AGOSEngine::killAllTimers() {
|
2006-04-29 13:38:07 +00:00
|
|
|
TimeEvent *cur, *next;
|
|
|
|
|
|
|
|
for (cur = _firstTimeStruct; cur; cur = next) {
|
|
|
|
next = cur->next;
|
|
|
|
delTimeEvent(cur);
|
|
|
|
}
|
2007-05-09 15:36:05 +00:00
|
|
|
_clickOnly = 0;
|
2006-04-29 13:38:07 +00:00
|
|
|
}
|
|
|
|
|
2006-09-29 09:44:30 +00:00
|
|
|
bool AGOSEngine::kickoffTimeEvents() {
|
2006-04-29 13:38:07 +00:00
|
|
|
time_t cur_time;
|
|
|
|
TimeEvent *te;
|
|
|
|
bool result = false;
|
|
|
|
|
2006-10-02 06:11:05 +00:00
|
|
|
if (getGameType() == GType_FF && _clockStopped)
|
2006-04-29 13:38:07 +00:00
|
|
|
return result;
|
|
|
|
|
|
|
|
time(&cur_time);
|
|
|
|
cur_time -= _gameStoppedClock;
|
|
|
|
|
|
|
|
while ((te = _firstTimeStruct) != NULL && te->time <= (uint32)cur_time) {
|
|
|
|
result = true;
|
|
|
|
_pendingDeleteTimeEvent = te;
|
|
|
|
invokeTimeEvent(te);
|
|
|
|
if (_pendingDeleteTimeEvent) {
|
|
|
|
_pendingDeleteTimeEvent = NULL;
|
|
|
|
delTimeEvent(te);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return result;
|
|
|
|
}
|
|
|
|
|
2006-09-30 07:15:19 +00:00
|
|
|
bool AGOSEngine::isVgaQueueEmpty() {
|
2006-09-30 07:29:23 +00:00
|
|
|
VgaTimerEntry *vte = _vgaTimerList;
|
2006-09-30 07:24:30 +00:00
|
|
|
bool result = false;
|
|
|
|
|
|
|
|
while (vte->delay) {
|
|
|
|
if (vte->cur_vga_file == _variableArray[999] && vte->sprite_id >= 100) {
|
|
|
|
result = true;
|
|
|
|
break;
|
|
|
|
}
|
2006-09-30 07:26:40 +00:00
|
|
|
vte++;
|
2006-09-30 07:24:30 +00:00
|
|
|
}
|
|
|
|
return result;
|
2006-09-30 07:15:19 +00:00
|
|
|
}
|
|
|
|
|
2006-10-13 11:38:41 +00:00
|
|
|
void AGOSEngine::haltAnimation() {
|
2007-05-09 15:36:05 +00:00
|
|
|
if (_lockWord & 0x10)
|
|
|
|
return;
|
2006-10-13 11:38:41 +00:00
|
|
|
|
|
|
|
_lockWord |= 0x10;
|
|
|
|
|
2007-05-13 08:46:48 +00:00
|
|
|
if (_displayScreen) {
|
|
|
|
displayScreen();
|
|
|
|
_displayScreen = false;
|
2006-10-13 11:38:41 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void AGOSEngine::restartAnimation() {
|
2007-05-09 15:36:05 +00:00
|
|
|
if (!(_lockWord & 0x10))
|
|
|
|
return;
|
|
|
|
|
2007-05-10 00:43:27 +00:00
|
|
|
_window4Flag = 2;
|
2007-05-13 08:46:48 +00:00
|
|
|
|
2007-05-10 00:43:27 +00:00
|
|
|
setMoveRect(0, 0, 224, 127);
|
2007-05-13 08:46:48 +00:00
|
|
|
displayScreen();
|
2007-05-10 00:43:27 +00:00
|
|
|
|
2006-10-13 11:38:41 +00:00
|
|
|
_lockWord &= ~0x10;
|
2007-05-09 15:36:05 +00:00
|
|
|
|
|
|
|
// Check picture queue
|
2006-10-13 11:38:41 +00:00
|
|
|
}
|
|
|
|
|
2007-05-13 08:46:48 +00:00
|
|
|
void AGOSEngine::addVgaEvent(uint16 num, const byte *code_ptr, uint16 cur_sprite, uint16 curZoneNum, uint8 type) {
|
2006-04-29 13:38:07 +00:00
|
|
|
VgaTimerEntry *vte;
|
|
|
|
|
|
|
|
_lockWord |= 1;
|
|
|
|
|
|
|
|
for (vte = _vgaTimerList; vte->delay; vte++) {
|
|
|
|
}
|
|
|
|
|
|
|
|
vte->delay = num;
|
|
|
|
vte->script_pointer = code_ptr;
|
|
|
|
vte->sprite_id = cur_sprite;
|
|
|
|
vte->cur_vga_file = curZoneNum;
|
2007-05-13 08:46:48 +00:00
|
|
|
vte->type = type;
|
2006-04-29 13:38:07 +00:00
|
|
|
|
|
|
|
_lockWord &= ~1;
|
|
|
|
}
|
|
|
|
|
2006-09-29 09:44:30 +00:00
|
|
|
void AGOSEngine::deleteVgaEvent(VgaTimerEntry * vte) {
|
2006-04-29 13:38:07 +00:00
|
|
|
_lockWord |= 1;
|
|
|
|
|
|
|
|
if (vte + 1 <= _nextVgaTimerToProcess) {
|
|
|
|
_nextVgaTimerToProcess--;
|
|
|
|
}
|
|
|
|
|
|
|
|
do {
|
|
|
|
memcpy(vte, vte + 1, sizeof(VgaTimerEntry));
|
|
|
|
vte++;
|
|
|
|
} while (vte->delay);
|
|
|
|
|
|
|
|
_lockWord &= ~1;
|
|
|
|
}
|
|
|
|
|
2006-09-29 09:44:30 +00:00
|
|
|
void AGOSEngine::processVgaEvents() {
|
2006-04-29 13:38:07 +00:00
|
|
|
VgaTimerEntry *vte = _vgaTimerList;
|
|
|
|
|
|
|
|
_vgaTickCounter++;
|
|
|
|
|
|
|
|
while (vte->delay) {
|
2006-10-01 10:48:06 +00:00
|
|
|
vte->delay -= _vgaBaseDelay;
|
2006-04-29 13:38:07 +00:00
|
|
|
if (vte->delay <= 0) {
|
|
|
|
uint16 curZoneNum = vte->cur_vga_file;
|
|
|
|
uint16 cur_sprite = vte->sprite_id;
|
|
|
|
const byte *script_ptr = vte->script_pointer;
|
2007-05-13 08:46:48 +00:00
|
|
|
uint8 type = vte->type;
|
|
|
|
|
|
|
|
if (type == 2) {
|
2007-05-13 10:07:55 +00:00
|
|
|
vte->delay = (getGameType() == GType_SIMON2) ? 5 : _frameCount;
|
2006-04-29 13:38:07 +00:00
|
|
|
|
2007-05-13 08:46:48 +00:00
|
|
|
animateSprites();
|
|
|
|
|
|
|
|
vte++;
|
|
|
|
} else if (type == 1) {
|
|
|
|
_nextVgaTimerToProcess = vte + 1;
|
|
|
|
deleteVgaEvent(vte);
|
2006-04-29 13:38:07 +00:00
|
|
|
|
|
|
|
scrollEvent();
|
2007-05-13 08:46:48 +00:00
|
|
|
|
|
|
|
vte = _nextVgaTimerToProcess;
|
|
|
|
} else if (type == 0) {
|
|
|
|
_nextVgaTimerToProcess = vte + 1;
|
|
|
|
deleteVgaEvent(vte);
|
|
|
|
|
2006-04-29 13:38:07 +00:00
|
|
|
animateEvent(script_ptr, curZoneNum, cur_sprite);
|
2007-05-13 08:46:48 +00:00
|
|
|
|
|
|
|
vte = _nextVgaTimerToProcess;
|
2006-04-29 13:38:07 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
vte++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-09-29 09:44:30 +00:00
|
|
|
void AGOSEngine::animateEvent(const byte *code_ptr, uint16 curZoneNum, uint16 cur_sprite) {
|
2006-04-29 13:38:07 +00:00
|
|
|
VgaPointersEntry *vpe;
|
|
|
|
|
|
|
|
_vgaCurSpriteId = cur_sprite;
|
|
|
|
|
|
|
|
_vgaCurZoneNum = curZoneNum;
|
|
|
|
_zoneNumber = curZoneNum;
|
|
|
|
vpe = &_vgaBufferPointers[curZoneNum];
|
|
|
|
|
|
|
|
_curVgaFile1 = vpe->vgaFile1;
|
|
|
|
_curVgaFile2 = vpe->vgaFile2;
|
|
|
|
_curSfxFile = vpe->sfxFile;
|
|
|
|
|
|
|
|
_vcPtr = code_ptr;
|
|
|
|
|
|
|
|
runVgaScript();
|
|
|
|
}
|
|
|
|
|
2006-09-29 09:44:30 +00:00
|
|
|
void AGOSEngine::scrollEvent() {
|
2006-04-29 13:38:07 +00:00
|
|
|
if (_scrollCount == 0)
|
|
|
|
return;
|
|
|
|
|
|
|
|
if (getGameType() == GType_FF) {
|
|
|
|
if (_scrollCount < 0) {
|
|
|
|
if (_scrollFlag != -8) {
|
|
|
|
_scrollFlag = -8;
|
|
|
|
_scrollCount += 8;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (_scrollFlag != 8) {
|
|
|
|
_scrollFlag = 8;
|
|
|
|
_scrollCount -= 8;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (_scrollCount < 0) {
|
|
|
|
if (_scrollFlag != -1) {
|
|
|
|
_scrollFlag = -1;
|
|
|
|
if (++_scrollCount == 0)
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (_scrollFlag != 1) {
|
|
|
|
_scrollFlag = 1;
|
|
|
|
if (--_scrollCount == 0)
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-05-13 08:46:48 +00:00
|
|
|
addVgaEvent(6, NULL, 0, 0, 1); /* scroll event */
|
2006-04-29 13:38:07 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-10-11 15:10:59 +00:00
|
|
|
void AGOSEngine::delay(uint amount) {
|
2007-03-17 19:02:05 +00:00
|
|
|
Common::Event event;
|
2006-10-11 15:10:59 +00:00
|
|
|
|
|
|
|
uint32 start = _system->getMillis();
|
|
|
|
uint32 cur = start;
|
|
|
|
uint this_delay, vga_period;
|
|
|
|
|
2007-02-16 13:55:01 +00:00
|
|
|
AudioCD.updateCD();
|
|
|
|
|
2006-10-11 15:10:59 +00:00
|
|
|
if (_debugger->isAttached())
|
|
|
|
_debugger->onFrame();
|
|
|
|
|
|
|
|
if (_fastMode)
|
|
|
|
vga_period = 10;
|
|
|
|
else if (getGameType() == GType_SIMON2)
|
|
|
|
vga_period = 45;
|
|
|
|
else
|
|
|
|
vga_period = 50;
|
|
|
|
|
|
|
|
_rnd.getRandomNumber(2);
|
|
|
|
|
|
|
|
do {
|
|
|
|
while (!_inCallBack && cur >= _lastVgaTick + vga_period && !_pause) {
|
|
|
|
_lastVgaTick += vga_period;
|
|
|
|
|
|
|
|
// don't get too many frames behind
|
|
|
|
if (cur >= _lastVgaTick + vga_period * 2)
|
|
|
|
_lastVgaTick = cur;
|
|
|
|
|
|
|
|
_inCallBack = true;
|
|
|
|
timer_callback();
|
|
|
|
_inCallBack = false;
|
|
|
|
}
|
|
|
|
|
2007-04-01 17:36:13 +00:00
|
|
|
while (_eventMan->pollEvent(event)) {
|
2006-10-11 15:10:59 +00:00
|
|
|
switch (event.type) {
|
2007-03-17 19:02:05 +00:00
|
|
|
case Common::EVENT_KEYDOWN:
|
2006-10-11 15:10:59 +00:00
|
|
|
if (event.kbd.keycode >= '0' && event.kbd.keycode <='9'
|
2007-03-17 19:02:05 +00:00
|
|
|
&& (event.kbd.flags == Common::KBD_ALT ||
|
|
|
|
event.kbd.flags == Common::KBD_CTRL)) {
|
2006-10-11 15:10:59 +00:00
|
|
|
_saveLoadSlot = event.kbd.keycode - '0';
|
|
|
|
|
|
|
|
// There is no save slot 0
|
|
|
|
if (_saveLoadSlot == 0)
|
|
|
|
_saveLoadSlot = 10;
|
|
|
|
|
|
|
|
sprintf(_saveLoadName, "Quicksave %d", _saveLoadSlot);
|
2007-03-17 19:02:05 +00:00
|
|
|
_saveLoadType = (event.kbd.flags == Common::KBD_ALT) ? 1 : 2;
|
2006-10-11 15:10:59 +00:00
|
|
|
|
|
|
|
// We should only allow a load or save when it was possible in original
|
|
|
|
// This stops load/save during copy protection, conversations and cut scenes
|
|
|
|
if (!_mouseHideCount && !_showPreposition)
|
|
|
|
quickLoadOrSave();
|
2007-03-17 19:02:05 +00:00
|
|
|
} else if (event.kbd.flags == Common::KBD_CTRL) {
|
2006-10-11 15:10:59 +00:00
|
|
|
if (event.kbd.keycode == 'a') {
|
|
|
|
GUI::Dialog *_aboutDialog;
|
|
|
|
_aboutDialog = new GUI::AboutDialog();
|
|
|
|
_aboutDialog->runModal();
|
|
|
|
} else if (event.kbd.keycode == 'f')
|
|
|
|
_fastMode ^= 1;
|
|
|
|
else if (event.kbd.keycode == 'd')
|
|
|
|
_debugger->attach();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (getGameType() == GType_PP) {
|
2007-03-17 19:02:05 +00:00
|
|
|
if (event.kbd.flags == Common::KBD_SHIFT)
|
2006-10-11 15:10:59 +00:00
|
|
|
_variableArray[41] = 0;
|
|
|
|
else
|
|
|
|
_variableArray[41] = 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Make sure backspace works right (this fixes a small issue on OS X)
|
|
|
|
if (event.kbd.keycode == 8)
|
|
|
|
_keyPressed = 8;
|
|
|
|
else
|
|
|
|
_keyPressed = (byte)event.kbd.ascii;
|
|
|
|
break;
|
2007-03-17 19:02:05 +00:00
|
|
|
case Common::EVENT_MOUSEMOVE:
|
2006-10-11 15:10:59 +00:00
|
|
|
break;
|
2007-03-17 19:02:05 +00:00
|
|
|
case Common::EVENT_LBUTTONDOWN:
|
2006-10-11 15:10:59 +00:00
|
|
|
if (getGameType() == GType_FF)
|
|
|
|
setBitFlag(89, true);
|
|
|
|
_leftButtonDown++;
|
2006-10-22 13:04:34 +00:00
|
|
|
_leftButton = 1;
|
2006-10-11 15:10:59 +00:00
|
|
|
break;
|
2007-03-17 19:02:05 +00:00
|
|
|
case Common::EVENT_LBUTTONUP:
|
2006-10-11 15:10:59 +00:00
|
|
|
if (getGameType() == GType_FF)
|
|
|
|
setBitFlag(89, false);
|
2006-10-22 13:04:34 +00:00
|
|
|
|
|
|
|
_leftButton = 0;
|
|
|
|
_leftButtonCount = 0;
|
2006-10-11 15:10:59 +00:00
|
|
|
break;
|
2007-03-17 19:02:05 +00:00
|
|
|
case Common::EVENT_RBUTTONDOWN:
|
2006-10-11 15:10:59 +00:00
|
|
|
if (getGameType() == GType_FF)
|
|
|
|
setBitFlag(92, false);
|
|
|
|
_rightButtonDown++;
|
|
|
|
break;
|
2007-03-17 19:02:05 +00:00
|
|
|
case Common::EVENT_QUIT:
|
2006-10-11 15:10:59 +00:00
|
|
|
shutdown();
|
|
|
|
return;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-10-22 13:04:34 +00:00
|
|
|
if (_leftButton == 1)
|
|
|
|
_leftButtonCount++;
|
|
|
|
|
2007-02-16 13:55:01 +00:00
|
|
|
AudioCD.updateCD();
|
|
|
|
|
2006-10-11 15:10:59 +00:00
|
|
|
_system->updateScreen();
|
|
|
|
|
|
|
|
if (amount == 0)
|
|
|
|
break;
|
|
|
|
|
|
|
|
this_delay = _fastMode ? 1 : 20;
|
|
|
|
if (this_delay > amount)
|
|
|
|
this_delay = amount;
|
|
|
|
_system->delayMillis(this_delay);
|
|
|
|
|
|
|
|
cur = _system->getMillis();
|
|
|
|
} while (cur < start + amount);
|
|
|
|
}
|
|
|
|
|
2006-09-29 09:44:30 +00:00
|
|
|
void AGOSEngine::timer_callback() {
|
2007-05-13 13:19:46 +00:00
|
|
|
if (_timer5) {
|
2006-04-29 14:11:29 +00:00
|
|
|
_syncFlag2 = true;
|
|
|
|
_timer5--;
|
|
|
|
} else {
|
|
|
|
timer_proc1();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2007-05-13 13:19:46 +00:00
|
|
|
void AGOSEngine_Feeble::timer_proc1() {
|
2006-04-29 14:11:29 +00:00
|
|
|
_timer4++;
|
|
|
|
|
|
|
|
if (_lockWord & 0x80E9 || _lockWord & 2)
|
|
|
|
return;
|
|
|
|
|
|
|
|
_syncCount++;
|
|
|
|
|
|
|
|
_lockWord |= 2;
|
|
|
|
|
|
|
|
if (!(_lockWord & 0x10)) {
|
2007-05-13 13:19:46 +00:00
|
|
|
_syncFlag2 ^= 1;
|
|
|
|
if (!_syncFlag2) {
|
2006-04-29 14:11:29 +00:00
|
|
|
processVgaEvents();
|
2007-05-13 13:19:46 +00:00
|
|
|
} else {
|
|
|
|
// Double speed on Oracle
|
|
|
|
if (getGameType() == GType_FF && getBitFlag(99)) {
|
2006-04-29 14:11:29 +00:00
|
|
|
processVgaEvents();
|
2007-05-13 13:19:46 +00:00
|
|
|
} else if (_scrollCount == 0) {
|
2006-04-29 14:11:29 +00:00
|
|
|
_lockWord &= ~2;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2007-05-13 08:46:48 +00:00
|
|
|
}
|
2006-04-29 14:11:29 +00:00
|
|
|
|
2007-05-13 08:46:48 +00:00
|
|
|
if (getGameType() == GType_FF) {
|
2006-04-29 14:11:29 +00:00
|
|
|
_moviePlay->nextFrame();
|
|
|
|
}
|
|
|
|
|
2007-05-13 13:19:46 +00:00
|
|
|
animateSprites();
|
|
|
|
|
2006-04-29 14:11:29 +00:00
|
|
|
if (_copyPartialMode == 2) {
|
2007-05-13 08:46:48 +00:00
|
|
|
fillFrontFromBack(0, 0, _screenWidth, _screenHeight);
|
2006-04-29 14:11:29 +00:00
|
|
|
_copyPartialMode = 0;
|
|
|
|
}
|
|
|
|
|
2007-05-13 08:46:48 +00:00
|
|
|
if (_displayScreen) {
|
2006-04-29 14:11:29 +00:00
|
|
|
if (getGameType() == GType_FF) {
|
|
|
|
if (!getBitFlag(78)) {
|
|
|
|
oracleLogo();
|
|
|
|
}
|
|
|
|
if (getBitFlag(76)) {
|
|
|
|
swapCharacterLogo();
|
|
|
|
}
|
|
|
|
}
|
2007-05-13 13:19:46 +00:00
|
|
|
handleMouseMoved();
|
|
|
|
displayScreen();
|
|
|
|
_displayScreen = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
_lockWord &= ~2;
|
|
|
|
}
|
|
|
|
|
|
|
|
void AGOSEngine::timer_proc1() {
|
|
|
|
_timer4++;
|
|
|
|
|
|
|
|
if (_lockWord & 0x80E9 || _lockWord & 2)
|
|
|
|
return;
|
|
|
|
|
|
|
|
_syncCount++;
|
|
|
|
|
|
|
|
_lockWord |= 2;
|
|
|
|
|
|
|
|
handleMouseMoved();
|
|
|
|
|
|
|
|
if (!(_lockWord & 0x10)) {
|
|
|
|
processVgaEvents();
|
|
|
|
processVgaEvents();
|
|
|
|
_cepeFlag ^= 1;
|
|
|
|
if (!_cepeFlag)
|
|
|
|
processVgaEvents();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_updateScreen) {
|
|
|
|
_system->copyRectToScreen(getFrontBuf(), _screenWidth, 0, 0, _screenWidth, _screenHeight);
|
|
|
|
_system->updateScreen();
|
|
|
|
|
|
|
|
_updateScreen = false;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (_displayScreen) {
|
2007-05-13 08:46:48 +00:00
|
|
|
displayScreen();
|
|
|
|
_displayScreen = false;
|
2006-04-29 14:11:29 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
_lockWord &= ~2;
|
|
|
|
}
|
|
|
|
|
2006-09-29 09:44:30 +00:00
|
|
|
} // End of namespace AGOS
|