[Scummvm-git-logs] scummvm master -> 600d15b491470cf7dc2e1ba907670fb0df58bab2
npjg
nathanael.gentrydb8 at gmail.com
Mon Jul 27 22:06:03 UTC 2020
This automated email contains information about 3 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
ea75044ae1 DIRECTOR: Load palette castmembers
95f731d52f DIRECTOR: Rename loadSpriteImages
600d15b491 DIRECTOR: Implement palette of cast workaround
Commit: ea75044ae140b22f49ca8febfae1eae3d994adaf
https://github.com/scummvm/scummvm/commit/ea75044ae140b22f49ca8febfae1eae3d994adaf
Author: Nathanael Gentry (nathanael.gentrydb8 at gmail.com)
Date: 2020-07-27T18:04:12-04:00
Commit Message:
DIRECTOR: Load palette castmembers
The loadPalette is also turned into a value-returning function.
Changed paths:
engines/director/cast.cpp
engines/director/cast.h
engines/director/castmember.cpp
engines/director/castmember.h
engines/director/director.cpp
engines/director/director.h
engines/director/graphics.cpp
engines/director/lingo/lingo-builtins.cpp
engines/director/score.cpp
engines/director/score.h
diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 7d75a366d2..95dd314116 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -78,6 +78,8 @@ Cast::Cast(Movie *movie, bool isShared) {
_loadedStxts = nullptr;
_loadedCast = nullptr;
+
+ _defaultPalette = -1;
}
Cast::~Cast() {
@@ -208,8 +210,8 @@ 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 + 1);
-
+ PaletteV4 p = loadPalette(*pal);
+ g_director->addPalette(clutList[i], p.palette, p.length);
delete pal;
}
}
@@ -396,20 +398,16 @@ void Cast::loadConfig(Common::SeekableSubReadStreamEndian &stream) {
stream.readByte();
}
- int palette = -1;
if (_vm->getVersion() >= 4) {
for (int i = 0; i < 0x16; i++)
stream.readByte();
- palette = (int16)stream.readUint16() - 1;
+ _defaultPalette = (int16)stream.readUint16();
for (int i = 0; i < 0x08; i++)
stream.readByte();
}
- 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",
@@ -448,9 +446,22 @@ void Cast::loadSpriteImages() {
if (!c->_value)
continue;
- if (c->_value->_type != kCastBitmap)
+ // First, handle palettes
+ if (c->_value->_type != kCastBitmap) {
+ if (c->_value->_type == kCastPalette) {
+ PaletteCastMember *member = ((PaletteCastMember *)c->_value);
+ if (member->_children.size() != 1) {
+ warning("Cast::loadSpriteChildren: Expected 1 child for palette cast, got %d", member->_children.size());
+ continue;
+ }
+
+ member->_palette = g_director->getPalette(member->_children[0].index);
+ }
+
continue;
+ }
+ // Then handle bitmaps
BitmapCastMember *bitmapCast = (BitmapCastMember *)c->_value;
uint32 tag = bitmapCast->_tag;
uint16 imgId = c->_key;
@@ -580,7 +591,7 @@ void Cast::loadSpriteSounds() {
}
}
-void Cast::loadPalette(Common::SeekableSubReadStreamEndian &stream, int id) {
+PaletteV4 Cast::loadPalette(Common::SeekableSubReadStreamEndian &stream) {
uint16 steps = stream.size() / 6;
uint16 index = (steps * 3) - 1;
byte *_palette = new byte[index + 1];
@@ -604,7 +615,7 @@ void Cast::loadPalette(Common::SeekableSubReadStreamEndian &stream, int id) {
index -= 3;
}
- g_director->addPalette(id, _palette, steps);
+ return PaletteV4(0, _palette, steps);
}
void Cast::loadCastDataVWCR(Common::SeekableSubReadStreamEndian &stream) {
@@ -799,8 +810,8 @@ void Cast::loadCastData(Common::SeekableSubReadStreamEndian &stream, uint16 id,
castInfoSize = 0;
break;
case kCastPalette:
- warning("STUB: Cast::loadCastData(): kCastPalette (%d children)", res->children.size());
- castInfoSize = 0;
+ debugC(3, kDebugLoading, "Cast::loadCastData(): loading kCastPalette (%d children)", res->children.size());
+ _loadedCast->setVal(id, new PaletteCastMember(this, id, castStream, _vm->getVersion()));
break;
case kCastPicture:
warning("STUB: Cast::loadCastData(): kCastPicture (%d children)", res->children.size());
diff --git a/engines/director/cast.h b/engines/director/cast.h
index c76cb89af2..5e6772d7d3 100644
--- a/engines/director/cast.h
+++ b/engines/director/cast.h
@@ -78,7 +78,7 @@ public:
void dumpScript(const char *script, ScriptType type, uint16 id);
private:
- void loadPalette(Common::SeekableSubReadStreamEndian &stream, int id);
+ PaletteV4 loadPalette(Common::SeekableSubReadStreamEndian &stream);
void loadScriptText(Common::SeekableSubReadStreamEndian &stream);
void loadFontMap(Common::SeekableSubReadStreamEndian &stream);
Common::String getString(Common::String str);
@@ -93,6 +93,8 @@ public:
uint16 _castArrayStart;
uint16 _castArrayEnd;
+ int _defaultPalette;
+
uint16 _movieScriptCount;
LingoArchive *_lingoArchive;
diff --git a/engines/director/castmember.cpp b/engines/director/castmember.cpp
index c8980842c9..f1c20f052e 100644
--- a/engines/director/castmember.cpp
+++ b/engines/director/castmember.cpp
@@ -642,4 +642,10 @@ void RTECastMember::loadChunks() {
#endif
}
-} // End of namespace Director
+PaletteCastMember::PaletteCastMember(Cast *cast, uint16 castId, Common::SeekableReadStreamEndian &stream, uint16 version)
+ : CastMember(cast, castId, stream) {
+ _type = kCastPalette;
+ _palette = nullptr;
+}
+
+} // end of namespace Director
diff --git a/engines/director/castmember.h b/engines/director/castmember.h
index 898e7fd139..2ede8a81c3 100644
--- a/engines/director/castmember.h
+++ b/engines/director/castmember.h
@@ -249,6 +249,15 @@ struct Label {
Label(Common::String name1, uint16 number1) { name = name1; number = number1; }
};
+class PaletteCastMember : public CastMember {
+public:
+ PaletteCastMember(Cast *cast, uint16 castId, Common::SeekableReadStreamEndian &stream, uint16 version);
+ int getPaletteId() { return _palette ? _palette->id : 0; }
+ void activatePalette() { if (_palette) g_director->setPalette(_palette->id); }
+
+ PaletteV4 *_palette;
+};
+
} // End of namespace Director
#endif
diff --git a/engines/director/director.cpp b/engines/director/director.cpp
index 0371f8ff40..8ec235a211 100644
--- a/engines/director/director.cpp
+++ b/engines/director/director.cpp
@@ -80,7 +80,6 @@ DirectorEngine::DirectorEngine(OSystem *syst, const DirectorGameDescription *gam
_soundManager = nullptr;
_currentPalette = nullptr;
_currentPaletteLength = 0;
- _currentPaletteId = 0;
_mainStage = nullptr;
_windowList = new Datum;
_windowList->type = ARRAY;
@@ -162,6 +161,8 @@ Common::Error DirectorEngine::run() {
_wm->setScreen(_surface);
_wm->addWindowInitialized(_mainStage);
_wm->setActiveWindow(_mainStage->getId());
+ setPalette(-1);
+
_currentStage = _mainStage;
_lingo = new Lingo(this);
diff --git a/engines/director/director.h b/engines/director/director.h
index a27a6542ca..6751d9c567 100644
--- a/engines/director/director.h
+++ b/engines/director/director.h
@@ -185,15 +185,18 @@ public:
Common::String getCurrentPath() const;
// graphics.cpp
+ bool hasFeature(EngineFeature f) const override;
+
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;
+ PaletteV4 *getPalette(int id);
void loadDefaultPalettes();
+
const byte *getPalette() const { return _currentPalette; }
uint16 getPaletteColorCount() const { return _currentPaletteLength; }
- int getPaletteId() const { return _currentPaletteId; }
+
void loadPatterns();
uint32 transformColor(uint32 color);
Graphics::MacPatterns &getPatterns();
@@ -233,7 +236,6 @@ private:
DirectorSound *_soundManager;
byte *_currentPalette;
uint16 _currentPaletteLength;
- int _currentPaletteId;
Lingo *_lingo;
Stage *_mainStage;
diff --git a/engines/director/graphics.cpp b/engines/director/graphics.cpp
index c0cbefe2ac..25a85fb27b 100644
--- a/engines/director/graphics.cpp
+++ b/engines/director/graphics.cpp
@@ -752,6 +752,15 @@ void DirectorEngine::loadDefaultPalettes() {
_loadedPalettes[kClutSystemWin] = PaletteV4(kClutSystemWin, winPalette, 256);
}
+PaletteV4 *DirectorEngine::getPalette(int id) {
+ if (!_loadedPalettes.contains(id)) {
+ warning("DirectorEngine::addPalette(): Palette %d not found", id);
+ return nullptr;
+ }
+
+ return &_loadedPalettes[id];
+}
+
void DirectorEngine::addPalette(int id, byte *palette, int length) {
if (id < 0) {
warning("DirectorEngine::addPalette(): Negative palette ids reserved for default palettes");
@@ -766,14 +775,16 @@ void DirectorEngine::addPalette(int id, byte *palette, int length) {
}
bool DirectorEngine::setPalette(int id) {
- if (!_loadedPalettes.contains(id)) {
+ if (id == 0) {
+ // Palette id of 0 is unused
+ return false;
+ } else if (!_loadedPalettes.contains(id)) {
warning("setPalette(): no palette with matching id %d", id);
return false;
}
PaletteV4 pal = _loadedPalettes[id];
setPalette(pal.palette, pal.length);
- _currentPaletteId = id;
return true;
}
@@ -787,8 +798,6 @@ void DirectorEngine::setPalette(byte *palette, uint16 count) {
}
void DirectorEngine::clearPalettes() {
- _currentPaletteId = 0;
-
for (Common::HashMap<int, PaletteV4>::iterator it = _loadedPalettes.begin(); it != _loadedPalettes.end(); ++it) {
if (it->_value.id > 0)
delete[] it->_value.palette;
diff --git a/engines/director/lingo/lingo-builtins.cpp b/engines/director/lingo/lingo-builtins.cpp
index 454ba85a34..1a6ad4e5e7 100644
--- a/engines/director/lingo/lingo-builtins.cpp
+++ b/engines/director/lingo/lingo-builtins.cpp
@@ -1755,10 +1755,13 @@ void LB::b_puppetPalette(int nargs) {
CastMember *member = g_director->getCurrentMovie()->getCastMemberByName(palStr);
if (member && member->_type == kCastPalette)
- palette = member->getID();
+ palette = ((PaletteCastMember *)member)->getPaletteId();
}
} else {
- palette = d.asInt();
+ CastMember *member = g_director->getCurrentMovie()->getCastMember(d.asInt());
+
+ if (member && member->_type == kCastPalette)
+ palette = ((PaletteCastMember *)member)->getPaletteId();
}
break;
default:
diff --git a/engines/director/score.cpp b/engines/director/score.cpp
index 267cd09e8d..92581f6294 100644
--- a/engines/director/score.cpp
+++ b/engines/director/score.cpp
@@ -94,6 +94,15 @@ int Score::getCurrentPalette() {
return _frames[_currentFrame]->_palette.paletteId;
}
+int Score::resolvePaletteId(int id) {
+ if (id > 0) {
+ CastMember *member = _movie->getCastMember(id);
+ id = (member && member->_type == kCastPalette) ? ((PaletteCastMember *)member)->getPaletteId() : 0;
+ }
+
+ return id;
+}
+
bool Score::processImmediateFrameScript(Common::String s, int id) {
s.trim();
@@ -228,7 +237,9 @@ void Score::startPlay() {
_currentFrame = 0;
_playState = kPlayStarted;
_nextFrameTime = 0;
- _lastPalette = _vm->getPaletteId();
+
+ _lastPalette = _movie->getCast()->_defaultPalette;
+ _vm->setPalette(resolvePaletteId(_lastPalette));
if (_frames.size() <= 1) { // We added one empty sprite
warning("Score::startLoop(): Movie has no frames");
@@ -416,7 +427,7 @@ void Score::renderFrame(uint16 frameId, RenderMode mode) {
int currentPalette = _frames[frameId]->_palette.paletteId;
if (!_puppetPalette && currentPalette != 0 && currentPalette != _lastPalette) {
_lastPalette = currentPalette;
- g_director->setPalette(currentPalette);
+ g_director->setPalette(resolvePaletteId(currentPalette));
}
_stage->render();
diff --git a/engines/director/score.h b/engines/director/score.h
index e5392bebf2..eb884ad496 100644
--- a/engines/director/score.h
+++ b/engines/director/score.h
@@ -85,6 +85,7 @@ public:
void setCurrentFrame(uint16 frameId) { _nextFrame = frameId; }
uint16 getCurrentFrame() { return _currentFrame; }
int getCurrentPalette();
+ int resolvePaletteId(int id);
Channel *getChannelById(uint16 id);
Sprite *getSpriteById(uint16 id);
Commit: 95f731d52fc3af335b5dbf34fda583cd938c40ac
https://github.com/scummvm/scummvm/commit/95f731d52fc3af335b5dbf34fda583cd938c40ac
Author: Nathanael Gentry (nathanael.gentrydb8 at gmail.com)
Date: 2020-07-27T18:04:12-04:00
Commit Message:
DIRECTOR: Rename loadSpriteImages
Resource children are not accessible to the castmember constructors, and palette
casts store their information in the child. So we load palettes in addition to
bitmaps here.
Changed paths:
engines/director/cast.cpp
engines/director/cast.h
diff --git a/engines/director/cast.cpp b/engines/director/cast.cpp
index 95dd314116..48813c8b3a 100644
--- a/engines/director/cast.cpp
+++ b/engines/director/cast.cpp
@@ -351,7 +351,7 @@ bool Cast::loadArchive() {
}
copyCastStxts();
- loadSpriteImages();
+ loadCastChildren();
loadSpriteSounds();
return true;
@@ -437,8 +437,8 @@ void Cast::copyCastStxts() {
}
}
-void Cast::loadSpriteImages() {
- debugC(1, kDebugLoading, "****** Preloading sprite images");
+void Cast::loadCastChildren() {
+ debugC(1, kDebugLoading, "****** Preloading sprite palettes and images");
Cast *sharedCast = _movie ? _movie->getSharedCast() : nullptr;
@@ -451,7 +451,7 @@ void Cast::loadSpriteImages() {
if (c->_value->_type == kCastPalette) {
PaletteCastMember *member = ((PaletteCastMember *)c->_value);
if (member->_children.size() != 1) {
- warning("Cast::loadSpriteChildren: Expected 1 child for palette cast, got %d", member->_children.size());
+ warning("Cast::loadSpriteChildren(): Expected 1 child for palette cast, got %d", member->_children.size());
continue;
}
@@ -491,7 +491,7 @@ void Cast::loadSpriteImages() {
}
if (pic == NULL) {
- warning("Cast::loadSpriteImages(): Image %d not found", imgId);
+ warning("Cast::loadCastChildren(): Bitmap image %d not found", imgId);
continue;
}
@@ -514,13 +514,13 @@ void Cast::loadSpriteImages() {
img = new Image::BitmapDecoder();
}
} else {
- warning("Cast::loadSpriteImages(): Image %d not found", imgId);
+ warning("Cast::loadCastChildren(): Bitmap image %d not found", imgId);
}
break;
default:
- warning("Cast::loadSpriteImages(): Unknown Bitmap CastMember Tag: [%d] %s", tag, tag2str(tag));
+ warning("Cast::loadCastChildren(): Unknown Bitmap CastMember Tag: [%d] %s", tag, tag2str(tag));
break;
}
@@ -535,7 +535,7 @@ void Cast::loadSpriteImages() {
delete pic;
- debugC(4, kDebugImages, "Cast::loadSpriteImages(): id: %d, w: %d, h: %d, flags1: %x, flags2: %x bytes: %x, bpp: %d clut: %x", imgId, w, h, bitmapCast->_flags1, bitmapCast->_flags2, bitmapCast->_bytes, bitmapCast->_bitsPerPixel, bitmapCast->_clut);
+ debugC(4, kDebugImages, "Cast::loadCastChildren(): Bitmap: id: %d, w: %d, h: %d, flags1: %x, flags2: %x bytes: %x, bpp: %d clut: %x", imgId, w, h, bitmapCast->_flags1, bitmapCast->_flags2, bitmapCast->_bytes, bitmapCast->_bitsPerPixel, bitmapCast->_clut);
}
}
diff --git a/engines/director/cast.h b/engines/director/cast.h
index 5e6772d7d3..645e93e8cc 100644
--- a/engines/director/cast.h
+++ b/engines/director/cast.h
@@ -63,7 +63,7 @@ public:
void loadLingoNames(Common::SeekableSubReadStreamEndian &stream);
void loadLingoContext(Common::SeekableSubReadStreamEndian &stream);
- void loadSpriteImages();
+ void loadCastChildren();
void loadSpriteSounds();
void copyCastStxts();
Commit: 600d15b491470cf7dc2e1ba907670fb0df58bab2
https://github.com/scummvm/scummvm/commit/600d15b491470cf7dc2e1ba907670fb0df58bab2
Author: Nathanael Gentry (nathanael.gentrydb8 at gmail.com)
Date: 2020-07-27T18:04:12-04:00
Commit Message:
DIRECTOR: Implement palette of cast workaround
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 d350eaca78..161fe05711 100644
--- a/engines/director/lingo/lingo-the.cpp
+++ b/engines/director/lingo/lingo-the.cpp
@@ -1877,6 +1877,15 @@ Datum Lingo::getObjectProp(Datum &obj, Common::String &propName) {
d = obj.u.parr->operator[](index - 1).v;
}
return d;
+ } else if (obj.type == CASTREF) {
+ // WORKAROUND: Until CastMembers are made Lingo objects
+ if (propName.equalsIgnoreCase("palette")) {
+ d.type = INT;
+ CastMember *member = _vm->getCurrentMovie()->getCastMember(obj.u.i);
+
+ if (member && member->_type == kCastBitmap)
+ d.u.i = ((BitmapCastMember *)member)->_clut + 1;
+ }
} else {
warning("Lingo::getObjectProp: Invalid object: %s", obj.asString(true).c_str());
}
@@ -1898,6 +1907,14 @@ void Lingo::setObjectProp(Datum &obj, Common::String &propName, Datum &val) {
PCell cell = PCell(propName, val);
obj.u.parr->push_back(cell);
}
+ } if (obj.type == CASTREF) {
+ // WORKAROUND: Until CastMembers are made Lingo objects
+ if (propName.equalsIgnoreCase("palette")) {
+ CastMember *member = _vm->getCurrentMovie()->getCastMember(obj.u.i);
+
+ if (member && member->_type == kCastBitmap)
+ ((BitmapCastMember *)member)->_clut = val.asInt();
+ }
} else {
warning("Lingo::setObjectProp: Invalid object: %s", obj.asString(true).c_str());
}
More information about the Scummvm-git-logs
mailing list