aboutsummaryrefslogtreecommitdiff
path: root/engines/dreamweb
diff options
context:
space:
mode:
authorWillem Jan Palenstijn2011-12-27 22:21:43 +0100
committerWillem Jan Palenstijn2011-12-27 23:03:40 +0100
commitd9aed2e00bbb2dc54eb741affc1d978068175c04 (patch)
treeafc3639743a2bf3e10b6459fefc4fa2ef2adbe90 /engines/dreamweb
parenta7cdc342b36bce68e5cdabf6a682e38ea1b21e7b (diff)
downloadscummvm-rg350-d9aed2e00bbb2dc54eb741affc1d978068175c04.tar.gz
scummvm-rg350-d9aed2e00bbb2dc54eb741affc1d978068175c04.tar.bz2
scummvm-rg350-d9aed2e00bbb2dc54eb741affc1d978068175c04.zip
DREAMWEB: Convert room text into TextFiles
Diffstat (limited to 'engines/dreamweb')
-rw-r--r--engines/dreamweb/dreambase.h10
-rw-r--r--engines/dreamweb/dreamgen.cpp6
-rw-r--r--engines/dreamweb/dreamgen.h43
-rw-r--r--engines/dreamweb/dreamweb.cpp5
-rw-r--r--engines/dreamweb/object.cpp17
-rw-r--r--engines/dreamweb/sprite.cpp10
-rw-r--r--engines/dreamweb/stubs.cpp81
-rw-r--r--engines/dreamweb/talk.cpp5
8 files changed, 72 insertions, 105 deletions
diff --git a/engines/dreamweb/dreambase.h b/engines/dreamweb/dreambase.h
index 1b48e07fb4..c62d202890 100644
--- a/engines/dreamweb/dreambase.h
+++ b/engines/dreamweb/dreambase.h
@@ -143,12 +143,18 @@ protected:
GraphicsFile _mainSprites;
const GraphicsFile *_currentCharset;
- // room graphics files
+ // room files
GraphicsFile _setFrames;
GraphicsFile _freeFrames;
GraphicsFile _reel1;
GraphicsFile _reel2;
GraphicsFile _reel3;
+ TextFile _setDesc;
+ TextFile _blockDesc;
+ TextFile _roomDesc;
+ TextFile _freeDesc;
+ TextFile _personText;
+ uint16 _personFramesLE[12];
// Extras segment (NB: this is saved)
GraphicsFile _exFrames;
@@ -516,8 +522,6 @@ public:
void loadGraphicsFile(GraphicsFile &file, const char *fileName);
void loadGraphicsSegment(GraphicsFile &file, unsigned int len);
void loadTextSegment(TextFile &file, unsigned int len);
- uint16 standardLoad(const char *fileName, uint16 *outSizeInBytes = NULL); // Returns a segment handle which needs to be freed with deallocatemem for symmetry
- void *standardLoadCPP(const char *fileName, uint16 *outSizeInBytes = NULL); // And this one should be 'free'd
void loadIntoTemp(const char *fileName);
void loadIntoTemp2(const char *fileName);
void loadIntoTemp3(const char *fileName);
diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp
index 4f2524ace6..de85b4c54e 100644
--- a/engines/dreamweb/dreamgen.cpp
+++ b/engines/dreamweb/dreamgen.cpp
@@ -65,11 +65,9 @@ void DreamGenContext::__start() {
//0x0100: .... .... .... ....
0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
//0x0110: .... .... .... ....
- 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
//0x0120: .... .... .... ....
- 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- //0x0130: .... .... .... ....
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, };
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, };
ds.assign(src, src + sizeof(src));
dreamweb();
}
diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h
index 75fef09741..bbedcbcbb9 100644
--- a/engines/dreamweb/dreamgen.h
+++ b/engines/dreamweb/dreamgen.h
@@ -255,30 +255,25 @@ static const uint16 kBackdrop = 284;
static const uint16 kRecordspace = 286;
static const uint16 kFreedat = 288;
static const uint16 kSetdat = 290;
-static const uint16 kRoomdesc = 292;
-static const uint16 kFreedesc = 294;
-static const uint16 kSetdesc = 296;
-static const uint16 kBlockdesc = 298;
-static const uint16 kPeople = 300;
-static const uint16 kReels = 302;
-static const uint16 kBlinkframe = 304;
-static const uint16 kBlinkcount = 305;
-static const uint16 kReasseschanges = 306;
-static const uint16 kPointerspath = 307;
-static const uint16 kManspath = 308;
-static const uint16 kPointerfirstpath = 309;
-static const uint16 kFinaldest = 310;
-static const uint16 kDestination = 311;
-static const uint16 kLinestartx = 312;
-static const uint16 kLinestarty = 314;
-static const uint16 kLineendx = 316;
-static const uint16 kLineendy = 318;
-static const uint16 kLinepointer = 320;
-static const uint16 kLinedirection = 321;
-static const uint16 kLinelength = 322;
-static const uint16 kCh0playing = 323;
-static const uint16 kCh0repeat = 324;
-static const uint16 kCh1playing = 325;
+static const uint16 kReels = 292;
+static const uint16 kBlinkframe = 294;
+static const uint16 kBlinkcount = 295;
+static const uint16 kReasseschanges = 296;
+static const uint16 kPointerspath = 297;
+static const uint16 kManspath = 298;
+static const uint16 kPointerfirstpath = 299;
+static const uint16 kFinaldest = 300;
+static const uint16 kDestination = 301;
+static const uint16 kLinestartx = 302;
+static const uint16 kLinestarty = 304;
+static const uint16 kLineendx = 306;
+static const uint16 kLineendy = 308;
+static const uint16 kLinepointer = 310;
+static const uint16 kLinedirection = 311;
+static const uint16 kLinelength = 312;
+static const uint16 kCh0playing = 313;
+static const uint16 kCh0repeat = 314;
+static const uint16 kCh1playing = 315;
static const uint16 kBlocktextdat = (0);
static const uint16 kPersonframes = (0);
static const uint16 kDebuglevel1 = (0);
diff --git a/engines/dreamweb/dreamweb.cpp b/engines/dreamweb/dreamweb.cpp
index 1019abaf31..539433dbb9 100644
--- a/engines/dreamweb/dreamweb.cpp
+++ b/engines/dreamweb/dreamweb.cpp
@@ -407,7 +407,10 @@ uint8 DreamWebEngine::modifyChar(uint8 c) const {
namespace DreamGen {
// FIXME/TODO: Move this to a better place.
-DreamBase::DreamBase(DreamWeb::DreamWebEngine *en) : engine(en), _exText(kNumExObjects+2) {
+DreamBase::DreamBase(DreamWeb::DreamWebEngine *en) :
+ engine(en), _exText(kNumExObjects+2),
+ _setDesc(130), _blockDesc(98), _roomDesc(38), _freeDesc(82), _personText(1026) {
+
_openChangeSize = kInventx+(4*kItempicsize);
_quitRequested = false;
diff --git a/engines/dreamweb/object.cpp b/engines/dreamweb/object.cpp
index c78ec71561..6e5ae8a813 100644
--- a/engines/dreamweb/object.cpp
+++ b/engines/dreamweb/object.cpp
@@ -252,10 +252,7 @@ void DreamBase::inventory() {
void DreamBase::transferText(uint8 from, uint8 to) {
_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);
+ const char *src = _freeDesc.getString(from);
char *dst = _exText._text + data.word(kExtextpos);
size_t len = strlen(src);
@@ -592,17 +589,13 @@ const uint8 *DreamBase::getObTextStart() {
const uint8 *text;
uint16 textOff;
if (data.byte(kObjecttype) == kFreeObjectType) {
- uint16 textSeg = data.word(kFreedesc);
- uint16 textDatOff = kFreetextdat;
+ textBase = (const uint8 *)_freeDesc._text;
textOff = kFreetext;
- textBase = getSegment(textSeg).ptr(textOff, 0);
- text = textBase + getSegment(textSeg).word(textDatOff + 2*data.byte(kCommand));
+ text = (const uint8 *)_freeDesc.getString(data.byte(kCommand));
} else if (data.byte(kObjecttype) == kSetObjectType1) {
- uint16 textSeg = data.word(kSetdesc);
- uint16 textDatOff = kSettextdat;
+ textBase = (const uint8 *)_setDesc._text;
textOff = kSettext;
- textBase = getSegment(textSeg).ptr(textOff, 0);
- text = textBase + getSegment(textSeg).word(textDatOff + 2*data.byte(kCommand));
+ text = (const uint8 *)_setDesc.getString(data.byte(kCommand));
} else {
textBase = (const uint8 *)_exText._text;
textOff = kExtext;
diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp
index 4071c56f64..424d8d52b2 100644
--- a/engines/dreamweb/sprite.cpp
+++ b/engines/dreamweb/sprite.cpp
@@ -1102,12 +1102,12 @@ void DreamBase::clearBeforeLoad() {
_backdropBlocks = 0;
_setFrames.clear();
deallocateMem(data.word(kReels));
- deallocateMem(data.word(kPeople));
- deallocateMem(data.word(kSetdesc));
- deallocateMem(data.word(kBlockdesc));
- deallocateMem(data.word(kRoomdesc));
+ _personText.clear();
+ _setDesc.clear();
+ _blockDesc.clear();
+ _roomDesc.clear();
_freeFrames.clear();
- deallocateMem(data.word(kFreedesc));
+ _freeDesc.clear();
data.byte(kRoomloaded) = 0;
}
diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp
index e9f1ea4f51..994111df04 100644
--- a/engines/dreamweb/stubs.cpp
+++ b/engines/dreamweb/stubs.cpp
@@ -658,6 +658,11 @@ done: // The engine will need some cleaner finalization, let's put it here for n
_reel1.clear();
_reel2.clear();
_reel3.clear();
+ _setDesc.clear();
+ _blockDesc.clear();
+ _roomDesc.clear();
+ _freeDesc.clear();
+ _personText.clear();
_textFile1.clear();
_textFile2.clear();
@@ -773,31 +778,6 @@ void DreamBase::switchRyanOff() {
data.byte(kRyanon) = 1;
}
-uint16 DreamBase::standardLoad(const char *fileName, uint16 *outSizeInBytes) {
- FileHeader header;
-
- Common::File file;
- file.open(fileName);
- file.read((uint8 *)&header, sizeof(FileHeader));
- uint16 sizeInBytes = header.len(0);
- if (outSizeInBytes)
- *outSizeInBytes = sizeInBytes;
- uint16 result = allocateMem((sizeInBytes + 15) / 16);
- file.read(getSegment(result).ptr(0, 0), sizeInBytes);
- return result;
-}
-
-void *DreamBase::standardLoadCPP(const char *fileName, uint16 *outSizeInBytes) {
- uint16 sizeInBytes;
- uint16 seg = standardLoad(fileName, &sizeInBytes);
- void *buffer = malloc(sizeInBytes);
- memcpy(buffer, getSegment(seg).ptr(0, 0), sizeInBytes);
- deallocateMem(seg);
- if (outSizeInBytes)
- *outSizeInBytes = sizeInBytes;
- return buffer;
-}
-
void DreamBase::loadGraphicsFile(GraphicsFile &file, const char *fileName) {
FileHeader header;
@@ -1248,20 +1228,16 @@ bool DreamBase::checkIfEx(uint8 x, uint8 y) {
const uint8 *DreamBase::findObName(uint8 type, uint8 index) {
if (type == 5) {
- uint16 i = 64 * 2 * (index & 127);
- uint16 offset = getSegment(data.word(kPeople)).word(kPersontxtdat + i) + kPersontext;
- return getSegment(data.word(kPeople)).ptr(offset, 0);
+ uint16 i = 64 * (index & 127);
+ return (const uint8 *)_personText.getString(i);
} else if (type == 4) {
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);
+ return (const uint8 *)_freeDesc.getString(index);
} else if (type == 1) {
- uint16 offset = getSegment(data.word(kSetdesc)).word(kSettextdat + index * 2) + kSettext;
- return getSegment(data.word(kSetdesc)).ptr(offset, 0);
+ return (const uint8 *)_setDesc.getString(index);
} else {
- uint16 offset = getSegment(data.word(kBlockdesc)).word(kBlocktextdat + index * 2) + kBlocktext;
- return getSegment(data.word(kBlockdesc)).ptr(offset, 0);
+ return (const uint8 *)_blockDesc.getString(index);
}
}
@@ -1736,9 +1712,8 @@ bool DreamBase::isRyanHolding(const char *id) {
}
bool DreamBase::isItDescribed(const ObjPos *pos) {
- uint16 offset = getSegment(data.word(kSetdesc)).word(kSettextdat + pos->index * 2);
- uint8 result = getSegment(data.word(kSetdesc)).byte(kSettext + offset);
- return result != 0;
+ const char *string = _setDesc.getString(pos->index);
+ return string[0] != 0;
}
bool DreamBase::isCD() {
@@ -2050,8 +2025,7 @@ void DreamBase::roomName() {
textIndex -= 32;
data.word(kLinespacing) = 7;
uint8 maxWidth = (data.byte(kWatchon) == 1) ? 120 : 160;
- uint16 descOffset = getSegment(data.word(kRoomdesc)).word(kIntextdat + textIndex * 2);
- const uint8 *string = getSegment(data.word(kRoomdesc)).ptr(kIntext + descOffset, 0);
+ const uint8 *string = (const uint8 *)_roomDesc.getString(textIndex);
printDirect(string, 88, 25, maxWidth, false);
data.word(kLinespacing) = 10;
useCharset1();
@@ -2142,8 +2116,7 @@ void DreamBase::doLook() {
data.byte(kCommandtype) = 255;
dumpTextLine();
uint8 index = data.byte(kRoomnum) & 31;
- uint16 offset = getSegment(data.word(kRoomdesc)).word(kIntextdat + index * 2);
- const uint8 *string = getSegment(data.word(kRoomdesc)).ptr(kIntext, 0) + offset;
+ const uint8 *string = (const uint8 *)_roomDesc.getString(index);
findNextColon(&string);
uint16 x;
if (data.byte(kReallocation) < 50)
@@ -2196,12 +2169,12 @@ void DreamBase::getRidOfAll() {
_reel2.clear();
_reel3.clear();
deallocateMem(data.word(kReels));
- deallocateMem(data.word(kPeople));
- deallocateMem(data.word(kSetdesc));
- deallocateMem(data.word(kBlockdesc));
- deallocateMem(data.word(kRoomdesc));
+ _personText.clear();
+ _setDesc.clear();
+ _blockDesc.clear();
+ _roomDesc.clear();
_freeFrames.clear();
- deallocateMem(data.word(kFreedesc));
+ _freeDesc.clear();
}
// if skipDat, skip clearing and loading Setdat and Freedat
@@ -2236,18 +2209,20 @@ void DreamBase::loadRoomData(const Room &room, bool skipDat) {
loadGraphicsSegment(_reel2, len[5]);
loadGraphicsSegment(_reel3, 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]);
+
+ // segment 8 consists of 12 personFrames followed by a TextFile
+ engine->readFromFile((uint8 *)_personFramesLE, 24);
+ loadTextSegment(_personText, len[8] - 24);
+
+ loadTextSegment(_setDesc, len[9]);
+ loadTextSegment(_blockDesc, len[10]);
+ loadTextSegment(_roomDesc, len[11]);
loadGraphicsSegment(_freeFrames, len[12]);
if (!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]);
+ loadTextSegment(_freeDesc, len[14]);
engine->closeFile();
}
diff --git a/engines/dreamweb/talk.cpp b/engines/dreamweb/talk.cpp
index 172a61fad1..d27d920891 100644
--- a/engines/dreamweb/talk.cpp
+++ b/engines/dreamweb/talk.cpp
@@ -81,7 +81,7 @@ void DreamBase::convIcons() {
}
uint16 DreamBase::getPersFrame(uint8 index) {
- return getSegment(data.word(kPeople)).word(kPersonframes + index * 2);
+ return READ_LE_UINT16(&_personFramesLE[index]);
}
void DreamBase::startTalk() {
@@ -108,8 +108,7 @@ void DreamBase::startTalk() {
}
const uint8 *DreamBase::getPersonText(uint8 index, uint8 talkPos) {
- uint16 offset = kPersontext + getSegment(data.word(kPeople)).word(((index * 64 + talkPos) * 2) + kPersontxtdat);
- return getSegment(data.word(kPeople)).ptr(offset, 0);
+ return (const uint8 *)_personText.getString(index*64 + talkPos);
}
void DreamBase::moreTalk() {