[Scummvm-cvs-logs] scummvm master -> 8e79608a1de77c54cc6bf0eb23b32b1cc3175677

wjp wjp at usecode.org
Fri Dec 23 23:51:01 CET 2011


This automated email contains information about 8 new commits which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .

Summary:
00b0aafd4c DREAMWEB: Fix broken merge for pull request #151
061d24bb82 DREAMWEB: Move palettes out of buffers
1749182e98 DREAMWEB: Move ObjPos lists out of buffers
109acaab3c DREAMWEB: Move mapflags out of buffers
814793de49 DREAMWEB: Move rainlist out of buffers
10774daa58 DREAMWEB: Move backgrounds, zoom space, initial vars out of buffers
bbdbffc107 DREAMWEB: Move changes out of buffers
8e79608a1d DREAMWEB: Move sprite table out of buffers


Commit: 00b0aafd4ca9fa79686340a66f9dba9b383993e2
    https://github.com/scummvm/scummvm/commit/00b0aafd4ca9fa79686340a66f9dba9b383993e2
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2011-12-23T14:46:38-08:00

Commit Message:
DREAMWEB: Fix broken merge for pull request #151

Changed paths:
    engines/dreamweb/talk.cpp



diff --git a/engines/dreamweb/talk.cpp b/engines/dreamweb/talk.cpp
index fac75be..40c514b 100644
--- a/engines/dreamweb/talk.cpp
+++ b/engines/dreamweb/talk.cpp
@@ -62,7 +62,7 @@ void DreamGenContext::talk() {
 	} while (!data.byte(kGetback));
 
 	if (data.byte(kTalkpos) >= 4)
-		data.byte(data.word(kPersondata)+7) |= 128;
+		_personData->b7 |= 128;
 
 	redrawMainScrn();
 	workToScreenM();


Commit: 061d24bb829a9b4ee08016fb25781802799fae14
    https://github.com/scummvm/scummvm/commit/061d24bb829a9b4ee08016fb25781802799fae14
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2011-12-23T14:46:38-08:00

Commit Message:
DREAMWEB: Move palettes out of buffers

Changed paths:
    engines/dreamweb/dreambase.h
    engines/dreamweb/vgafades.cpp
    engines/dreamweb/vgagrafx.cpp



diff --git a/engines/dreamweb/dreambase.h b/engines/dreamweb/dreambase.h
index e20ee83..b4265e9 100644
--- a/engines/dreamweb/dreambase.h
+++ b/engines/dreamweb/dreambase.h
@@ -66,9 +66,14 @@ protected:
 
 	// from people.cpp
 	ReelRoutine _reelRoutines[kNumReelRoutines+1];
-	Common::List<People> _peopleList;
 	ReelRoutine *_personData;
 
+	// from Buffers
+	uint8 _startPal[3*256];
+	uint8 _endPal[3*256];
+	uint8 _mainPal[3*256];
+	Common::List<People> _peopleList;
+
 public:
 	DreamBase(DreamWeb::DreamWebEngine *en);
 
@@ -494,9 +499,6 @@ public:
 	void showPuzText(uint16 command, uint16 count);
 
 	// from vgafades.cpp
-	uint8 *mainPalette();
-	uint8 *startPalette();
-	uint8 *endPalette();
 	void clearStartPal();
 	void clearEndPal();
 	void palToStartPal();
