TONY: Get rid of RMDataStream.
This commit is contained in:
parent
18b1f6d7c6
commit
35fd91793b
12 changed files with 180 additions and 768 deletions
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
\****************************************************************************/
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
/****************************************************************************\
|
||||
|
|
|
@ -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);
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue