SHERLOCK: Implement pushSequence and pullSequence
This commit is contained in:
parent
1199cf724c
commit
283c6074ad
2 changed files with 64 additions and 13 deletions
|
@ -831,37 +831,83 @@ void Talk::clearSequences() {
|
|||
_sequenceStack.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
* Pulls a background object sequence from the sequence stack and restore's the
|
||||
* object's sequence
|
||||
*/
|
||||
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.
|
||||
* The new sequence will display the character as "listening"
|
||||
*/
|
||||
void Talk::setStillSeq(int speak) {
|
||||
void Talk::setStillSeq(int speaker) {
|
||||
People &people = *_vm->_people;
|
||||
Scene &scene = *_vm->_scene;
|
||||
|
||||
// Don't bother doing anything if no specific speaker is specified
|
||||
if (speak == -1)
|
||||
if (speaker == -1)
|
||||
return;
|
||||
|
||||
if (speak) {
|
||||
int objNum = people.findSpeaker(speak);
|
||||
if (speaker) {
|
||||
int objNum = people.findSpeaker(speaker);
|
||||
if (objNum != -1) {
|
||||
Object &obj = scene._bgShapes[objNum];
|
||||
|
||||
if (obj._seqSize < MAX_TALK_SEQUENCES) {
|
||||
warning("Tried to copy too many still frames");
|
||||
warning("Tried to copy too few still frames");
|
||||
} else {
|
||||
for (uint idx = 0; idx < MAX_TALK_SEQUENCES; ++idx) {
|
||||
obj._sequences[idx] = STILL_SEQUENCES[speak][idx];
|
||||
if (idx > 0 && !TALK_SEQUENCES[speak][idx] && !TALK_SEQUENCES[speak][idx - 1])
|
||||
obj._sequences[idx] = STILL_SEQUENCES[speaker][idx];
|
||||
if (idx > 0 && !TALK_SEQUENCES[speaker][idx] && !TALK_SEQUENCES[speaker][idx - 1])
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -38,6 +38,11 @@ struct SavedSequence {
|
|||
Common::Array<byte> _sequences;
|
||||
};
|
||||
|
||||
struct SequenceEntry : public SavedSequence {
|
||||
int _frameNumber;
|
||||
int _seqTo;
|
||||
};
|
||||
|
||||
struct Statement {
|
||||
Common::String _statement;
|
||||
Common::String _reply;
|
||||
|
@ -80,8 +85,8 @@ private:
|
|||
SherlockEngine *_vm;
|
||||
int _saveSeqNum;
|
||||
Common::Array<SavedSequence> _savedSequences;
|
||||
Common::Stack<SequenceEntry> _sequenceStack;
|
||||
Common::Array<Statement> _statements;
|
||||
Common::Stack<int> _sequenceStack;
|
||||
TalkHistoryEntry _talkHistory[500];
|
||||
int _speaker;
|
||||
int _talkIndex;
|
||||
|
@ -116,10 +121,10 @@ public:
|
|||
|
||||
void drawInterface();
|
||||
|
||||
void setStillSeq(int speak);
|
||||
void setStillSeq(int speaker);
|
||||
void clearSequences();
|
||||
void pullSequence();
|
||||
void pushSequence(int speak);
|
||||
void pushSequence(int speaker);
|
||||
bool isSequencesEmpty() const { return _sequenceStack.empty(); }
|
||||
};
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue