diff options
author | Paul Gilbert | 2007-07-26 10:11:31 +0000 |
---|---|---|
committer | Paul Gilbert | 2007-07-26 10:11:31 +0000 |
commit | cfff436ca7b294557f0833044c2751c37a4853da (patch) | |
tree | 51a441291bfcbd146ab4738a5f5a49f7b1891fcc /engines | |
parent | 872a1ea36970af4a5440b81ac434a4e109e9cc51 (diff) | |
download | scummvm-rg350-cfff436ca7b294557f0833044c2751c37a4853da.tar.gz scummvm-rg350-cfff436ca7b294557f0833044c2751c37a4853da.tar.bz2 scummvm-rg350-cfff436ca7b294557f0833044c2751c37a4853da.zip |
Added proper room change fading effect
svn-id: r28212
Diffstat (limited to 'engines')
-rw-r--r-- | engines/lure/game.cpp | 11 | ||||
-rw-r--r-- | engines/lure/game.h | 2 | ||||
-rw-r--r-- | engines/lure/luredefs.h | 2 | ||||
-rw-r--r-- | engines/lure/room.cpp | 47 | ||||
-rw-r--r-- | engines/lure/screen.cpp | 37 | ||||
-rw-r--r-- | engines/lure/screen.h | 3 |
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(); |