[Scummvm-git-logs] scummvm master -> cd8446ad4500447b218d1701adac7b882c998b13

sev- sev at scummvm.org
Sat Feb 8 14:17:06 UTC 2020


This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
cd8446ad45 DIRECTOR: Made number of channels dynamic


Commit: cd8446ad4500447b218d1701adac7b882c998b13
    https://github.com/scummvm/scummvm/commit/cd8446ad4500447b218d1701adac7b882c998b13
Author: Eugene Sandulenko (sev at scummvm.org)
Date: 2020-02-08T13:10:11+01:00

Commit Message:
DIRECTOR: Made number of channels dynamic

Changed paths:
    engines/director/director.h
    engines/director/frame.cpp
    engines/director/frame.h
    engines/director/lingo/lingo-events.cpp
    engines/director/lingo/lingo.cpp
    engines/director/score.cpp
    engines/director/score.h


diff --git a/engines/director/director.h b/engines/director/director.h
index 3695532..67e802c 100644
--- a/engines/director/director.h
+++ b/engines/director/director.h
@@ -31,8 +31,6 @@
 #include "engines/engine.h"
 #include "director/types.h"
 
-#define CHANNEL_COUNT 30
-
 namespace Common {
 class MacResManager;
 class SeekableReadStream;
diff --git a/engines/director/frame.cpp b/engines/director/frame.cpp
index b72e0b4..8e06ef9 100644
--- a/engines/director/frame.cpp
+++ b/engines/director/frame.cpp
@@ -37,7 +37,7 @@
 
 namespace Director {
 
-Frame::Frame(DirectorEngine *vm) {
+Frame::Frame(DirectorEngine *vm, int numChannels) {
 	_vm = vm;
 	_transDuration = 0;
 	_transType = kTransNone;
@@ -45,6 +45,8 @@ Frame::Frame(DirectorEngine *vm) {
 	_transChunkSize = 0;
 	_tempo = 0;
 
+	_numChannels = numChannels;
+
 	_sound1 = 0;
 	_sound2 = 0;
 	_soundType1 = 0;
@@ -56,7 +58,7 @@ Frame::Frame(DirectorEngine *vm) {
 
 	_palette = NULL;
 
-	_sprites.resize(CHANNEL_COUNT + 1);
+	_sprites.resize(_numChannels + 1);
 
 	for (uint16 i = 0; i < _sprites.size(); i++) {
 		Sprite *sp = new Sprite();
@@ -66,6 +68,7 @@ Frame::Frame(DirectorEngine *vm) {
 
 Frame::Frame(const Frame &frame) {
 	_vm = frame._vm;
+	_numChannels = frame._numChannels;
 	_actionId = frame._actionId;
 	_transArea = frame._transArea;
 	_transDuration = frame._transDuration;
@@ -82,9 +85,9 @@ Frame::Frame(const Frame &frame) {
 
 	debugC(1, kDebugLoading, "Frame. action: %d transType: %d transDuration: %d", _actionId, _transType, _transDuration);
 
-	_sprites.resize(CHANNEL_COUNT + 1);
+	_sprites.resize(_numChannels + 1);
 
-	for (uint16 i = 0; i < CHANNEL_COUNT + 1; i++) {
+	for (uint16 i = 0; i < _numChannels + 1; i++) {
 		_sprites[i] = new Sprite(*frame._sprites[i]);
 	}
 }
@@ -190,7 +193,7 @@ void Frame::readChannels(Common::ReadStreamEndian *stream) {
 		}
 	}
 
-	for (int i = 0; i < CHANNEL_COUNT; i++) {
+	for (int i = 0; i < _numChannels; i++) {
 		Sprite &sprite = *_sprites[i + 1];
 
 		if (_vm->getVersion() <= 4) {
@@ -578,7 +581,7 @@ void Frame::playTransition(Score *score) {
 }
 
 void Frame::renderSprites(Graphics::ManagedSurface &surface, bool renderTrail) {
-	for (uint16 i = 0; i < CHANNEL_COUNT; i++) {
+	for (uint16 i = 0; i < _numChannels; i++) {
 		if (_sprites[i]->_enabled) {
 			if ((_sprites[i]->_trails == 0 && renderTrail) || (_sprites[i]->_trails == 1 && !renderTrail))
 				continue;
diff --git a/engines/director/frame.h b/engines/director/frame.h
index 970e8a4..fde5432 100644
--- a/engines/director/frame.h
+++ b/engines/director/frame.h
@@ -63,7 +63,7 @@ struct FrameEntity {
 
 class Frame {
 public:
-	Frame(DirectorEngine *vm);
+	Frame(DirectorEngine *vm, int numChannels);
 	Frame(const Frame &frame);
 	~Frame();
 	void readChannels(Common::ReadStreamEndian *stream);
@@ -95,6 +95,7 @@ private:
 	void addDrawRect(uint16 entityId, Common::Rect &rect);
 
 public:
+	int _numChannels;
 	byte _channelData[kChannelDataSize];
 	uint8 _actionId;
 	uint8 _transDuration;
diff --git a/engines/director/lingo/lingo-events.cpp b/engines/director/lingo/lingo-events.cpp
index cc4d040..9184f8f 100644
--- a/engines/director/lingo/lingo-events.cpp
+++ b/engines/director/lingo/lingo-events.cpp
@@ -258,7 +258,7 @@ void Lingo::processSpriteEvent(LEvent event) {
 	Frame *currentFrame = score->_frames[score->getCurrentFrame()];
 	if (event == kEventBeginSprite) {
 		// TODO: Check if this is also possibly a kSpriteScript?
-		for (uint16 i = 0; i < CHANNEL_COUNT; i++)
+		for (uint16 i = 0; i < score->_numChannelsDisplayed; i++)
 			if (currentFrame->_sprites[i]->_enabled)
 				processEvent(event, kCastScript, currentFrame->_sprites[i]->_scriptId);
 
diff --git a/engines/director/lingo/lingo.cpp b/engines/director/lingo/lingo.cpp
index 13e5c3a..c2ad108 100644
--- a/engines/director/lingo/lingo.cpp
+++ b/engines/director/lingo/lingo.cpp
@@ -589,7 +589,7 @@ void Lingo::runTests() {
 }
 
 void Lingo::executeImmediateScripts(Frame *frame) {
-	for (uint16 i = 0; i < CHANNEL_COUNT; i++) {
+	for (uint16 i = 0; i < _vm->getCurrentScore()->_numChannelsDisplayed; i++) {
 		if (_vm->getCurrentScore()->_immediateActions.contains(frame->_sprites[i]->_scriptId)) {
 			g_lingo->processEvent(kEventMouseUp, kFrameScript, frame->_sprites[i]->_scriptId);
 		}
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 603a399..04ffc05 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -100,6 +100,8 @@ Score::Score(DirectorEngine *vm) {
 
 	_loadedStxts = nullptr;
 	_loadedCast = nullptr;
+
+	_numChannelsDisplayed = 0;
 }
 
 void Score::setArchive(Archive *archive) {
@@ -414,22 +416,23 @@ void Score::loadFrames(Common::SeekableSubReadStreamEndian &stream) {
 	uint32 size = stream.readUint32();
 	size -= 4;
 
-	if (_vm->getVersion() == 4) {
+	if (_vm->getVersion() < 4) {
+		_numChannelsDisplayed = 30;
+	} else if (_vm->getVersion() == 4) {
 		uint32 frame1Offset = stream.readUint32();
 		uint32 numFrames = stream.readUint32();
 		uint16 version = stream.readUint16();
 		uint16 spriteRecordSize = stream.readUint16();
 		uint16 numChannels = stream.readUint16();
-		uint16 numChannelsDisplayed;
 		size -= 14;
 
 		if (version > 13) {
-			numChannelsDisplayed = stream.readUint16();
+			_numChannelsDisplayed = stream.readUint16();
 		} else {
 			if (version <= 7)	// Director5
-				numChannelsDisplayed = 28;
+				_numChannelsDisplayed = 48;
 			else
-				numChannelsDisplayed = 120;	// D6
+				_numChannelsDisplayed = 120;	// D6
 
 			stream.readUint16(); // Skip
 		}
@@ -437,7 +440,7 @@ void Score::loadFrames(Common::SeekableSubReadStreamEndian &stream) {
 		size -= 2;
 
 		warning("STUB: Score::loadFrames. frame1Offset: %x numFrames: %x version: %x spriteRecordSize: %x numChannels: %x numChannelsDisplayed: %x",
-			frame1Offset, numFrames, version, spriteRecordSize, numChannels, numChannelsDisplayed);
+			frame1Offset, numFrames, version, spriteRecordSize, numChannels, _numChannelsDisplayed);
 		// Unknown, some bytes - constant (refer to contuinity).
 	} else if (_vm->getVersion() > 4) {
 		//what data is up the top of D5 VWSC?
@@ -476,7 +479,7 @@ void Score::loadFrames(Common::SeekableSubReadStreamEndian &stream) {
 	uint16 channelSize;
 	uint16 channelOffset;
 
-	Frame *initial = new Frame(_vm);
+	Frame *initial = new Frame(_vm, _numChannelsDisplayed);
 	// Push a frame at frame#0 position.
 	// This makes all indexing simpler
 	_frames.push_back(initial);
@@ -493,7 +496,7 @@ void Score::loadFrames(Common::SeekableSubReadStreamEndian &stream) {
 		debugC(kDebugLoading, 8, "++++++++++ score frame %d (frameSize %d) size %d", _frames.size(), frameSize, size);
 
 		if (frameSize > 0) {
-			Frame *frame = new Frame(_vm);
+			Frame *frame = new Frame(_vm, _numChannelsDisplayed);
 			size -= frameSize;
 			frameSize -= 2;
 
diff --git a/engines/director/score.h b/engines/director/score.h
index f8b7bf3..7545880 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -147,6 +147,8 @@ public:
 
 	uint16 _castIDoffset;
 
+	int _numChannelsDisplayed;
+
 private:
 	uint16 _versionMinor;
 	uint16 _versionMajor;




More information about the Scummvm-git-logs mailing list