DIRECTOR: Cleanup

This commit is contained in:
Eugene Sandulenko 2016-09-01 10:52:11 +02:00
parent 3735f79d5b
commit 91cc02b0ee
5 changed files with 70 additions and 61 deletions

View File

@ -112,7 +112,9 @@ Common::Error DirectorEngine::run() {
//_mainArchive = new RIFFArchive();
//_mainArchive->openFile("bookshelf_example.mmm");
loadMMMNames(ConfMan.get("path"));
scanMovies(ConfMan.get("path"));
loadSharedCastsFrom(_sharedCastFile);
loadMainArchive();
_currentScore = new Score(this, _mainArchive);
@ -124,7 +126,7 @@ Common::Error DirectorEngine::run() {
return Common::kNoError;
}
Common::HashMap<Common::String, Score *> DirectorEngine::loadMMMNames(Common::String folder) {
Common::HashMap<Common::String, Score *> DirectorEngine::scanMovies(const Common::String &folder) {
Common::FSNode directory(folder);
Common::FSList movies;
const char *sharedMMMname;
@ -142,8 +144,9 @@ Common::HashMap<Common::String, Score *> DirectorEngine::loadMMMNames(Common::St
if (!movies.empty()) {
for (Common::FSList::const_iterator i = movies.begin(); i != movies.end(); ++i) {
debugC(2, kDebugLoading, "File: %s", i->getName().c_str());
if (Common::matchString(i->getName().c_str(), sharedMMMname, true)) {
loadSharedCastsFrom(i->getName());
_sharedCastFile = i->getName();
continue;
}

View File

@ -102,7 +102,7 @@ protected:
private:
const DirectorGameDescription *_gameDescription;
Common::HashMap<Common::String, Score *> loadMMMNames(Common::String folder);
Common::HashMap<Common::String, Score *> scanMovies(const Common::String &folder);
void loadEXE();
void loadEXEv3(Common::SeekableReadStream *stream);
void loadEXEv4(Common::SeekableReadStream *stream);
@ -125,6 +125,8 @@ private:
byte *_currentPalette;
uint16 _currentPaletteLength;
Lingo *_lingo;
Common::String _sharedCastFile;
};
} // End of namespace Director

View File

@ -95,7 +95,7 @@ void Frame::readChannel(Common::SeekableSubReadStreamEndian &stream, uint16 offs
if (size <= 16)
readSprite(stream, offset, size);
else {
//read > 1 sprites channel
// read > 1 sprites channel
while (size > 16) {
byte spritePosition = (offset - 32) / 16;
uint16 nextStart = (spritePosition + 1) * 16 + 32;
@ -125,13 +125,13 @@ void Frame::readMainChannels(Common::SeekableSubReadStreamEndian &stream, uint16
offset++;
break;
case kTransFlagsPosition: {
uint8 transFlags = stream.readByte();
if (transFlags & 0x80)
_transArea = 1;
else
_transArea = 0;
_transDuration = transFlags & 0x7f;
offset++;
uint8 transFlags = stream.readByte();
if (transFlags & 0x80)
_transArea = 1;
else
_transArea = 0;
_transDuration = transFlags & 0x7f;
offset++;
}
break;
case kTransChunkSizePosition:
@ -244,7 +244,7 @@ void Frame::readSprite(Common::SeekableSubReadStreamEndian &stream, uint16 offse
fieldPosition += 2;
break;
default:
//end cycle, go to next sprite channel
// end of channel, go to next sprite channel
readSprite(stream, spriteStart + 16, finishPosition - fieldPosition);
fieldPosition = finishPosition;
break;
@ -257,7 +257,7 @@ void Frame::prepareFrame(Score *score) {
renderSprites(*score->_trailSurface, true);
if (_transType != 0)
//TODO Handle changing area case
//T ODO Handle changing area case
playTransition(score);
if (_sound1 != 0 || _sound2 != 0) {
@ -268,16 +268,16 @@ void Frame::prepareFrame(Score *score) {
}
void Frame::playSoundChannel() {
debug(0, "Sound2 %d", _sound2);
debug(0, "Sound1 %d", _sound1);
debug(0, "Sound2 %d", _sound2);
}
void Frame::playTransition(Score *score) {
uint16 duration = _transDuration * 250; // _transDuration in 1/4 of sec
duration = (duration == 0 ? 250 : duration); // director support transition duration = 0, but animation play like value = 1, idk.
duration = (duration == 0 ? 250 : duration); // director supports transition duration = 0, but animation play like value = 1, idk.
if (_transChunkSize == 0)
_transChunkSize = 1; //equal 1 step
_transChunkSize = 1; // equal to 1 step
uint16 stepDuration = duration / _transChunkSize;
uint16 steps = duration / stepDuration;
@ -428,6 +428,7 @@ void Frame::renderSprites(Graphics::ManagedSurface &surface, bool renderTrail) {
warning("Cast id %d not found", _sprites[i]->_castId);
continue;
} else {
warning("Getting cast id %d from shared cast");
cast = _vm->getSharedCasts()->getVal(_sprites[i]->_castId);
}
} else {
@ -447,10 +448,7 @@ void Frame::renderSprites(Graphics::ManagedSurface &surface, bool renderTrail) {
}
if (!img->getSurface()) {
//TODO
//BMPDecoder doesnt cover all BITD resources (not all have first two bytes 'BM')
//Some BITD's first two bytes 0x6 0x0
warning("Can not load image %d", _sprites[i]->_castId);
warning("Frame::renderSprites: Could not load image %d", _sprites[i]->_castId);
continue;
}
@ -472,7 +470,7 @@ void Frame::renderSprites(Graphics::ManagedSurface &surface, bool renderTrail) {
surface.blitFrom(*img->getSurface(), Common::Point(x, y));
break;
case kInkTypeTransparent:
//FIXME: is it always white (last entry in pallette)?
// FIXME: is it always white (last entry in pallette)?
surface.transBlitFrom(*img->getSurface(), Common::Point(x, y), _vm->getPaletteColorCount() - 1);
break;
case kInkTypeBackgndTrans:
@ -512,7 +510,7 @@ void Frame::renderButton(Graphics::ManagedSurface &surface, uint16 spriteId) {
switch (button->buttonType) {
case kTypeCheckBox:
//Magic numbers: checkbox square need to move left about 5px from text and 12px side size (d4)
// Magic numbers: checkbox square need to move left about 5px from text and 12px side size (D4)
surface.frameRect(Common::Rect(x - 17, y, x + 12, y + 12), 0);
break;
case kTypeButton:
@ -624,7 +622,7 @@ void Frame::renderText(Graphics::ManagedSurface &surface, uint16 spriteID) {
if (textCast->borderSize != kSizeNone) {
uint16 size = textCast->borderSize;
//Indent from borders, measured in d4
// Indent from borders, measured in d4
x -= 1;
y -= 4;
@ -662,7 +660,7 @@ void Frame::renderText(Graphics::ManagedSurface &surface, uint16 spriteID) {
}
void Frame::drawBackgndTransSprite(Graphics::ManagedSurface &target, const Graphics::Surface &sprite, Common::Rect &drawRect) {
uint8 skipColor = _vm->getPaletteColorCount() - 1; //FIXME is it always white (last entry in pallette) ?
uint8 skipColor = _vm->getPaletteColorCount() - 1; // FIXME is it always white (last entry in pallette) ?
for (int ii = 0; ii < sprite.h; ii++) {
const byte *src = (const byte *)sprite.getBasePtr(0, ii);
@ -686,7 +684,7 @@ void Frame::drawGhostSprite(Graphics::ManagedSurface &target, const Graphics::Su
for (int j = 0; j < drawRect.width(); j++) {
if ((getSpriteIDFromPos(Common::Point(drawRect.left + j, drawRect.top + ii)) != 0) && (*src != skipColor))
*dst = (_vm->getPaletteColorCount() - 1) - *src; //Oposite color
*dst = (_vm->getPaletteColorCount() - 1) - *src; // Oposite color
src++;
dst++;
@ -772,7 +770,7 @@ void Frame::drawMatteSprite(Graphics::ManagedSurface &target, const Graphics::Su
}
uint16 Frame::getSpriteIDFromPos(Common::Point pos) {
//Find first from top to bottom
// Find first from top to bottom
for (uint16 i = _drawRects.size() - 1; i > 0; i--) {
if (_drawRects[i].contains(pos))
return i;
@ -781,4 +779,4 @@ uint16 Frame::getSpriteIDFromPos(Common::Point pos) {
return 0;
}
} //End of namespace Director
} // End of namespace Director

View File

@ -160,7 +160,6 @@ void Score::loadArchive() {
}
Common::Array<uint16> vwci = _movieArchive->getResourceIDList(MKTAG('V','W','C','I'));
if (vwci.size() > 0) {
Common::Array<uint16>::iterator iterator;
@ -169,7 +168,6 @@ void Score::loadArchive() {
}
Common::Array<uint16> stxt = _movieArchive->getResourceIDList(MKTAG('S','T','X','T'));
if (stxt.size() > 0) {
loadScriptText(*_movieArchive->getResource(MKTAG('S','T','X','T'), *stxt.begin()));
}
@ -218,6 +216,8 @@ void Score::loadFrames(Common::SeekableSubReadStreamEndian &stream) {
if (_vm->getVersion() > 3) {
stream.skip(16);
warning("STUB: Score::loadFrames. Skipping initial bytes");
//Unknown, some bytes - constant (refer to contuinity).
}
@ -244,7 +244,6 @@ void Score::loadFrames(Common::SeekableSubReadStreamEndian &stream) {
frameSize -= channelSize + 4;
}
frame->readChannel(stream, channelOffset, channelSize);
}
_frames.push_back(frame);
@ -409,10 +408,10 @@ void Score::loadScriptText(Common::SeekableSubReadStreamEndian &stream) {
for (uint32 i = 0; i < strLen; i++) {
byte ch = stream.readByte();
if (ch == 0x0d) {
//in old Mac systems \r was the code for end-of-line instead.
// Convert Mac line endings
if (ch == 0x0d)
ch = '\n';
}
script += ch;
}
@ -496,8 +495,8 @@ void Score::loadCastInfo(Common::SeekableSubReadStreamEndian &stream, uint16 id)
}
void Score::gotoloop() {
//This command has the playback head contonuously return to the first marker to to the left and then loop back.
//If no marker are to the left of the playback head, the playback head continues to the right.
// This command has the playback head contonuously return to the first marker to to the left and then loop back.
// If no marker are to the left of the playback head, the playback head continues to the right.
Common::SortedArray<Label *>::iterator i;
for (i = _labels->begin(); i != _labels->end(); ++i) {
@ -514,25 +513,25 @@ void Score::gotonext() {
for (i = _labels->begin(); i != _labels->end(); ++i) {
if ((*i)->name == _currentLabel) {
if (i != _labels->end()) {
//return to the first marker to to the right
// return to the first marker to to the right
++i;
_currentFrame = (*i)->number;
return;
} else {
//if no markers are to the right of the playback head,
//the playback head goes to the first marker to the left
// if no markers are to the right of the playback head,
// the playback head goes to the first marker to the left
_currentFrame = (*i)->number;
return;
}
}
}
//If there are not markers to the left,
//the playback head goes to frame 1, (Director frame array start from 1, engine from 0)
// If there are not markers to the left,
// the playback head goes to frame 1, (Director frame array start from 1, engine from 0)
_currentFrame = 0;
}
void Score::gotoprevious() {
//One label
// One label
if (_labels->begin() == _labels->end()) {
_currentFrame = (*_labels->begin())->number;
return;
@ -602,7 +601,7 @@ Common::Array<Common::String> Score::loadStrings(Common::SeekableSubReadStreamEn
}
uint16 count = stream.readUint16();
offset += (count + 1) * 4 + 2; //positions info + uint16 count
offset += (count + 1) * 4 + 2; // positions info + uint16 count
uint32 startPos = stream.readUint32() + offset;
for (uint16 i = 0; i < count; i++) {
@ -689,7 +688,7 @@ TextCast::TextCast(Common::SeekableSubReadStreamEndian &stream) {
if (flags & 0x4)
textFlags.push_back(kTextFlagDoNotWrap);
//TODO: FIXME: guesswork
// TODO: FIXME: guesswork
fontId = stream.readByte();
fontSize = stream.readByte();
@ -752,20 +751,24 @@ void Score::update() {
_surface->clear();
_surface->copyFrom(*_trailSurface);
//Enter and exit from previous frame (Director 4)
// Enter and exit from previous frame (Director 4)
_lingo->processEvent(kEventEnterFrame, _frames[_currentFrame]->_actionId);
_lingo->processEvent(kEventExitFrame, _frames[_currentFrame]->_actionId);
//TODO Director 6 - another order
// TODO Director 6 - another order
// TODO Director 6 step: send beginSprite event to any sprites whose span begin in the upcoming frame
if (_vm->getVersion() >= 6) {
for (uint16 i = 0; i < CHANNEL_COUNT; i++) {
if (_frames[_currentFrame]->_sprites[i]->_enabled) {
_lingo->processEvent(kEventBeginSprite, i);
}
}
}
//TODO Director 6 step: send beginSprite event to any sprites whose span begin in the upcoming frame
//for (uint16 i = 0; i < CHANNEL_COUNT; i++) {
// if (_frames[_currentFrame]->_sprites[i]->_enabled)
// _lingo->processEvent(kEventBeginSprite, i);
//}
// TODO Director 6 step: send prepareFrame event to all sprites and the script channel in upcoming frame
if (_vm->getVersion() >= 6)
_lingo->processEvent(kEventPrepareFrame, _currentFrame);
//TODO Director 6 step: send prepareFrame event to all sprites and the script channel in upcoming frame
//_lingo->processEvent(kEventPrepareFrame, _currentFrame);
_currentFrame++;
Common::SortedArray<Label *>::iterator i;
@ -776,31 +779,33 @@ void Score::update() {
}
_frames[_currentFrame]->prepareFrame(this);
//Stage is drawn between the prepareFrame and enterFrame events (Lingo in a Nutshell)
// Stage is drawn between the prepareFrame and enterFrame events (Lingo in a Nutshell)
byte tempo = _frames[_currentFrame]->_tempo;
if (tempo) {
if (tempo > 161) {
//Delay
// Delay
_nextFrameTime = g_system->getMillis() + (256 - tempo) * 1000;
return;
} else if (tempo <= 60) {
//FPS
// FPS
_nextFrameTime = g_system->getMillis() + (float)tempo / 60 * 1000;
_currentFrameRate = tempo;
} else if (tempo >= 136) {
//TODO Wait for channel tempo - 135
// TODO Wait for channel tempo - 135
warning("STUB: tempo >= 136");
} else if (tempo == 128) {
//TODO Wait for Click/Key
// TODO Wait for Click/Key
warning("STUB: tempo == 128");
} else if (tempo == 135) {
//Wait for sound channel 1
// Wait for sound channel 1
while (_soundManager->isChannelActive(1)) {
processEvents();
}
} else if (tempo == 134) {
//Wait for sound channel 2
// Wait for sound channel 2
while (_soundManager->isChannelActive(2)) {
processEvents();
}
@ -825,7 +830,7 @@ void Score::processEvents() {
if (event.type == Common::EVENT_LBUTTONDOWN) {
Common::Point pos = g_system->getEventManager()->getMousePos();
//TODO there is dont send frame id
// TODO there is dont send frame id
_lingo->processEvent(kEventMouseDown, _frames[_currentFrame]->getSpriteIDFromPos(pos));
}

View File

@ -188,6 +188,7 @@ public:
void setCurrentFrame(uint16 frameId) { _currentFrame = frameId; }
Common::String getMacName() const { return _macName; }
Sprite *getSpriteById(uint16 id);
private:
void update();
void readVersion(uint32 rid);