aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaul Gilbert2007-07-26 10:11:31 +0000
committerPaul Gilbert2007-07-26 10:11:31 +0000
commitcfff436ca7b294557f0833044c2751c37a4853da (patch)
tree51a441291bfcbd146ab4738a5f5a49f7b1891fcc
parent872a1ea36970af4a5440b81ac434a4e109e9cc51 (diff)
downloadscummvm-rg350-cfff436ca7b294557f0833044c2751c37a4853da.tar.gz
scummvm-rg350-cfff436ca7b294557f0833044c2751c37a4853da.tar.bz2
scummvm-rg350-cfff436ca7b294557f0833044c2751c37a4853da.zip
Added proper room change fading effect
svn-id: r28212
-rw-r--r--engines/lure/game.cpp11
-rw-r--r--engines/lure/game.h2
-rw-r--r--engines/lure/luredefs.h2
-rw-r--r--engines/lure/room.cpp47
-rw-r--r--engines/lure/screen.cpp37
-rw-r--r--engines/lure/screen.h3
6 files changed, 78 insertions, 24 deletions
diff --git a/engines/lure/game.cpp b/engines/lure/game.cpp
index 3ac25f83b8..5bffc6ade8 100644
--- a/engines/lure/game.cpp
+++ b/engines/lure/game.cpp
@@ -52,7 +52,7 @@ Game::~Game() {
delete _debugger;
}
-void Game::tick() {
+void Game::tick(bool fastSpeed) {
// Call the tick method for each hotspot - this is somewaht complicated
// by the fact that a tick proc can unload both itself and/or others,
// so we first get a list of the Ids, and call the tick proc for each
@@ -65,7 +65,11 @@ void Game::tick() {
int idSize = 0;
for (i = res.activeHotspots().begin(); i != res.activeHotspots().end(); ++i) {
Hotspot *hotspot = *i;
- idList[idSize++] = hotspot->hotspotId();
+
+ if (!fastSpeed || ((hotspot->layer() != 0xff) &&
+ (hotspot->hotspotId() < FIRST_NONCHARACTER_ID)))
+ // Add hotspot to list to execute
+ idList[idSize++] = hotspot->hotspotId();
}
debugC(ERROR_DETAILED, kLureDebugAnimations, "Hotspot ticks begin");
@@ -289,6 +293,7 @@ void Game::playerChangeRoom() {
uint16 roomNum = fields.playerNewPos().roomNumber;
fields.playerNewPos().roomNumber = 0;
Point &newPos = fields.playerNewPos().position;
+
delayList.clear();
RoomData *roomData = res.getRoom(roomNum);
@@ -302,7 +307,9 @@ void Game::playerChangeRoom() {
displayChuteAnimation();
else if (animFlag != 0)
displayBarrelAnimation();
+
fields.setField(ROOM_EXIT_ANIMATION, 0);
+ roomData->exitTime = g_system->getMillis();
// Change to the new room
Hotspot *player = res.getActiveHotspot(PLAYER_ID);
diff --git a/engines/lure/game.h b/engines/lure/game.h
index b1d1f8d21a..20e56df776 100644
--- a/engines/lure/game.h
+++ b/engines/lure/game.h
@@ -66,7 +66,7 @@ public:
static Game &getReference();
- void tick();
+ void tick(bool fastSpeed = false);
void nextFrame();
void execute();
void setState(uint8 flags) { _state = flags; }
diff --git a/engines/lure/luredefs.h b/engines/lure/luredefs.h
index a715c4a1e7..d5991a5807 100644
--- a/engines/lure/luredefs.h
+++ b/engines/lure/luredefs.h
@@ -113,6 +113,8 @@ enum Action {
#define SUB_PALETTE_SIZE 64
// Palette resources have 220 palette entries
#define RES_PALETTE_ENTRIES 220
+// Main working palette size
+#define MAIN_PALETTE_SIZE 228
// Palette colour increment amouns for palette fade in/outs
#define PALETTE_FADE_INC_SIZE 4
diff --git a/engines/lure/room.cpp b/engines/lure/room.cpp
index 016432dfac..b48b50197b 100644
--- a/engines/lure/room.cpp
+++ b/engines/lure/room.cpp
@@ -24,6 +24,7 @@
#include "lure/luredefs.h"
#include "lure/res.h"
#include "lure/screen.h"
+#include "lure/game.h"
#include "lure/events.h"
#include "lure/strings.h"
#include "lure/scripts.h"
@@ -492,18 +493,26 @@ void Room::update() {
void Room::setRoomNumber(uint16 newRoomNumber, bool showOverlay) {
Resources &r = Resources::getReference();
+ Game &game = Game::getReference();
+ Mouse &mouse = Mouse::getReference();
+
+ mouse.pushCursorNum(CURSOR_DISK);
+
_roomData = r.getRoom(newRoomNumber);
if (!_roomData)
error("Tried to change to non-existant room: %d", newRoomNumber);
- bool leaveFlag = (_layers[0] && (newRoomNumber != _roomNumber));
+ bool leaveFlag = (_layers[0] && (newRoomNumber != _roomNumber) && (_roomNumber != 0));
_roomNumber = _roomData->roomNumber;
_descId = _roomData->descId;
+ if (leaveFlag) {
+ _screen.paletteFadeOut();
+ leaveRoom();
+ }
+
_screen.empty();
- _screen.resetPalette();
- if (leaveFlag) leaveRoom();
_numLayers = _roomData->numLayers;
if (showOverlay) ++_numLayers;
@@ -512,13 +521,9 @@ void Room::setRoomNumber(uint16 newRoomNumber, bool showOverlay) {
_layers[layerNum] = new RoomLayer(_roomData->layers[layerNum],
layerNum == 0);
- // Load in the palette, add in the two replacements segments, and then
- // set to the system palette
- Palette p(228, NULL, RGB64);
- Palette tempPalette(paletteId);
- p.copyFrom(&tempPalette);
- r.insertPaletteSubset(p);
- _screen.setPalette(&p);
+ // Load in the game palette and set the non-room specific colours at the top end of the palette
+ Palette mainPalette(GAME_PALETTE_RESOURCE_ID);
+ _screen.setPalette(&mainPalette, MAIN_PALETTE_SIZE, GAME_COLOURS - MAIN_PALETTE_SIZE);
// Set the new room number
r.fieldList().setField(ROOM_NUMBER, newRoomNumber);
@@ -527,8 +532,28 @@ void Room::setRoomNumber(uint16 newRoomNumber, bool showOverlay) {
Script::execute(_roomData->sequenceOffset);
loadRoomHotspots();
- checkCursor();
+
+ if (_roomData->exitTime != 0xffff)
+ {
+ // If time has passed, animation ticks needed before room is displayed
+ int numSeconds = (g_system->getMillis() - _roomData->exitTime) / 1000;
+ if (numSeconds > 300) numSeconds = 300;
+
+ while (numSeconds-- > 0)
+ game.tick(true);
+ }
+
update();
+ _screen.update();
+
+ // Generate the palette for the room and fade it in
+ Palette p(MAIN_PALETTE_SIZE, NULL, RGB64);
+ Palette tempPalette(paletteId);
+ p.copyFrom(&tempPalette);
+ r.insertPaletteSubset(p);
+ _screen.paletteFadeIn(&p);
+
+ mouse.popCursor();
}
// checkCursor
diff --git a/engines/lure/screen.cpp b/engines/lure/screen.cpp
index 8477c0def4..0cd2dd9357 100644
--- a/engines/lure/screen.cpp
+++ b/engines/lure/screen.cpp
@@ -28,6 +28,7 @@
#include "lure/memory.h"
#include "lure/disk.h"
#include "lure/decode.h"
+#include "lure/events.h"
namespace Lure {
@@ -71,26 +72,40 @@ void Screen::setPalette(Palette *p) {
_system.updateScreen();
}
+// setPalette
+// Variation that allows the specification of a subset of a palette passed in to be copied
+
+void Screen::setPalette(Palette *p, uint16 start, uint16 num) {
+ _palette->palette()->copyFrom(p->palette(), start * PALETTE_FADE_INC_SIZE,
+ start * PALETTE_FADE_INC_SIZE, num * PALETTE_FADE_INC_SIZE);
+ _system.setPalette(_palette->data(), 0, GAME_COLOURS);
+ _system.updateScreen();
+}
+
// paletteFadeIn
// Fades in the palette. For proper operation, the palette should have been
// previously set to empty
void Screen::paletteFadeIn(Palette *p) {
+ assert(p->numEntries() <= _palette->numEntries());
+ Events &events = Events::getReference();
bool changed;
- byte *const pDest = p->data();
- byte *const pTemp = _palette->data();
do {
changed = false;
+ byte *pFinal = p->data();
+ byte *pCurrent = _palette->data();
- for (int palCtr = 0; palCtr < p->numEntries() * 4; ++palCtr)
+ for (int palCtr = 0; palCtr < p->numEntries() * PALETTE_FADE_INC_SIZE; ++palCtr, ++pCurrent, ++pFinal)
{
if (palCtr % PALETTE_FADE_INC_SIZE == (PALETTE_FADE_INC_SIZE - 1)) continue;
- bool isDifferent = pTemp[palCtr] < pDest[palCtr];
+ bool isDifferent = *pCurrent < *pFinal;
+
if (isDifferent) {
- if (pDest[palCtr] - pTemp[palCtr] < PALETTE_FADE_INC_SIZE)
- pTemp[palCtr] = pDest[palCtr];
- else pTemp[palCtr] += PALETTE_FADE_INC_SIZE;
+ if ((*pFinal - *pCurrent) < PALETTE_FADE_INC_SIZE)
+ *pCurrent = *pFinal;
+ else
+ *pCurrent += PALETTE_FADE_INC_SIZE;
changed = true;
}
}
@@ -99,6 +114,7 @@ void Screen::paletteFadeIn(Palette *p) {
_system.setPalette(_palette->data(), 0, GAME_COLOURS);
_system.updateScreen();
_system.delayMillis(20);
+ events.pollEvent();
}
} while (changed);
}
@@ -106,14 +122,16 @@ void Screen::paletteFadeIn(Palette *p) {
// paletteFadeOut
// Fades the screen to black by gradually decreasing the palette colours
-void Screen::paletteFadeOut() {
+void Screen::paletteFadeOut(int numEntries) {
+ assert((uint32)numEntries <= _palette->palette()->size());
+ Events &events = Events::getReference();
bool changed;
do {
byte *pTemp = _palette->data();
changed = false;
- for (uint32 palCtr = 0; palCtr < _palette->palette()->size(); ++palCtr, ++pTemp) {
+ for (uint32 palCtr = 0; palCtr < (uint32)(numEntries * PALETTE_FADE_INC_SIZE); ++palCtr, ++pTemp) {
if (palCtr % PALETTE_FADE_INC_SIZE == (PALETTE_FADE_INC_SIZE - 1))
continue;
bool isDifferent = *pTemp > 0;
@@ -128,6 +146,7 @@ void Screen::paletteFadeOut() {
_system.setPalette(_palette->data(), 0, GAME_COLOURS);
_system.updateScreen();
_system.delayMillis(20);
+ events.pollEvent();
}
} while (changed);
}
diff --git a/engines/lure/screen.h b/engines/lure/screen.h
index 9197f64a8d..7182c4236b 100644
--- a/engines/lure/screen.h
+++ b/engines/lure/screen.h
@@ -49,9 +49,10 @@ public:
void setPaletteEmpty();
void setPalette(Palette *p);
+ void setPalette(Palette *p, uint16 start, uint16 num);
Palette &getPalette() { return *_palette; }
void paletteFadeIn(Palette *p);
- void paletteFadeOut();
+ void paletteFadeOut(int numEntries = MAIN_PALETTE_SIZE);
void resetPalette();
void empty();
void update();