aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engines/sky/debug.cpp4
-rw-r--r--engines/sky/intro.cpp9
-rw-r--r--engines/sky/screen.cpp125
-rw-r--r--engines/sky/screen.h4
4 files changed, 69 insertions, 73 deletions
diff --git a/engines/sky/debug.cpp b/engines/sky/debug.cpp
index b43ec917fe..2839665ff8 100644
--- a/engines/sky/debug.cpp
+++ b/engines/sky/debug.cpp
@@ -1071,11 +1071,11 @@ void Debug::logic(uint32 logic) {
void Debug::script(uint32 command, uint16 *scriptData) {
debug(6, "SCRIPT: %s", opcodes[command]);
if (command == 0 || command == 6)
- debug(6, " %s", scriptVars[READ_LE_UINT16(scriptData)/4]);
+ debug(6, " %s", scriptVars[(*scriptData)/4]);
else {
int i;
for (i = 0; i < opcode_par[command]; i++) {
- debug(6, " %d", READ_LE_UINT16(scriptData + i));
+ debug(6, " %d", *(scriptData + i));
}
}
debug(6, " "); // Print an empty line as separator
diff --git a/engines/sky/intro.cpp b/engines/sky/intro.cpp
index 6455f3b15b..cf1910c5b1 100644
--- a/engines/sky/intro.cpp
+++ b/engines/sky/intro.cpp
@@ -647,6 +647,7 @@ Intro::~Intro() {
free(_textBuf);
free(_saveBuf);
+ _mixer->stopID(SOUND_BG);
free(_bgBuf);
}
@@ -917,12 +918,14 @@ bool Intro::escDelay(uint32 msecs) {
nDelay = _relDelay - _system->getMillis();
if (nDelay < 0)
nDelay = 0;
- else if (nDelay > 10)
- nDelay = 10;
+ else if (nDelay > 20)
+ nDelay = 20;
+
_system->delayMillis(nDelay);
+
_skyScreen->processSequence();
_system->updateScreen();
- } while (nDelay == 10);
+ } while (nDelay == 20);
return true;
}
diff --git a/engines/sky/screen.cpp b/engines/sky/screen.cpp
index 78925b8a8e..a77017de38 100644
--- a/engines/sky/screen.cpp
+++ b/engines/sky/screen.cpp
@@ -386,14 +386,14 @@ void Screen::waitForTick() {
Common::Event event;
while (true) {
+ while (eventMan->pollEvent(event))
+ ;
+
start = _system->getMillis();
if (start >= end)
return;
- while (eventMan->pollEvent(event))
- ;
-
remain = end - start;
if (remain < 10) {
_system->delayMillis(remain);
@@ -411,7 +411,7 @@ void Screen::waitForSequence() {
while (_seqInfo.running) {
processSequence();
- _system->delayMillis(10);
+ _system->delayMillis(20);
while (eventMan->pollEvent(event))
;
}
@@ -419,20 +419,18 @@ void Screen::waitForSequence() {
void Screen::startSequence(uint16 fileNum) {
_seqInfo.seqData = _skyDisk->loadFile(fileNum);
- _seqInfo.nextFrame = _system->getMillis();
+ _seqInfo.nextFrame = _system->getMillis() + 60;
_seqInfo.framesLeft = _seqInfo.seqData[0];
_seqInfo.seqDataPos = _seqInfo.seqData + 1;
- _seqInfo.delay = SEQ_DELAY;
_seqInfo.running = true;
_seqInfo.runningItem = false;
}
void Screen::startSequenceItem(uint16 itemNum) {
_seqInfo.seqData = (uint8 *)SkyEngine::fetchItem(itemNum);
- _seqInfo.nextFrame = _system->getMillis();
+ _seqInfo.nextFrame = _system->getMillis() + 60;
_seqInfo.framesLeft = _seqInfo.seqData[0] - 1;
_seqInfo.seqDataPos = _seqInfo.seqData + 1;
- _seqInfo.delay = SEQ_DELAY;
_seqInfo.running = true;
_seqInfo.runningItem = true;
}
@@ -453,75 +451,72 @@ void Screen::processSequence() {
if (_system->getMillis() < _seqInfo.nextFrame)
return;
- _seqInfo.delay--;
- if (_seqInfo.delay == 0) {
- _seqInfo.delay = SEQ_DELAY;
- _seqInfo.nextFrame += 20 * SEQ_DELAY;
+ _seqInfo.nextFrame += 60;
- memset(_seqGrid, 0, 12 * 20);
+ memset(_seqGrid, 0, 12 * 20);
- uint32 screenPos = 0;
+ uint32 screenPos = 0;
- uint8 nrToSkip, nrToDo, cnt;
+ uint8 nrToSkip, nrToDo, cnt;
+ do {
do {
- do {
- nrToSkip = _seqInfo.seqDataPos[0];
- _seqInfo.seqDataPos++;
- screenPos += nrToSkip;
- } while (nrToSkip == 0xFF);
+ nrToSkip = _seqInfo.seqDataPos[0];
+ _seqInfo.seqDataPos++;
+ screenPos += nrToSkip;
+ } while (nrToSkip == 0xFF);
- do {
- nrToDo = _seqInfo.seqDataPos[0];
- _seqInfo.seqDataPos++;
-
- uint8 gridSta = (uint8)((screenPos / (GAME_SCREEN_WIDTH * 16))*20 + ((screenPos % GAME_SCREEN_WIDTH) >> 4));
- uint8 gridEnd = (uint8)(((screenPos+nrToDo) / (GAME_SCREEN_WIDTH * 16))*20 + (((screenPos+nrToDo) % GAME_SCREEN_WIDTH) >> 4));
- gridSta = MIN(gridSta, (uint8)(12 * 20 - 1));
- gridEnd = MIN(gridEnd, (uint8)(12 * 20 - 1));
- if (gridEnd >= gridSta)
- for (cnt = gridSta; cnt <= gridEnd; cnt++)
- _seqGrid[cnt] = 1;
- else {
- for (cnt = gridSta; cnt < (gridSta / 20 + 1) * 20; cnt++)
- _seqGrid[cnt] = 1;
- for (cnt = (gridEnd / 20) * 20; cnt <= gridEnd; cnt++)
- _seqGrid[cnt] = 1;
- }
+ do {
+ nrToDo = _seqInfo.seqDataPos[0];
+ _seqInfo.seqDataPos++;
+
+ uint8 gridSta = (uint8)((screenPos / (GAME_SCREEN_WIDTH * 16))*20 + ((screenPos % GAME_SCREEN_WIDTH) >> 4));
+ uint8 gridEnd = (uint8)(((screenPos+nrToDo) / (GAME_SCREEN_WIDTH * 16))*20 + (((screenPos+nrToDo) % GAME_SCREEN_WIDTH) >> 4));
+ gridSta = MIN(gridSta, (uint8)(12 * 20 - 1));
+ gridEnd = MIN(gridEnd, (uint8)(12 * 20 - 1));
+ if (gridEnd >= gridSta)
+ for (cnt = gridSta; cnt <= gridEnd; cnt++)
+ _seqGrid[cnt] = 1;
+ else {
+ for (cnt = gridSta; cnt < (gridSta / 20 + 1) * 20; cnt++)
+ _seqGrid[cnt] = 1;
+ for (cnt = (gridEnd / 20) * 20; cnt <= gridEnd; cnt++)
+ _seqGrid[cnt] = 1;
+ }
- for (cnt = 0; cnt < nrToDo; cnt++) {
- _currentScreen[screenPos] = _seqInfo.seqDataPos[0];
- _seqInfo.seqDataPos++;
- screenPos++;
- }
- } while (nrToDo == 0xFF);
- } while (screenPos < (GAME_SCREEN_WIDTH * GAME_SCREEN_HEIGHT));
- uint8 *gridPtr = _seqGrid; uint8 *scrPtr = _currentScreen; uint8 *rectPtr = NULL;
- uint8 rectWid = 0, rectX = 0, rectY = 0;
- for (uint8 cnty = 0; cnty < 12; cnty++) {
- for (uint8 cntx = 0; cntx < 20; cntx++) {
- if (*gridPtr) {
- if (!rectWid) {
- rectX = cntx;
- rectY = cnty;
- rectPtr = scrPtr;
- }
- rectWid++;
- } else if (rectWid) {
- _system->copyRectToScreen(rectPtr, GAME_SCREEN_WIDTH, rectX << 4, rectY << 4, rectWid << 4, 16);
- rectWid = 0;
- }
- scrPtr += 16;
- gridPtr++;
+ for (cnt = 0; cnt < nrToDo; cnt++) {
+ _currentScreen[screenPos] = _seqInfo.seqDataPos[0];
+ _seqInfo.seqDataPos++;
+ screenPos++;
}
- if (rectWid) {
+ } while (nrToDo == 0xFF);
+ } while (screenPos < (GAME_SCREEN_WIDTH * GAME_SCREEN_HEIGHT));
+ uint8 *gridPtr = _seqGrid; uint8 *scrPtr = _currentScreen; uint8 *rectPtr = NULL;
+ uint8 rectWid = 0, rectX = 0, rectY = 0;
+ for (uint8 cnty = 0; cnty < 12; cnty++) {
+ for (uint8 cntx = 0; cntx < 20; cntx++) {
+ if (*gridPtr) {
+ if (!rectWid) {
+ rectX = cntx;
+ rectY = cnty;
+ rectPtr = scrPtr;
+ }
+ rectWid++;
+ } else if (rectWid) {
_system->copyRectToScreen(rectPtr, GAME_SCREEN_WIDTH, rectX << 4, rectY << 4, rectWid << 4, 16);
rectWid = 0;
}
- scrPtr += 15 * GAME_SCREEN_WIDTH;
+ scrPtr += 16;
+ gridPtr++;
}
- _system->updateScreen();
- _seqInfo.framesLeft--;
+ if (rectWid) {
+ _system->copyRectToScreen(rectPtr, GAME_SCREEN_WIDTH, rectX << 4, rectY << 4, rectWid << 4, 16);
+ rectWid = 0;
+ }
+ scrPtr += 15 * GAME_SCREEN_WIDTH;
}
+ _system->updateScreen();
+ _seqInfo.framesLeft--;
+
if (_seqInfo.framesLeft == 0) {
_seqInfo.running = false;
if (!_seqInfo.runningItem)
diff --git a/engines/sky/screen.h b/engines/sky/screen.h
index bf5eeacf24..69a9a2fc8f 100644
--- a/engines/sky/screen.h
+++ b/engines/sky/screen.h
@@ -45,8 +45,7 @@ struct DataFileHeader;
#define SCROLL_JUMP 16
#define VGA_COLOURS 256
-#define GAME_COLOURS 240
-#define SEQ_DELAY 3
+#define GAME_COLOURS 240
#define FORE 1
#define BACK 0
@@ -114,7 +113,6 @@ private:
struct {
uint32 nextFrame;
uint32 framesLeft;
- uint32 delay;
uint8 *seqData;
uint8 *seqDataPos;
volatile bool running;