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();
|
_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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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(); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue