aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xdevtools/tasmrecover/tasm-recover1
-rw-r--r--engines/dreamweb/dreamgen.cpp97
-rw-r--r--engines/dreamweb/dreamgen.h1
-rw-r--r--engines/dreamweb/people.cpp135
-rw-r--r--engines/dreamweb/sprite.cpp4
-rw-r--r--engines/dreamweb/stubs.h3
6 files changed, 84 insertions, 157 deletions
diff --git a/devtools/tasmrecover/tasm-recover b/devtools/tasmrecover/tasm-recover
index 83ebcadd69..901075f210 100755
--- a/devtools/tasmrecover/tasm-recover
+++ b/devtools/tasmrecover/tasm-recover
@@ -624,6 +624,7 @@ generator = cpp(context, "DreamGen", blacklist = [
'playchannel1',
'playguitar',
'plotreel',
+ 'poolguard',
'powerlightoff',
'powerlighton',
'priest',
diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp
index 804896de5f..9106dc0425 100644
--- a/engines/dreamweb/dreamgen.cpp
+++ b/engines/dreamweb/dreamgen.cpp
@@ -26,103 +26,6 @@
namespace DreamGen {
-void DreamGenContext::poolGuard() {
- STACK_CHECK;
- ax = es.word(bx+3);
- _cmp(ax, 214);
- if (flags.z())
- goto combatover2;
- _cmp(ax, 258);
- if (flags.z())
- goto combatover2;
- _cmp(ax, 185);
- if (flags.z())
- goto combatover1;
- _cmp(ax, 0);
- if (!flags.z())
- goto notfirstpool;
- al = 0;
- turnPathOn();
-notfirstpool:
- checkSpeed();
- if (!flags.z())
- goto guardspeed;
- ax = es.word(bx+3);
- _inc(ax);
- _cmp(ax, 122);
- if (!flags.z())
- goto notendguard1;
- _dec(ax);
- _cmp(data.byte(kLastweapon), 2);
- if (!flags.z())
- goto notaxeonpool;
- data.byte(kLastweapon) = -1;
- ax = 122;
- goto gotguardframe;
-notaxeonpool:
- _inc(data.byte(kCombatcount));
- _cmp(data.byte(kCombatcount), 40);
- if (!flags.z())
- goto gotguardframe;
- data.byte(kCombatcount) = 0;
- ax = 195;
- goto gotguardframe;
-notendguard1:
- _cmp(ax, 147);
- if (!flags.z())
- goto gotguardframe;
- _dec(ax);
- _cmp(data.byte(kLastweapon), 1);
- if (!flags.z())
- goto notgunonpool;
- data.byte(kLastweapon) = -1;
- ax = 147;
- goto gotguardframe;
-notgunonpool:
- _inc(data.byte(kCombatcount));
- _cmp(data.byte(kCombatcount), 40);
- if (!flags.z())
- goto gotguardframe;
- data.byte(kCombatcount) = 0;
- ax = 220;
-gotguardframe:
- es.word(bx+3) = ax;
-guardspeed:
- showGameReel();
- ax = es.word(bx+3);
- _cmp(ax, 121);
- if (flags.z())
- goto iswaitingpool;
- _cmp(ax, 146);
- if (flags.z())
- goto iswaitingpool;
- data.byte(kPointermode) = 0;
- data.word(kWatchingtime) = 2;
- return;
-iswaitingpool:
- data.byte(kPointermode) = 2;
- data.word(kWatchingtime) = 0;
- return;
-combatover1:
- data.word(kWatchingtime) = 0;
- data.byte(kPointermode) = 0;
- al = 0;
- turnPathOn();
- al = 1;
- turnPathOff();
- return;
-combatover2:
- showGameReel();
- data.word(kWatchingtime) = 2;
- data.byte(kPointermode) = 0;
- _inc(data.byte(kCombatcount));
- _cmp(data.byte(kCombatcount), 100);
- if (flags.c())
- return /* (doneover2) */;
- data.word(kWatchingtime) = 0;
- data.byte(kMandead) = 2;
-}
-
void DreamGenContext::checkForExit() {
STACK_CHECK;
cl = data.byte(kRyanx);
diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h
index c47be2f748..945e8ad10f 100644
--- a/engines/dreamweb/dreamgen.h
+++ b/engines/dreamweb/dreamgen.h
@@ -519,7 +519,6 @@ public:
void deleteExFrame();
void searchForSame();
void rollEm();
- void poolGuard();
void lookAtPlace();
void findAllOpen();
void showSlots();
diff --git a/engines/dreamweb/people.cpp b/engines/dreamweb/people.cpp
index 96c9ae89c9..d8ebca648d 100644
--- a/engines/dreamweb/people.cpp
+++ b/engines/dreamweb/people.cpp
@@ -24,38 +24,6 @@
namespace DreamGen {
-static void (DreamGenContext::*reelCallbacks[57])() = {
- NULL, NULL,
- NULL, NULL,
- NULL, NULL,
- NULL, NULL,
- NULL, NULL,
- NULL, NULL,
- NULL, NULL,
- NULL, NULL,
- NULL, NULL,
- NULL, NULL,
- NULL, NULL,
- NULL, NULL,
- NULL, NULL,
- NULL, NULL,
- NULL, &DreamGenContext::poolGuard,
- NULL, NULL,
- NULL, NULL,
- NULL, NULL,
- NULL, NULL,
- NULL, NULL,
- NULL, NULL,
- NULL, NULL,
- NULL, NULL,
- NULL, NULL,
- NULL, NULL,
- NULL, NULL,
- NULL, NULL,
- NULL, NULL,
- NULL
-};
-
static void (DreamGenContext::*reelCallbacksCPP[57])(ReelRoutine &) = {
&DreamGenContext::gamer, &DreamGenContext::sparkyDrip,
&DreamGenContext::eden, &DreamGenContext::edenInBath,
@@ -93,10 +61,6 @@ void DreamGenContext::updatePeople() {
memset(getSegment(data.word(kBuffers)).ptr(kPeoplelist, 12 * sizeof(People)), 0xff, 12 * sizeof(People));
++data.word(kMaintimer);
- // The original callbacks are called with es:bx pointing to their reelRoutine entry.
- // The new callbacks take a mutable ReelRoutine parameter.
-
- es = data;
ReelRoutine *r = (ReelRoutine *)data.ptr(kReelroutines, 0);
for (int i = 0; r[i].reallocation != 255; ++i) {
@@ -104,35 +68,30 @@ void DreamGenContext::updatePeople() {
if (r[i].reallocation == data.byte(kReallocation) &&
r[i].mapX == data.byte(kMapx) &&
r[i].mapY == data.byte(kMapy)) {
- if (reelCallbacks[i]) {
- assert(!reelCallbacksCPP[i]);
- (this->*(reelCallbacks[i]))();
- } else {
- assert(reelCallbacksCPP[i]);
- (this->*(reelCallbacksCPP[i]))(r[i]);
- }
+ assert(reelCallbacksCPP[i]);
+ (this->*(reelCallbacksCPP[i]))(r[i]);
}
}
}
void DreamGenContext::madmanText() {
+ byte origCount;
+
if (isCD()) {
if (data.byte(kSpeechcount) >= 63)
return;
if (data.byte(kCh1playing) != 255)
return;
- al = data.byte(kSpeechcount);
+ origCount = data.byte(kSpeechcount);
++data.byte(kSpeechcount);
} else {
if (data.byte(kCombatcount) >= 61)
return;
- al = data.byte(kCombatcount);
- _and(al, 3);
- if (!flags.z())
+ if (data.byte(kCombatcount) & 3)
return;
- al = data.byte(kCombatcount) / 4;
+ origCount = data.byte(kCombatcount) / 4;
}
- setupTimedTemp(47 + al, 82, 72, 80, 90, 1);
+ setupTimedTemp(47 + origCount, 82, 72, 80, 90, 1);
}
void DreamGenContext::madman(ReelRoutine &routine) {
@@ -191,10 +150,6 @@ void DreamGenContext::madMode() {
data.byte(kPointermode) = 2;
}
-void DreamGenContext::addToPeopleList() {
- addToPeopleList((ReelRoutine *)es.ptr(bx, sizeof(ReelRoutine)));
-}
-
void DreamGenContext::addToPeopleList(ReelRoutine *routine) {
uint16 routinePointer = (const uint8 *)routine - data.ptr(0, 0);
@@ -1049,4 +1004,78 @@ void DreamGenContext::endGameSeq(ReelRoutine &routine) {
}
}
+void DreamGenContext::poolGuard(ReelRoutine &routine) {
+ if (routine.reelPointer() == 214 || routine.reelPointer() == 258) {
+ // Combat over 2
+ showGameReel(&routine);
+ data.word(kWatchingtime) = 2;
+ data.byte(kPointermode) = 0;
+ data.byte(kCombatcount)++;
+ if (data.byte(kCombatcount) < 100)
+ return; // doneover2
+ data.word(kWatchingtime) = 0;
+ data.byte(kMandead) = 2;
+ return;
+ } else if (routine.reelPointer() == 185) {
+ // Combat over 1
+ data.word(kWatchingtime) = 0;
+ data.byte(kPointermode) = 0;
+ turnPathOn(0);
+ turnPathOff(1);
+ return;
+ }
+
+ if (routine.reelPointer() == 0)
+ turnPathOn(0); // first pool
+
+ if (checkSpeed(routine)) {
+ uint16 nextReelPointer = routine.reelPointer() + 1;
+
+ if (nextReelPointer != 122) {
+ // Not end guard 1
+ if (nextReelPointer == 147) {
+ nextReelPointer--;
+ if (data.byte(kLastweapon) == 1) {
+ // Gun on pool
+ data.byte(kLastweapon) = (byte)-1;
+ nextReelPointer = 147;
+ } else {
+ // Gun not on pool
+ data.byte(kCombatcount)++;
+ if (data.byte(kCombatcount) == 40) {
+ data.byte(kCombatcount) = 0;
+ nextReelPointer = 220;
+ }
+ }
+ }
+ }
+
+ nextReelPointer--;
+
+ if (data.byte(kLastweapon) == 2) {
+ // Axe on pool
+ data.byte(kLastweapon) = (byte)-1;
+ nextReelPointer = 122;
+ } else {
+ data.byte(kCombatcount)++;
+ if (data.byte(kCombatcount) == 40) {
+ data.byte(kCombatcount) = 0;
+ nextReelPointer = 195;
+ }
+ }
+
+ routine.setReelPointer(nextReelPointer);
+ }
+
+ showGameReel(&routine);
+
+ if (routine.reelPointer() != 121 && routine.reelPointer() != 146) {
+ data.byte(kPointermode) = 0;
+ data.word(kWatchingtime) = 2;
+ } else {
+ data.byte(kPointermode) = 2;
+ data.word(kWatchingtime) = 0;
+ }
+}
+
} // End of namespace DreamGen
diff --git a/engines/dreamweb/sprite.cpp b/engines/dreamweb/sprite.cpp
index c69ac2a3f5..d82d0f19fc 100644
--- a/engines/dreamweb/sprite.cpp
+++ b/engines/dreamweb/sprite.cpp
@@ -486,10 +486,6 @@ void DreamBase::showReelFrame(Reel *reel) {
showFrame(base, x, y, frame, 8);
}
-void DreamGenContext::showGameReel() {
- showGameReel((ReelRoutine *)es.ptr(bx, sizeof(ReelRoutine)));
-}
-
void DreamGenContext::showGameReel(ReelRoutine *routine) {
uint16 reelPointer = routine->reelPointer();
if (reelPointer >= 512)
diff --git a/engines/dreamweb/stubs.h b/engines/dreamweb/stubs.h
index 0ee4171470..b50b1bccd7 100644
--- a/engines/dreamweb/stubs.h
+++ b/engines/dreamweb/stubs.h
@@ -92,7 +92,6 @@
void wideDoor(Sprite *sprite, SetObject *objData);
void lockedDoorway(Sprite *sprite, SetObject *objData);
void liftSprite(Sprite *sprite, SetObject *objData);
- void showGameReel();
void showGameReel(ReelRoutine *routine);
void turnPathOn(uint8 param);
void turnPathOff(uint8 param);
@@ -176,7 +175,6 @@
void obName();
void obName(uint8 command, uint8 commandType);
void checkCoords(const RectWithCallback *rectWithCallbacks);
- void addToPeopleList();
void addToPeopleList(ReelRoutine *routine);
void getExPos();
void compare();
@@ -385,6 +383,7 @@
void mugger(ReelRoutine &routine);
void businessMan(ReelRoutine &routine);
void endGameSeq(ReelRoutine &routine);
+ void poolGuard(ReelRoutine &routine);
void singleKey(uint8 key, uint16 x, uint16 y);
void loadSaveBox();
uint8 nextSymbol(uint8 symbol);