[Scummvm-cvs-logs] CVS: scummvm/kyra animator.cpp,1.1,1.2 animator.h,1.1,1.2 kyra.cpp,1.108,1.109 kyra.h,1.61,1.62 script_v1.cpp,1.56,1.57 timer.cpp,1.1,1.2

Johannes Schickel lordhoto at users.sourceforge.net
Tue Jan 3 11:04:03 CET 2006


Update of /cvsroot/scummvm/scummvm/kyra
In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv32128

Modified Files:
	animator.cpp animator.h kyra.cpp kyra.h script_v1.cpp 
	timer.cpp 
Log Message:
Fixed some bugs with the timers.
also implemented: cmd_dispelMagicAnimation and cmd_runWSAFrames
and implemented color fading of the kyragem in room 210.


Index: animator.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/animator.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- animator.cpp	2 Jan 2006 22:58:59 -0000	1.1
+++ animator.cpp	3 Jan 2006 19:03:08 -0000	1.2
@@ -24,14 +24,21 @@
 #include "kyra/animator.h"
 #include "kyra/sprites.h"
 
+#include "common/system.h"
+
 namespace Kyra {
-ScreenAnimator::ScreenAnimator(KyraEngine *vm) {
+ScreenAnimator::ScreenAnimator(KyraEngine *vm, OSystem *system) {
 	_vm = vm;
 	_screen = vm->screen();
 	_initOk = false;
 	_updateScreen = false;
+	_system = system;
 	_screenObjects = _actors = _items = _sprites = _objectQueue = 0;
 	_noDrawShapesFlag = 0;
+	
+	memset(&_kyragemFadingState, 0, sizeof(_kyragemFadingState));
+	_kyragemFadingState.gOffset = 0x13;
+	_kyragemFadingState.bOffset = 0x13;
 }
 
 ScreenAnimator::~ScreenAnimator() {
@@ -522,4 +529,74 @@
 		_objectQueue = objectAddHead(0, object);
 	}
 }
+
+void ScreenAnimator::updateKyragemFading() {
+	static const uint8 kyraGemPalette[0x28] = {
+		0x3F, 0x3B, 0x38, 0x34, 0x32, 0x2F, 0x2C, 0x29, 0x25, 0x22,
+		0x1F, 0x1C, 0x19, 0x16, 0x12, 0x0F, 0x0C, 0x0A, 0x06, 0x03,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+		0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+	};
+	
+	if (_system->getMillis() < _kyragemFadingState.timerCount)
+		return;
+	
+	_kyragemFadingState.timerCount = _system->getMillis() + 4 * _vm->tickLength();
+	int palPos = 684;
+	for (int i = 0; i < 20; ++i) {
+		_screen->_currentPalette[palPos++] = kyraGemPalette[i + _kyragemFadingState.rOffset];
+		_screen->_currentPalette[palPos++] = kyraGemPalette[i + _kyragemFadingState.gOffset];
+		_screen->_currentPalette[palPos++] = kyraGemPalette[i + _kyragemFadingState.bOffset];
+	}
+	_screen->setScreenPalette(_screen->_currentPalette);
+	_updateScreen = true;
+	switch (_kyragemFadingState.nextOperation) {
+		case 0:
+			--_kyragemFadingState.bOffset;
+			if (_kyragemFadingState.bOffset >= 1)
+				return;
+			_kyragemFadingState.nextOperation = 1;
+			break;
+
+		case 1:
+			++_kyragemFadingState.rOffset;
+			if (_kyragemFadingState.rOffset < 19)
+				return;
+			_kyragemFadingState.nextOperation = 2;
+			break;
+
+		case 2:
+			--_kyragemFadingState.gOffset;
+			if (_kyragemFadingState.gOffset >= 1)
+				return;
+			_kyragemFadingState.nextOperation = 3;
+			break;
+		
+		case 3:
+			++_kyragemFadingState.bOffset;
+			if (_kyragemFadingState.bOffset < 19)
+				return;
+			_kyragemFadingState.nextOperation = 4;
+			break;
+		
+		case 4:
+			--_kyragemFadingState.rOffset;
+			if (_kyragemFadingState.rOffset >= 1)
+				return;
+			_kyragemFadingState.nextOperation = 5;
+			break;
+		
+		case 5:
+			++_kyragemFadingState.gOffset;
+			if (_kyragemFadingState.gOffset < 19)
+				return;
+			_kyragemFadingState.nextOperation = 0;
+			break;
+			
+		default:
+			break;
+	}
+	
+	_kyragemFadingState.timerCount = _system->getMillis() + 120 * _vm->tickLength();
+}
 } // end of namespace Kyra

