aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xdevtools/tasmrecover/tasm-recover2
-rw-r--r--engines/dreamweb/dreambase.h8
-rw-r--r--engines/dreamweb/dreamgen.cpp93
-rw-r--r--engines/dreamweb/dreamgen.h6
-rw-r--r--engines/dreamweb/sound.cpp4
-rw-r--r--engines/dreamweb/sprite.cpp15
-rw-r--r--engines/dreamweb/stubs.cpp72
-rw-r--r--engines/dreamweb/stubs.h13
8 files changed, 91 insertions, 122 deletions
diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover
index a37f7a7f99..1e326cbf5d 100755
--- a/devtools/tasmrecover/tasm-recover
+++ b/devtools/tasmrecover/tasm-recover
@@ -202,6 +202,7 @@ generator = cpp(context, "DreamGen", blacklist = [
'checkcoords',
'checkdest',
'checkforemm',
+ 'checkforshake',
'checkifex',
'checkiffree',
'checkifpathison',
@@ -710,6 +711,7 @@ generator = cpp(context, "DreamGen", blacklist = [
'walkintoroom',
'walktotext',
'watchcount',
+ 'watchreel',
'wearwatch',
'wearshades',
'wheelsound',
diff --git a/engines/dreamweb/dreambase.h b/engines/dreamweb/dreambase.h
index 767229029c..d88fda397a 100644
--- a/engines/dreamweb/dreambase.h
+++ b/engines/dreamweb/dreambase.h
@@ -74,10 +74,16 @@ public:
void cancelCh0();
void cancelCh1();
void loadRoomsSample();
+ void playChannel0(uint8 index, uint8 repeat);
+ void playChannel1(uint8 index);
// from sprite.cpp
Sprite *spriteTable();
- Reel *getReelStart();
+ Reel *getReelStart(uint16 reelPointer);
+ const Frame *findSource(uint16 &frame);
+ void showReelFrame(Reel *reel);
+ const Frame *getReelFrameAX(uint16 frame);
+ void soundOnReels(uint16 reelPointer);
// from stubs.cpp
void crosshair();
diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp
index 718538e415..aef64884e1 100644
--- a/engines/dreamweb/dreamgen.cpp
+++ b/engines/dreamweb/dreamgen.cpp
@@ -6758,99 +6758,6 @@ void DreamGenContext::clearChanges() {
_stosw(cx, true);
}
-void DreamGenContext::watchReel() {
- STACK_CHECK;
- _cmp(data.word(kReeltowatch), -1);
- if (flags.z())
- goto notplayingreel;
- al = data.byte(kManspath);
- _cmp(al, data.byte(kFinaldest));
- if (!flags.z())
- return /* (waitstopwalk) */;
- al = data.byte(kTurntoface);
- _cmp(al, data.byte(kFacing));
- if (flags.z())
- goto notwatchpath;
- return;
-notwatchpath:
- _dec(data.byte(kSpeedcount));
- _cmp(data.byte(kSpeedcount), -1);
- if (!flags.z())
- goto showwatchreel;
- al = data.byte(kWatchspeed);
- data.byte(kSpeedcount) = al;
- ax = data.word(kReeltowatch);
- _cmp(ax, data.word(kEndwatchreel));
- if (!flags.z())
- goto ismorereel;
- _cmp(data.word(kWatchingtime), 0);
- if (!flags.z())
- goto showwatchreel;
- data.word(kReeltowatch) = -1;
- data.byte(kWatchmode) = -1;
- _cmp(data.word(kReeltohold), -1);
- if (flags.z())
- return /* (nomorereel) */;
- data.byte(kWatchmode) = 1;
- goto notplayingreel;
-ismorereel:
- _inc(data.word(kReeltowatch));
-showwatchreel:
- ax = data.word(kReeltowatch);
- data.word(kReelpointer) = ax;
- plotReel();
- ax = data.word(kReelpointer);
- data.word(kReeltowatch) = ax;
- checkForShake();
- return;
-notplayingreel:
- _cmp(data.byte(kWatchmode), 1);
- if (!flags.z())
- goto notholdingreel;
- ax = data.word(kReeltohold);
- data.word(kReelpointer) = ax;
- plotReel();
- return;
-notholdingreel:
- _cmp(data.byte(kWatchmode), 2);
- if (!flags.z())
- return /* (notreleasehold) */;
- _dec(data.byte(kSpeedcount));
- _cmp(data.byte(kSpeedcount), -1);
- if (!flags.z())
- goto notlastspeed2;
- al = data.byte(kWatchspeed);
- data.byte(kSpeedcount) = al;
- _inc(data.word(kReeltohold));
-notlastspeed2:
- ax = data.word(kReeltohold);
- _cmp(ax, data.word(kEndofholdreel));
- if (!flags.z())
- goto ismorereel2;
- data.word(kReeltohold) = -1;
- data.byte(kWatchmode) = -1;
- al = data.byte(kDestafterhold);
- data.byte(kDestination) = al;
- data.byte(kFinaldest) = al;
- autoSetWalk();
- return;
-ismorereel2:
- ax = data.word(kReeltohold);
- data.word(kReelpointer) = ax;
- plotReel();
-}
-
-void DreamGenContext::checkForShake() {
- STACK_CHECK;
- _cmp(data.byte(kReallocation), 26);
- if (!flags.z())
- return /* (notstartshake) */;
- _cmp(ax, 104);
- if (!flags.z())
- return /* (notstartshake) */;
- data.byte(kShakecounter) = -1;
-}
-
void DreamGenContext::madmanRun() {
STACK_CHECK;
_cmp(data.byte(kLocation), 14);
diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h
index 9d283b29e9..b8aecee432 100644
--- a/engines/dreamweb/dreamgen.h
+++ b/engines/dreamweb/dreamgen.h
@@ -554,10 +554,9 @@ public:
void checkInput();
void putUnderCentre();
void checkObjectSize();
- void watchReel();
void findText1();
void isRyanHolding();
- void showSlots();
+ void quitSymbol();
void useCashCard();
void moneyPoke();
void doSomeTalk();
@@ -643,7 +642,7 @@ public:
void lookAtPlace();
void useAxe();
void findAllOpen();
- void quitSymbol();
+ void showSlots();
void findSetObject();
void useDiary();
void deleteExObject();
@@ -693,7 +692,6 @@ public:
void afterNewRoom();
void getExAd();
void initialMonCols();
- void checkForShake();
void useButtonA();
void execCommand();
void updateSymbolBot();
diff --git a/engines/dreamweb/sound.cpp b/engines/dreamweb/sound.cpp
index 16f562a840..8bccc5e280 100644
--- a/engines/dreamweb/sound.cpp
+++ b/engines/dreamweb/sound.cpp
@@ -53,7 +53,7 @@ void DreamBase::volumeAdjust() {
}
}
-void DreamGenContext::playChannel0(uint8 index, uint8 repeat) {
+void DreamBase::playChannel0(uint8 index, uint8 repeat) {
if (data.byte(kSoundint) == 255)
return;
@@ -80,7 +80,7 @@ void DreamGenContext::playChannel0() {
playChannel0(al, ah);
}
-void DreamGenContext::playChannel1(uint8 index) {
+void DreamBase::playChannel1(uint8 index) {
if (data.byte(kSoundint) == 255)
return;
if (data.byte(kCh1playing) == 7)
diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp
index a44cd8d60c..992a080f6c 100644
--- a/engines/dreamweb/sprite.cpp
+++ b/engines/dreamweb/sprite.cpp
@@ -482,8 +482,8 @@ Frame *DreamGenContext::findSource() {
}
}
-Reel *DreamBase::getReelStart() {
- Reel *reel = (Reel *)getSegment(data.word(kReels)).ptr(kReellist + data.word(kReelpointer) * sizeof(Reel) * 8, sizeof(Reel));
+Reel *DreamBase::getReelStart(uint16 reelPointer) {
+ Reel *reel = (Reel *)getSegment(data.word(kReels)).ptr(kReellist + reelPointer * sizeof(Reel) * 8, sizeof(Reel));
return reel;
}
@@ -504,9 +504,8 @@ void DreamGenContext::showGameReel(ReelRoutine *routine) {
uint16 reelPointer = routine->reelPointer();
if (reelPointer >= 512)
return;
- data.word(kReelpointer) = reelPointer;
- plotReel();
- routine->setReelPointer(data.word(kReelpointer));
+ plotReel(reelPointer);
+ routine->setReelPointer(reelPointer);
}
const Frame *DreamGenContext::getReelFrameAX(uint16 frame) {
@@ -1133,14 +1132,14 @@ static const ReelSound *g_roomByRoom[] = {
};
-void DreamGenContext::soundOnReels() {
+void DreamBase::soundOnReels(uint16 reelPointer) {
const ReelSound *r = g_roomByRoom[data.byte(kReallocation)];
if (engine->getLanguage() == Common::DE_DEU && r == g_roomSound29)
r = g_roomSound29_German;
for (; r->_sample != 255; ++r) {
- if (r->_reelPointer != data.word(kReelpointer))
+ if (r->_reelPointer != reelPointer)
continue;
if (r->_reelPointer == data.word(kLastsoundreel))
continue;
@@ -1156,7 +1155,7 @@ void DreamGenContext::soundOnReels() {
playChannel0(r->_sample & 63, 255);
}
- if (data.word(kReelpointer) != data.word(kLastsoundreel))
+ if (data.word(kLastsoundreel) != reelPointer)
data.word(kLastsoundreel) = (uint16)-1;
}
diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp
index 6ad048d0dd..4ccb50ba6c 100644
--- a/engines/dreamweb/stubs.cpp
+++ b/engines/dreamweb/stubs.cpp
@@ -1196,11 +1196,11 @@ void DreamGenContext::dealWithSpecial(uint8 firstParam, uint8 secondParam) {
}
}
-void DreamGenContext::plotReel() {
- Reel *reel = getReelStart();
+void DreamGenContext::plotReel(uint16 &reelPointer) {
+ Reel *reel = getReelStart(reelPointer);
while (reel->x >= 220 && reel->x != 255) {
dealWithSpecial(reel->x, reel->y);
- ++data.word(kReelpointer);
+ ++reelPointer;
reel += 8;
}
@@ -1209,11 +1209,7 @@ void DreamGenContext::plotReel() {
showReelFrame(reel);
++reel;
}
- push(es);
- push(bx);
- soundOnReels();
- bx = pop();
- es = pop();
+ soundOnReels(reelPointer);
}
void DreamBase::crosshair() {
@@ -1258,8 +1254,7 @@ bool DreamGenContext::checkIfPerson(uint8 x, uint8 y) {
for (size_t i = 0; i < 12; ++i, ++people) {
if (people->b4 == 255)
continue;
- data.word(kReelpointer) = people->reelPointer();
- Reel *reel = getReelStart();
+ Reel *reel = getReelStart(people->reelPointer());
if (reel->frame() == 0xffff)
++reel;
const Frame *frame = getReelFrameAX(reel->frame());
@@ -3815,4 +3810,61 @@ void DreamBase::showDiary() {
showFrame(tempGraphics(), kDiaryx + 176, kDiaryy + 108, 2, 0);
}
+void DreamGenContext::showWatchReel() {
+ uint16 reelPointer = data.word(kReeltowatch);
+ plotReel(reelPointer);
+ data.word(kReeltowatch) = reelPointer;
+
+ // check for shake
+ if (data.byte(kReallocation) == 26 && reelPointer == 104)
+ data.byte(kShakecounter) = 0xFF;
+}
+
+void DreamGenContext::watchReel() {
+ if (data.word(kReeltowatch) != 0xFFFF) {
+ if (data.byte(kManspath) != data.byte(kFinaldest))
+ return; // Wait until stopped walking
+ if (data.byte(kTurntoface) != data.byte(kFacing))
+ return;
+
+ if (--data.byte(kSpeedcount) != 0xFF) {
+ showWatchReel();
+ return;
+ }
+ data.byte(kSpeedcount) = data.byte(kWatchspeed);
+ if (data.word(kReeltowatch) != data.word(kEndwatchreel)) {
+ ++data.word(kReeltowatch);
+ showWatchReel();
+ return;
+ }
+ if (data.word(kWatchingtime)) {
+ showWatchReel();
+ return;
+ }
+ data.word(kReeltowatch) = 0xFFFF;
+ data.byte(kWatchmode) = 0xFF;
+ if (data.word(kReeltohold) == 0xFFFF)
+ return; // No more reel
+ data.byte(kWatchmode) = 1;
+ } else if (data.byte(kWatchmode) != 1) {
+ if (data.byte(kWatchmode) != 2)
+ return; // "notreleasehold"
+ if (--data.byte(kSpeedcount) == 0xFF) {
+ data.byte(kSpeedcount) = data.byte(kWatchspeed);
+ ++data.word(kReeltohold);
+ }
+ if (data.word(kReeltohold) == data.word(kEndofholdreel)) {
+ data.word(kReeltohold) = -1;
+ data.byte(kWatchmode) = -1;
+ data.byte(kDestination) = data.byte(kDestafterhold);
+ data.byte(kFinaldest) = data.byte(kDestafterhold);
+ autoSetWalk();
+ return;
+ }
+ }
+
+ uint16 reelPointer = data.word(kReeltohold);
+ plotReel(reelPointer);
+}
+
} // End of namespace DreamGen
diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h
index 8b709d850e..3bbba77d93 100644
--- a/engines/dreamweb/stubs.h
+++ b/engines/dreamweb/stubs.h
@@ -130,7 +130,6 @@
void turnAnyPathOff();
void makeBackOb(SetObject *objData);
void lockMon();
- void plotReel();
void dealWithSpecial(uint8 firstParam, uint8 secondParam);
void zoom();
void showRain();
@@ -297,9 +296,13 @@
void powerLightOn();
void powerLightOff();
void playChannel0();
- void playChannel0(uint8 index, uint8 repeat);
+ void playChannel0(uint8 index, uint8 repeat) {
+ DreamBase::playChannel0(index, repeat);
+ }
void playChannel1();
- void playChannel1(uint8 index);
+ void playChannel1(uint8 index) {
+ DreamBase::playChannel1(index);
+ }
void showMainOps();
void showDiscOps();
void findRoomInLoc();
@@ -471,7 +474,6 @@
void loadPersonal();
void loadNews();
void loadCart();
- void soundOnReels();
void readKey();
void hangOne(uint16 delay);
void hangOne();
@@ -556,5 +558,8 @@
void examineInventory();
void showSaveOps();
void showLoadOps();
+ void watchReel();
+ void showWatchReel();
+ void plotReel(uint16 &reelPointer);
#endif