diff options
-rwxr-xr-x | devtools/tasmrecover/tasm-recover | 1 | ||||
-rw-r--r-- | engines/dreamweb/dreamgen.cpp | 97 | ||||
-rw-r--r-- | engines/dreamweb/dreamgen.h | 1 | ||||
-rw-r--r-- | engines/dreamweb/people.cpp | 135 | ||||
-rw-r--r-- | engines/dreamweb/sprite.cpp | 4 | ||||
-rw-r--r-- | engines/dreamweb/stubs.h | 3 |
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); |