SHERLOCK: Implement pushSequence and pullSequence

This commit is contained in:
Paul Gilbert 2015-03-31 23:21:04 -04:00
parent 1199cf724c
commit 283c6074ad
2 changed files with 64 additions and 13 deletions

View file

@ -831,37 +831,83 @@ void Talk::clearSequences() {
_sequenceStack.clear(); _sequenceStack.clear();
} }
/**
* Pulls a background object sequence from the sequence stack and restore's the
* object's sequence
*/
void Talk::pullSequence() { void Talk::pullSequence() {
// TODO Scene &scene = *_vm->_scene;
SequenceEntry seq = _sequenceStack.pop();
if (seq._objNum != -1) {
Object &obj = scene._bgShapes[seq._objNum];
if (obj._seqSize < MAX_TALK_SEQUENCES) {
warning("Tried to restore too few frames");
} else {
for (int idx = 0; idx < MAX_TALK_SEQUENCES; ++idx)
obj._sequences[idx] = seq._sequences[idx];
obj._frameNumber = seq._frameNumber;
obj._seqTo = seq._seqTo;
}
}
} }
void Talk::pushSequence(int speak) { /**
// TODO * Push the sequence of a background object that's an NPC that needs to be
* saved onto the sequence stack.
*/
void Talk::pushSequence(int speaker) {
People &people = *_vm->_people;
Scene &scene = *_vm->_scene;
// Only proceed if a speaker is specified
if (speaker == -1)
return;
SequenceEntry seqEntry;
if (!speaker) {
seqEntry._objNum = -1;
} else {
seqEntry._objNum = people.findSpeaker(speaker);
Object &obj = scene._bgShapes[seqEntry._objNum];
for (uint idx = 0; idx < MAX_TALK_SEQUENCES; ++idx)
seqEntry._sequences.push_back(obj._sequences[idx]);
seqEntry._frameNumber = obj._frameNumber;
seqEntry._seqTo = obj._seqTo;
}
_sequenceStack.push(seqEntry);
if (_sequenceStack.size() >= 5)
error("sequence stack overflow");
} }
/** /**
* Change the sequence of a background object corresponding to a given speaker. * Change the sequence of a background object corresponding to a given speaker.
* The new sequence will display the character as "listening" * The new sequence will display the character as "listening"
*/ */
void Talk::setStillSeq(int speak) { void Talk::setStillSeq(int speaker) {
People &people = *_vm->_people; People &people = *_vm->_people;
Scene &scene = *_vm->_scene; Scene &scene = *_vm->_scene;
// Don't bother doing anything if no specific speaker is specified // Don't bother doing anything if no specific speaker is specified
if (speak == -1) if (speaker == -1)
return; return;
if (speak) { if (speaker) {
int objNum = people.findSpeaker(speak); int objNum = people.findSpeaker(speaker);
if (objNum != -1) { if (objNum != -1) {
Object &obj = scene._bgShapes[objNum]; Object &obj = scene._bgShapes[objNum];
if (obj._seqSize < MAX_TALK_SEQUENCES) { if (obj._seqSize < MAX_TALK_SEQUENCES) {
warning("Tried to copy too many still frames"); warning("Tried to copy too few still frames");
} else { } else {
for (uint idx = 0; idx < MAX_TALK_SEQUENCES; ++idx) { for (uint idx = 0; idx < MAX_TALK_SEQUENCES; ++idx) {
obj._sequences[idx] = STILL_SEQUENCES[speak][idx]; obj._sequences[idx] = STILL_SEQUENCES[speaker][idx];
if (idx > 0 && !TALK_SEQUENCES[speak][idx] && !TALK_SEQUENCES[speak][idx - 1]) if (idx > 0 && !TALK_SEQUENCES[speaker][idx] && !TALK_SEQUENCES[speaker][idx - 1])
break; break;
} }

View file

@ -38,6 +38,11 @@ struct SavedSequence {
Common::Array<byte> _sequences; Common::Array<byte> _sequences;
}; };
struct SequenceEntry : public SavedSequence {
int _frameNumber;
int _seqTo;
};
struct Statement { struct Statement {
Common::String _statement; Common::String _statement;
Common::String _reply; Common::String _reply;
@ -80,8 +85,8 @@ private:
SherlockEngine *_vm; SherlockEngine *_vm;
int _saveSeqNum; int _saveSeqNum;
Common::Array<SavedSequence> _savedSequences; Common::Array<SavedSequence> _savedSequences;
Common::Stack<SequenceEntry> _sequenceStack;
Common::Array<Statement> _statements; Common::Array<Statement> _statements;
Common::Stack<int> _sequenceStack;
TalkHistoryEntry _talkHistory[500]; TalkHistoryEntry _talkHistory[500];
int _speaker; int _speaker;
int _talkIndex; int _talkIndex;
@ -116,10 +121,10 @@ public:
void drawInterface(); void drawInterface();
void setStillSeq(int speak); void setStillSeq(int speaker);
void clearSequences(); void clearSequences();
void pullSequence(); void pullSequence();
void pushSequence(int speak); void pushSequence(int speaker);
bool isSequencesEmpty() const { return _sequenceStack.empty(); } bool isSequencesEmpty() const { return _sequenceStack.empty(); }
}; };