[Scummvm-cvs-logs] SF.net SVN: scummvm: [28212] scummvm/trunk/engines/lure
dreammaster at users.sourceforge.net
dreammaster at users.sourceforge.net
Thu Jul 26 12:11:31 CEST 2007
Revision: 28212
http://scummvm.svn.sourceforge.net/scummvm/?rev=28212&view=rev
Author: dreammaster
Date: 2007-07-26 03:11:31 -0700 (Thu, 26 Jul 2007)
Log Message:
-----------
Added proper room change fading effect
Modified Paths:
--------------
scummvm/trunk/engines/lure/game.cpp
scummvm/trunk/engines/lure/game.h
scummvm/trunk/engines/lure/luredefs.h
scummvm/trunk/engines/lure/room.cpp
scummvm/trunk/engines/lure/screen.cpp
scummvm/trunk/engines/lure/screen.h
Modified: scummvm/trunk/engines/lure/game.cpp
===================================================================
--- scummvm/trunk/engines/lure/game.cpp 2007-07-26 07:21:19 UTC (rev 28211)
+++ scummvm/trunk/engines/lure/game.cpp 2007-07-26 10:11:31 UTC (rev 28212)
@@ -52,7 +52,7 @@
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 @@
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 @@
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 @@
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);
Modified: scummvm/trunk/engines/lure/game.h
===================================================================
--- scummvm/trunk/engines/lure/game.h 2007-07-26 07:21:19 UTC (rev 28211)
+++ scummvm/trunk/engines/lure/game.h 2007-07-26 10:11:31 UTC (rev 28212)
@@ -66,7 +66,7 @@
static Game &getReference();
- void tick();
+ void tick(bool fastSpeed = false);
void nextFrame();
void execute();
void setState(uint8 flags) { _state = flags; }
Modified: scummvm/trunk/engines/lure/luredefs.h
===================================================================
--- scummvm/trunk/engines/lure/luredefs.h 2007-07-26 07:21:19 UTC (rev 28211)
+++ scummvm/trunk/engines/lure/luredefs.h 2007-07-26 10:11:31 UTC (rev 28212)
@@ -113,6 +113,8 @@
#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
Modified: scummvm/trunk/engines/lure/room.cpp
===================================================================
--- scummvm/trunk/engines/lure/room.cpp 2007-07-26 07:21:19 UTC (rev 28211)
+++ scummvm/trunk/engines/lure/room.cpp 2007-07-26 10:11:31 UTC (rev 28212)
@@ -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::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 @@
_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 @@
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
Modified: scummvm/trunk/engines/lure/screen.cpp
===================================================================
--- scummvm/trunk/engines/lure/screen.cpp 2007-07-26 07:21:19 UTC (rev 28211)
+++ scummvm/trunk/engines/lure/screen.cpp 2007-07-26 10:11:31 UTC (rev 28212)
@@ -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 @@
_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 @@
_system.setPalette(_palette->data(), 0, GAME_COLOURS);
_system.updateScreen();
_system.delayMillis(20);
+ events.pollEvent();
}
} while (changed);
}
@@ -106,14 +122,16 @@
// 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 @@
_system.setPalette(_palette->data(), 0, GAME_COLOURS);
_system.updateScreen();
_system.delayMillis(20);
+ events.pollEvent();
}
} while (changed);
}
Modified: scummvm/trunk/engines/lure/screen.h
===================================================================
--- scummvm/trunk/engines/lure/screen.h 2007-07-26 07:21:19 UTC (rev 28211)
+++ scummvm/trunk/engines/lure/screen.h 2007-07-26 10:11:31 UTC (rev 28212)
@@ -49,9 +49,10 @@
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();
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Scummvm-git-logs
mailing list