aboutsummaryrefslogtreecommitdiff
path: root/engines
diff options
context:
space:
mode:
authorBertrand Augereau2011-11-15 17:31:19 +0100
committerBertrand Augereau2011-11-15 18:46:57 +0100
commit0730d108c304db1fe138c5c398330bef47ee44cf (patch)
treece8e0fe6f4f8986e77da2c3570bef6e7af297fff /engines
parent36982fb8a439990d5a28762185fe178a1c788a50 (diff)
downloadscummvm-rg350-0730d108c304db1fe138c5c398330bef47ee44cf.tar.gz
scummvm-rg350-0730d108c304db1fe138c5c398330bef47ee44cf.tar.bz2
scummvm-rg350-0730d108c304db1fe138c5c398330bef47ee44cf.zip
DREAMWEB: 'initrain' ported to C++
Diffstat (limited to 'engines')
-rw-r--r--engines/dreamweb/dreamgen.cpp67
-rw-r--r--engines/dreamweb/sprite.cpp50
2 files changed, 50 insertions, 67 deletions
diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp
index f33ee0c8d2..6643ab0204 100644
--- a/engines/dreamweb/dreamgen.cpp
+++ b/engines/dreamweb/dreamgen.cpp
@@ -2262,73 +2262,6 @@ forgotone:
setuptimeduse();
}
-void DreamGenContext::initrain() {
- STACK_CHECK;
- es = data.word(kBuffers);
- di = (0+(228*13)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)+(46*40)+(5*80)+(250*4)+(256*30));
- bx = offset_rainlocations;
-checkmorerain:
- al = cs.byte(bx);
- _cmp(al, 255);
- if (flags.z())
- goto finishinitrain;
- _cmp(al, data.byte(kReallocation));
- if (!flags.z())
- goto checkrain;
- al = cs.byte(bx+1);
- _cmp(al, data.byte(kMapx));
- if (!flags.z())
- goto checkrain;
- al = cs.byte(bx+2);
- _cmp(al, data.byte(kMapy));
- if (!flags.z())
- goto checkrain;
- al = cs.byte(bx+3);
- data.byte(kRainspace) = al;
- goto dorain;
-checkrain:
- _add(bx, 4);
- goto checkmorerain;
-dorain:
- cx = 4;
-initraintop:
- randomnumber();
- _and(al, 31);
- _add(al, 3);
- _cmp(al, data.byte(kRainspace));
- if (!flags.c())
- goto initraintop;
- _add(cl, al);
- _cmp(cl, data.byte(kMapxsize));
- if (!flags.c())
- goto initrainside;
- push(cx);
- splitintolines();
- cx = pop();
- goto initraintop;
-initrainside:
- cl = data.byte(kMapxsize);
- _dec(cl);
-initrainside2:
- randomnumber();
- _and(al, 31);
- _add(al, 3);
- _cmp(al, data.byte(kRainspace));
- if (!flags.c())
- goto initrainside2;
- _add(ch, al);
- _cmp(ch, data.byte(kMapysize));
- if (!flags.c())
- goto finishinitrain;
- push(cx);
- splitintolines();
- cx = pop();
- goto initrainside2;
-finishinitrain:
- al = 255;
- _stosb();
-}
-
void DreamGenContext::liftnoise() {
STACK_CHECK;
_cmp(data.byte(kReallocation), 5);
diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp
index 6c8c8db86b..f6083ff705 100644
--- a/engines/dreamweb/sprite.cpp
+++ b/engines/dreamweb/sprite.cpp
@@ -932,5 +932,55 @@ Rain *DreamGenContext::splitintolines(uint8 x, uint8 y, Rain *rain) {
return rain;
}
+struct RainLocation {
+ uint8 location;
+ uint8 x, y;
+ uint8 rainSpace;
+};
+
+void DreamGenContext::initrain() {
+ Rain *rainList = (Rain *)segRef(data.word(kBuffers)).ptr(kRainlist, 0);
+ Rain *rain = rainList;
+ const RainLocation *rainLocationList = (const RainLocation *)cs.ptr(offset_rainlocations, 0);
+ const RainLocation *rainLocation = rainLocationList;
+
+ do {
+ if (rainLocation->location == 0xff) {
+ rain->x = 0xff;
+ return;
+ }
+ if ((rainLocation->location == data.byte(kReallocation)) &&
+ (rainLocation->x == data.byte(kMapx)) &&
+ (rainLocation->y == data.byte(kMapy))) {
+ data.byte(kRainspace) = rainLocation->rainSpace;
+ break;
+ }
+ ++rainLocation;
+ } while (true);
+
+ uint8 x = 4;
+ do {
+ uint8 delta = (engine->randomNumber() & 31) + 3;
+ if (delta >= data.byte(kRainspace))
+ continue;
+ x += delta;
+ if (x >= data.byte(kMapxsize))
+ break;
+ rain = splitintolines(x, 0, rain);
+ } while (true);
+ uint8 y = 0;
+ do {
+ uint8 delta = (engine->randomNumber() & 31) + 3;
+ if (delta >= data.byte(kRainspace))
+ continue;
+ y += delta;
+ if (y >= data.byte(kMapysize))
+ break;
+ rain = splitintolines(data.byte(kMapxsize) - 1, y, rain);
+ } while (true);
+
+ rain->x = 0xff;
+}
+
} /*namespace dreamgen */