diff options
-rw-r--r-- | engines/tony/game.cpp | 7 | ||||
-rw-r--r-- | engines/tony/gfxcore.cpp | 12 | ||||
-rw-r--r-- | engines/tony/gfxcore.h | 10 | ||||
-rw-r--r-- | engines/tony/gfxengine.cpp | 5 | ||||
-rw-r--r-- | engines/tony/inventory.cpp | 15 | ||||
-rw-r--r-- | engines/tony/loc.cpp | 358 | ||||
-rw-r--r-- | engines/tony/loc.h | 42 | ||||
-rw-r--r-- | engines/tony/mpal/mpalutils.cpp | 5 | ||||
-rw-r--r-- | engines/tony/mpal/mpalutils.h | 6 | ||||
-rw-r--r-- | engines/tony/tonychar.cpp | 13 | ||||
-rw-r--r-- | engines/tony/utils.cpp | 363 | ||||
-rw-r--r-- | engines/tony/utils.h | 112 |
12 files changed, 180 insertions, 768 deletions
diff --git a/engines/tony/game.cpp b/engines/tony/game.cpp index 4699a9b9aa..1ba8094ac4 100644 --- a/engines/tony/game.cpp +++ b/engines/tony/game.cpp @@ -1492,11 +1492,10 @@ void RMPointer::init() { for (i = 0; i < 5; i++) { RMRes res(RES_P_PAP1 + i); - RMDataStream ds; - - ds.openBuffer(res); + Common::SeekableReadStream *ds = res.getReadStream(); _specialPointer[i] = new RMItem; - ds >> *_specialPointer[i]; + _specialPointer[i]->readFromStream(*ds); + delete ds; } //m_hotspot[0].set(19,5); diff --git a/engines/tony/gfxcore.cpp b/engines/tony/gfxcore.cpp index f9f7cb02ec..44befa3755 100644 --- a/engines/tony/gfxcore.cpp +++ b/engines/tony/gfxcore.cpp @@ -125,7 +125,7 @@ int RMGfxSourceBuffer::init(const byte *buf, int dimx, int dimy, bool bLoadPalet return dimx * dimy * getBpp() / 8; } -void RMGfxSourceBuffer::init(RMDataStream &ds, int dimx, int dimy, bool bLoadPalette) { +void RMGfxSourceBuffer::init(Common::ReadStream &ds, int dimx, int dimy, bool bLoadPalette) { create(dimx, dimy, getBpp()); ds.read(_buf, dimx * dimy * getBpp() / 8); @@ -489,7 +489,7 @@ int RMGfxSourceBufferPal::init(const byte *buf, int dimx, int dimy, bool bLoadPa return read; } -void RMGfxSourceBufferPal::init(RMDataStream &ds, int dimx, int dimy, bool bLoadPalette) { +void RMGfxSourceBufferPal::init(Common::ReadStream &ds, int dimx, int dimy, bool bLoadPalette) { // Load the RAW image RMGfxSourceBuffer::init(ds, dimx, dimy); @@ -749,13 +749,13 @@ int RMGfxSourceBuffer8RLE::init(const byte *buf, int dimx, int dimy, bool bLoadP return RMGfxSourceBufferPal::init(buf, dimx, dimy, bLoadPalette); } -void RMGfxSourceBuffer8RLE::init(RMDataStream &ds, int dimx, int dimy, bool bLoadPalette) { +void RMGfxSourceBuffer8RLE::init(Common::ReadStream &ds, int dimx, int dimy, bool bLoadPalette) { if (_bNeedRLECompress) { RMGfxSourceBufferPal::init(ds, dimx, dimy, bLoadPalette); } else { int size; - ds >> size; + size = ds.readSint32LE(); _buf = new byte[size]; ds.read(_buf, size); @@ -1826,7 +1826,7 @@ int RMGfxSourceBuffer8RLEByteAA::init(const byte *buf, int dimx, int dimy, bool return RMGfxSourceBuffer8RLE::init(buf, dimx, dimy, bLoadPalette); } -void RMGfxSourceBuffer8RLEByteAA::init(RMDataStream &ds, int dimx, int dimy, bool bLoadPalette) { +void RMGfxSourceBuffer8RLEByteAA::init(Common::ReadStream &ds, int dimx, int dimy, bool bLoadPalette) { RMGfxSourceBuffer8RLE::init(ds, dimx, dimy, bLoadPalette); if (!_bNeedRLECompress) { @@ -1862,7 +1862,7 @@ int RMGfxSourceBuffer8RLEWordAA::init(byte *buf, int dimx, int dimy, bool bLoadP return RMGfxSourceBuffer8RLE::init(buf, dimx, dimy, bLoadPalette); } -void RMGfxSourceBuffer8RLEWordAA::init(RMDataStream &ds, int dimx, int dimy, bool bLoadPalette) { +void RMGfxSourceBuffer8RLEWordAA::init(Common::ReadStream &ds, int dimx, int dimy, bool bLoadPalette) { RMGfxSourceBuffer8RLE::init(ds, dimx, dimy, bLoadPalette); if (!_bNeedRLECompress) { diff --git a/engines/tony/gfxcore.h b/engines/tony/gfxcore.h index cd7830be24..472a4ad13a 100644 --- a/engines/tony/gfxcore.h +++ b/engines/tony/gfxcore.h @@ -290,7 +290,7 @@ public: // Load the data for the surface virtual int init(uint32 resID, int dimx, int dimy, bool bLoadPalette = false); virtual int init(const byte *buf, int dimx, int dimy, bool bLoadPalette = false); - virtual void init(RMDataStream &ds, int dimx, int dimy, bool bLoadPalette = false); + virtual void init(Common::ReadStream &ds, int dimx, int dimy, bool bLoadPalette = false); virtual ~RMGfxSourceBuffer(); @@ -343,7 +343,7 @@ public: virtual ~RMGfxSourceBufferPal(); virtual int init(const byte *buf, int dimx, int dimy, bool bLoadPalette = false); - virtual void init(RMDataStream &ds, int dimx, int dimy, bool bLoadPalette = false); + virtual void init(Common::ReadStream &ds, int dimx, int dimy, bool bLoadPalette = false); int loadPaletteWA(uint32 resID, bool bSwapped = false); int loadPaletteWA(const byte *buf, bool bSwapped = false); @@ -418,7 +418,7 @@ public: virtual ~RMGfxSourceBuffer8RLE(); // Overload of the initialization method - virtual void init(RMDataStream &ds, int dimx, int dimy, bool bLoadPalette = false); + virtual void init(Common::ReadStream &ds, int dimx, int dimy, bool bLoadPalette = false); virtual int init(const byte *buf, int dimx, int dimy, bool bLoadPalette = false); // Draw image with RLE decompression @@ -501,7 +501,7 @@ public: virtual void draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim); // Overloaded initialization methods - virtual void init(RMDataStream &ds, int dimx, int dimy, bool bLoadPalette = false); + virtual void init(Common::ReadStream &ds, int dimx, int dimy, bool bLoadPalette = false); virtual int init(const byte *buf, int dimx, int dimy, bool bLoadPalette = false); virtual ~RMGfxSourceBuffer8RLEByteAA(); @@ -515,7 +515,7 @@ public: virtual void draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim); // Overloaded initialization methods - virtual void init(RMDataStream &ds, int dimx, int dimy, bool bLoadPalette = false); + virtual void init(Common::ReadStream &ds, int dimx, int dimy, bool bLoadPalette = false); virtual int init(byte *buf, int dimx, int dimy, bool bLoadPalette = false); virtual ~RMGfxSourceBuffer8RLEWordAA(); diff --git a/engines/tony/gfxengine.cpp b/engines/tony/gfxengine.cpp index 25aaa625f4..e8a5df29e9 100644 --- a/engines/tony/gfxengine.cpp +++ b/engines/tony/gfxengine.cpp @@ -416,7 +416,10 @@ uint32 RMGfxEngine::loadLocation(int nLoc, RMPoint ptTonyStart, RMPoint start) { if (!res.isValid()) continue; - _loc.load(res); + Common::SeekableReadStream *ds = res.getReadStream(); + _loc.load(*ds); + delete ds; + initForNewLocation(nLoc, ptTonyStart, start); bLoaded = true; break; diff --git a/engines/tony/inventory.cpp b/engines/tony/inventory.cpp index 175d9fc6a9..dbd3ad6840 100644 --- a/engines/tony/inventory.cpp +++ b/engines/tony/inventory.cpp @@ -95,15 +95,13 @@ void RMInventory::init() { for (i = 0; i <= _nItems; i++) { // Load the items from the resource RMRes res(curres); - RMDataStream ds; - assert(res.isValid()); + Common::SeekableReadStream *ds = res.getReadStream(); // Initialize the MPAL inventory item by reading it in. _items[i]._icon.setInitCurPattern(false); - ds.openBuffer(res); - ds >> _items[i]._icon; - ds.close(); + _items[i]._icon.readFromStream(*ds); + delete ds; // Puts in the default pattern 1 _items[i]._pointer = NULL; @@ -131,13 +129,12 @@ void RMInventory::init() { _items[29]._icon.setPattern(1); // Download interface - RMDataStream ds; RMRes res(RES_I_MINIINTER); assert(res.isValid()); - ds.openBuffer(res); - ds >> _miniInterface; + Common::SeekableReadStream *ds = res.getReadStream(); + _miniInterface.readFromStream(*ds); _miniInterface.setPattern(1); - ds.close(); + delete ds; // Create the text for hints on the mini interface _hints[0].setAlignType(RMText::HCENTER, RMText::VTOP); diff --git a/engines/tony/loc.cpp b/engines/tony/loc.cpp index e767584e9b..32c857ceaa 100644 --- a/engines/tony/loc.cpp +++ b/engines/tony/loc.cpp @@ -42,52 +42,29 @@ using namespace ::Tony::MPAL; * RMPalette Methods \****************************************************************************/ -/** - * Operator for reading palette information from a data stream. - * - * @param ds Data stream - * @param pal Destination palette - * - * @returns Reference to the data stream - */ -RMDataStream &operator>>(RMDataStream &ds, RMPalette &pal) { - ds.read(pal._data, 1024); - return ds; +void RMPalette::readFromStream(Common::ReadStream &ds) { + ds.read(_data, 1024); } /****************************************************************************\ * RMSlot Methods \****************************************************************************/ -/** - * Operator for reading slot information from a data stream. - * - * @param ds Data stream - * @param slot Destination slot - * - * @returns Reference to the data stream - */ -RMDataStream &operator>>(RMDataStream &ds, RMPattern::RMSlot &slot) { - slot.readFromStream(ds); - return ds; -} - - -void RMPattern::RMSlot::readFromStream(RMDataStream &ds, bool bLOX) { +void RMPattern::RMSlot::readFromStream(Common::ReadStream &ds, bool bLOX) { byte type; // Type - ds >> type; + type = ds.readByte(); _type = (RMPattern::RMSlotType)type; // Dati - ds >> _data; + _data = ds.readSint32LE(); // Posizione - ds >> _pos; + _pos.readFromStream(ds); // Flag generica - ds >> _flag; + _flag = ds.readByte(); } @@ -95,42 +72,29 @@ void RMPattern::RMSlot::readFromStream(RMDataStream &ds, bool bLOX) { * Metodi di RMPattern \****************************************************************************/ -/** - * Operator for reading pattern information from a data stream - * - * @param ds Data stream - * @param pat Destination pattern - * - * @returns Reference to the data stream - */ -RMDataStream &operator>>(RMDataStream &ds, RMPattern &pat) { - pat.readFromStream(ds); - return ds; -} - -void RMPattern::readFromStream(RMDataStream &ds, bool bLOX) { +void RMPattern::readFromStream(Common::ReadStream &ds, bool bLOX) { int i; // Pattern name if (!bLOX) - ds >> _name; + _name = readString(ds); // Velocity - ds >> _speed; + _speed = ds.readSint32LE(); // Position - ds >> _pos; + _pos.readFromStream(ds); // Flag for pattern looping - ds >> _bLoop; + _bLoop = ds.readSint32LE(); // Number of slots - ds >> _nSlots; + _nSlots = ds.readSint32LE(); // Create and read the slots _slots = new RMSlot[_nSlots]; - for (i = 0; i < _nSlots && !ds.isError(); i++) { + for (i = 0; i < _nSlots && !ds.err(); i++) { if (bLOX) _slots[i].readFromStream(ds, true); else @@ -302,56 +266,46 @@ RMPattern::~RMPattern() { * RMSprite Methods \****************************************************************************/ -/** - * Operator for reading sprite information from a data stream. - * - * @param ds Data stream - * @param sprite Destination slot - * - * @returns Reference to the data stream - */ -RMDataStream &operator>>(RMDataStream &ds, RMSprite &sprite) { - sprite.readFromStream(ds); - return ds; -} - void RMSprite::init(RMGfxSourceBuffer *buf) { _buf = buf; } -void RMSprite::LOXGetSizeFromStream(RMDataStream &ds, int *dimx, int *dimy) { - int pos = ds.pos(); +void RMSprite::LOXGetSizeFromStream(Common::SeekableReadStream &ds, int *dimx, int *dimy) { + uint32 pos = ds.pos(); - ds >> *dimx >> *dimy; + *dimx = ds.readSint32LE(); + *dimy = ds.readSint32LE(); - ds.seek(pos, ds.START); + ds.seek(pos); } -void RMSprite::getSizeFromStream(RMDataStream &ds, int *dimx, int *dimy) { - int pos = ds.pos(); +void RMSprite::getSizeFromStream(Common::SeekableReadStream &ds, int *dimx, int *dimy) { + uint32 pos = ds.pos(); - ds >> _name; - ds >> *dimx >> *dimy; + _name = readString(ds); + *dimx = ds.readSint32LE(); + *dimy = ds.readSint32LE(); - ds.seek(pos, ds.START); + ds.seek(pos); } -void RMSprite::readFromStream(RMDataStream &ds, bool bLOX) { +void RMSprite::readFromStream(Common::SeekableReadStream &ds, bool bLOX) { int dimx, dimy; // Sprite name if (!bLOX) - ds >> _name; + _name = readString(ds); // Dimensions - ds >> dimx >> dimy; + dimx = ds.readSint32LE(); + dimy = ds.readSint32LE(); // Bounding box - ds >> _rcBox; + _rcBox.readFromStream(ds); // Unused space if (!bLOX) - ds += 32; + ds.skip(32); // Create buffer and read _buf->init(ds, dimx, dimy); @@ -381,26 +335,13 @@ RMSprite::~RMSprite() { * RMSfx Methods \****************************************************************************/ -/** - * Operator for reading SFX information from a data stream. - * - * @param ds Data stream - * @param sfx Destination SFX - * - * @returns Reference to the data stream - */ -RMDataStream &operator>>(RMDataStream &ds, RMSfx &sfx) { - sfx.readFromStream(ds); - return ds; -} - -void RMSfx::readFromStream(RMDataStream &ds, bool bLOX) { +void RMSfx::readFromStream(Common::ReadStream &ds, bool bLOX) { int size; // sfx name - ds >> _name; + _name = readString(ds); - ds >> size; + size = ds.readSint32LE(); // Read the entire buffer into a MemoryReadStream byte *buffer = (byte *)malloc(size); @@ -459,20 +400,6 @@ void RMSfx::stop() { * RMItem Methods \****************************************************************************/ -/** - * Operator for reading item information from a data stream. - * - * @param ds Data stream - * @param tem Destination item - * - * @returns Reference to the data stream - */ -RMDataStream &operator>>(RMDataStream &ds, RMItem &item) { - item.readFromStream(ds); - return ds; -} - - RMGfxSourceBuffer *RMItem::newItemSpriteBuffer(int dimx, int dimy, bool bPreRLE) { if (_cm == CM_256) { RMGfxSourceBuffer8RLE *spr; @@ -524,53 +451,55 @@ bool RMItem::isIn(const RMPoint &pt, int *size) { return rc.ptInRect(pt + _curScroll); } -void RMItem::readFromStream(RMDataStream &ds, bool bLOX) { +void RMItem::readFromStream(Common::SeekableReadStream &ds, bool bLOX) { int i, dimx, dimy; byte cm; // MPAL code - ds >> _mpalCode; + _mpalCode = ds.readSint32LE(); // Object name - ds >> _name; + _name = readString(ds); // Z (signed) - ds >> _z; + _z = ds.readSint32LE(); // Parent position - ds >> _pos; + _pos.readFromStream(ds); // Hotspot - ds >> _hot; + _hot.readFromStream(ds); // Bounding box - ds >> _rcBox; + _rcBox.readFromStream(ds); // Number of sprites, sound effects, and patterns - ds >> _nSprites >> _nSfx >> _nPatterns; + _nSprites = ds.readSint32LE(); + _nSfx = ds.readSint32LE(); + _nPatterns = ds.readSint32LE(); // Color mode - ds >> cm; + cm = ds.readByte(); _cm = (RMColorMode)cm; // Flag for the presence of custom palette differences - ds >> _bPal; + _bPal = ds.readByte(); if (_cm == CM_256) { // If there is a palette, read it in if (_bPal) - ds >> _pal; + _pal.readFromStream(ds); } // MPAL data if (!bLOX) - ds += 20; + ds.skip(20); - ds >> _FX; - ds >> _FXparm; + _FX = ds.readByte(); + _FXparm = ds.readByte(); if (!bLOX) - ds += 106; + ds.skip(106); // Create sub-classes if (_nSprites > 0) @@ -580,8 +509,8 @@ void RMItem::readFromStream(RMDataStream &ds, bool bLOX) { _patterns = new RMPattern[_nPatterns + 1]; // Read in class data - if (!ds.isError()) - for (i = 0; i < _nSprites && !ds.isError(); i++) { + if (!ds.err()) + for (i = 0; i < _nSprites && !ds.err(); i++) { // Download the sprites if (bLOX) { _sprites[i].LOXGetSizeFromStream(ds, &dimx, &dimy); @@ -597,8 +526,8 @@ void RMItem::readFromStream(RMDataStream &ds, bool bLOX) { _sprites[i].setPalette(_pal._data); } - if (!ds.isError()) - for (i = 0; i < _nSfx && !ds.isError(); i++) { + if (!ds.err()) + for (i = 0; i < _nSfx && !ds.err(); i++) { if (bLOX) _sfx[i].readFromStream(ds, true); else @@ -606,8 +535,8 @@ void RMItem::readFromStream(RMDataStream &ds, bool bLOX) { } // Read the pattern from pattern 1 - if (!ds.isError()) - for (i = 1; i <= _nPatterns && !ds.isError(); i++) { + if (!ds.err()) + for (i = 1; i <= _nPatterns && !ds.err(); i++) { if (bLOX) _patterns[i].readFromStream(ds, true); else @@ -899,11 +828,9 @@ void RMWipe::initFade(int type) { _bMustRegister = true; RMRes res(RES_W_CIRCLE); - RMDataStream ds; - - ds.openBuffer(res); - ds >> _wip0r; - ds.close(); + Common::SeekableReadStream *ds = res.getReadStream(); + _wip0r.readFromStream(*ds); + delete ds; _wip0r.setPattern(1); @@ -1706,50 +1633,45 @@ void RMCharacter::linkToBoxes(RMGameBoxes *boxes) { * RMBox Methods \****************************************************************************/ -void RMBox::readFromStream(RMDataStream &ds) { +void RMBox::readFromStream(Common::ReadStream &ds) { uint16 w; int i; byte b; // Bbox - ds >> _left; - ds >> _top; - ds >> _right; - ds >> _bottom; + _left = ds.readSint32LE(); + _top = ds.readSint32LE(); + _right = ds.readSint32LE(); + _bottom = ds.readSint32LE(); // Adjacency for (i = 0; i < MAXBOXES; i++) { - ds >> _adj[i]; + _adj[i] = ds.readSint32LE(); } // Misc - ds >> _numHotspot; - ds >> _destZ; - ds >> b; + _numHotspot = ds.readSint32LE(); + _destZ = ds.readByte(); + b = ds.readByte(); _bActive = b; - ds >> b; + b = ds.readByte(); _bReversed = b; // Reversed expansion space - ds += 30; + for (i = 0; i < 30; i++) + ds.readByte(); // Hotspots for (i = 0; i < _numHotspot; i++) { - ds >> w; + w = ds.readUint16LE(); _hotspot[i]._hotx = w; - ds >> w; + w = ds.readUint16LE(); _hotspot[i]._hoty = w; - ds >> w; + w = ds.readUint16LE(); _hotspot[i]._destination = w; } } -RMDataStream &operator>>(RMDataStream &ds, RMBox &box) { - box.readFromStream(ds); - - return ds; -} - /****************************************************************************\ * RMBoxLoc Methods \****************************************************************************/ @@ -1763,25 +1685,27 @@ RMBoxLoc::~RMBoxLoc() { delete[] _boxes; } -void RMBoxLoc::readFromStream(RMDataStream &ds) { +void RMBoxLoc::readFromStream(Common::ReadStream &ds) { int i; char buf[2]; byte ver; // ID and version - ds >> buf[0] >> buf[1] >> ver; + buf[0] = ds.readByte(); + buf[1] = ds.readByte(); + ver = ds.readByte(); assert(buf[0] == 'B' && buf[1] == 'X'); assert(ver == 3); // Number of boxes - ds >> _numbBox; + _numbBox = ds.readSint32LE(); // Allocate memory for the boxes _boxes = new RMBox[_numbBox]; // Read in boxes for (i = 0; i < _numbBox; i++) - ds >> _boxes[i]; + _boxes[i].readFromStream(ds); } void RMBoxLoc::recalcAllAdj() { @@ -1796,12 +1720,6 @@ void RMBoxLoc::recalcAllAdj() { } } -RMDataStream &operator>>(RMDataStream &ds, RMBoxLoc &bl) { - bl.readFromStream(ds); - - return ds; -} - /****************************************************************************\ * RMGameBoxes methods \****************************************************************************/ @@ -1818,21 +1736,20 @@ RMGameBoxes::~RMGameBoxes() { void RMGameBoxes::init() { int i; - RMDataStream ds; // Load boxes from disk _nLocBoxes = 130; for (i = 1; i <= _nLocBoxes; i++) { RMRes res(10000 + i); - ds.openBuffer(res); + Common::SeekableReadStream *ds = res.getReadStream(); _allBoxes[i] = new RMBoxLoc(); - ds >> *_allBoxes[i]; + _allBoxes[i]->readFromStream(*ds); _allBoxes[i]->recalcAllAdj(); - ds.close(); + delete ds; } } @@ -1946,70 +1863,13 @@ RMLocation::RMLocation() { _cmode = CM_256; } - -/** - * Load a location (.LOC) from a file that is provided. - * - * @param lpszFileName Name of the file - */ -bool RMLocation::load(const char *lpszFileName) { - Common::File f; - bool bRet; - - // Open the file for reading - if (!f.open(lpszFileName)) - return false; - - // Passes to the method variation for loading from the opened file - bRet = load(f); - - // Close the file - f.close(); - - return bRet; -} - - -/** - * Load a location (.LOC) from a given open file - * - * @param hFile File reference - * - * @returns True if succeeded OK, false in case of error. - */ -bool RMLocation::load(Common::File &file) { - bool bRet; - - file.seek(0); - - RMFileStreamSlow fs; - - fs.openFile(file); - bRet = load(fs); - fs.close(); - - return bRet; -} - - -bool RMLocation::load(const byte *buf) { - RMDataStream ds; - bool bRet; - - ds.openBuffer(buf); - bRet = load(ds); - ds.close(); - return bRet; -} - - /** * Load a location (.LOC) from a given data stream * * @param ds Data stream * @returns True if succeeded OK, false in case of error. */ -bool RMLocation::load(RMDataStream &ds) { +bool RMLocation::load(Common::SeekableReadStream &ds) { char id[3]; int dimx, dimy; byte ver; @@ -2021,7 +1881,7 @@ bool RMLocation::load(RMDataStream &ds) { _prevFixedScroll.set(-1, -1); // Check the ID - ds >> id[0] >> id[1] >> id[2]; + ds.read(id, 3); // Check if we are in a LOX if (id[0] == 'L' && id[1] == 'O' && id[2] == 'X') @@ -2032,26 +1892,28 @@ bool RMLocation::load(RMDataStream &ds) { return false; // Version - ds >> ver; + ver = ds.readByte(); assert(ver == 6); // Location name - ds >> _name; + _name = readString(ds); // Skip the MPAL bailouts (64 bytes) - ds >> TEMPNumLoc; - ds >> TEMPTonyStart._x >> TEMPTonyStart._y; - ds += 64 - 4 * 3; + TEMPNumLoc = ds.readSint32LE(); + TEMPTonyStart._x = ds.readSint32LE(); + TEMPTonyStart._y = ds.readSint32LE(); + ds.skip(64 - 4 * 3); // Skip flag associated with the background (?) - ds += 1; + ds.skip(1); // Location dimensions - ds >> dimx >> dimy; + dimx = ds.readSint32LE(); + dimy = ds.readSint32LE(); _curScroll.set(0, 0); // Read the color mode - ds >> cm; + cm = ds.readByte(); _cmode = (RMColorMode)cm; // Initialize the source buffer and read the location @@ -2076,7 +1938,7 @@ bool RMLocation::load(RMDataStream &ds) { // assert(dimy!=512); // Number of objects - ds >> _nItems; + _nItems = ds.readSint32LE(); // Create and read in the objects if (_nItems > 0) @@ -2084,32 +1946,34 @@ bool RMLocation::load(RMDataStream &ds) { g_vm->freezeTime(); - for (i = 0; i < _nItems && !ds.isError(); i++) - ds >> _items[i]; + for (i = 0; i < _nItems && !ds.err(); i++) + _items[i].readFromStream(ds); g_vm->unfreezeTime(); - return ds.isError(); + return ds.err(); } -bool RMLocation::loadLOX(RMDataStream &ds) { +bool RMLocation::loadLOX(Common::SeekableReadStream &ds) { int dimx, dimy; byte ver; int i; // Version - ds >> ver; + ver = ds.readByte(); assert(ver == 1); // Location name - ds >> _name; + _name = readString(ds); // Location number - ds >> TEMPNumLoc; - ds >> TEMPTonyStart._x >> TEMPTonyStart._y; + TEMPNumLoc = ds.readSint32LE(); + TEMPTonyStart._x = ds.readSint32LE(); + TEMPTonyStart._y = ds.readSint32LE(); // Dimensions - ds >> dimx >> dimy; + dimx = ds.readSint32LE(); + dimy = ds.readSint32LE(); _curScroll.set(0, 0); // It's always 65K (16-bit) mode @@ -2120,16 +1984,16 @@ bool RMLocation::loadLOX(RMDataStream &ds) { _buf->init(ds, dimx, dimy, true); // Number of items - ds >> _nItems; + _nItems = ds.readSint32LE(); // Create and read objects if (_nItems > 0) _items = new RMItem[_nItems]; - for (i = 0; i < _nItems && !ds.isError(); i++) + for (i = 0; i < _nItems && !ds.err(); i++) _items[i].readFromStream(ds, true); - return ds.isError(); + return ds.err(); } diff --git a/engines/tony/loc.h b/engines/tony/loc.h index acfbd45cdb..7b0a2ddd6b 100644 --- a/engines/tony/loc.h +++ b/engines/tony/loc.h @@ -62,7 +62,7 @@ public: byte _data[1024]; public: - friend RMDataStream &operator>>(RMDataStream &ds, RMPalette &pal); + void readFromStream(Common::ReadStream &ds); }; @@ -79,14 +79,12 @@ public: RMSfx(); virtual ~RMSfx(); - friend RMDataStream &operator>>(RMDataStream &ds, RMSfx &sfx); - void play(bool bLoop = false); void setVolume(int vol); void pause(bool bPause); void stop(); - void readFromStream(RMDataStream &ds, bool bLOX = false); + void readFromStream(Common::ReadStream &ds, bool bLOX = false); }; @@ -116,13 +114,11 @@ public: byte _flag; public: - friend RMDataStream &operator>>(RMDataStream &ds, RMSlot &slot); - RMPoint pos() { return _pos; } - void readFromStream(RMDataStream &ds, bool bLOX = false); + void readFromStream(Common::ReadStream &ds, bool bLOX = false); }; public: @@ -145,8 +141,6 @@ public: RMPattern(); virtual ~RMPattern(); - friend RMDataStream &operator>>(RMDataStream &ds, RMPattern &pat); - // A warning that the pattern now and the current int init(RMSfx *sfx, bool bPlayP0 = false, byte *bFlag = NULL); @@ -162,7 +156,7 @@ public: return _curPos; } - void readFromStream(RMDataStream &ds, bool bLOX = false); + void readFromStream(Common::ReadStream &ds, bool bLOX = false); private: void updateCoord(); @@ -185,13 +179,12 @@ public: virtual ~RMSprite(); void init(RMGfxSourceBuffer *buf); - friend RMDataStream &operator>>(RMDataStream &ds, RMSprite &sprite); virtual void draw(CORO_PARAM, RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim); void setPalette(byte *lpBuf); - void getSizeFromStream(RMDataStream &ds, int *dimx, int *dimy); - void LOXGetSizeFromStream(RMDataStream &ds, int *dimx, int *dimy); + void getSizeFromStream(Common::SeekableReadStream &ds, int *dimx, int *dimy); + void LOXGetSizeFromStream(Common::SeekableReadStream &ds, int *dimx, int *dimy); - void readFromStream(RMDataStream &ds, bool bLOX = false); + void readFromStream(Common::SeekableReadStream &ds, bool bLOX = false); }; @@ -241,8 +234,6 @@ public: RMItem(); virtual ~RMItem(); - friend RMDataStream &operator>>(RMDataStream &ds, RMItem &item); - // Process to make the object move on any animations. // Returns TRUE if it should be redrawn on the next frame bool doFrame(RMGfxTargetBuffer *bigBuf, bool bAddToList = true); @@ -296,7 +287,7 @@ public: void playSfx(int nSfx); - void readFromStream(RMDataStream &ds, bool bLOX = false); + void readFromStream(Common::SeekableReadStream &ds, bool bLOX = false); void pauseSound(bool bPause); @@ -329,11 +320,7 @@ public: bool _bActive; bool _bReversed; -private: - void readFromStream(RMDataStream &ds); - -public: - friend RMDataStream &operator>>(RMDataStream &ds, RMBox &box); + void readFromStream(Common::ReadStream &ds); }; @@ -342,14 +329,12 @@ public: int _numbBox; RMBox *_boxes; -private: - void readFromStream(RMDataStream &ds); + void readFromStream(Common::ReadStream &ds); public: RMBoxLoc(); virtual ~RMBoxLoc(); - friend RMDataStream &operator >>(RMDataStream &ds, RMBoxLoc &bl); void recalcAllAdj(); }; @@ -559,11 +544,8 @@ public: virtual ~RMLocation(); // Load variations - bool load(const char *lpszFileName); - bool load(Common::File &file); - bool load(const byte *buf); - bool load(RMDataStream &ds); - bool loadLOX(RMDataStream &ds); + bool load(Common::SeekableReadStream &ds); + bool loadLOX(Common::SeekableReadStream &ds); // Unload void unload(); diff --git a/engines/tony/mpal/mpalutils.cpp b/engines/tony/mpal/mpalutils.cpp index aa22456a4b..bfc97a5f3d 100644 --- a/engines/tony/mpal/mpalutils.cpp +++ b/engines/tony/mpal/mpalutils.cpp @@ -23,6 +23,7 @@ #include "tony/mpal/mpalutils.h" #include "tony/tony.h" +#include "common/memstream.h" namespace Tony { @@ -75,6 +76,10 @@ unsigned int RMRes::size() { return globalSize(_h); } +Common::SeekableReadStream *RMRes::getReadStream() { + return new Common::MemoryReadStream(_buf, size()); +} + /****************************************************************************\ * RMResRaw methods \****************************************************************************/ diff --git a/engines/tony/mpal/mpalutils.h b/engines/tony/mpal/mpalutils.h index 19810cf3a1..19e4fa7778 100644 --- a/engines/tony/mpal/mpalutils.h +++ b/engines/tony/mpal/mpalutils.h @@ -27,6 +27,10 @@ #include "common/scummsys.h" #include "tony/mpal/memory.h" +namespace Common { + class SeekableReadStream; +} + namespace Tony { namespace MPAL { @@ -47,6 +51,8 @@ public: // Casting for access to data operator const byte*(); + + Common::SeekableReadStream *getReadStream(); }; class RMResRaw : public RMRes { diff --git a/engines/tony/tonychar.cpp b/engines/tony/tonychar.cpp index 8593ece480..9caa10bd46 100644 --- a/engines/tony/tonychar.cpp +++ b/engines/tony/tonychar.cpp @@ -87,7 +87,6 @@ RMGfxSourceBuffer *RMTony::newItemSpriteBuffer(int dimx, int dimy, bool bPreRLE) void RMTony::init() { RMRes tony(0); RMRes body(9999); - RMDataStream ds; // Tony is shown by default _bShow = _bShowShadow = true; @@ -101,18 +100,18 @@ void RMTony::init() { _bIsStaticTalk = false; // Opens the buffer - ds.openBuffer(tony); + Common::SeekableReadStream *ds = tony.getReadStream(); // Reads his details from the stream - readFromStream(ds, true); + readFromStream(*ds, true); // Closes the buffer - ds.close(); + delete ds; // Reads Tony's body - ds.openBuffer(body); - _body.readFromStream(ds, true); - ds.close(); + ds = body.getReadStream(); + _body.readFromStream(*ds, true); + delete ds; _body.setPattern(0); _nTimeLastStep = g_vm->getTime(); diff --git a/engines/tony/utils.cpp b/engines/tony/utils.cpp index 8dc1f5d615..a3f79decaf 100644 --- a/engines/tony/utils.cpp +++ b/engines/tony/utils.cpp @@ -35,360 +35,21 @@ namespace Tony { /** * Extracts a string from a data stream * @param df data stream - * @param var String */ -RMDataStream &operator>>(RMDataStream &df, Common::String &var) { +Common::String readString(Common::ReadStream &df) { + Common::String var; uint8 len; int i; - df >> len; + len = df.readByte(); for (i = 0; i < len; i++) { char c; - df >> c; + c = df.readByte(); var += c; } - return df; -} - -/****************************************************************************\ -* RMFileStreamSlow Methods -\****************************************************************************/ - -RMFileStreamSlow::RMFileStreamSlow() : RMDataStream() { - _stream = NULL; -} - -RMFileStreamSlow::~RMFileStreamSlow() { - close(); -} - -void RMFileStreamSlow::close() { - delete _stream; -} - -bool RMFileStreamSlow::openFile(Common::File &file) { - _stream = file.readStream(file.size()); - - _length = _stream->pos(); - - return true; -} - -bool RMFileStreamSlow::openFile(const char *lpFN) { - // Open file for reading - Common::File f; - if (!f.open(lpFN)) - return false; - - _length = f.size(); - _stream = f.readStream(f.size()); - - return true; -} - -RMDataStream &RMFileStreamSlow::operator+=(int nBytes) { - seek(nBytes); - return *this; -} - -int RMFileStreamSlow::pos() { - return _stream->pos(); -} - -bool RMFileStreamSlow::isEOF() { - return (pos() >= _length); -} - -int RMFileStreamSlow::seek(int nBytes, RMDSPos where) { - switch (where) { - case START: - return _stream->seek(nBytes); - - case END: - return _stream->seek(nBytes, SEEK_END); - - case CUR: - return _stream->seek(nBytes, SEEK_CUR); - - default: - return 0; - } -} - -bool RMFileStreamSlow::read(void *buf, int size) { - uint32 dwRead; - - dwRead = _stream->read(buf, size); - return ((int)dwRead == size); -} - -RMFileStreamSlow &operator>>(RMFileStreamSlow &df, char &var) { - df.read(&var, 1); - return df; -} - -RMFileStreamSlow &operator>>(RMFileStreamSlow &df, byte &var) { - df.read(&var, 1); - return df; -} - -RMFileStreamSlow &operator>>(RMFileStreamSlow &df, uint16 &var) { - uint16 v; - df.read(&v, 2); - v = FROM_LE_16(v); - return df; -} - -RMFileStreamSlow &operator>>(RMFileStreamSlow &df, int16 &var) { - uint16 v; - df.read(&v, 2); - var = (int16)FROM_LE_16(v); - return df; -} - -RMFileStreamSlow &operator>>(RMFileStreamSlow &df, int &var) { - int v; - df.read(&v, 4); - var = FROM_LE_32(v); - return df; -} - -RMFileStreamSlow &operator>>(RMFileStreamSlow &df, uint32 &var) { - uint32 v; - df.read(&v, 4); - var = FROM_LE_32(v); - return df; -} - -/****************************************************************************\ -* RMDataStream methods -\****************************************************************************/ - -/** - * Constructor - */ -RMDataStream::RMDataStream() { - _length = 0; - _pos = 0; - _bError = false; - - _buf = NULL; - _ecode = 0; -} - -/** - * Destructor - */ -RMDataStream::~RMDataStream() { - close(); -} - -/** - * Close a stream - */ -void RMDataStream::close() { - _length = 0; - _pos = 0; -} - -/** - * Takes the address of the buffer from which will be read the data. - * @param lpBuf Data buffer - * @param size Size of the buffer - * @remarks If the length of the buffer is not known, and cannot be - * specified, then EOF() and Seek() to end won't work. - */ -void RMDataStream::openBuffer(const byte *lpBuf, int size) { - _length = size; - _buf = lpBuf; - _bError = false; - _pos = 0; -} - -/** - * Returns the length of the stream - * @returns Stream length - */ -int RMDataStream::length() { - return _length; -} - -/** - * Determines if the end of the stream has been reached - * @returns true if end of stream reached, false if not - */ -bool RMDataStream::isEOF() { - return (_pos >= _length); -} - -/** - * Extracts data from the stream - * @param df Stream - * @param var Variable of a supported type - * @returns Value read from the stream - */ -RMDataStream &operator>>(RMDataStream &df, char &var) { - df.read(&var, 1); - return df; -} - -/** - * Extracts data from the stream - * @param df Stream - * @param var Variable of a supported type - * @returns Value read from the stream - */ -RMDataStream &operator>>(RMDataStream &df, uint8 &var) { - df.read(&var, 1); - return df; -} - -/** - * Extracts data from the stream - * @param df Stream - * @param var Variable of a supported type - * @returns Value read from the stream - */ -RMDataStream &operator>>(RMDataStream &df, uint16 &var) { - uint16 v; - df.read(&v, 2); - - var = FROM_LE_16(v); - return df; -} - -/** - * Extracts data from the stream - * @param df Stream - * @param var Variable of a supported type - * @returns Value read from the stream - */ -RMDataStream &operator>>(RMDataStream &df, int16 &var) { - uint16 v; - df.read(&v, 2); - - var = (int16)FROM_LE_16(v); - return df; -} - -/** - * Extracts data from the stream - * @param df Stream - * @param var Variable of a supported type - * @returns Value read from the stream - */ -RMDataStream &operator>>(RMDataStream &df, int &var) { - uint32 v; - df.read(&v, 4); - - var = (int)FROM_LE_32(v); - return df; -} - -/** - * Extracts data from the stream - * @param df Stream - * @param var Variable of a supported type - * @returns Value read from the stream - */ -RMDataStream &operator>>(RMDataStream &df, uint32 &var) { - uint32 v; - df.read(&v, 4); - - var = FROM_LE_32(v); - return df; -} - -/** - * Reads a series of data from the stream in a buffer - * @param lpBuf Data buffer - * @param size Size of the buffer - * @returns true if we have reached the end, false if not - */ -bool RMDataStream::read(void *lpBuf, int size) { - byte *dest = (byte *)lpBuf; - - if ((_pos + size) > _length) { - Common::copy(_buf + _pos, _buf + _pos + (_length - _pos), dest); - - return true; - } else { - Common::copy(_buf + _pos, _buf + _pos + size, dest); - - _pos += size; - return false; - } -} - -/** - * Skips a number of bytes in the stream - * @param nBytres Number of bytes to skip - * @returns The stream - */ -RMDataStream &RMDataStream::operator+=(int nBytes) { - _pos += nBytes; - return *this; -} - -/** - * Seeks to a position within the stream - * @param nBytes Number of bytes from specified origin - * @param origin Origin to do offset from - * @returns The absolute current position in bytes - */ -int RMDataStream::seek(int nBytes, RMDSPos origin) { - switch (origin) { - case CUR: - break; - - case START: - _pos = 0; - break; - - case END: - if (_length == SIZENOTKNOWN) - return _pos; - _pos = _length; - break; - } - - _pos += nBytes; - return _pos; -} - -/** - * Returns the current position of the stream - * @returns The current position - */ -int RMDataStream::pos() { - return _pos; -} - -/** - * Check if an error occurred during reading the stream - * @returns true if there was an error, false otherwise - */ -bool RMDataStream::isError() { - return _bError; -} - -/** - * Sets an error code for the stream - * @param code Error code - */ -void RMDataStream::setError(int code) { - _bError = true; - _ecode = code; -} - -/** - * Returns the error code for the stream - * @returns Error code - */ -int RMDataStream::getError() { - return _ecode; + return var; } /****************************************************************************\ @@ -507,9 +168,9 @@ bool RMPoint::operator!=(RMPoint p) { /** * Reads a point from a stream */ -RMDataStream &operator>>(RMDataStream &ds, RMPoint &p) { - ds >> p._x >> p._y; - return ds; +void RMPoint::readFromStream(Common::ReadStream &ds) { + _x = ds.readSint32LE(); + _y = ds.readSint32LE(); } /****************************************************************************\ @@ -663,9 +324,11 @@ void RMRect::normalizeRect() { setRect(MIN(_x1, _x2), MIN(_y1, _y2), MAX(_x1, _x2), MAX(_y1, _y2)); } -RMDataStream &operator>>(RMDataStream &ds, RMRect &rc) { - ds >> rc._x1 >> rc._y1 >> rc._x2 >> rc._y2; - return ds; +void RMRect::readFromStream(Common::ReadStream &ds) { + _x1 = ds.readSint32LE(); + _y1 = ds.readSint32LE(); + _x2 = ds.readSint32LE(); + _y2 = ds.readSint32LE(); } /****************************************************************************\ diff --git a/engines/tony/utils.h b/engines/tony/utils.h index 50b18d8aa7..d3f93e06ef 100644 --- a/engines/tony/utils.h +++ b/engines/tony/utils.h @@ -39,113 +39,7 @@ namespace Tony { using namespace ::Tony::MPAL; -/** - * Data stream for reading data - */ -class RMDataStream { -protected: - const byte *_buf; - int _length; - int _pos; - bool _bError; - int _ecode; - -public: - enum RMDSPos { - CUR, - START, - END - }; - -private: - enum { - SIZENOTKNOWN = 0x7FFFFFFF - }; - -public: - // Constructor and destructor - RMDataStream(); - virtual ~RMDataStream(); - - // Loading buffer - void openBuffer(const byte *buf, int size = SIZENOTKNOWN); - void close(); - - // Attributei - int length(); - virtual int pos(); - - // EOF - virtual bool isEOF(); - - // Read methods - friend RMDataStream &operator>>(RMDataStream &df, char &var); - friend RMDataStream &operator>>(RMDataStream &df, byte &var); - friend RMDataStream &operator>>(RMDataStream &df, uint16 &var); - friend RMDataStream &operator>>(RMDataStream &df, int16 &var); - friend RMDataStream &operator>>(RMDataStream &df, int &var); - friend RMDataStream &operator>>(RMDataStream &df, uint32 &var); - - // General read - virtual bool read(void *buf, int size); - - // Skipping & Seeking - virtual RMDataStream &operator+=(int nBytes); - virtual int seek(int nBytes, RMDSPos origin = CUR); - - // Error handling - void setError(int ecode); - int getError(); - bool isError(); -}; - -/** - * Data stream per lettura di dati aperto da file - */ -class RMFileStream : public RMDataStream { -private: - byte *_buf; - -public: - RMFileStream(); - virtual ~RMFileStream(); - - // Methods for opening file - bool openFile(const char *lpFN); - bool openFile(Common::File &file); - - void close(); -}; - -class RMFileStreamSlow : public RMDataStream { -private: - Common::SeekableReadStream *_stream; -public: - RMFileStreamSlow(); - virtual ~RMFileStreamSlow(); - - bool openFile(const char *lpFN); - bool openFile(Common::File &file); - - void close(); - - RMDataStream &operator+=(int nBytes); - int seek(int nBytes, RMDSPos where = CUR); - - int pos(); - virtual bool isEOF(); - - bool read(void *buf, int size); - - friend RMFileStreamSlow &operator>>(RMFileStreamSlow &df, char &var); - friend RMFileStreamSlow &operator>>(RMFileStreamSlow &df, byte &var); - friend RMFileStreamSlow &operator>>(RMFileStreamSlow &df, uint16 &var); - friend RMFileStreamSlow &operator>>(RMFileStreamSlow &df, int16 &var); - friend RMFileStreamSlow &operator>>(RMFileStreamSlow &df, int &var); - friend RMFileStreamSlow &operator>>(RMFileStreamSlow &df, uint32 &var); -}; - -RMDataStream &operator>>(RMDataStream &df, Common::String &var); +Common::String readString(Common::ReadStream &ds); /** * Point class @@ -186,7 +80,7 @@ public: operator Common::Point() const; // Extraction from data streams - friend RMDataStream &operator>>(RMDataStream &ds, RMPoint &p); + void readFromStream(Common::ReadStream &ds); }; class RMPointReference { @@ -256,7 +150,7 @@ public: } // Extract from data stream - friend RMDataStream &operator>>(RMDataStream &ds, RMRect &rc); + void readFromStream(Common::ReadStream &ds); }; /** |