[Scummvm-git-logs] scummvm master -> 4f49df9ff247c69eb8ce3e54a9a0312596fb0f9a

npjg nathanael.gentrydb8 at gmail.com
Mon Jul 27 03:49:57 UTC 2020


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

Summary:
b3b7ed19a4 DIRECTOR: Rework palette handling
1e38497d8a DIRECTOR: Properly read frame palette id
013c7276e7 DIRECTOR: Implement basic puppetPalette
3cb5b5acb4 DIRECTOR: LINGO: Implement kTheFramePalette
d6ac60a221 DIRECTOR: LINGO: Implement kTheFrameTempo
4f49df9ff2 DIRECTOR: LINGO: Implement palette of cast


Commit: b3b7ed19a4bf336c4190e924cc4105f0db7896dd
    https://github.com/scummvm/scummvm/commit/b3b7ed19a4bf336c4190e924cc4105f0db7896dd
Author: Nathanael Gentry (nathanael.gentrydb8 at gmail.com)
Date: 2020-07-26T23:46:06-04:00

Commit Message:
DIRECTOR: Rework palette handling

Now there is no static for default palettes. All the defaults have negative ids
anyway, so those are just protected by the new setter method.

Changed paths:
    engines/director/cast.cpp
    engines/director/cast.h
    engines/director/director.cpp
    engines/director/director.h
    engines/director/graphics.cpp
    engines/director/types.h


diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index d2211994b6..7d75a366d2 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -95,9 +95,6 @@ Cast::~Cast() {
 		for (Common::HashMap<int, CastMember *>::iterator it = _loadedCast->begin(); it != _loadedCast->end(); ++it)
 			delete it->_value;
 
-	for (uint i = 0; i < _loadedPalettes.size(); i++)
-		delete[] _loadedPalettes[i].palette;
-
 	delete _loadedStxts;
 	delete _loadedCast;
 	delete _lingoArchive;
@@ -211,7 +208,7 @@ bool Cast::loadArchive() {
 			Common::SeekableSubReadStreamEndian *pal = _castArchive->getResource(MKTAG('C', 'L', 'U', 'T'), clutList[i]);
 
 			debugC(2, kDebugLoading, "****** Loading Palette CLUT, #%d", clutList[i]);
-			loadPalette(*pal, i);
+			loadPalette(*pal, i + 1);
 
 			delete pal;
 		}
@@ -399,32 +396,20 @@ void Cast::loadConfig(Common::SeekableSubReadStreamEndian &stream) {
 		stream.readByte();
 	}
 
+	int palette = -1;
 	if (_vm->getVersion() >= 4) {
-		for (int i = 0; i < 0x16; i++) {
+		for (int i = 0; i < 0x16; i++)
 			stream.readByte();
-		}
 
-		int palette = (int16)stream.readUint16() - 1;
-		if (palette <= 0) {
-			// Builtin palette
-			_vm->setPalette(palette);
-		} else if ((uint)palette - 1 < _loadedPalettes.size()) {
-			// Loaded palette
-			PaletteV4 pal = _loadedPalettes[palette - 1];
-			_vm->setPalette(pal.palette, pal.length);
-		} else {
-			// Default palette
-			_vm->setPalette(-1);
-		}
+		palette = (int16)stream.readUint16() - 1;
 
-		for (int i = 0; i < 0x08; i++) {
+		for (int i = 0; i < 0x08; i++)
 			stream.readByte();
-		}
-	} else {
-		// Set default palette for earlier versions
-		_vm->setPalette(-1);
 	}
 
+	if (!_vm->setPalette(palette))
+		_vm->setPalette(-1);
+
 	debugC(1, kDebugLoading, "Cast::loadConfig(): len: %d, ver: %d, framerate: %d, light: %d, unk: %d, font: %d, size: %d"
 			", style: %d", len, ver1, currentFrameRate, lightswitch, unk1, commentFont, commentSize, commentStyle);
 	debugC(1, kDebugLoading, "Cast::loadConfig(): stagecolor: %d, depth: %d, color: %d, rgb: 0x%04x 0x%04x 0x%04x",
@@ -619,7 +604,7 @@ void Cast::loadPalette(Common::SeekableSubReadStreamEndian &stream, int id) {
 		index -= 3;
 	}
 
-	_loadedPalettes.push_back(PaletteV4(id, _palette, steps));
+	g_director->addPalette(id, _palette, steps);
 }
 
 void Cast::loadCastDataVWCR(Common::SeekableSubReadStreamEndian &stream) {
diff --git a/engines/director/cast.h b/engines/director/cast.h
index 0ddb358fc9..c76cb89af2 100644
--- a/engines/director/cast.h
+++ b/engines/director/cast.h
@@ -89,7 +89,6 @@ public:
 
 	Common::HashMap<int, CastMember *> *_loadedCast;
 	Common::HashMap<int, const Stxt *> *_loadedStxts;
-	Common::Array<PaletteV4> _loadedPalettes;
 	uint16 _castIDoffset;
 	uint16 _castArrayStart;
 	uint16 _castArrayEnd;
diff --git a/engines/director/director.cpp b/engines/director/director.cpp
index 4907d02c28..6bad75a7be 100644
--- a/engines/director/director.cpp
+++ b/engines/director/director.cpp
@@ -69,7 +69,7 @@ DirectorEngine::DirectorEngine(OSystem *syst, const DirectorGameDescription *gam
 	syncSoundSettings();
 
 	// Load Palettes
-	loadPalettes();
+	loadDefaultPalettes();
 
 	// Load Patterns
 	loadPatterns();
@@ -117,6 +117,8 @@ DirectorEngine::~DirectorEngine() {
 	for (Common::HashMap<Common::String, Archive *, Common::IgnoreCase_Hash, Common::IgnoreCase_EqualTo>::iterator it = _openResFiles.begin(); it != _openResFiles.end(); ++it) {
 		delete it->_value;
 	}
+
+	clearPalettes();
 }
 
 Archive *DirectorEngine::getMainArchive() const { return _currentStage->getMainArchive(); }
diff --git a/engines/director/director.h b/engines/director/director.h
index 159863acf9..c4c56654d4 100644
--- a/engines/director/director.h
+++ b/engines/director/director.h
@@ -107,6 +107,7 @@ struct PaletteV4 {
 	int length;
 
 	PaletteV4(int i, byte *p, int l) : id(i), palette(p), length(l) {}
+	PaletteV4() : id(0), palette(nullptr), length(0) {}
 };
 
 struct MacShape {
@@ -184,10 +185,12 @@ public:
 	Common::String getCurrentPath() const;
 
 	// graphics.cpp
-	void setPalette(int id);
+	void addPalette(int id, byte *palette, int length);
+	bool setPalette(int id);
 	void setPalette(byte *palette, uint16 count);
+	void clearPalettes();
 	bool hasFeature(EngineFeature f) const override;
-	void loadPalettes();
+	void loadDefaultPalettes();
 	const byte *getPalette() const { return _currentPalette; }
 	uint16 getPaletteColorCount() const { return _currentPaletteLength; }
 	void loadPatterns();
@@ -238,7 +241,7 @@ private:
 	Graphics::MacPatterns _director3Patterns;
 	Graphics::MacPatterns _director3QuickDrawPatterns;
 
-	Common::HashMap<int, PaletteV4 *> _director4Palettes;
+	Common::HashMap<int, PaletteV4> _loadedPalettes;
 };
 
 extern DirectorEngine *g_director;
diff --git a/engines/director/graphics.cpp b/engines/director/graphics.cpp
index 7103b5821a..42a9022d0e 100644
--- a/engines/director/graphics.cpp
+++ b/engines/director/graphics.cpp
@@ -563,19 +563,6 @@ static byte winPalette[768] = {
 };
 
 
-static PaletteV4 director4Palettes[] = {
-	PaletteV4(-1, macPalette, 256),
-	PaletteV4(-2, rainbowPalette, 256),
-	PaletteV4(-3, grayscalePalette, 256),
-	PaletteV4(-4, pastelsPalette, 256),
-	PaletteV4(-5, vividPalette, 256),
-	PaletteV4(-6, ntscPalette, 256),
-	PaletteV4(-7, metallicPalette, 256),
-	PaletteV4(-101, winPalette, 256),
-	PaletteV4(0, nullptr, 0)
-};
-
-
 static byte director3Patterns[][8] = {
 	{ 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF },
 	{ 0xFF, 0xFF, 0x77, 0xFF, 0xFF, 0xFF, 0x77, 0xFF },
@@ -754,19 +741,40 @@ Graphics::MacPatterns &DirectorEngine::getPatterns() {
 	return _director3QuickDrawPatterns;
 }
 
-void DirectorEngine::loadPalettes() {
-	for (PaletteV4 *pal = director4Palettes; pal->id != 0; pal++) {
-		_director4Palettes[pal->id] = pal;
+void DirectorEngine::loadDefaultPalettes() {
+	_loadedPalettes[kClutSystemMac] = PaletteV4(kClutSystemMac, macPalette, 256);
+	_loadedPalettes[kClutRainbow] = PaletteV4(kClutRainbow, rainbowPalette, 256);
+	_loadedPalettes[kClutGrayscale] = PaletteV4(kClutGrayscale, grayscalePalette, 256);
+	_loadedPalettes[kClutPastels] = PaletteV4(kClutPastels, pastelsPalette, 256);
+	_loadedPalettes[kClutVivid] = PaletteV4(kClutVivid, vividPalette, 256);
+	_loadedPalettes[kClutNTSC] = PaletteV4(kClutNTSC, ntscPalette, 256);
+	_loadedPalettes[kClutMetallic] = PaletteV4(kClutMetallic, metallicPalette, 256);
+	_loadedPalettes[kClutSystemWin] = PaletteV4(kClutSystemWin, winPalette, 256);
+}
+
+void DirectorEngine::addPalette(int id, byte *palette, int length) {
+	if (id < 0) {
+		warning("DirectorEngine::addPalette(): Negative palette ids reserved for default palettes");
+		return;
+	} else if (_loadedPalettes.contains(id)) {
+		// TODO: Can castmember palettes conflict with those in the cast config?
+		warning("DirectorEngine::addPalette(): Attempting to replace palette %d", id);
+		return;
 	}
+
+	_loadedPalettes[id] = PaletteV4(id, palette, length);
 }
 
-void DirectorEngine::setPalette(int id) {
-	if (!_director4Palettes.contains(id)) {
+bool DirectorEngine::setPalette(int id) {
+	if (!_loadedPalettes.contains(id)) {
 		warning("setPalette(): no palette with matching id %d", id);
-		return;
+		return false;
 	}
-	PaletteV4 *pal = _director4Palettes[id];
-	setPalette(pal->palette, pal->length);
+
+	PaletteV4 pal = _loadedPalettes[id];
+	setPalette(pal.palette, pal.length);
+
+	return true;
 }
 
 void DirectorEngine::setPalette(byte *palette, uint16 count) {
@@ -777,6 +785,13 @@ void DirectorEngine::setPalette(byte *palette, uint16 count) {
 	_wm->passPalette(palette, count);
 }
 
+void DirectorEngine::clearPalettes() {
+	for (Common::HashMap<int, PaletteV4>::iterator it = _loadedPalettes.begin(); it != _loadedPalettes.end(); ++it) {
+		if (it->_value.id > 0)
+			delete[] it->_value.palette;
+	}
+}
+
 void DirectorEngine::setCursor(int type) {
 	switch (type) {
 	case kCursorDefault:
diff --git a/engines/director/types.h b/engines/director/types.h
index 3891bc220c..e25bd9039f 100644
--- a/engines/director/types.h
+++ b/engines/director/types.h
@@ -274,14 +274,14 @@ enum TransitionType {
 
 // TODO: Can there be any more built-in palette types?
 enum PaletteType {
- kClutSystemMac = 0x0000,
- kClutSystemWin = 0xff9c,
- kClutRainbow = 0xffff,
- kClutGrayscale = 0xfffe,
- kClutPastels = 0xfffd,
- kClutVivid = 0xfffc,
- kClutNTSC = 0xfffb,
- kClutMetallic = 0xfffa
+ kClutSystemMac = -1,
+ kClutRainbow = -2,
+ kClutGrayscale = -3,
+ kClutPastels = -4,
+ kClutVivid = -5,
+ kClutNTSC = -6,
+ kClutMetallic = -7,
+ kClutSystemWin = -101
 };
 
 enum {


Commit: 1e38497d8a8a09b3c9aee8f5b371e67f07203d10
    https://github.com/scummvm/scummvm/commit/1e38497d8a8a09b3c9aee8f5b371e67f07203d10
Author: Nathanael Gentry (nathanael.gentrydb8 at gmail.com)
Date: 2020-07-26T23:46:06-04:00

Commit Message:
DIRECTOR: Properly read frame palette id

Changed paths:
    engines/director/frame.cpp
    engines/director/frame.h


diff --git a/engines/director/frame.cpp b/engines/director/frame.cpp
index 35fd5ba245..90c862158d 100644
--- a/engines/director/frame.cpp
+++ b/engines/director/frame.cpp
@@ -211,7 +211,7 @@ void Frame::readChannels(Common::ReadStreamEndian *stream) {
 		_colorTrans = stream->readByte();
 
 		// palette
-		_palette.paletteId = stream->readUint16();
+		_palette.paletteId = stream->readSint16();
 		_palette.firstColor = stream->readByte(); // for cycles. note: these start at 0x80 (for pal entry 0)!
 		_palette.lastColor = stream->readByte();
 		_palette.flags = stream->readByte();
diff --git a/engines/director/frame.h b/engines/director/frame.h
index ca1cd24f49..51c0b0fb56 100644
--- a/engines/director/frame.h
+++ b/engines/director/frame.h
@@ -47,7 +47,7 @@ enum {
 };
 
 struct PaletteInfo {
-	uint16 paletteId;
+	int paletteId;
 
 	byte firstColor;
 	byte lastColor;


Commit: 013c7276e70bd746edfca8e3a2be57071116a597
    https://github.com/scummvm/scummvm/commit/013c7276e70bd746edfca8e3a2be57071116a597
Author: Nathanael Gentry (nathanael.gentrydb8 at gmail.com)
Date: 2020-07-26T23:46:06-04:00

Commit Message:
DIRECTOR: Implement basic puppetPalette

Right now, only changing the palette itself is supported. Fades and other fancy
features will come later, as needed.

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


diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 6ef172b7b1..82eaee6c98 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -1723,10 +1723,62 @@ void LB::b_pasteClipBoardInto(int nargs) {
 
 void LB::b_puppetPalette(int nargs) {
 	g_lingo->convertVOIDtoString(0, nargs);
+	int numFrames = 0, speed = 0, palette = 0;
+	Datum d;
 
-	g_lingo->printSTUBWithArglist("b_puppetPalette", nargs);
+	switch (nargs) {
+	case 3:
+		numFrames = g_lingo->pop().asInt();
+		// fall through
+	case 2:
+		speed = g_lingo->pop().asInt();
+		// fall through
+	case 1:
+		d = g_lingo->pop();
+
+		if (d.type == STRING) {
+			// TODO: It seems that there are not strings for Mac and Win system palette
+			Common::String palStr = d.asString();
+			if (palStr.equalsIgnoreCase("Rainbow")) {
+				palette = kClutRainbow;
+			} else if (palStr.equalsIgnoreCase("Grayscale")) {
+				palette = kClutGrayscale;
+			} else if (palStr.equalsIgnoreCase("Pastels")) {
+				palette = kClutPastels;
+			} else if (palStr.equalsIgnoreCase("Vivid")) {
+				palette = kClutVivid;
+			} else if (palStr.equalsIgnoreCase("NTSC")) {
+				palette = kClutMetallic;
+			} else if (palStr.equalsIgnoreCase("Metallic")) {
+				palette = kClutSystemWin;
+			} else {
+				CastMember *member = g_director->getCurrentMovie()->getCastMemberByName(palStr);
 
-	g_lingo->dropStack(nargs);
+				if (member && member->_type == kCastPalette)
+					palette = member->getID();
+			}
+		} else {
+			palette = d.asInt();
+		}
+		break;
+	default:
+		ARGNUMCHECK(1);
+		g_lingo->dropStack(nargs);
+		return;
+	}
+
+	if (palette) {
+		g_director->setPalette(palette);
+		g_director->getCurrentMovie()->getScore()->_puppetPalette = true;
+	} else {
+		// Setting puppetPalette to 0 disables it (Lingo Dictionary, 226)
+		g_director->setPalette(g_director->getCurrentMovie()->getScore()->_lastPalette);
+		g_director->getCurrentMovie()->getScore()->_puppetPalette = false;
+	}
+
+	// TODO: Implement advanced features that use these.
+	if (numFrames || speed)
+		warning("b_puppetPalette: Skipping extra features");
 }
 
 void LB::b_puppetSound(int nargs) {
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index af799189d8..335f4b4384 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -54,7 +54,10 @@ Score::Score(Movie *movie) {
 	_lingo = _vm->getLingo();
 
 	_soundManager = _vm->getSoundManager();
+
 	_puppetTempo = 0x00;
+	_puppetPalette = false;
+	_lastPalette = 0;
 
 	_labels = nullptr;
 	_currentCursor = nullptr;
@@ -405,6 +408,12 @@ void Score::renderFrame(uint16 frameId, RenderMode mode) {
 	if (!renderTransition(frameId))
 		renderSprites(frameId, mode);
 
+	int currentPalette = _frames[frameId]->_palette.paletteId;
+	if (!_puppetPalette && currentPalette != _lastPalette) {
+		_lastPalette = currentPalette;
+		g_director->setPalette(currentPalette);
+	}
+
 	_stage->render();
 
 	if (_frames[frameId]->_sound1 || _frames[frameId]->_sound2)
diff --git a/engines/director/score.h b/engines/director/score.h
index 9617146bb8..b623ce4c2b 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -120,6 +120,9 @@ public:
 	byte _currentFrameRate;
 
 	byte _puppetTempo;
+	bool _puppetPalette;
+	int _lastPalette;
+
 	PlayState _playState;
 	uint32 _nextFrameTime;
 	int _waitForChannel;


Commit: 3cb5b5acb4c41d9217eff46bce00039aea137cb3
    https://github.com/scummvm/scummvm/commit/3cb5b5acb4c41d9217eff46bce00039aea137cb3
Author: Nathanael Gentry (nathanael.gentrydb8 at gmail.com)
Date: 2020-07-26T23:46:06-04:00

Commit Message:
DIRECTOR: LINGO: Implement kTheFramePalette

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


diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index 571e4454cb..db016d2dcf 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -431,7 +431,8 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) {
 		getTheEntitySTUB(kTheFrameScript);
 		break;
 	case kTheFramePalette:
-		getTheEntitySTUB(kTheFramePalette);
+		d.type = INT;
+		d.u.i = _vm->getCurrentMovie()->getScore()->getCurrentPalette();
 		break;
 	case kTheFrameTempo:
 		getTheEntitySTUB(kTheFrameTempo);
@@ -814,6 +815,9 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) {
 #define setTheEntitySTUB(entity) \
 	warning("Lingo::setTheEntity(): Unprocessed setting entity %s", entity2str(entity));
 
+#define setTheEntityReadOnly(entity) \
+	warning("Lingo::setTheEntity: Attempt to set read-only entity %s", entity2str(entity));
+
 void Lingo::setTheEntity(int entity, Datum &id, int field, Datum &d) {
 	if (debugChannelSet(3, kDebugLingoExec)) {
 		debugC(3, kDebugLingoExec, "Lingo::setTheEntity(%s, %s, %s, %s)", entity2str(entity), id.asString(true).c_str(), field2str(field), d.asString(true).c_str());
@@ -871,7 +875,7 @@ void Lingo::setTheEntity(int entity, Datum &id, int field, Datum &d) {
 		setTheEntitySTUB(kTheFrameScript);
 		break;
 	case kTheFramePalette:
-		setTheEntitySTUB(kTheFramePalette);
+		setTheEntityReadOnly(kTheFramePalette);
 		break;
 	case kTheFullColorPermit:
 		// No op in ScummVM. We always allow it
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 335f4b4384..f692c38315 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -90,6 +90,10 @@ Score::~Score() {
 	delete _labels;
 }
 
+int Score::getCurrentPalette() {
+	return _frames[_currentFrame]->_palette.paletteId;
+}
+
 bool Score::processImmediateFrameScript(Common::String s, int id) {
 	s.trim();
 
diff --git a/engines/director/score.h b/engines/director/score.h
index b623ce4c2b..95dd6d2a84 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -81,8 +81,11 @@ public:
 	void startPlay();
 	void step();
 	void stopPlay();
+
 	void setCurrentFrame(uint16 frameId) { _nextFrame = frameId; }
 	uint16 getCurrentFrame() { return _currentFrame; }
+	int getCurrentPalette();
+
 	Channel *getChannelById(uint16 id);
 	Sprite *getSpriteById(uint16 id);
 


Commit: d6ac60a2210bdc1a2fd8f910ddde4d64933bbbc4
    https://github.com/scummvm/scummvm/commit/d6ac60a2210bdc1a2fd8f910ddde4d64933bbbc4
Author: Nathanael Gentry (nathanael.gentrydb8 at gmail.com)
Date: 2020-07-26T23:46:06-04:00

Commit Message:
DIRECTOR: LINGO: Implement kTheFrameTempo

Changed paths:
    engines/director/lingo/lingo-the.cpp


diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index db016d2dcf..dd80ff26f9 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -435,7 +435,8 @@ Datum Lingo::getTheEntity(int entity, Datum &id, int field) {
 		d.u.i = _vm->getCurrentMovie()->getScore()->getCurrentPalette();
 		break;
 	case kTheFrameTempo:
-		getTheEntitySTUB(kTheFrameTempo);
+		d.type = INT;
+		d.u.i = _vm->getCurrentMovie()->getScore()->_currentFrameRate;
 		break;
 	case kTheFreeBlock:
 	case kTheFreeBytes:
@@ -877,6 +878,9 @@ void Lingo::setTheEntity(int entity, Datum &id, int field, Datum &d) {
 	case kTheFramePalette:
 		setTheEntityReadOnly(kTheFramePalette);
 		break;
+	case kTheFrameTempo:
+		setTheEntityReadOnly(kTheFramePalette);
+		break;
 	case kTheFullColorPermit:
 		// No op in ScummVM. We always allow it
 		break;


Commit: 4f49df9ff247c69eb8ce3e54a9a0312596fb0f9a
    https://github.com/scummvm/scummvm/commit/4f49df9ff247c69eb8ce3e54a9a0312596fb0f9a
Author: Nathanael Gentry (nathanael.gentrydb8 at gmail.com)
Date: 2020-07-26T23:46:06-04:00

Commit Message:
DIRECTOR: LINGO: Implement palette of cast

Bitmap cast members also now have palette read in correctly, since the CLUT
field can refer to a castmember and not just one of the builtin fields.

Changed paths:
    engines/director/castmember.cpp
    engines/director/castmember.h
    engines/director/lingo/lingo-the.cpp


diff --git a/engines/director/castmember.cpp b/engines/director/castmember.cpp
index 5c9415327c..c8980842c9 100644
--- a/engines/director/castmember.cpp
+++ b/engines/director/castmember.cpp
@@ -70,7 +70,7 @@ BitmapCastMember::BitmapCastMember(Cast *cast, uint16 castId, Common::SeekableRe
 
 		if (_bytes & 0x8000) {
 			_bitsPerPixel = stream.readUint16();
-			_clut = (PaletteType)stream.readUint16();
+			_clut = stream.readSint16() - 1;
 		} else {
 			_bitsPerPixel = 1;
 			_clut = kClutSystemMac;
@@ -95,7 +95,7 @@ BitmapCastMember::BitmapCastMember(Cast *cast, uint16 castId, Common::SeekableRe
 		if (stream.eos()) {
 			_bitsPerPixel = 0;
 		} else {
-			_clut = (PaletteType)stream.readUint16();
+			_clut = stream.readSint16() - 1;
 			stream.readUint16();
 			/* uint16 unk1 = */ stream.readUint16();
 			stream.readUint16();
diff --git a/engines/director/castmember.h b/engines/director/castmember.h
index 671143270b..898e7fd139 100644
--- a/engines/director/castmember.h
+++ b/engines/director/castmember.h
@@ -105,7 +105,7 @@ public:
 	uint16 _regY;
 	uint16 _flags2;
 	uint16 _bytes;
-	PaletteType _clut;
+	int _clut;
 
 	uint16 _bitsPerPixel;
 
diff --git a/engines/director/lingo/lingo-the.cpp b/engines/director/lingo/lingo-the.cpp
index dd80ff26f9..d350eaca78 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -1503,7 +1503,8 @@ Datum Lingo::getTheCast(Datum &id1, int field) {
 		warning("STUB: Lingo::getTheCast(): Unprocessed getting field \"%s\" of cast %d", field2str(field), id);
 		break;
 	case kThePalette:
-		warning("STUB: Lingo::getTheCast(): Unprocessed getting field \"%s\" of cast %d", field2str(field), id);
+		if (member->_type == kCastBitmap)
+			d.u.i = ((BitmapCastMember *)member)->_clut;
 		break;
 	case kThePicture:
 		warning("STUB: Lingo::getTheCast(): Unprocessed getting field \"%s\" of cast %d", field2str(field), id);
@@ -1697,7 +1698,8 @@ void Lingo::setTheCast(Datum &id1, int field, Datum &d) {
 		warning("STUB: Lingo::setTheCast(): Unprocessed setting field \"%s\" of cast %d", field2str(field), id);
 		break;
 	case kThePalette:
-		warning("STUB: Lingo::setTheCast(): Unprocessed setting field \"%s\" of cast %d", field2str(field), id);
+		if (member->_type == kCastBitmap)
+			((BitmapCastMember *)member)->_clut = d.asInt();
 		break;
 	case kThePicture:
 		warning("STUB: Lingo::setTheCast(): Unprocessed setting field \"%s\" of cast %d", field2str(field), id);




More information about the Scummvm-git-logs mailing list