diff options
author | Gregory Montoir | 2004-08-24 16:31:46 +0000 |
---|---|---|
committer | Gregory Montoir | 2004-08-24 16:31:46 +0000 |
commit | 45d8b3b00291b6dcdae4d4966021ded316c2cfae (patch) | |
tree | d7de6814592f453b7e27fe679ad676b0c1023c1a /queen | |
parent | 649e9b71a5837b10573fcfcb11497497827e35a8 (diff) | |
download | scummvm-rg350-45d8b3b00291b6dcdae4d4966021ded316c2cfae.tar.gz scummvm-rg350-45d8b3b00291b6dcdae4d4966021ded316c2cfae.tar.bz2 scummvm-rg350-45d8b3b00291b6dcdae4d4966021ded316c2cfae.zip |
Rewrote the way strings are extracting from the datafiles, now it should be 'alignment safe'. Maybe it will fix bugs #923570 and #1013886, too.
svn-id: r14734
Diffstat (limited to 'queen')
-rw-r--r-- | queen/cutaway.cpp | 41 | ||||
-rw-r--r-- | queen/cutaway.h | 12 | ||||
-rw-r--r-- | queen/queen.cpp | 4 | ||||
-rw-r--r-- | queen/resource.cpp | 4 | ||||
-rw-r--r-- | queen/sound.cpp | 1 | ||||
-rw-r--r-- | queen/talk.cpp | 112 | ||||
-rw-r--r-- | queen/talk.h | 14 |
7 files changed, 83 insertions, 105 deletions
diff --git a/queen/cutaway.cpp b/queen/cutaway.cpp index 91380bb1ce..37250eaf94 100644 --- a/queen/cutaway.cpp +++ b/queen/cutaway.cpp @@ -106,19 +106,18 @@ void Cutaway::load(const char *filename) { Pointers to other places in the cutaway data */ - _gameStatePtr = _fileData + READ_BE_UINT16(ptr); + _gameStatePtr = _fileData + READ_BE_UINT16(ptr); ptr += 2; - _nextSentence = _fileData + READ_BE_UINT16(ptr); + _nextSentenceOff = READ_BE_UINT16(ptr); ptr += 2; - byte *bankNamesPtr = _fileData + READ_BE_UINT16(ptr); + uint16 bankNamesOff = READ_BE_UINT16(ptr); ptr += 2; - debug(6, "Bank name file offset = %08x", 20 + bankNamesPtr - _fileData); _objectData = ptr; - loadStrings(bankNamesPtr); + loadStrings(bankNamesOff); if (_bankNames[0][0]) { debug(6, "Loading bank '%s'", _bankNames[0]); @@ -126,7 +125,7 @@ void Cutaway::load(const char *filename) { } char entryString[MAX_STRING_SIZE]; - _nextSentence = Talk::getString(_nextSentence, entryString, MAX_STRING_LENGTH); + Talk::getString(_fileData, _nextSentenceOff, entryString, MAX_STRING_LENGTH); debug(6, "Entry string = '%s'", entryString); _vm->logic()->joeCutFacing(_vm->logic()->joeFacing()); @@ -153,11 +152,11 @@ void Cutaway::load(const char *filename) { } -void Cutaway::loadStrings(byte *ptr) { +void Cutaway::loadStrings(uint16 offset) { int i,j; - int bankNameCount = READ_BE_UINT16(ptr); - ptr += 2; + int bankNameCount = READ_BE_UINT16(_fileData + offset); + offset += 2; debug(6, "Bank name count = %i", bankNameCount); @@ -167,8 +166,7 @@ void Cutaway::loadStrings(byte *ptr) { */ for (i = 0, j = 0; i < bankNameCount; i++) { - ptr = Talk::getString(ptr, _bankNames[j], MAX_FILENAME_LENGTH); - + Talk::getString(_fileData, offset, _bankNames[j], MAX_FILENAME_LENGTH); if (_bankNames[j][0]) { debug(6, "Bank name %i = '%s'", j, _bankNames[j]); j++; @@ -176,17 +174,16 @@ void Cutaway::loadStrings(byte *ptr) { } debug(6, "Getting talk file"); - ptr = Talk::getString(ptr, _talkFile, MAX_FILENAME_LENGTH); + Talk::getString(_fileData, offset, _talkFile, MAX_FILENAME_LENGTH); debug(6, "Talk file = '%s'", _talkFile); - _talkTo = (int16)READ_BE_INT16(ptr); - ptr += 2; + _talkTo = (int16)READ_BE_INT16(_fileData + offset); debug(6, "_talkTo = %i", _talkTo); } -byte *Cutaway::getCutawayObject(byte *ptr, CutawayObject &object) +const byte *Cutaway::getCutawayObject(const byte *ptr, CutawayObject &object) { - byte *oldPtr = ptr; + const byte *oldPtr = ptr; object.objectNumber = (int16)READ_BE_INT16(ptr); ptr += 2; object.moveToX = (int16)READ_BE_INT16(ptr); ptr += 2; @@ -261,7 +258,7 @@ void Cutaway::dumpCutawayObject(int index, CutawayObject &object) } -byte *Cutaway::turnOnPeople(byte *ptr, CutawayObject &object) { +const byte *Cutaway::turnOnPeople(const byte *ptr, CutawayObject &object) { // Lines 1248-1259 in cutaway.c object.personCount = (int16)READ_BE_INT16(ptr); ptr += 2; @@ -471,7 +468,7 @@ Cutaway::ObjectType Cutaway::getObjectType(CutawayObject &object) { return objectType; } -byte *Cutaway::getCutawayAnim(byte *ptr, int header, CutawayAnim &anim) { +const byte *Cutaway::getCutawayAnim(const byte *ptr, int header, CutawayAnim &anim) { // lines 1531-1607 in cutaway.c //debug(6, "[Cutaway::getCutawayAnim] header=%i", header); @@ -564,7 +561,7 @@ void Cutaway::dumpCutawayAnim(CutawayAnim &anim) { if (anim.song) debug(6, "song = %i", anim.song); } -byte *Cutaway::handleAnimation(byte *ptr, CutawayObject &object) { +const byte *Cutaway::handleAnimation(const byte *ptr, CutawayObject &object) { // lines 1517-1770 in cutaway.c int frameCount = 0; int header = 0; @@ -828,7 +825,7 @@ void Cutaway::run(char *nextFilename) { memset(_personFace, 0, sizeof(_personFace)); _personFaceCount = 0; - byte *ptr = _objectData; + const byte *ptr = _objectData; for (i = 0; i < _cutawayObjectCount; i++) { CutawayObject object; @@ -857,7 +854,7 @@ void Cutaway::run(char *nextFilename) { limitBob(object); char sentence[MAX_STRING_SIZE]; - _nextSentence = Talk::getString(_nextSentence, sentence, MAX_STRING_LENGTH); + Talk::getString(_fileData, _nextSentenceOff, sentence, MAX_STRING_LENGTH); if (OBJECT_ROOMFADE == object.objectNumber) { _roomFade = true; @@ -1268,8 +1265,6 @@ void Cutaway::handleText( const char *sentence) { // lines 1776-1863 in cutaway.c - //debug(6, "----- Write '%s' ----", sentence); - int spaces = countSpaces(type, sentence); int x; diff --git a/queen/cutaway.h b/queen/cutaway.h index 68411a63d9..29e21df03a 100644 --- a/queen/cutaway.h +++ b/queen/cutaway.h @@ -142,7 +142,7 @@ class Cutaway { byte *_objectData; //! Pointer to next sentence string in _fileData - byte *_nextSentence; + uint16 _nextSentenceOff; //! ??? bool _roomFade; @@ -205,10 +205,10 @@ class Cutaway { void load(const char *filename); //! Used by load to read string data - void loadStrings(byte *ptr); + void loadStrings(uint16 offset); //! Get persons - byte *turnOnPeople(byte *ptr, CutawayObject &object); + const byte *turnOnPeople(const byte *ptr, CutawayObject &object); //! Limit the BOB void limitBob(CutawayObject &object); @@ -220,7 +220,7 @@ class Cutaway { ObjectType getObjectType(CutawayObject &object); //! Perform actions for an animation - byte *handleAnimation(byte *ptr, CutawayObject &object); + const byte *handleAnimation(const byte *ptr, CutawayObject &object); //! Perform actions for a person record void handlePersonRecord( @@ -248,13 +248,13 @@ class Cutaway { void talk(char *nextFilename); //! Get CutawayAnim data from ptr and return new ptr - byte *getCutawayAnim(byte *ptr, int header, CutawayAnim &anim); + const byte *getCutawayAnim(const byte *ptr, int header, CutawayAnim &anim); //! Special animation int makeComplexAnimation(int16 currentImage, CutawayAnim *objAnim, int frameCount); //! Read a CutawayObject from ptr and return new ptr - static byte *getCutawayObject(byte *ptr, CutawayObject &object); + static const byte *getCutawayObject(const byte *ptr, CutawayObject &object); //! Dump a CutawayObject with debug() void dumpCutawayObject(int index, CutawayObject &object); diff --git a/queen/queen.cpp b/queen/queen.cpp index 69633c0824..f2f6cd9daf 100644 --- a/queen/queen.cpp +++ b/queen/queen.cpp @@ -216,7 +216,7 @@ void QueenEngine::saveGameState(uint16 slot, const char *desc) { // write header GameStateHeader header; memset(&header, 0, sizeof(header)); - file->writeUint32BE(MKID_BE('SCVM')); + file->writeUint32BE('SCVM'); header.version = TO_BE_32(SAVESTATE_CUR_VER); header.flags = TO_BE_32(0); header.dataSize = TO_BE_32(dataSize); @@ -260,7 +260,7 @@ SaveFile *QueenEngine::readGameStateHeader(uint16 slot, GameStateHeader *gsh) { char name[20]; makeGameStateName(slot, name); SaveFile *file = _saveFileMan->open_savefile(name, getSavePath(), false); - if (file && file->readUint32BE() == MKID_BE('SCVM')) { + if (file && file->readUint32BE() == 'SCVM') { gsh->version = file->readUint32BE(); gsh->flags = file->readUint32BE(); gsh->dataSize = file->readUint32BE(); diff --git a/queen/resource.cpp b/queen/resource.cpp index 64bef70f28..68397209e7 100644 --- a/queen/resource.cpp +++ b/queen/resource.cpp @@ -196,7 +196,7 @@ Language Resource::getLanguage() const { bool Resource::readTableFile(const GameVersion *gameVersion) { File tableFile; tableFile.open(_tableFilename); - if (tableFile.isOpen() && tableFile.readUint32BE() == MKID_BE('QTBL')) { + if (tableFile.isOpen() && tableFile.readUint32BE() == 'QTBL') { if (tableFile.readUint32BE() != CURRENT_TBL_VERSION) warning("Incorrect version of queen.tbl, please update it"); tableFile.seek(gameVersion->tableOffset); @@ -207,7 +207,7 @@ bool Resource::readTableFile(const GameVersion *gameVersion) { } void Resource::readTableCompResource() { - if (_resourceFile->readUint32BE() != MKID_BE('QTBL')) + if (_resourceFile->readUint32BE() != 'QTBL') error("Invalid table header"); _resourceFile->read(_versionString, 6); diff --git a/queen/sound.cpp b/queen/sound.cpp index 602b03927f..47a1d26315 100644 --- a/queen/sound.cpp +++ b/queen/sound.cpp @@ -50,7 +50,6 @@ Sound *Sound::giveSound(SoundMixer *mixer, QueenEngine *vm, uint8 compression) { return new SilentSound(mixer, vm); #else return new MP3Sound(mixer, vm); - #endif break; case COMPRESSION_OGG: diff --git a/queen/talk.cpp b/queen/talk.cpp index 06a367dbd5..2a40794d5d 100644 --- a/queen/talk.cpp +++ b/queen/talk.cpp @@ -146,7 +146,7 @@ void Talk::talk(const char *filename, int personInRoom, char *cutawayFilename) { if (hasTalkedTo() && head == 1) strcpy(_talkString[0], _person2String); else - findDialogueString(_person1Ptr, head, _pMax, _talkString[0]); + findDialogueString(_person1PtrOff, head, _pMax, _talkString[0]); if (hasTalkedTo() && head == 1) sprintf(otherVoiceFilePrefix, "%2dXXXXP", _talkKey); @@ -154,14 +154,14 @@ void Talk::talk(const char *filename, int personInRoom, char *cutawayFilename) { sprintf(otherVoiceFilePrefix, "%2d%4xP", _talkKey, head); if (_talkString[0][0] == '\0' && retval > 1) { - findDialogueString(_person1Ptr, retval, _pMax, _talkString[0]); + findDialogueString(_person1PtrOff, retval, _pMax, _talkString[0]); sprintf(otherVoiceFilePrefix,"%2d%4xP", _talkKey, retval); } // Joe dialogue for (i = 1; i <= 4; i++) { - findDialogueString(_joePtr, _dialogueTree[level][i].head, _jMax, _talkString[i]); + findDialogueString(_joePtrOff, _dialogueTree[level][i].head, _jMax, _talkString[i]); int16 index = _dialogueTree[level][i].gameStateIndex; @@ -267,7 +267,7 @@ void Talk::talk(const char *filename, int personInRoom, char *cutawayFilename) { // check to see if person has something final to say if (-1 == retval) { - findDialogueString(_person1Ptr, head, _pMax, _talkString[0]); + findDialogueString(_person1PtrOff, head, _pMax, _talkString[0]); if (_talkString[0][0] != '\0') { sprintf(otherVoiceFilePrefix, "%2d%4xP", _talkKey, head); if (speak(_talkString[0], &person, otherVoiceFilePrefix)) @@ -291,13 +291,13 @@ void Talk::talk(const char *filename, int personInRoom, char *cutawayFilename) { _vm->grid()->setupPanel(); - uint8 *ptr = _cutawayPtr; + uint16 offset = _cutawayPtrOff; - int16 cutawayGameState = (int16)READ_BE_INT16(ptr); ptr += 2; - int16 cutawayTestValue = (int16)READ_BE_INT16(ptr); ptr += 2; + int16 cutawayGameState = (int16)READ_BE_INT16(_fileData + offset); offset += 2; + int16 cutawayTestValue = (int16)READ_BE_INT16(_fileData + offset); offset += 2; if (_vm->logic()->gameState(cutawayGameState) == cutawayTestValue) { - getString(ptr, cutawayFilename, 20); + getString(_fileData, offset, cutawayFilename, 20); if (cutawayFilename[0]) { //CR 2 - 7/3/95, If we're executing a cutaway scene, then make sure // Joe can talk, so set TALKQUIT to 0 just in case we exit on the @@ -348,19 +348,18 @@ void Talk::disableSentence(int oldLevel, int selectedSentence) { _dialogueTree[oldLevel][selectedSentence].dialogueNodeValue1 = -1; } -void Talk::findDialogueString(byte *ptr, int16 id, int16 max, char *str) { +void Talk::findDialogueString(uint16 offset, int16 id, int16 max, char *str) { str[0] = '\0'; - for (int i = 1; i <= max; i++) { - ptr += 2; - int16 currentId = (int16)READ_BE_INT16(ptr); ptr += 2; + offset += 2; + int16 currentId = (int16)READ_BE_INT16(_fileData + offset); + offset += 2; if (id == currentId) { - ptr = getString(ptr, str, MAX_STRING_LENGTH, 4); - //debug(6, "Found string with ID %i: '%s'", id, str); + getString(_fileData, offset, str, MAX_STRING_LENGTH, 4); break; + } else { + getString(_fileData, offset, NULL, MAX_STRING_LENGTH, 4); } - else - ptr = getString(ptr, NULL, MAX_STRING_LENGTH, 4); } } @@ -403,9 +402,9 @@ void Talk::load(const char *filename) { if (_levelMax < 0) { _levelMax = -_levelMax; canQuit = false; - } - else + } else { canQuit = true; + } _uniqueKey = (int16)READ_BE_INT16(ptr); ptr += 2; _talkKey = (int16)READ_BE_INT16(ptr); ptr += 2; @@ -418,19 +417,13 @@ void Talk::load(const char *filename) { _itemNumber[i] = (int16)READ_BE_INT16(ptr); ptr += 2; } - _person1Ptr = _fileData + READ_BE_UINT16(ptr); ptr += 2; - _cutawayPtr = _fileData + READ_BE_UINT16(ptr); ptr += 2; - _person2Ptr = _fileData + READ_BE_UINT16(ptr); ptr += 2; - - if (ptr != (_fileData + 28)) - error("ptr != (_fileData + 28))"); - - byte *dataPtr = _fileData + 32; - _joePtr = dataPtr + _levelMax * 96; + _person1PtrOff = READ_BE_UINT16(ptr); ptr += 2; + _cutawayPtrOff = READ_BE_UINT16(ptr); ptr += 2; + _person2PtrOff = READ_BE_UINT16(ptr); ptr += 2; + _joePtrOff = 32 + _levelMax * 96; // Load dialogue tree - ptr = dataPtr; - + ptr = _fileData + 32; memset(&_dialogueTree[0], 0, sizeof(_dialogueTree[0])); for (i = 1; i <= _levelMax; i++) for (int j = 0; j <= 5; j++) { @@ -448,22 +441,20 @@ void Talk::load(const char *filename) { void Talk::initialTalk() { // Lines 848-903 in talk.c - byte *ptr = _joePtr + 2; - - uint16 hasNotString = READ_BE_UINT16(ptr); ptr += 2; + uint16 offset = _joePtrOff + 2; + uint16 hasNotString = READ_BE_UINT16(_fileData + offset); offset += 2; char joeString[MAX_STRING_SIZE]; if (!hasNotString) { - ptr = getString(ptr, joeString, MAX_STRING_LENGTH); + getString(_fileData, offset, joeString, MAX_STRING_LENGTH); } else { joeString[0] = '\0'; } - ptr = _person2Ptr; - ptr = getString(ptr, _person2String, MAX_STRING_LENGTH); - + offset = _person2PtrOff; char joe2String[MAX_STRING_SIZE]; - ptr = getString(ptr, joe2String, MAX_STRING_LENGTH); + getString(_fileData, offset, _person2String, MAX_STRING_LENGTH); + getString(_fileData, offset, joe2String, MAX_STRING_LENGTH); if (!hasTalkedTo()) { // Not yet talked to this person @@ -487,33 +478,33 @@ int Talk::getSpeakCommand(const Person *person, const char *sentence, unsigned & int commandCode = SPEAK_DEFAULT; uint16 id = (sentence[index] << 8) | sentence[index + 1]; switch (id) { - case MKID_BE('AO'): + case 'AO': commandCode = SPEAK_AMAL_ON; break; - case MKID_BE('FL'): + case 'FL': commandCode = SPEAK_FACE_LEFT; break; - case MKID_BE('FF'): + case 'FF': commandCode = SPEAK_FACE_FRONT; break; - case MKID_BE('FB'): + case 'FB': commandCode = SPEAK_FACE_BACK; break; - case MKID_BE('FR'): + case 'FR': commandCode = SPEAK_FACE_RIGHT; break; - case MKID_BE('GD'): + case 'GD': _vm->logic()->joeGrab(STATE_GRAB_DOWN); commandCode = SPEAK_NONE; break; - case MKID_BE('GM'): + case 'GM': _vm->logic()->joeGrab(STATE_GRAB_MID); commandCode = SPEAK_NONE; break; - case MKID_BE('WT'): + case 'WT': commandCode = SPEAK_PAUSE; break; - case MKID_BE('XY'): + case 'XY': // For example *XY00(237,112) { commandCode = atoi(sentence + index + 2); @@ -1081,27 +1072,20 @@ const Talk::SpeechParameters *Talk::findSpeechParameters( return iterator; } -byte *Talk::getString(byte *ptr, char *str, int maxLength, int align) { - int length = *ptr; - ptr++; +void Talk::getString(const byte *ptr, uint16 &offset, char *str, int maxLength, int align) { + assert((align & 1) == 0); + int length = *(ptr + offset); + ++offset; if (length > maxLength) { - error("String too long. Length = %i, maxLength = %i, str = '%*s'", - length, maxLength, length, (const char*)ptr); - } - else if (length) { - if (str) - memcpy(str, (const char*)ptr, length); - ptr += length; - - while ((int)ptr % align) - ptr++; + error("String too long. Length = %i, maxLength = %i", length, maxLength, length); + } else if (length) { + if (str) { + memcpy(str, ptr + offset, length); + str[length] = '\0'; + } + offset = (offset + length + (align - 1)) & ~(align - 1); } - - if (str) - str[length] = '\0'; - - return ptr; } TalkSelected *Talk::talkSelected() { diff --git a/queen/talk.h b/queen/talk.h index d7f84a1de8..395eccced9 100644 --- a/queen/talk.h +++ b/queen/talk.h @@ -46,8 +46,8 @@ class Talk { const char *voiceFilePrefix, QueenEngine *vm); - //! Read a string from ptr and return new ptr - static byte *getString(byte *ptr, char *str, int maxLength, int align = 2); + //! Read a string from ptr and update offset + static void getString(const byte *ptr, uint16 &offset, char *str, int maxLength, int align = 2); private: //! Collection of constants used by Talk @@ -131,16 +131,16 @@ private: int16 _itemNumber[2]; //! String data - byte *_person1Ptr; + uint16 _person1PtrOff; //! Cutaway data - byte *_cutawayPtr; + uint16 _cutawayPtrOff; //! Data used if we have talked to the person before - byte *_person2Ptr; + uint16 _person2PtrOff; //! Data used if we haven't talked to the person before - byte *_joePtr; + uint16 _joePtrOff; //! Is a talking head bool _talkHead; @@ -176,7 +176,7 @@ private: void initialTalk(); //! Find a string in the dialogue tree - void findDialogueString(byte *ptr, int16 id, int16 max, char *str); + void findDialogueString(uint16 offset, int16 id, int16 max, char *str); //! Get TalkSelected struct for this talk TalkSelected *talkSelected(); |