diff options
Diffstat (limited to 'engines')
-rw-r--r-- | engines/sci/console.cpp | 58 | ||||
-rw-r--r-- | engines/sci/engine/segment.cpp | 2 | ||||
-rw-r--r-- | engines/sci/engine/segment.h | 1 |
3 files changed, 47 insertions, 14 deletions
diff --git a/engines/sci/console.cpp b/engines/sci/console.cpp index 6c022bb631..a3e33b13c8 100644 --- a/engines/sci/console.cpp +++ b/engines/sci/console.cpp @@ -1095,6 +1095,14 @@ bool Console::cmdSaveGame(int argc, const char **argv) { delete out; } + out->finalize(); + if (out->err()) { + delete out; + warning("Writing the savegame failed."); + } else { + delete out; + } + return true; } @@ -1420,6 +1428,16 @@ bool Console::cmdPrintSegmentTable(int argc, const char **argv) { DebugPrintf("F string fragments"); break; +#ifdef ENABLE_SCI32 + case SEG_TYPE_ARRAY: + DebugPrintf("A SCI32 arrays (%d)", (*(ArrayTable *)mobj).entries_used); + break; + + case SEG_TYPE_STRING: + DebugPrintf("T SCI32 strings (%d)", (*(StringTable *)mobj).entries_used); + break; +#endif + default: DebugPrintf("I Invalid (type = %x)", mobj->getType()); break; @@ -2180,26 +2198,40 @@ bool Console::cmdViewReference(int argc, const char **argv) { printObject(reg); break; case KSIG_REF: { - int size; - const SegmentRef block = _engine->_gamestate->_segMan->dereference(reg); - size = block.maxSize; + switch (_engine->_gamestate->_segMan->getSegmentType(reg.segment)) { + case SEG_TYPE_STRING: { + const SciString *str = _engine->_gamestate->_segMan->lookupString(reg); + Common::hexdump((const byte *) str->getRawData(), str->getSize(), 16, 0); + break; + } + case SEG_TYPE_ARRAY: { + const SciArray<reg_t> *array = _engine->_gamestate->_segMan->lookupArray(reg); + Common::hexdump((const byte *) array->getRawData(), array->getSize(), 16, 0); + break; + } + default: { + int size; + const SegmentRef block = _engine->_gamestate->_segMan->dereference(reg); + size = block.maxSize; - DebugPrintf("raw data\n"); + DebugPrintf("raw data\n"); - if (reg_end.segment != 0 && size < reg_end.offset - reg.offset) { - DebugPrintf("Block end out of bounds (size %d). Resetting.\n", size); - reg_end = NULL_REG; - } + if (reg_end.segment != 0 && size < reg_end.offset - reg.offset) { + DebugPrintf("Block end out of bounds (size %d). Resetting.\n", size); + reg_end = NULL_REG; + } - if (reg_end.segment != 0 && (size >= reg_end.offset - reg.offset)) - size = reg_end.offset - reg.offset; + if (reg_end.segment != 0 && (size >= reg_end.offset - reg.offset)) + size = reg_end.offset - reg.offset; - if (reg_end.segment != 0) - DebugPrintf("Block size less than or equal to %d\n", size); + if (reg_end.segment != 0) + DebugPrintf("Block size less than or equal to %d\n", size); - Common::hexdump(block.raw, size, 16, 0); + Common::hexdump(block.raw, size, 16, 0); + } } break; + } case KSIG_ARITHMETIC: DebugPrintf("arithmetic value\n %d (%04x)\n", (int16) reg.offset, reg.offset); break; diff --git a/engines/sci/engine/segment.cpp b/engines/sci/engine/segment.cpp index 879cbc22ee..a6154e7512 100644 --- a/engines/sci/engine/segment.cpp +++ b/engines/sci/engine/segment.cpp @@ -435,7 +435,7 @@ bool Script::isValidOffset(uint16 offset) const { SegmentRef Script::dereference(reg_t pointer) { if (pointer.offset > _bufSize) { - warning("Script::dereference(): Attempt to dereference invalid pointer %04x:%04x into script segment (script size=%d)", + error("Script::dereference(): Attempt to dereference invalid pointer %04x:%04x into script segment (script size=%d)", PRINT_REG(pointer), (uint)_bufSize); return SegmentRef(); } diff --git a/engines/sci/engine/segment.h b/engines/sci/engine/segment.h index 02d4809b70..61f1c7b3c9 100644 --- a/engines/sci/engine/segment.h +++ b/engines/sci/engine/segment.h @@ -802,6 +802,7 @@ public: byte getType() const { return _type; } uint32 getSize() const { return _size; } T *getRawData() { return _data; } + const T *getRawData()const { return _data; } protected: int8 _type; |