Index: animator.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/animator.h,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- animator.h	2 Jan 2006 22:58:59 -0000	1.1
+++ animator.h	3 Jan 2006 19:03:08 -0000	1.2
@@ -49,7 +49,7 @@
 
 class ScreenAnimator {
 public:
-	ScreenAnimator(KyraEngine *vm);
+	ScreenAnimator(KyraEngine *vm, OSystem *system);
 	virtual ~ScreenAnimator();
 
 	operator bool() const { return _initOk; }
@@ -78,12 +78,15 @@
 	void clearQueue() { _objectQueue = 0; }
 	void addObjectToQueue(AnimObject *object);
 	void refreshObject(AnimObject *object);
+	
+	void updateKyragemFading();
 
 	int _noDrawShapesFlag;
 	bool _updateScreen;
 protected:
 	KyraEngine *_vm;
 	Screen *_screen;
+	OSystem *_system;
 	bool _initOk;
 
 	AnimObject *_screenObjects;
@@ -99,6 +102,14 @@
 	void preserveOrRestoreBackground(AnimObject *obj, bool restore);
 
 	AnimObject *_objectQueue;
+	
+	struct KyragemState {
+		uint16 nextOperation;
+		uint16 rOffset;
+		uint16 gOffset;
+		uint16 bOffset;
+		uint32 timerCount;
+	} _kyragemFadingState;
 };
 } // end of namespace Kyra
 

Index: kyra.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/kyra.cpp,v
retrieving revision 1.108
retrieving revision 1.109
diff -u -d -r1.108 -r1.109
--- kyra.cpp	2 Jan 2006 22:58:59 -0000	1.108
+++ kyra.cpp	3 Jan 2006 19:03:09 -0000	1.109
@@ -295,7 +295,7 @@
 	assert(_sprites);
 	_seq = new SeqPlayer(this, _system);
 	assert(_seq);
-	_animator = new ScreenAnimator(this);
+	_animator = new ScreenAnimator(this, _system);
 	assert(_animator);
 	_animator->init(5, 11, 12);
 	assert(*_animator);
