diff options
author | Willem Jan Palenstijn | 2011-12-23 22:53:29 +0100 |
---|---|---|
committer | Willem Jan Palenstijn | 2011-12-23 23:46:38 +0100 |
commit | 814793de49f8002fbac17fdd604399a4f694ddf8 (patch) | |
tree | 192ddaf29d081ad1b6d0927f4b678490b2e960ef /engines/dreamweb | |
parent | 109acaab3cb9b75937e9521b582476f544ebfe71 (diff) | |
download | scummvm-rg350-814793de49f8002fbac17fdd604399a4f694ddf8.tar.gz scummvm-rg350-814793de49f8002fbac17fdd604399a4f694ddf8.tar.bz2 scummvm-rg350-814793de49f8002fbac17fdd604399a4f694ddf8.zip |
DREAMWEB: Move rainlist out of buffers
Diffstat (limited to 'engines/dreamweb')
-rw-r--r-- | engines/dreamweb/dreambase.h | 3 | ||||
-rw-r--r-- | engines/dreamweb/sprite.cpp | 52 | ||||
-rw-r--r-- | engines/dreamweb/structs.h | 5 |
3 files changed, 27 insertions, 33 deletions
diff --git a/engines/dreamweb/dreambase.h b/engines/dreamweb/dreambase.h index 7816308e03..3428a8cef8 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 17d3ccd765..754f91401b 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 61400455d1..558b000f19 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; }; |