diff --git a/engines/dreamweb/vgafades.cpp b/engines/dreamweb/vgafades.cpp
index adbc158..80f5ce6 100644
--- a/engines/dreamweb/vgafades.cpp
+++ b/engines/dreamweb/vgafades.cpp
@@ -24,41 +24,28 @@
 
 namespace DreamGen {
 
-uint8 *DreamBase::mainPalette() {
-// TODO: Turn these into plain C arrays
-	return getSegment(data.word(kBuffers)).ptr(kMaingamepal, 256 * 3);
-}
-
-uint8 *DreamBase::startPalette() {
-	return getSegment(data.word(kBuffers)).ptr(kStartpal, 256 * 3);
-}
-
-uint8 *DreamBase::endPalette() {
-	return getSegment(data.word(kBuffers)).ptr(kEndpal, 256 * 3);
-}
-
 void DreamBase::clearStartPal() {
-	memset(startPalette(), 0, 256 * 3);
+	memset(_startPal, 0, 256 * 3);
 }
 
 void DreamBase::clearEndPal() {
-	memset(endPalette(), 0, 256 * 3);
+	memset(_endPal, 0, 256 * 3);
 }
 
 void DreamBase::palToStartPal() {
-	memcpy(startPalette(), mainPalette(), 256 * 3);
+	memcpy(_startPal, _mainPal, 256 * 3);
 }
 
 void DreamBase::endPalToStart() {
-	memcpy(startPalette(), endPalette(), 256 * 3);
+	memcpy(_startPal, _endPal, 256 * 3);
 }
 
 void DreamBase::startPalToEnd() {
-	memcpy(endPalette(), startPalette(), 256 * 3);
+	memcpy(_endPal, _startPal, 256 * 3);
 }
 
 void DreamBase::palToEndPal() {
-	memcpy(endPalette(), mainPalette(), 256 * 3);
+	memcpy(_endPal, _mainPal, 256 * 3);
 }
 
 void DreamBase::fadeDOS() {
@@ -66,7 +53,7 @@ void DreamBase::fadeDOS() {
 
 	engine->waitForVSync();
 	//processEvents will be called from vsync
-	uint8 *dst = startPalette();
+	uint8 *dst = _startPal;
 	engine->getPalette(dst, 0, 64);
 	for (int fade = 0; fade < 64; ++fade) {
 		for (int c = 0; c < 768; ++c) { //original sources decrement 768 values -> 256 colors
@@ -84,7 +71,7 @@ void DreamBase::doFade() {
 		return;
 
 	engine->processEvents();
-	uint8 *src = startPalette() + 3 * data.byte(kColourpos);
+	uint8 *src = _startPal + 3 * data.byte(kColourpos);
 	engine->setPalette(src, data.byte(kColourpos), data.byte(kNumtofade));
 
 	data.byte(kColourpos) += data.byte(kNumtofade);
@@ -98,8 +85,8 @@ void DreamBase::fadeCalculation() {
 		return;
 	}
 
-	uint8 *startPal = startPalette();
-	const uint8 *endPal = endPalette();
+	uint8 *startPal = _startPal;
+	const uint8 *endPal = _endPal;
 	for (size_t i = 0; i < 256 * 3; ++i) {
 		uint8 s = startPal[i];
 		uint8 e = endPal[i];
@@ -117,8 +104,8 @@ void DreamBase::fadeCalculation() {
 
 void DreamBase::fadeUpYellows() {
 	palToEndPal();
-	memset(endPalette() + 231 * 3, 0, 8 * 3);
-	memset(endPalette() + 246 * 3, 0, 1 * 3);
+	memset(_endPal + 231 * 3, 0, 8 * 3);
+	memset(_endPal + 246 * 3, 0, 1 * 3);
 	data.byte(kFadedirection) = 1;
 	data.byte(kFadecount) = 63;
 	data.byte(kColourpos) = 0;
@@ -129,8 +116,8 @@ void DreamBase::fadeUpYellows() {
 void DreamBase::fadeUpMonFirst() {
 	palToStartPal();
 	palToEndPal();
-	memset(startPalette() + 231 * 3, 0, 8 * 3);
-	memset(startPalette() + 246 * 3, 0, 1 * 3);
+	memset(_startPal + 231 * 3, 0, 8 * 3);
+	memset(_startPal + 246 * 3, 0, 1 * 3);
 	data.byte(kFadedirection) = 1;
 	data.byte(kFadecount) = 63;
 	data.byte(kColourpos) = 0;
@@ -144,8 +131,8 @@ void DreamBase::fadeUpMonFirst() {
 void DreamBase::fadeDownMon() {
 	palToStartPal();
 	palToEndPal();
-	memset(endPalette() + 231 * 3, 0, 8 * 3);
-	memset(endPalette() + 246 * 3, 0, 1 * 3);
+	memset(_endPal + 231 * 3, 0, 8 * 3);
+	memset(_endPal + 246 * 3, 0, 1 * 3);
 	data.byte(kFadedirection) = 1;
 	data.byte(kFadecount) = 63;
 	data.byte(kColourpos) = 0;
@@ -156,8 +143,8 @@ void DreamBase::fadeDownMon() {
 void DreamBase::fadeUpMon() {
 	palToStartPal();
 	palToEndPal();
-	memset(startPalette() + 231 * 3, 0, 8 * 3);
-	memset(startPalette() + 246 * 3, 0, 1 * 3);
+	memset(_startPal + 231 * 3, 0, 8 * 3);
+	memset(_startPal + 246 * 3, 0, 1 * 3);
 	data.byte(kFadedirection) = 1;
 	data.byte(kFadecount) = 63;
 	data.byte(kColourpos) = 0;
@@ -167,10 +154,10 @@ void DreamBase::fadeUpMon() {
 
 void DreamBase::initialMonCols() {
 	palToStartPal();
-	memset(startPalette() + 230 * 3, 0, 9 * 3);
-	memset(startPalette() + 246 * 3, 0, 1 * 3);
+	memset(_startPal + 230 * 3, 0, 9 * 3);
+	memset(_startPal + 246 * 3, 0, 1 * 3);
 	engine->processEvents();
-	engine->setPalette(startPalette() + 230 * 3, 230, 18);
+	engine->setPalette(_startPal + 230 * 3, 230, 18);
 }
 
 void DreamBase::fadeScreenUp() {
@@ -222,8 +209,8 @@ void DreamBase::fadeScreenDownHalf() {
 	palToStartPal();
 	palToEndPal();
 
-	const uint8 *startPal = startPalette();
-	uint8 *endPal = endPalette();
+	const uint8 *startPal = _startPal;
+	uint8 *endPal = _endPal;
 	for (int i = 0; i < 256 * 3; ++i) {
 		*endPal >>= 1;
 		endPal++;
@@ -248,8 +235,8 @@ void DreamBase::clearPalette() {
 // Converts palette to grey scale, summed using formula
 // .20xred + .59xGreen + .11xBlue
 void DreamBase::greyscaleSum() {
-	byte *src = mainPalette();
-	byte *dst = endPalette();
+	byte *src = _mainPal;
+	byte *dst = _endPal;
 
 	for (int i = 0; i < 256; ++i) {
 		const unsigned int r = 20 * *src++;
@@ -276,12 +263,12 @@ void DreamBase::greyscaleSum() {
 }
 
 void DreamBase::allPalette() {
-	memcpy(startPalette(), mainPalette(), 3 * 256);
+	memcpy(_startPal, _mainPal, 3 * 256);
 	dumpCurrent();
 }
 
 void DreamBase::dumpCurrent() {
-	uint8 *pal = startPalette();
+	uint8 *pal = _startPal;
 
 	engine->waitForVSync();
 	engine->processEvents();
diff --git a/engines/dreamweb/vgagrafx.cpp b/engines/dreamweb/vgagrafx.cpp
index b1a23a6..87ab998 100644
--- a/engines/dreamweb/vgagrafx.cpp
+++ b/engines/dreamweb/vgagrafx.cpp
@@ -202,7 +202,7 @@ void DreamBase::showPCX(const Common::String &name) {
 	// the color components have to be adjusted from 8 to 6 bits.
 
 	pcxFile.seek(16, SEEK_SET);
-	mainGamePal = mainPalette();
+	mainGamePal = _mainPal;
 	pcxFile.read(mainGamePal, 48);
 
 	memset(mainGamePal + 48, 0xff, 720);
@@ -448,7 +448,7 @@ void DreamBase::loadPalFromIFF() {
 	palFile.close();
 
 	const uint8 *src = mapStore() + 0x30;
-	uint8 *dst = mainPalette();
+	uint8 *dst = _mainPal;
 	for (size_t i = 0; i < 256*3; ++i) {
 		uint8 c = src[i] / 4;
 		if (data.byte(kBrightness) == 1) {


Commit: 1749182e98ed410cd62e22185943696b7e30432a
    https://github.com/scummvm/scummvm/commit/1749182e98ed410cd62e22185943696b7e30432a
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2011-12-23T14:46:38-08:00

Commit Message:
DREAMWEB: Move ObjPos lists out of buffers

Changed paths:
    engines/dreamweb/backdrop.cpp
    engines/dreamweb/dreambase.h
    engines/dreamweb/stubs.cpp



diff --git a/engines/dreamweb/backdrop.cpp b/engines/dreamweb/backdrop.cpp
index cb72454..9fe3c74 100644
--- a/engines/dreamweb/backdrop.cpp
+++ b/engines/dreamweb/backdrop.cpp
@@ -134,8 +134,7 @@ void DreamBase::makeBackOb(SetObject *objData, uint16 x, uint16 y) {
 void DreamBase::showAllObs() {
 	const unsigned int count = 128;
 
-	ObjPos *objPos = (ObjPos *)getSegment(data.word(kBuffers)).ptr(kSetlist, count * sizeof(ObjPos));
-	memset(objPos, 0xff, count * sizeof(ObjPos));
+	_setList.clear();
 
 	const Frame *frameBase = (const Frame *)getSegment(data.word(kSetframes)).ptr(0, 0);
 	SetObject *setEntries = (SetObject *)getSegment(data.word(kSetdat)).ptr(0, count * sizeof(SetObject));
@@ -148,7 +147,8 @@ void DreamBase::showAllObs() {
 		if (currentFrame == 0xff)
 			continue;
 		uint8 width, height;
-		calcFrFrame(frameBase, currentFrame, &width, &height, x, y, objPos);
+		ObjPos objPos;
+		calcFrFrame(frameBase, currentFrame, &width, &height, x, y, &objPos);
 		setEntry->index = setEntry->frames[0];
 		if ((setEntry->type == 0) && (setEntry->priority != 5) && (setEntry->priority != 6)) {
 			x += data.word(kMapadx);
@@ -157,8 +157,8 @@ void DreamBase::showAllObs() {
 		} else
 			makeBackOb(setEntry, x, y);
 
-		objPos->index = i;
-		++objPos;
+		objPos.index = i;
+		_setList.push_back(objPos);
 	}
 }
 
@@ -218,8 +218,7 @@ void DreamBase::calcMapAd() {
 void DreamBase::showAllFree() {
 	const unsigned int count = 80;
 
-	ObjPos *objPos = (ObjPos *)getSegment(data.word(kBuffers)).ptr(kFreelist, count * sizeof(ObjPos));
-	memset(objPos, 0xff, count * sizeof(ObjPos));
+	_freeList.clear();
 
 	const DynObject *freeObjects = (const DynObject *)getSegment(data.word(kFreedat)).ptr(0, 0);
 	const Frame *frameBase = (const Frame *)getSegment(data.word(kFreeframes)).ptr(0, 0);
@@ -228,15 +227,16 @@ void DreamBase::showAllFree() {
 		uint8 mapAd = getMapAd(freeObjects[i].mapad, &x, &y);
 		if (mapAd != 0) {
 			uint8 width, height;
+			ObjPos objPos;
 			uint16 currentFrame = 3 * i;
-			calcFrFrame(frameBase, currentFrame, &width, &height, x, y, objPos);
+			calcFrFrame(frameBase, currentFrame, &width, &height, x, y, &objPos);
 			if ((width != 0) || (height != 0)) {
 				x += data.word(kMapadx);
 				y += data.word(kMapady);
 				assert(currentFrame < 256);
 				showFrame(frameBase, x, y, currentFrame, 0);
-				objPos->index = i;
-				++objPos;
+				objPos.index = i;
+				_freeList.push_back(objPos);
 			}
 		}
 	}
@@ -261,8 +261,7 @@ void DreamBase::drawFlags() {
 void DreamBase::showAllEx() {
 	const unsigned int count = 100;
 
-	ObjPos *objPos = (ObjPos *)getSegment(data.word(kBuffers)).ptr(kExlist, count * sizeof(ObjPos));
-	memset(objPos, 0xff, count * sizeof(ObjPos));
+	_exList.clear();
 
 	DynObject *objects = (DynObject *)getSegment(data.word(kExtras)).ptr(kExdata, sizeof(DynObject));
 	const Frame *frameBase = (const Frame *)getSegment(data.word(kExtras)).ptr(0, 0);
@@ -276,13 +275,14 @@ void DreamBase::showAllEx() {
 		if (getMapAd(object->mapad, &x, &y) == 0)
 			continue;
 		uint8 width, height;
+		ObjPos objPos;
 		uint16 currentFrame = 3 * i;
-		calcFrFrame(frameBase, currentFrame, &width, &height, x, y, objPos);
+		calcFrFrame(frameBase, currentFrame, &width, &height, x, y, &objPos);
 		if ((width != 0) || (height != 0)) {
 			assert(currentFrame < 256);
 			showFrame(frameBase, x + data.word(kMapadx), y + data.word(kMapady), currentFrame, 0);
-			objPos->index = i;
-			++objPos;
+			objPos.index = i;
+			_exList.push_back(objPos);
 		}
 	}
 }
diff --git a/engines/dreamweb/dreambase.h b/engines/dreamweb/dreambase.h
index b4265e9..b739c9c 100644
--- a/engines/dreamweb/dreambase.h
+++ b/engines/dreamweb/dreambase.h
@@ -72,6 +72,9 @@ protected:
 	uint8 _startPal[3*256];
 	uint8 _endPal[3*256];
 	uint8 _mainPal[3*256];
+	Common::List<ObjPos> _setList;
+	Common::List<ObjPos> _freeList;
+	Common::List<ObjPos> _exList;
 	Common::List<People> _peopleList;
 
 public:
diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp
index 9969ac7..3e7a694 100644
--- a/engines/dreamweb/stubs.cpp
+++ b/engines/dreamweb/stubs.cpp
@@ -1188,12 +1188,13 @@ void DreamGenContext::checkIfFree() {
 }
 
 bool DreamGenContext::checkIfFree(uint8 x, uint8 y) {
-	const ObjPos *freeList = (const ObjPos *)getSegment(data.word(kBuffers)).ptr(kFreelist, 80 * sizeof(ObjPos));
-	for (size_t i = 0; i < 80; ++i) {
-		const ObjPos *objPos = freeList + 79 - i;
-		if (objPos->index == 0xff || !objPos->contains(x,y))
+	Common::List<ObjPos>::const_iterator i;
+	for (i = _freeList.reverse_begin(); i != _freeList.end(); --i) {
+		const ObjPos &pos = *i;
+		assert(pos.index != 0xff);
+		if (!pos.contains(x,y))
 			continue;
-		obName(objPos->index, 2);
+		obName(pos.index, 2);
 		return true;
 	}
 	return false;
@@ -1204,12 +1205,13 @@ void DreamGenContext::checkIfEx() {
 }
 
 bool DreamGenContext::checkIfEx(uint8 x, uint8 y) {
-	const ObjPos *exList = (const ObjPos *)getSegment(data.word(kBuffers)).ptr(kExlist, 100 * sizeof(ObjPos));
-	for (size_t i = 0; i < 100; ++i) {
-		const ObjPos *objPos = exList + 99 - i;
-		if (objPos->index == 0xff || !objPos->contains(x,y))
+	Common::List<ObjPos>::const_iterator i;
+	for (i = _exList.reverse_begin(); i != _exList.end(); --i) {
+		const ObjPos &pos = *i;
+		assert(pos.index != 0xff);
+		if (!pos.contains(x,y))
 			continue;
-		obName(objPos->index, 4);
+		obName(pos.index, 4);
 		return true;
 	}
 	return false;
@@ -1781,16 +1783,17 @@ void DreamBase::showIcon() {
 }
 
 bool DreamGenContext::checkIfSet(uint8 x, uint8 y) {
-	const ObjPos *setList = (const ObjPos *)getSegment(data.word(kBuffers)).ptr(kSetlist, sizeof(ObjPos) * 128);
-	for (size_t i = 0; i < 128; ++i) {
-		const ObjPos *pos = setList + 127 - i;
-		if (pos->index == 0xff || !pos->contains(x,y))
+	Common::List<ObjPos>::const_iterator i;
+	for (i = _setList.reverse_begin(); i != _setList.end(); --i) {
+		const ObjPos &pos = *i;
+		assert(pos.index != 0xff);
+		if (!pos.contains(x,y))
 			continue;
-		if (!pixelCheckSet(pos, x, y))
+		if (!pixelCheckSet(&pos, x, y))
 			continue;
-		if (!isItDescribed(pos))
+		if (!isItDescribed(&pos))
 			continue;
-		obName(pos->index, 1);
+		obName(pos.index, 1);
 		return true;
 	}
 	return false;


Commit: 109acaab3cb9b75937e9521b582476f544ebfe71
    https://github.com/scummvm/scummvm/commit/109acaab3cb9b75937e9521b582476f544ebfe71
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2011-12-23T14:46:38-08:00

Commit Message:
DREAMWEB: Move mapflags out of buffers

Changed paths:
    engines/dreamweb/backdrop.cpp
    engines/dreamweb/dreambase.h
    engines/dreamweb/sprite.cpp



diff --git a/engines/dreamweb/backdrop.cpp b/engines/dreamweb/backdrop.cpp
index 9fe3c74..b806ba4 100644
--- a/engines/dreamweb/backdrop.cpp
+++ b/engines/dreamweb/backdrop.cpp
@@ -179,22 +179,20 @@ bool DreamBase::addLength(const uint8 *mapFlags) {
 }
 
 void DreamBase::getDimension(uint8 *mapXstart, uint8 *mapYstart, uint8 *mapXsize, uint8 *mapYsize) {
-	const uint8 *mapFlags = getSegment(data.word(kBuffers)).ptr(kMapflags, 0);
-
 	uint8 yStart = 0;
-	while (! addAlong(mapFlags + 3 * 11 * yStart))
+	while (! addAlong(_mapFlags + 3 * 11 * yStart))
 		++yStart;
 
 	uint8 xStart = 0;
-	while (! addLength(mapFlags + 3 * xStart))
+	while (! addLength(_mapFlags + 3 * xStart))
 		++xStart;
 
 	uint8 yEnd = 10;
-	while (! addAlong(mapFlags + 3 * 11 * (yEnd - 1)))
+	while (! addAlong(_mapFlags + 3 * 11 * (yEnd - 1)))
 		--yEnd;
 
 	uint8 xEnd = 11;
-	while (! addLength(mapFlags + 3 * (xEnd - 1)))
+	while (! addLength(_mapFlags + 3 * (xEnd - 1)))
 		--xEnd;
 
 	*mapXstart = xStart;
@@ -243,7 +241,7 @@ void DreamBase::showAllFree() {
 }
 
 void DreamBase::drawFlags() {
-	uint8 *mapFlags = getSegment(data.word(kBuffers)).ptr(kMapflags, 0);
+	uint8 *mapFlags = _mapFlags;
 	const uint8 *mapData = getSegment(data.word(kMapdata)).ptr(kMap + data.byte(kMapy) * kMapwidth + data.byte(kMapx), 0);
 	const uint8 *backdropFlags = getSegment(data.word(kBackdrop)).ptr(kFlags, 0);
 
diff --git a/engines/dreamweb/dreambase.h b/engines/dreamweb/dreambase.h
index b739c9c..7816308 100644
--- a/engines/dreamweb/dreambase.h
+++ b/engines/dreamweb/dreambase.h
@@ -69,6 +69,7 @@ protected:
 	ReelRoutine *_personData;
 
 	// from Buffers
+	uint8 _mapFlags[11*10*3];
 	uint8 _startPal[3*256];
 	uint8 _endPal[3*256];
 	uint8 _mainPal[3*256];
diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp
index cc6b09f..17d3ccd 100644
--- a/engines/dreamweb/sprite.cpp
+++ b/engines/dreamweb/sprite.cpp
@@ -552,7 +552,7 @@ void DreamGenContext::checkOne() {
 void DreamBase::checkOne(uint8 x, uint8 y, uint8 *flag, uint8 *flagEx, uint8 *type, uint8 *flagX, uint8 *flagY) {
 	*flagX = x / 16;
 	*flagY = y / 16;
-	const uint8 *tileData = getSegment(data.word(kBuffers)).ptr(kMapflags + (*flagY * 11 + *flagX) * 3, 3);
+	const uint8 *tileData = &_mapFlags[(*flagY * 11 + *flagX) * 3];
 	*flag = tileData[0];
 	*flagEx = tileData[1];
 	*type = tileData[2];


Commit: 814793de49f8002fbac17fdd604399a4f694ddf8
    https://github.com/scummvm/scummvm/commit/814793de49f8002fbac17fdd604399a4f694ddf8
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2011-12-23T14:46:38-08:00

Commit Message:
DREAMWEB: Move rainlist out of buffers

Changed paths:
    engines/dreamweb/dreambase.h
    engines/dreamweb/sprite.cpp
    engines/dreamweb/structs.h



diff --git a/engines/dreamweb/dreambase.h b/engines/dreamweb/dreambase.h
index 7816308..3428a8c 100644
--- a/engines/dreamweb/dreambase.h
+++ b/engines/dreamweb/dreambase.h
@@ -77,6 +77,7 @@ protected:
 	Common::List<ObjPos> _freeList;
 	Common::List<ObjPos> _exList;
 	Common::List<People> _peopleList;
+	Common::List<Rain> _rainList;
 
 public:
 	DreamBase(DreamWeb::DreamWebEngine *en);
@@ -317,7 +318,7 @@ public:
 	void checkOne(uint8 x, uint8 y, uint8 *flag, uint8 *flagEx, uint8 *type, uint8 *flagX, uint8 *flagY);
 
 	uint8 getBlockOfPixel(uint8 x, uint8 y);
-	Rain *splitIntoLines(uint8 x, uint8 y, Rain *rain);
+	void splitIntoLines(uint8 x, uint8 y);
 	void initRain();
 
 	void intro1Text();
diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp
index 17d3ccd..754f914 100644
--- a/engines/dreamweb/sprite.cpp
+++ b/engines/dreamweb/sprite.cpp
@@ -474,25 +474,26 @@ const Frame *DreamBase::getReelFrameAX(uint16 frame) {
 }
 
 void DreamBase::showRain() {
-	Rain *rain = (Rain *)getSegment(data.word(kBuffers)).ptr(kRainlist, 0);
+	Common::List<Rain>::iterator i;
 
 	// Do nothing if there's no rain at all
-	if (rain->x == 255)
+	if (_rainList.empty())
 		return;
 
 	const Frame *frame = (const Frame *)getSegment(data.word(kMainsprites)).ptr(58 * sizeof(Frame), sizeof(Frame));
 	const uint8 *frameData = getSegment(data.word(kMainsprites)).ptr(kFrframes + frame->ptr(), 512);
 
-	for (; rain->x != 255; ++rain) {
-		uint16 y = rain->y + data.word(kMapady) + data.word(kMapystart);
-		uint16 x = rain->x + data.word(kMapadx) + data.word(kMapxstart);
-		uint16 size = rain->size;
-		uint16 offset = (rain->w3() - rain->b5) & 511;
-		rain->setW3(offset);
+	for (i = _rainList.begin(); i != _rainList.end(); ++i) {
+		Rain &rain = *i;
+		uint16 y = rain.y + data.word(kMapady) + data.word(kMapystart);
+		uint16 x = rain.x + data.word(kMapadx) + data.word(kMapxstart);
+		uint16 size = rain.size;
+		uint16 offset = (rain.w3 - rain.b5) & 511;
+		rain.w3 = offset;
 		const uint8 *src = frameData + offset;
 		uint8 *dst = workspace() + y * 320 + x;
-		for (uint16 i = 0; i < size; ++i) {
-			uint8 v = src[i];
+		for (uint16 j = 0; j < size; ++j) {
+			uint8 v = src[j];
 			if (v != 0)
 				*dst = v;
 			dst += 320-1; // advance diagonally
@@ -567,18 +568,20 @@ uint8 DreamBase::getBlockOfPixel(uint8 x, uint8 y) {
 		return type;
 }
 
-Rain *DreamBase::splitIntoLines(uint8 x, uint8 y, Rain *rain) {
+void DreamBase::splitIntoLines(uint8 x, uint8 y) {
 	do {
+		Rain rain;
+
 		// Look for line start
 		while (!getBlockOfPixel(x, y)) {
 			--x;
 			++y;
 			if (x == 0 || y >= data.byte(kMapysize))
-				return rain;
+				return;
 		}
 
-		rain->x = x;
-		rain->y = y;
+		rain.x = x;
+		rain.y = y;
 
 		uint8 length = 1;
 
@@ -591,14 +594,11 @@ Rain *DreamBase::splitIntoLines(uint8 x, uint8 y, Rain *rain) {
 			++length;
 		}
 
-		rain->size = length;
-		rain->w3_lo = engine->randomNumber();
-		rain->w3_hi = engine->randomNumber();
-		rain->b5 = (engine->randomNumber() & 3) + 4;
-		++rain;
+		rain.size = length;
+		rain.w3 = (engine->randomNumber() << 8) | engine->randomNumber();
+		rain.b5 = (engine->randomNumber() & 3) + 4;
+		_rainList.push_back(rain);
 	} while (x > 0 && y < data.byte(kMapysize));
-
-	return rain;
 }
 
 struct RainLocation {
@@ -640,8 +640,7 @@ static const RainLocation rainLocationList[] = {
 
 void DreamBase::initRain() {
 	const RainLocation *r = rainLocationList;
-	Rain *rainList = (Rain *)getSegment(data.word(kBuffers)).ptr(kRainlist, 0);
-	Rain *rain = rainList;
+	_rainList.clear();
 
 	uint8 rainSpacing = 0;
 
@@ -656,7 +655,6 @@ void DreamBase::initRain() {
 
 	if (rainSpacing == 0) {
 		// location not found in rainLocationList: no rain
-		rain->x = 0xff;
 		return;
 	}
 
@@ -672,7 +670,7 @@ void DreamBase::initRain() {
 		if (x >= data.byte(kMapxsize))
 			break;
 
-		rain = splitIntoLines(x, 0, rain);
+		splitIntoLines(x, 0);
 	} while (true);
 
 	// start lines of rain from side of screen
@@ -687,10 +685,8 @@ void DreamBase::initRain() {
 		if (y >= data.byte(kMapysize))
 			break;
 
-		rain = splitIntoLines(data.byte(kMapxsize) - 1, y, rain);
+		splitIntoLines(data.byte(kMapxsize) - 1, y);
 	} while (true);
-
-	rain->x = 0xff;
 }
 
 void DreamBase::intro1Text() {
diff --git a/engines/dreamweb/structs.h b/engines/dreamweb/structs.h
index 6140045..558b000 100644
--- a/engines/dreamweb/structs.h
+++ b/engines/dreamweb/structs.h
@@ -213,10 +213,7 @@ struct Rain {
 	uint8 x;
 	uint8 y;
 	uint8 size;
-	uint8 w3_lo;
-	uint8 w3_hi;
-	uint16 w3() const { return READ_LE_UINT16(&w3_lo); }
-	void setW3(uint16 v) { WRITE_LE_UINT16(&w3_lo, v); }
+	uint16 w3;
 	uint8 b5;
 };
 


Commit: 10774daa586008af8e327a58a3ee910482a7cbfb
    https://github.com/scummvm/scummvm/commit/10774daa586008af8e327a58a3ee910482a7cbfb
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2011-12-23T14:46:38-08:00

Commit Message:
DREAMWEB: Move backgrounds, zoom space, initial vars out of buffers

Changed paths:
    engines/dreamweb/dreambase.h
    engines/dreamweb/keypad.cpp
    engines/dreamweb/monitor.cpp
    engines/dreamweb/stubs.cpp



diff --git a/engines/dreamweb/dreambase.h b/engines/dreamweb/dreambase.h
index 3428a8c..26f0395 100644
--- a/engines/dreamweb/dreambase.h
+++ b/engines/dreamweb/dreambase.h
@@ -35,8 +35,17 @@ namespace DreamWeb {
 
 namespace DreamGen {
 
-
+ // Note: duplication from dreamgen.h
 const unsigned int kNumReelRoutines = 57;
+const unsigned int kUnderTextSizeX = 180;
+const unsigned int kUnderTextSizeY = 10;
+const unsigned int kUnderTimedTextSizeY = 24;
+const unsigned int kUnderTextSizeX_f = 228; // foreign version
+const unsigned int kUnderTextSizeY_f = 13; // foreign version
+const unsigned int kUnderTimedTextSizeY_f = 30;
+const unsigned int kUnderTextBufSize = kUnderTextSizeX_f * kUnderTextSizeY_f;
+const unsigned int kUnderTimedTextBufSize = 256 * kUnderTextSizeY_f;
+const unsigned int kLengthOfVars = 68;
 
 /**
  * This class is one of the parent classes of DreamGenContext. Its sole purpose
@@ -69,6 +78,8 @@ protected:
 	ReelRoutine *_personData;
 
 	// from Buffers
+	uint8 _textUnder[kUnderTextBufSize];
+	uint8 _pointerBack[32*32];
 	uint8 _mapFlags[11*10*3];
 	uint8 _startPal[3*256];
 	uint8 _endPal[3*256];
@@ -77,7 +88,10 @@ protected:
 	Common::List<ObjPos> _freeList;
 	Common::List<ObjPos> _exList;
 	Common::List<People> _peopleList;
+	uint8 _zoomSpace[46*40];
+	uint8 _underTimedText[kUnderTimedTextBufSize];
 	Common::List<Rain> _rainList;
+	uint8 _initialVars[kLengthOfVars]; // TODO: This shouldn't be necessary
 
 public:
 	DreamBase(DreamWeb::DreamWebEngine *en);
diff --git a/engines/dreamweb/keypad.cpp b/engines/dreamweb/keypad.cpp
index 6e69419..d0ef260 100644
--- a/engines/dreamweb/keypad.cpp
+++ b/engines/dreamweb/keypad.cpp
@@ -25,11 +25,11 @@
 namespace DreamGen {
 
 void DreamBase::getUnderMenu() {
-	multiGet(getSegment(data.word(kBuffers)).ptr(kUndertimedtext, 0), kMenux, kMenuy, 48, 48);
+	multiGet(_underTimedText, kMenux, kMenuy, 48, 48);
 }
 
 void DreamBase::putUnderMenu() {
-	multiPut(getSegment(data.word(kBuffers)).ptr(kUndertimedtext, 0), kMenux, kMenuy, 48, 48);
+	multiPut(_underTimedText, kMenux, kMenuy, 48, 48);
 }
 
 void DreamBase::singleKey(uint8 key, uint16 x, uint16 y) {
diff --git a/engines/dreamweb/monitor.cpp b/engines/dreamweb/monitor.cpp
index 6652650..9a1076a 100644
--- a/engines/dreamweb/monitor.cpp
+++ b/engines/dreamweb/monitor.cpp
@@ -267,7 +267,7 @@ void DreamBase::printCurs() {
 		height = 11;
 	} else
 		height = 8;
-	multiGet(textUnder(), x, y, 6, height);
+	multiGet(_textUnder, x, y, 6, height);
 	++data.word(kMaintimer);
 	if ((data.word(kMaintimer) & 16) == 0)
 		showFrame(engine->tempCharset(), x, y, '/' - 32, 0);
@@ -284,7 +284,7 @@ void DreamBase::delCurs() {
 		height = 11;
 	} else
 		height = 8;
-	multiPut(textUnder(), x, y, width, height);
+	multiPut(_textUnder, x, y, width, height);
 	multiDump(x, y, width, height);
 }
 
diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp
index 3e7a694..3882446 100644
--- a/engines/dreamweb/stubs.cpp
+++ b/engines/dreamweb/stubs.cpp
@@ -740,10 +740,6 @@ void DreamBase::switchRyanOff() {
 	data.byte(kRyanon) = 1;
 }
 
-uint8 *DreamBase::textUnder() {
-	return getSegment(data.word(kBuffers)).ptr(kTextunder, 0);
-}
-
 uint16 DreamBase::standardLoad(const char *fileName, uint16 *outSizeInBytes) {
 	FileHeader header;
 
@@ -833,17 +829,17 @@ void DreamBase::dumpTextLine() {
 }
 
 void DreamBase::getUnderTimed() {
-	uint16 y = data.byte(kTimedy);
 	if (data.byte(kForeignrelease))
-		y -= 3;
-	multiGet(getSegment(data.word(kBuffers)).ptr(kUndertimedtext, 0), data.byte(kTimedx), y, 240, kUndertimedysize);
+		multiGet(_underTimedText, data.byte(kTimedx), data.byte(kTimedy) - 3, 240, kUnderTimedTextSizeY_f);
+	else
+		multiGet(_underTimedText, data.byte(kTimedx), data.byte(kTimedy), 240, kUnderTimedTextSizeY);
 }
 
 void DreamBase::putUnderTimed() {
-	uint16 y = data.byte(kTimedy);
 	if (data.byte(kForeignrelease))
-		y -= 3;
-	multiPut(getSegment(data.word(kBuffers)).ptr(kUndertimedtext, 0), data.byte(kTimedx), y, 240, kUndertimedysize);
+		multiPut(_underTimedText, data.byte(kTimedx), data.byte(kTimedy) - 3, 240, kUnderTimedTextSizeY_f);
+	else
+		multiPut(_underTimedText, data.byte(kTimedx), data.byte(kTimedy), 240, kUnderTimedTextSizeY);
 }
 
 void DreamGenContext::triggerMessage(uint16 index) {
@@ -1131,11 +1127,10 @@ void DreamBase::crosshair() {
 }
 
 void DreamBase::delTextLine() {
-	uint16 x = data.word(kTextaddressx);
-	uint16 y = data.word(kTextaddressy);
-	if (data.byte(kForeignrelease) != 0)
-		y -= 3;
-	multiPut(textUnder(), x, y, kUndertextsizex, kUndertextsizey);
+	if (data.byte(kForeignrelease))
+		multiPut(_textUnder, data.byte(kTextaddressx), data.word(kTextaddressy) - 3, kUnderTextSizeX_f, kUnderTextSizeY_f);
+	else
+		multiPut(_textUnder, data.byte(kTextaddressx), data.word(kTextaddressy), kUnderTextSizeX, kUnderTextSizeY);
 }
 
 void DreamGenContext::commandOnly() {
@@ -1514,7 +1509,7 @@ void DreamBase::delPointer() {
 	data.word(kDelherey) = data.word(kOldpointery);
 	data.byte(kDelxs) = data.byte(kPointerxs);
 	data.byte(kDelys) = data.byte(kPointerys);
-	multiPut(getSegment(data.word(kBuffers)).ptr(kPointerback, 0), data.word(kDelherex), data.word(kDelherey), data.byte(kPointerxs), data.byte(kPointerys));
+	multiPut(_pointerBack, data.word(kDelherex), data.word(kDelherey), data.byte(kPointerxs), data.byte(kPointerys));
 }
 
 void DreamBase::showBlink() {
@@ -1594,7 +1589,7 @@ void DreamBase::showPointer() {
 		uint16 yMin = (y >= height / 2) ? y - height / 2 : 0;
 		data.word(kOldpointerx) = xMin;
 		data.word(kOldpointery) = yMin;
-		multiGet(getSegment(data.word(kBuffers)).ptr(kPointerback, 0), xMin, yMin, width, height);
+		multiGet(_pointerBack, xMin, yMin, width, height);
 		showFrame(frames, x, y, 3 * data.byte(kItemframe) + 1, 128);
 		showFrame(engine->icons1(), x, y, 3, 128);
 	} else {
@@ -1607,7 +1602,7 @@ void DreamBase::showPointer() {
 			height = 12;
 		data.byte(kPointerxs) = width;
 		data.byte(kPointerys) = height;
-		multiGet(getSegment(data.word(kBuffers)).ptr(kPointerback, 0), x, y, width, height);
+		multiGet(_pointerBack, x, y, width, height);
 		showFrame(engine->icons1(), x, y, data.byte(kPointerframe) + 20, 0);
 	}
 }
@@ -3059,18 +3054,18 @@ void DreamBase::showDiary() {
 }
 
 void DreamBase::underTextLine() {
-	uint16 y = data.word(kTextaddressy);
 	if (data.byte(kForeignrelease))
-		y -= 3;
-	multiGet(textUnder(), data.byte(kTextaddressx), y, kUndertextsizex, kUndertextsizey);
+		multiGet(_textUnder, data.byte(kTextaddressx), data.word(kTextaddressy) - 3, kUnderTextSizeX_f, kUnderTextSizeY_f);
+	else
+		multiGet(_textUnder, data.byte(kTextaddressx), data.word(kTextaddressy), kUnderTextSizeX, kUnderTextSizeY);
 }
 
 void DreamBase::getUnderZoom() {
-	multiGet(getSegment(data.word(kBuffers)).ptr(kZoomspace, 0), kZoomx + 5, kZoomy + 4, 46, 40);
+	multiGet(_zoomSpace, kZoomx + 5, kZoomy + 4, 46, 40);
 }
 
 void DreamBase::putUnderZoom() {
-	multiPut(getSegment(data.word(kBuffers)).ptr(kZoomspace, 0), kZoomx + 5, kZoomy + 4, 46, 40);
+	multiPut(_zoomSpace, kZoomx + 5, kZoomy + 4, 46, 40);
 }
 
 void DreamBase::showWatchReel() {
@@ -3697,7 +3692,7 @@ void DreamBase::clearBuffers() {
 
 	memset(getSegment(data.word(kExtras)).ptr(0, kLengthofextra), 0xFF, kLengthofextra);
 
-	memcpy(getSegment(data.word(kBuffers)).ptr(kInitialvars, kLengthofvars), data.ptr(kStartvars, kLengthofvars), kLengthofvars);
+	memcpy(_initialVars, data.ptr(kStartvars, kLengthofvars), kLengthofvars);
 
 	clearChanges();
 }
@@ -3707,7 +3702,7 @@ void DreamBase::clearChanges() {
 
 	setupInitialReelRoutines();
 
-	memcpy(data.ptr(kStartvars, kLengthofvars), getSegment(data.word(kBuffers)).ptr(kInitialvars, kLengthofvars), kLengthofvars);
+	memcpy(data.ptr(kStartvars, kLengthofvars), _initialVars, kLengthofvars);
 
 	data.byte(kExpos) = 0;
 	data.word(kExframepos) = 0;


Commit: bbdbffc10744e4d9e789150ba151c1884c740ae0
    https://github.com/scummvm/scummvm/commit/bbdbffc10744e4d9e789150ba151c1884c740ae0
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2011-12-23T14:46:38-08:00

Commit Message:
DREAMWEB: Move changes out of buffers

Changed paths:
    engines/dreamweb/dreambase.h
    engines/dreamweb/saveload.cpp
    engines/dreamweb/stubs.cpp



diff --git a/engines/dreamweb/dreambase.h b/engines/dreamweb/dreambase.h
index 26f0395..1601cb4 100644
--- a/engines/dreamweb/dreambase.h
+++ b/engines/dreamweb/dreambase.h
@@ -46,6 +46,7 @@ const unsigned int kUnderTimedTextSizeY_f = 30;
 const unsigned int kUnderTextBufSize = kUnderTextSizeX_f * kUnderTextSizeY_f;
 const unsigned int kUnderTimedTextBufSize = 256 * kUnderTextSizeY_f;
 const unsigned int kLengthOfVars = 68;
+const unsigned int kNumChanges = 250;
 
 /**
  * This class is one of the parent classes of DreamGenContext. Its sole purpose
@@ -79,16 +80,21 @@ protected:
 
 	// from Buffers
 	uint8 _textUnder[kUnderTextBufSize];
+	// _openInvList (see fillOpen/findOpenPos)
+	// _ryanInvList (see findInvPos/findInvPosCPP)
 	uint8 _pointerBack[32*32];
 	uint8 _mapFlags[11*10*3];
 	uint8 _startPal[3*256];
 	uint8 _endPal[3*256];
 	uint8 _mainPal[3*256];
+	// _spriteTable
 	Common::List<ObjPos> _setList;
 	Common::List<ObjPos> _freeList;
 	Common::List<ObjPos> _exList;
 	Common::List<People> _peopleList;
 	uint8 _zoomSpace[46*40];
+	// _printedList (unused?)
+	Change _listOfChanges[kNumChanges]; // Note: this array is saved
 	uint8 _underTimedText[kUnderTimedTextBufSize];
 	Common::List<Rain> _rainList;
 	uint8 _initialVars[kLengthOfVars]; // TODO: This shouldn't be necessary
diff --git a/engines/dreamweb/saveload.cpp b/engines/dreamweb/saveload.cpp
index b12c668..53c2f55 100644
--- a/engines/dreamweb/saveload.cpp
+++ b/engines/dreamweb/saveload.cpp
@@ -479,7 +479,7 @@ void DreamBase::savePosition(unsigned int slot, const char *descbuf) {
 	outSaveFile->write(descbuf, len[0]);
 	outSaveFile->write(data.ptr(kStartvars, len[1]), len[1]);
 	outSaveFile->write(getSegment(data.word(kExtras)).ptr(kExframedata, len[2]), len[2]);
-	outSaveFile->write(getSegment(data.word(kBuffers)).ptr(kListofchanges, len[3]), len[3]);
+	outSaveFile->write(_listOfChanges, len[3]);
 
 	// len[4] == 48, which is sizeof(Room) plus 16 for 'Roomscango'
 	outSaveFile->write((const uint8 *)&madeUpRoom, sizeof(Room));
@@ -545,7 +545,7 @@ void DreamBase::loadPosition(unsigned int slot) {
 	}
 	inSaveFile->read(data.ptr(kStartvars, len[1]), len[1]);
 	inSaveFile->read(getSegment(data.word(kExtras)).ptr(kExframedata, len[2]), len[2]);
-	inSaveFile->read(getSegment(data.word(kBuffers)).ptr(kListofchanges, len[3]), len[3]);
+	inSaveFile->read(_listOfChanges, len[3]);
 
 	// len[4] == 48, which is sizeof(Room) plus 16 for 'Roomscango'
 	// Note: the values read into g_madeUpRoomDat are only used in actualLoad,
diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp
index 3882446..dd1a034 100644
--- a/engines/dreamweb/stubs.cpp
+++ b/engines/dreamweb/stubs.cpp
@@ -1284,7 +1284,7 @@ void DreamBase::walkToText() {
 }
 
 void DreamBase::findOrMake(uint8 index, uint8 value, uint8 type) {
-	Change *change = (Change *)getSegment(data.word(kBuffers)).ptr(kListofchanges, sizeof(Change));
+	Change *change = _listOfChanges;
 	for (; change->index != 0xff; ++change) {
 		if (index == change->index && data.byte(kReallocation) == change->location && type == change->type) {
 			change->value = value;
@@ -1299,7 +1299,7 @@ void DreamBase::findOrMake(uint8 index, uint8 value, uint8 type) {
 }
 
 void DreamBase::setAllChanges() {
-	Change *change = (Change *)getSegment(data.word(kBuffers)).ptr(kListofchanges, sizeof(Change));
+	Change *change = _listOfChanges;
 	for (; change->index != 0xff; ++change)
 		if (change->location == data.byte(kReallocation))
 			doChange(change->index, change->value, change->type);
@@ -3698,7 +3698,7 @@ void DreamBase::clearBuffers() {
 }
 
 void DreamBase::clearChanges() {
-	memset(getSegment(data.word(kBuffers)).ptr(kListofchanges, 4*kNumchanges), 0xFF, 4*kNumchanges);
+	memset(_listOfChanges, 0xFF, 4*kNumchanges);
 
 	setupInitialReelRoutines();
 


Commit: 8e79608a1de77c54cc6bf0eb23b32b1cc3175677
    https://github.com/scummvm/scummvm/commit/8e79608a1de77c54cc6bf0eb23b32b1cc3175677
Author: Willem Jan Palenstijn (wjp at usecode.org)
Date: 2011-12-23T14:46:38-08:00

Commit Message:
DREAMWEB: Move sprite table out of buffers

Changed paths:
    engines/dreamweb/backdrop.cpp
    engines/dreamweb/dreambase.h
    engines/dreamweb/sprite.cpp
    engines/dreamweb/structs.h
    engines/dreamweb/stubs.cpp



diff --git a/engines/dreamweb/backdrop.cpp b/engines/dreamweb/backdrop.cpp
index b806ba4..875e168 100644
--- a/engines/dreamweb/backdrop.cpp
+++ b/engines/dreamweb/backdrop.cpp
@@ -121,7 +121,7 @@ void DreamBase::makeBackOb(SetObject *objData, uint16 x, uint16 y) {
 	uint16 objDataOffset = (uint8 *)objData - getSegment(data.word(kSetdat)).ptr(0, 0);
 	assert(objDataOffset % sizeof(SetObject) == 0);
 	assert(objDataOffset < 128 * sizeof(SetObject));
-	sprite->setObjData(objDataOffset);
+	sprite->_objData = objDataOffset;
 	if (priority == 255)
 		priority = 0;
 	sprite->priority = priority;
diff --git a/engines/dreamweb/dreambase.h b/engines/dreamweb/dreambase.h
index 1601cb4..32b36a5 100644
--- a/engines/dreamweb/dreambase.h
+++ b/engines/dreamweb/dreambase.h
@@ -87,7 +87,7 @@ protected:
 	uint8 _startPal[3*256];
 	uint8 _endPal[3*256];
 	uint8 _mainPal[3*256];
-	// _spriteTable
+	Common::List<Sprite> _spriteTable;
 	Common::List<ObjPos> _setList;
 	Common::List<ObjPos> _freeList;
 	Common::List<ObjPos> _exList;
@@ -311,7 +311,6 @@ public:
 	void playChannel1(uint8 index);
 
 	// from sprite.cpp
-	Sprite *spriteTable();
 	void printSprites();
 	void printASprite(const Sprite *sprite);
 	void clearSprites();
diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp
index 754f914..e2e27bc 100644
--- a/engines/dreamweb/sprite.cpp
+++ b/engines/dreamweb/sprite.cpp
@@ -24,18 +24,12 @@
 
 namespace DreamGen {
 
-Sprite *DreamBase::spriteTable() {
-	Sprite *sprite = (Sprite *)getSegment(data.word(kBuffers)).ptr(kSpritetable, 16 * sizeof(Sprite));
-	return sprite;
-}
-
 void DreamBase::printSprites() {
 	for (size_t priority = 0; priority < 7; ++priority) {
-		Sprite *sprites = spriteTable();
-		for (size_t j = 0; j < 16; ++j) {
-			const Sprite &sprite = sprites[j];
-			if (sprite.updateCallback() == 0x0ffff)
-				continue;
+		Common::List<Sprite>::const_iterator i;
+		for (i = _spriteTable.begin(); i != _spriteTable.end(); ++i) {
+			const Sprite &sprite = *i;
+			assert(sprite._updateCallback != 0x0ffff);
 			if (priority != sprite.priority)
 				continue;
 			if (sprite.hidden == 1)
@@ -64,24 +58,27 @@ void DreamBase::printASprite(const Sprite *sprite) {
 		c = 8;
 	else
 		c = 0;
-	showFrame((const Frame *)getSegment(sprite->frameData()).ptr(0, 0), x, y, sprite->frameNumber, c);
+	showFrame((const Frame *)getSegment(sprite->_frameData).ptr(0, 0), x, y, sprite->frameNumber, c);
 }
 
 void DreamBase::clearSprites() {
-	memset(spriteTable(), 0xff, sizeof(Sprite) * 16);
+	_spriteTable.clear();
 }
 
 Sprite *DreamBase::makeSprite(uint8 x, uint8 y, uint16 updateCallback, uint16 frameData, uint16 somethingInDi) {
-	Sprite *sprite = spriteTable();
-	while (sprite->frameNumber != 0xff) { // NB: No boundchecking in the original code either
-		++sprite;
-	}
+	// Note: the original didn't append sprites here, but filled up the
+	// first unused entry. This can change the order of entries, but since they
+	// are drawn based on the priority field, this shouldn't matter.
+	_spriteTable.push_back(Sprite());
+	Sprite *sprite = &_spriteTable.back();
+
+	memset(sprite, 0xff, sizeof(Sprite));
 
-	sprite->setUpdateCallback(updateCallback);
+	sprite->_updateCallback = updateCallback;
 	sprite->x = x;
 	sprite->y = y;
-	sprite->setFrameData(frameData);
-	WRITE_LE_UINT16(&sprite->w8, somethingInDi);
+	sprite->_frameData = frameData;
+	sprite->w8 = somethingInDi;
 	sprite->w2 = 0xffff;
 	sprite->frameNumber = 0;
 	sprite->delay = 0;
@@ -89,25 +86,25 @@ Sprite *DreamBase::makeSprite(uint8 x, uint8 y, uint16 updateCallback, uint16 fr
 }
 
 void DreamBase::spriteUpdate() {
-	Sprite *sprites = spriteTable();
-	sprites[0].hidden = data.byte(kRyanon);
-
-	Sprite *sprite = sprites;
-	for (size_t i=0; i < 16; ++i) {
-		uint16 updateCallback = sprite->updateCallback();
-		if (updateCallback != 0xffff) {
-			sprite->w24 = sprite->w2;
-			if (updateCallback == addr_mainman) // NB : Let's consider the callback as an enum while more code is not ported to C++
-				mainMan(sprite);
-			else {
-				assert(updateCallback == addr_backobject);
-				backObject(sprite);
-			}
+	// During the intro the sprite table can be empty
+	if (!_spriteTable.empty())
+		_spriteTable.front().hidden = data.byte(kRyanon);
+
+	Common::List<Sprite>::iterator i;
+	for (i = _spriteTable.begin(); i != _spriteTable.end(); ++i) {
+		Sprite &sprite = *i;
+		assert(sprite._updateCallback != 0xffff);
+
+		sprite.w24 = sprite.w2;
+		if (sprite._updateCallback == addr_mainman) // NB : Let's consider the callback as an enum while more code is not ported to C++
+			mainMan(&sprite);
+		else {
+			assert(sprite._updateCallback == addr_backobject);
+			backObject(&sprite);
 		}
 	
 		if (data.byte(kNowinnewroom) == 1)
 			break;
-		++sprite;
 	}
 }
 
@@ -228,7 +225,7 @@ void DreamBase::aboutTurn(Sprite *sprite) {
 }
 
 void DreamBase::backObject(Sprite *sprite) {
-	SetObject *objData = (SetObject *)getSegment(data.word(kSetdat)).ptr(sprite->objData(), 0);
+	SetObject *objData = (SetObject *)getSegment(data.word(kSetdat)).ptr(sprite->_objData, 0);
 
 	if (sprite->delay != 0) {
 		--sprite->delay;
diff --git a/engines/dreamweb/structs.h b/engines/dreamweb/structs.h
index 558b000..4d1b142 100644
--- a/engines/dreamweb/structs.h
+++ b/engines/dreamweb/structs.h
@@ -30,13 +30,9 @@ namespace DreamGen {
 
 struct Sprite {
 	uint16 _updateCallback;
-	uint16 updateCallback() const { return READ_LE_UINT16(&_updateCallback); }
-	void setUpdateCallback(uint16 v) { WRITE_LE_UINT16(&_updateCallback, v); }
 	uint16 w2;
 	uint16 w4;
 	uint16 _frameData;
-	uint16 frameData() const { return READ_LE_UINT16(&_frameData); }
-	void setFrameData(uint16 v) { WRITE_LE_UINT16(&_frameData, v); }
 	uint16 w8;
 	uint8  x;
 	uint8  y;
@@ -48,8 +44,6 @@ struct Sprite {
 	uint8  delay;
 	uint8  animFrame; // index into SetObject::frames
 	uint16 _objData;
-	uint16 objData() const { return READ_LE_UINT16(&_objData); }
-	void setObjData(uint16 v) { WRITE_LE_UINT16(&_objData, v); }
 	uint8  speed;
 	uint8  priority;
 	uint16 w24;
diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp
index dd1a034..b302bce 100644
--- a/engines/dreamweb/stubs.cpp
+++ b/engines/dreamweb/stubs.cpp
@@ -981,12 +981,17 @@ void DreamBase::eraseOldObs() {
 	if (data.byte(kNewobs) == 0)
 		return;
 
-	Sprite *sprites = spriteTable();
-	for (size_t i = 0; i < 16; ++i) {
-		Sprite &sprite = sprites[i];
-		if (sprite.objData() != 0xffff) {
-			memset(&sprite, 0xff, sizeof(Sprite));
-		}
+	// Note: the original didn't delete sprites here, but marked the
+	// entries as unused, to be filled again by makeSprite. This can
+	// change the order of entries, but since they are drawn based on the
+	// priority field, this shouldn't matter.
+	Common::List<Sprite>::iterator i;
+	for (i = _spriteTable.begin(); i != _spriteTable.end(); ) {
+		Sprite &sprite = *i;
+		if (sprite._objData != 0xffff)
+			i = _spriteTable.erase(i);
+		else
+			++i;
 	}
 }
 






More information about the Scummvm-git-logs mailing list