[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