[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