diff options
Diffstat (limited to 'engines/dreamweb/stubs.cpp')
-rw-r--r-- | engines/dreamweb/stubs.cpp | 350 |
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 |