TONY: Get rid of RMDataStream.

This commit is contained in:
Alyssa Milburn 2012-08-28 14:26:00 +02:00
parent 18b1f6d7c6
commit 35fd91793b
12 changed files with 180 additions and 768 deletions

View file

@ -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);

View file

@ -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) {

View file

@ -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();

View file

@ -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;

View file

@ -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);

View file

@ -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();
}

View file

@ -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();

View file

@ -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
\****************************************************************************/

View file

@ -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 {

View file

@ -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();

View file

@ -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();
}
/****************************************************************************\

View file

@ -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);
};
/**