aboutsummaryrefslogtreecommitdiff
path: root/engines/dreamweb/stubs.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/dreamweb/stubs.cpp')
-rw-r--r--engines/dreamweb/stubs.cpp350
1 files changed, 335 insertions, 15 deletions
diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp
index 71a6834b73..a7d65845e1 100644
--- a/engines/dreamweb/stubs.cpp
+++ b/engines/dreamweb/stubs.cpp
@@ -576,7 +576,7 @@ void DreamGenContext::dreamweb() {
data.byte(kLastflag) = 32;
startup1();
data.byte(kVolumeto) = 0;
- data.byte(kVolumedirection) = (uint8)-1;
+ data.byte(kVolumedirection) = (byte)-1;
data.byte(kCommandtype) = 255;
}
@@ -862,6 +862,41 @@ void DreamGenContext::putUnderTimed() {
multiPut(ds.ptr(si, 0), data.byte(kTimedx), y, 240, kUndertimedysize);
}
+void DreamBase::getUnderCentre() {
+ multiGet(mapStore(), 58, 72, 254, 110);
+}
+
+void DreamBase::putUnderCentre() {
+ multiPut(mapStore(), 58, 72, 254, 110);
+}
+
+void DreamGenContext::triggerMessage(uint16 index) {
+ multiGet(mapStore(), 174, 153, 200, 63);
+ uint16 offset = kTextstart + getSegment(data.word(kPuzzletext)).word(index * 2);
+ const uint8 *string = getSegment(data.word(kPuzzletext)).ptr(offset, 0);
+ uint16 y = 156;
+ printDirect(&string, 174, &y, 141, true);
+ hangOn(140);
+ workToScreenCPP();
+ hangOn(340);
+ multiPut(mapStore(), 174, 153, 200, 63);
+ workToScreenCPP();
+ data.byte(kLasttrigger) = 0;
+}
+
+void DreamGenContext::processTrigger() {
+ if (data.byte(kLasttrigger) == '1') {
+ DreamBase::setLocation(8);
+ triggerMessage(45);
+ } else if (data.byte(kLasttrigger) == '2') {
+ DreamBase::setLocation(9);
+ triggerMessage(55);
+ } else if (data.byte(kLasttrigger) == '3') {
+ DreamBase::setLocation(2);
+ triggerMessage(59);
+ }
+}
+
void DreamGenContext::useTimedText() {
if (data.word(kTimecount) == 0)
return;
@@ -2466,20 +2501,20 @@ void DreamGenContext::examIcon() {
showFrame(engine->icons2(), 254, 5, 3, 0);
}
-uint8 DreamGenContext::getLocation(uint8 index) {
+uint8 DreamBase::getLocation(uint8 index) {
return data.byte(kRoomscango + index);
}
void DreamGenContext::getLocation() {
- al = getLocation(al);
+ al = DreamBase::getLocation(al);
}
-void DreamGenContext::setLocation(uint8 index) {
+void DreamBase::setLocation(uint8 index) {
data.byte(kRoomscango + index) = 1;
}
void DreamGenContext::setLocation() {
- setLocation(al);
+ DreamBase::setLocation(al);
}
const uint8 *DreamBase::getTextInFile1(uint16 index) {
@@ -2542,8 +2577,8 @@ void DreamGenContext::lastFolder() {
void DreamGenContext::folderHints() {
if (data.byte(kFolderpage) == 5) {
- if ((data.byte(kAidedead) != 1) && (getLocation(13) != 1)) {
- setLocation(13);
+ if ((data.byte(kAidedead) != 1) && (DreamBase::getLocation(13) != 1)) {
+ DreamBase::setLocation(13);
showFolder();
const uint8 *string = getTextInFile1(30);
printDirect(string, 0, 86, 141, true);
@@ -2551,8 +2586,8 @@ void DreamGenContext::folderHints() {
hangOnP(200);
}
} else if (data.byte(kFolderpage) == 9) {
- if (getLocation(7) != 1) {
- setLocation(7);
+ if (DreamBase::getLocation(7) != 1) {
+ DreamBase::setLocation(7);
showFolder();
const uint8 *string = getTextInFile1(31);
printDirect(string, 0, 86, 141, true);
@@ -3031,7 +3066,7 @@ void DreamGenContext::intro() {
clearPalette();
loadIntroRoom();
data.byte(kVolume) = 7;
- data.byte(kVolumedirection) = (uint8)-1;
+ data.byte(kVolumedirection) = (byte)-1;
data.byte(kVolumeto) = 4;
playChannel0(12, 255);
fadeScreenUps();
@@ -3247,7 +3282,7 @@ void DreamGenContext::gettingShot() {
loadIntroRoom();
fadeScreenUps();
data.byte(kVolumeto) = 0;
- data.byte(kVolumedirection) = 0xFF;
+ data.byte(kVolumedirection) = (byte)-1;
runEndSeq();
clearBeforeLoad();
}
@@ -3314,8 +3349,8 @@ void DreamGenContext::obsThatDoThings() {
if (!compare(data.byte(kCommand), data.byte(kObjecttype), id))
return; // notlouiscard
- if (getLocation(4) != 1) {
- setLocation(4);
+ if (DreamBase::getLocation(4) != 1) {
+ DreamBase::setLocation(4);
lookAtCard();
}
}
@@ -3896,7 +3931,7 @@ void DreamGenContext::talk() {
workToScreenM();
if (data.byte(kSpeechloaded) == 1) {
cancelCh1();
- data.byte(kVolumedirection) = 0xFF;
+ data.byte(kVolumedirection) = (byte)-1;
data.byte(kVolumeto) = 0;
}
}
@@ -4219,7 +4254,7 @@ void DreamGenContext::monkSpeaking() {
showFrame(tempGraphics(), 160, 72, 0, 128); // show monk
workToScreen();
data.byte(kVolume) = 7;
- data.byte(kVolumedirection) = 0xFF;
+ data.byte(kVolumedirection) = (byte)-1;
data.byte(kVolumeto) = 5;
playChannel0(12, 255);
fadeScreenUps();
@@ -4262,4 +4297,289 @@ void DreamGenContext::useButtonA() {
}
}
+void DreamGenContext::autoAppear() {
+ if (data.byte(kLocation) == 32) {
+ // In alley
+ al = 5;
+ resetLocation();
+ DreamBase::setLocation(10);
+ data.byte(kDestpos) = 10;
+ return;
+ }
+
+ if (data.byte(kReallocation) == 24) {
+ // In Eden's apartment
+ if (data.byte(kGeneraldead) == 1) {
+ data.byte(kGeneraldead)++;
+ placeSetObject(44);
+ placeSetObject(18);
+ placeSetObject(93);
+ removeSetObject(92);
+ removeSetObject(55);
+ removeSetObject(75);
+ removeSetObject(84);
+ removeSetObject(85);
+ } else if (data.byte(kSartaindead) == 1) {
+ // Eden's part 2
+ removeSetObject(44);
+ removeSetObject(93);
+ placeSetObject(55);
+ data.byte(kSartaindead)++;
+ }
+ } else {
+ // Not in Eden's
+ if (data.byte(kReallocation) == 25) {
+ // Sart roof
+ data.byte(kNewsitem) = 3;
+ al = 6;
+ resetLocation();
+ DreamBase::setLocation(11);
+ data.byte(kDestpos) = 11;
+ } else {
+ if (data.byte(kReallocation) == 2 && data.byte(kRockstardead) != 0)
+ placeSetObject(23);
+ }
+ }
+}
+
+void DreamGenContext::quitKey() {
+ if (data.byte(kCommandtype) != 222) {
+ data.byte(kCommandtype) = 222;
+ commandOnly(4);
+ }
+
+ if (data.word(kMousebutton) != data.word(kOldbutton) && (data.word(kMousebutton) & 1))
+ data.byte(kGetback) = 1;
+}
+
+void DreamGenContext::setupTimedUse() {
+ DreamBase::setupTimedUse(al, cx, dx, bl, bh);
+}
+
+void DreamBase::setupTimedUse(uint16 textIndex, uint16 countToTimed, uint16 timeCount, byte x, byte y) {
+ if (data.word(kTimecount) != 0)
+ return; // can't setup
+
+ data.byte(kTimedy) = y;
+ data.byte(kTimedx) = x;
+ data.word(kCounttotimed) = countToTimed;
+ data.word(kTimecount) = timeCount + countToTimed;
+ data.word(kTimedseg) = data.word(kPuzzletext);
+ data.word(kTimedoffset) = kTextstart + getSegment(data.word(kPuzzletext)).word(textIndex * 2);
+ const uint8 *string = getSegment(data.word(kPuzzletext)).ptr(data.word(kTimedoffset), 0);
+ debug(1, "setupTimedUse: %d => '%s'", textIndex, string);
+}
+
+void DreamBase::entryTexts() {
+ switch (data.byte(kLocation)) {
+ case 21:
+ setupTimedUse(28, 60, 11, 68, 64);
+ break;
+ case 30:
+ setupTimedUse(27, 60, 11, 68, 64);
+ break;
+ case 23:
+ setupTimedUse(29, 60, 11, 68, 64);
+ break;
+ case 31:
+ setupTimedUse(30, 60, 11, 68, 64);
+ break;
+ case 20: // Sarter's 2
+ setupTimedUse(31, 60, 11, 68, 64);
+ break;
+ case 24: // Eden's lobby
+ setupTimedUse(32, 60, 3, 68, 64);
+ break;
+ case 34: // Eden 2
+ setupTimedUse(33, 60, 3, 68, 64);
+ break;
+ default:
+ break;
+ }
+}
+
+void DreamGenContext::entryAnims() {
+ data.word(kReeltowatch) = 0xFFFF;
+ data.byte(kWatchmode) = (byte)-1;
+
+ switch (data.byte(kLocation)) {
+ case 33: // beach
+ switchRyanOff();
+ data.word(kWatchingtime) = 76 * 2;
+ data.word(kReeltowatch) = 0;
+ data.word(kEndwatchreel) = 76;
+ data.byte(kWatchspeed) = 1;
+ data.byte(kSpeedcount) = 1;
+ break;
+ case 44: // Sparky's
+ al = 8;
+ resetLocation();
+ data.word(kWatchingtime) = 50*2;
+ data.word(kReeltowatch) = 247;
+ data.word(kEndwatchreel) = 297;
+ data.byte(kWatchspeed) = 1;
+ data.byte(kSpeedcount) = 1;
+ switchRyanOff();
+ break;
+ case 22: // lift
+ data.word(kWatchingtime) = 31 * 2;
+ data.word(kReeltowatch) = 0;
+ data.word(kEndwatchreel) = 30;
+ data.byte(kWatchspeed) = 1;
+ data.byte(kSpeedcount) = 1;
+ switchRyanOff();
+ break;
+ case 26: // under church
+ data.byte(kSymboltopnum) = 2;
+ data.byte(kSymbolbotnum) = 1;
+ break;
+ case 45: // entered Dreamweb
+ data.byte(kKeeperflag) = 0;
+ data.word(kWatchingtime) = 296;
+ data.word(kReeltowatch) = 45;
+ data.word(kEndwatchreel) = 198;
+ data.byte(kWatchspeed) = 1;
+ data.byte(kSpeedcount) = 1;
+ switchRyanOff();
+ break;
+ default:
+ if (data.byte(kReallocation) == 46 && data.byte(kSartaindead) == 1) { // Crystal
+ removeFreeObject(0);
+ } else if (data.byte(kLocation) == 9 && !checkIfPathIsOn(2) && data.byte(kAidedead) != 0) {
+ // Top of church
+ if (checkIfPathIsOn(3))
+ turnPathOn(2);
+
+ // Make doors open
+ removeSetObject(4);
+ placeSetObject(5);
+ } else if (data.byte(kLocation) == 47) { // Dream centre
+ placeSetObject(4);
+ placeSetObject(5);
+ } else if (data.byte(kLocation) == 38) { // Car park
+ data.word(kWatchingtime) = 57 * 2;
+ data.word(kReeltowatch) = 4;
+ data.word(kEndwatchreel) = 57;
+ data.byte(kWatchspeed) = 1;
+ data.byte(kSpeedcount) = 1;
+ switchRyanOff();
+ } else if (data.byte(kLocation) == 32) { // Alley
+ data.word(kWatchingtime) = 66 * 2;
+ data.word(kReeltowatch) = 0;
+ data.word(kEndwatchreel) = 66;
+ data.byte(kWatchspeed) = 1;
+ data.byte(kSpeedcount) = 1;
+ switchRyanOff();
+ } else if (data.byte(kLocation) == 24) { // Eden's again
+ turnAnyPathOn(2, data.byte(kRoomnum) - 1);
+ }
+ }
+}
+
+void DreamGenContext::selectSlot() {
+ if (data.byte(kCommandtype) != 244) {
+ data.byte(kCommandtype) = 244;
+ commandOnly(45);
+ }
+
+ if (data.word(kMousebutton) != 1 || data.word(kMousebutton) == data.word(kOldbutton))
+ return; // noselslot
+ if (data.byte(kLoadingorsave) == 3)
+ data.byte(kLoadingorsave)--;
+
+ oldToNames();
+ int y = data.word(kMousey) - (kOpsy + 4);
+ if (y < 11)
+ data.byte(kCurrentslot) = 0;
+ else
+ data.byte(kCurrentslot) = y / 11;
+
+ delPointer();
+ showOpBox();
+ showSlots();
+ showNames();
+ if (data.byte(kLoadingorsave) == 1)
+ showLoadOps();
+ else
+ showSaveOps();
+ readMouse();
+ showPointer();
+ workToScreen();
+ delPointer();
+}
+
+void DreamGenContext::updateSymbolTop() {
+ if (!data.byte(kSymboltopdir))
+ return; // topfinished
+
+ if (data.byte(kSymboltopdir) == (byte)-1) {
+ // Backward
+ data.byte(kSymboltopx)--;
+ if (data.byte(kSymboltopx) != (byte)-1) {
+ // Not wrapping
+ if (data.byte(kSymboltopx) != 24)
+ return; // topfinished
+ data.byte(kSymboltopdir) = 0;
+ } else {
+ data.byte(kSymboltopx) = 48;
+ data.byte(kSymboltopnum)++;
+ if (data.byte(kSymboltopnum) != 6)
+ return; // topfinished
+ data.byte(kSymboltopnum) = 0;
+ }
+ } else {
+ // Forward
+ data.byte(kSymboltopx)++;
+ if (data.byte(kSymboltopx) != 49) {
+ // Not wrapping
+ if (data.byte(kSymboltopx) != 24)
+ return; // topfinished
+ data.byte(kSymboltopdir) = 0;
+ } else {
+ data.byte(kSymboltopx) = 0;
+ data.byte(kSymboltopnum)--;
+ if (data.byte(kSymboltopnum) != (byte)-1)
+ return; // topfinished
+ data.byte(kSymboltopnum) = 5;
+ }
+ }
+}
+
+void DreamGenContext::updateSymbolBot() {
+ if (!data.byte(kSymbolbotdir))
+ return; // botfinished
+
+ if (data.byte(kSymbolbotdir) == (byte)-1) {
+ // Backward
+ data.byte(kSymbolbotx)--;
+ if (data.byte(kSymbolbotx) != (byte)-1) {
+ // Not wrapping
+ if (data.byte(kSymbolbotx) != 24)
+ return; // botfinished
+ data.byte(kSymbolbotdir) = 0;
+ } else {
+ data.byte(kSymbolbotx) = 48;
+ data.byte(kSymbolbotnum)++;
+ if (data.byte(kSymbolbotnum) != 6)
+ return; // botfinished
+ data.byte(kSymbolbotnum) = 0;
+ }
+ } else {
+ // Forward
+ data.byte(kSymbolbotx)++;
+ if (data.byte(kSymbolbotx) != 49) {
+ // Not wrapping
+ if (data.byte(kSymbolbotx) != 24)
+ return; // botfinished
+ data.byte(kSymbolbotdir) = 0;
+ } else {
+ data.byte(kSymbolbotx) = 0;
+ data.byte(kSymbolbotnum)--;
+ if (data.byte(kSymbolbotnum) != (byte)-1)
+ return; // botfinished
+ data.byte(kSymbolbotnum) = 5;
+ }
+ }
+}
+
} // End of namespace DreamGen