@@ -623,7 +623,7 @@
 			_animator->updateAllObjectShapes();
 
 		if (_currentCharacter->sceneId == 210) {
-			//XXX
+			_animator->updateKyragemFading();
 		}
 
 		if (amount > 0) {
@@ -668,6 +668,10 @@
 
 	while (!_quitFlag) {
 		int32 frameTime = (int32)_system->getMillis();
+		if (_currentCharacter->sceneId == 210) {
+			_animator->updateKyragemFading();
+			// XXX
+		}
 		
 		if (_brandonStatusBit & 2) {
 			if (_brandonStatusBit0x02Flag)
@@ -780,10 +784,10 @@
 	while (_system->getMillis() < nextTime) {
 		_sprites->updateSceneAnims();
 		_animator->updateAllObjectShapes();
-		//if (_currentCharacter->sceneId == 210) {
-		//	updateKyragemFading();
+		if (_currentCharacter->sceneId == 210) {
+			_animator->updateKyragemFading();
 		//	seq_playEnd();
-		//}
+		}
 	}
 }
 
@@ -2066,7 +2070,7 @@
 	updateTextFade();
 
 	if (_currentCharacter->sceneId == 210) {
-		// XXX game_updateKyragemFading
+		_animator->updateKyragemFading();
 	}
 }
 
@@ -4892,7 +4896,7 @@
 			_animator->updateAllObjectShapes();
 			updateTextFade();
 			if (_currentCharacter->sceneId == 210) {
-				// XXX updateKyragemFading
+				_animator->updateKyragemFading();
 				// XXX playEnd
 				// XXX
 			}

Index: kyra.h
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/kyra.h,v
retrieving revision 1.61
retrieving revision 1.62
diff -u -d -r1.61 -r1.62
--- kyra.h	2 Jan 2006 22:58:59 -0000	1.61
+++ kyra.h	3 Jan 2006 19:03:09 -0000	1.62
@@ -177,6 +177,7 @@
 	ScreenAnimator *animator() { return _animator; }
 	TextDisplayer *text() { return _text; }
 	MusicPlayer *midi() { return _midi; }
+	uint32 tickLength() const { return _tickLength; }
 	Movie *createWSAMovie();
 
 	uint8 game() const { return _game; }

Index: script_v1.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/script_v1.cpp,v
retrieving revision 1.56
retrieving revision 1.57
diff -u -d -r1.56 -r1.57
--- script_v1.cpp	2 Jan 2006 22:58:59 -0000	1.56
+++ script_v1.cpp	3 Jan 2006 19:03:09 -0000	1.57
@@ -509,7 +509,27 @@
 }
 
 int KyraEngine::cmd_runWSAFrames(ScriptState *script) {
-	warning("STUB: cmd_runWSAFrames");
+	debug(3, "cmd_runWSAFrames(0x%X) (%d, %d, %d, %d, %d, %d)", script, stackPos(0), stackPos(1), stackPos(2), stackPos(3), stackPos(4), stackPos(5));
+	int xpos = stackPos(0);
+	int ypos = stackPos(1);
+	int delayTime = stackPos(2);
+	int startFrame = stackPos(3);
+	int endFrame = stackPos(4);
+	int wsaIndex = stackPos(5);
+	_screen->hideMouse();
+	_movieObjects[wsaIndex]->_x = xpos;
+	_movieObjects[wsaIndex]->_y = ypos;
+	_movieObjects[wsaIndex]->_drawPage = 0;
+	for (; startFrame <= endFrame; ++startFrame) {
+		uint32 nextRun = _system->getMillis() + delayTime * _tickLength;
+		_movieObjects[wsaIndex]->displayFrame(startFrame);
+		while (_system->getMillis() < nextRun) {
+			_sprites->updateSceneAnims();
+			_animator->updateAllObjectShapes();
+			delay(10);
+		}
+	}
+	_screen->showMouse();
 	return 0;
 }
 
@@ -1097,7 +1117,8 @@
 }
 
 int KyraEngine::cmd_dispelMagicAnimation(ScriptState *script) {
-	warning("STUB: cmd_dispelMagicAnimation");
+	debug(3, "cmd_dispelMagicAnimation(0x%X) ()", script);
+	seq_dispelMagicAnimation();
 	return 0;
 }
 

Index: timer.cpp
===================================================================
RCS file: /cvsroot/scummvm/scummvm/kyra/timer.cpp,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -d -r1.1 -r1.2
--- timer.cpp	2 Jan 2006 22:58:59 -0000	1.1
+++ timer.cpp	3 Jan 2006 19:03:09 -0000	1.2
@@ -93,7 +93,6 @@
 					(*this.*_timers[i].func)(i);
 
 				_timers[i].nextRun = _system->getMillis() + _timers[i].countdown * _tickLength;
-
 			}
 		}
 		if (_timers[i].nextRun < _timerNextRun)
@@ -119,8 +118,9 @@
 void KyraEngine::setTimerCountdown(uint8 timer, int32 countdown) {
 	debug(9, "setTimerCountdown(%i, %i)", timer, countdown);
 	_timers[timer].countdown = countdown;
+	_timers[timer].nextRun = _system->getMillis() + countdown * _tickLength;
 
-	uint32 nextRun = _system->getMillis() + countdown;
+	uint32 nextRun = _system->getMillis() + countdown * _tickLength;
 	if (nextRun < _timerNextRun)
 		_timerNextRun = nextRun;
 }





More information about the Scummvm-git-logs mailing list