aboutsummaryrefslogtreecommitdiff
path: root/engines/dreamweb
diff options
context:
space:
mode:
authorWillem Jan Palenstijn2011-12-27 21:42:38 +0100
committerWillem Jan Palenstijn2011-12-27 23:02:33 +0100
commitf729742f87648d6a5ebc1468e26e90ac1de1c2e0 (patch)
tree8eb3b4166d8b69985ceba0c95d42627e78edc0d7 /engines/dreamweb
parente54196f37fbf918976f834680671c12bfce58d23 (diff)
downloadscummvm-rg350-f729742f87648d6a5ebc1468e26e90ac1de1c2e0.tar.gz
scummvm-rg350-f729742f87648d6a5ebc1468e26e90ac1de1c2e0.tar.bz2
scummvm-rg350-f729742f87648d6a5ebc1468e26e90ac1de1c2e0.zip
DREAMWEB: Convert exText into TextFile
Diffstat (limited to 'engines/dreamweb')
-rw-r--r--engines/dreamweb/dreambase.h3
-rw-r--r--engines/dreamweb/dreamweb.cpp2
-rw-r--r--engines/dreamweb/object.cpp18
-rw-r--r--engines/dreamweb/saveload.cpp8
-rw-r--r--engines/dreamweb/structs.h22
-rw-r--r--engines/dreamweb/stubs.cpp12
6 files changed, 41 insertions, 24 deletions
diff --git a/engines/dreamweb/dreambase.h b/engines/dreamweb/dreambase.h
index d07e74d3f0..88dc96ece2 100644
--- a/engines/dreamweb/dreambase.h
+++ b/engines/dreamweb/dreambase.h
@@ -150,8 +150,7 @@ protected:
// Extras segment (NB: this is saved)
GraphicsFile _exFrames;
DynObject _exData[kNumExObjects];
- uint16 _exTextdatLE[kNumExObjects+2]; // TODO: Convert into TextFile
- char _exText[18000];
+ TextFile _exText;
public:
DreamBase(DreamWeb::DreamWebEngine *en);
diff --git a/engines/dreamweb/dreamweb.cpp b/engines/dreamweb/dreamweb.cpp
index b31a85149a..1019abaf31 100644
--- a/engines/dreamweb/dreamweb.cpp
+++ b/engines/dreamweb/dreamweb.cpp
@@ -407,7 +407,7 @@ uint8 DreamWebEngine::modifyChar(uint8 c) const {
namespace DreamGen {
// FIXME/TODO: Move this to a better place.
-DreamBase::DreamBase(DreamWeb::DreamWebEngine *en) : engine(en) {
+DreamBase::DreamBase(DreamWeb::DreamWebEngine *en) : engine(en), _exText(kNumExObjects+2) {
_openChangeSize = kInventx+(4*kItempicsize);
_quitRequested = false;
diff --git a/engines/dreamweb/object.cpp b/engines/dreamweb/object.cpp
index 3054a61d68..c78ec71561 100644
--- a/engines/dreamweb/object.cpp
+++ b/engines/dreamweb/object.cpp
@@ -251,12 +251,12 @@ void DreamBase::inventory() {
}
void DreamBase::transferText(uint8 from, uint8 to) {
- WRITE_LE_UINT16(&_exTextdatLE[to], data.word(kExtextpos));
+ _exText.setOffset(to, data.word(kExtextpos));
uint16 freeTextOffset = 2*from;
uint16 srcOffset = getSegment(data.word(kFreedesc)).word(kFreetextdat + freeTextOffset);
const char *src = (const char *)getSegment(data.word(kFreedesc)).ptr(kFreetext + srcOffset, 0);
- char *dst = _exText + data.word(kExtextpos);
+ char *dst = _exText._text + data.word(kExtextpos);
size_t len = strlen(src);
memcpy(dst, src, len + 1);
@@ -449,24 +449,24 @@ void DreamBase::deleteExFrame(uint8 frameNum) {
}
void DreamBase::deleteExText(uint8 textNum) {
- uint16 offset = READ_LE_UINT16(&_exTextdatLE[textNum]);
+ uint16 offset = _exText.getOffset(textNum);
uint16 startOff = offset;
- uint16 textSize = strlen(&_exText[startOff]) + 1;
+ uint16 textSize = strlen(_exText.getString(textNum)) + 1;
uint16 endOff = startOff + textSize;
uint16 remainder = kExtextlen - offset - textSize;
// Shift text data after this one down
- memmove(&_exText[startOff], &_exText[endOff], remainder);
+ memmove(&_exText._text[startOff], &_exText._text[endOff], remainder);
// Combined text data is now frameSize smaller
data.word(kExtextpos) -= textSize;
// Adjust all text pointers pointing into the shifted data
for (unsigned int i = 0; i < kNumexobjects; ++i) {
- uint16 t = READ_LE_UINT16(&_exTextdatLE[i]);
+ uint16 t = _exText.getOffset(i);
if (t >= offset + textSize)
- WRITE_LE_UINT16(&_exTextdatLE[i], t - textSize);
+ _exText.setOffset(i, t - textSize);
}
}
@@ -604,9 +604,9 @@ const uint8 *DreamBase::getObTextStart() {
textBase = getSegment(textSeg).ptr(textOff, 0);
text = textBase + getSegment(textSeg).word(textDatOff + 2*data.byte(kCommand));
} else {
- textBase = (const uint8 *)_exText;
+ textBase = (const uint8 *)_exText._text;
textOff = kExtext;
- text = textBase + READ_LE_UINT16(&_exTextdatLE[data.byte(kCommand)]);
+ text = (const uint8 *)_exText.getString(data.byte(kCommand));
}
if (data.byte(kObjecttype) != kSetObjectType1)
diff --git a/engines/dreamweb/saveload.cpp b/engines/dreamweb/saveload.cpp
index 2c659c4c6e..e2af04df75 100644
--- a/engines/dreamweb/saveload.cpp
+++ b/engines/dreamweb/saveload.cpp
@@ -481,8 +481,8 @@ void DreamBase::savePosition(unsigned int slot, const char *descbuf) {
outSaveFile->write((const uint8 *)_exFrames._frames, 2080);
outSaveFile->write((const uint8 *)_exFrames._data, kExframeslen);
outSaveFile->write((const uint8 *)_exData, sizeof(DynObject)*kNumexobjects);
- outSaveFile->write((const uint8 *)_exTextdatLE, 2*(kNumExObjects+2));
- outSaveFile->write((const uint8 *)_exText, kExtextlen);
+ outSaveFile->write((const uint8 *)_exText._offsetsLE, 2*(kNumExObjects+2));
+ outSaveFile->write((const uint8 *)_exText._text, kExtextlen);
outSaveFile->write(_listOfChanges, len[3]);
@@ -554,8 +554,8 @@ void DreamBase::loadPosition(unsigned int slot) {
inSaveFile->read((uint8 *)_exFrames._frames, 2080);
inSaveFile->read((uint8 *)_exFrames._data, kExframeslen);
inSaveFile->read((uint8 *)_exData, sizeof(DynObject)*kNumexobjects);
- inSaveFile->read((uint8 *)_exTextdatLE, 2*(kNumExObjects+2));
- inSaveFile->read((uint8 *)_exText, kExtextlen);
+ inSaveFile->read((uint8 *)_exText._offsetsLE, 2*(kNumExObjects+2));
+ inSaveFile->read((uint8 *)_exText._text, kExtextlen);
inSaveFile->read(_listOfChanges, len[3]);
diff --git a/engines/dreamweb/structs.h b/engines/dreamweb/structs.h
index cf3e2ceb9f..0b7a81b6eb 100644
--- a/engines/dreamweb/structs.h
+++ b/engines/dreamweb/structs.h
@@ -295,14 +295,28 @@ struct MapFlag {
};
struct TextFile {
- TextFile() : _text(0) { }
+ TextFile(unsigned int size = 66) : _size(size), _text(0) { _offsetsLE = new uint16[_size]; }
- uint16 _offsetsLE[66];
+ ~TextFile() {
+ delete[] _offsetsLE;
+ _offsetsLE = 0;
+ _size = 0;
+ clear();
+ }
+
+ uint16 *_offsetsLE;
+ unsigned int _size;
char *_text;
const char *getString(unsigned int i) const {
- assert(i < 66);
- return _text + READ_LE_UINT16(&_offsetsLE[i]);
+ assert(i < _size);
+ return _text + getOffset(i);
+ }
+ void setOffset(unsigned int i, uint16 offset) {
+ WRITE_LE_UINT16(&_offsetsLE[i], offset);
+ }
+ uint16 getOffset(unsigned int i) const {
+ return READ_LE_UINT16(&_offsetsLE[i]);
}
void clear() {
delete[] _text;
diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp
index 084aa76da7..818e1a537b 100644
--- a/engines/dreamweb/stubs.cpp
+++ b/engines/dreamweb/stubs.cpp
@@ -1230,8 +1230,7 @@ const uint8 *DreamBase::findObName(uint8 type, uint8 index) {
uint16 offset = getSegment(data.word(kPeople)).word(kPersontxtdat + i) + kPersontext;
return getSegment(data.word(kPeople)).ptr(offset, 0);
} else if (type == 4) {
- uint16 offset = READ_LE_UINT16(&_exTextdatLE[index]);
- return (const uint8 *)_exText + offset;
+ return (const uint8 *)_exText.getString(index);
} else if (type == 2) {
uint16 offset = getSegment(data.word(kFreedesc)).word(kFreetextdat + index * 2) + kFreetext;
return getSegment(data.word(kFreedesc)).ptr(offset, 0);
@@ -2223,6 +2222,7 @@ void DreamBase::loadRoomData(const Room &room, bool skipDat) {
data.word(kReel3) = allocateAndLoad(len[6]);
data.word(kReels) = allocateAndLoad(len[7]);
data.word(kPeople) = allocateAndLoad(len[8]);
+ // TODO: kSetdesc, kBlockdesc, kRoomdesc are also TextFiles?
data.word(kSetdesc) = allocateAndLoad(len[9]);
data.word(kBlockdesc) = allocateAndLoad(len[10]);
data.word(kRoomdesc) = allocateAndLoad(len[11]);
@@ -2238,6 +2238,7 @@ void DreamBase::loadRoomData(const Room &room, bool skipDat) {
clearAndLoad(data.word(kFreedat), 255, len[13], kFreedatlen);
else
engine->skipBytes(len[13]);
+ // TODO: kFreedesc is also a TextFile?
data.word(kFreedesc) = allocateAndLoad(len[14]);
engine->closeFile();
@@ -2499,6 +2500,9 @@ void DreamBase::drawFloor() {
void DreamBase::allocateBuffers() {
_exFrames.clear();
_exFrames._data = new uint8[kExframeslen];
+ _exText.clear();
+ _exText._text = new char[kExtextlen];
+
data.word(kFreedat) = allocateMem(kFreedatlen/16);
data.word(kSetdat) = allocateMem(kSetdatlen/16);
}
@@ -3622,8 +3626,8 @@ void DreamBase::clearChanges() {
memset(_exFrames._frames, 0xFF, 2080);
memset(_exFrames._data, 0xFF, kExframeslen);
memset(_exData, 0xFF, sizeof(DynObject) * kNumexobjects);
- memset(_exTextdatLE, 0xFF, 2*(kNumexobjects+2));
- memset(_exText, 0xFF, kExtextlen);
+ memset(_exText._offsetsLE, 0xFF, 2*(kNumexobjects+2));
+ memset(_exText._text, 0xFF, kExtextlen);
const uint8 initialRoomsCanGo[] = { 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };