diff options
Diffstat (limited to 'engines/dreamweb/talk.cpp')
-rw-r--r-- | engines/dreamweb/talk.cpp | 234 |
1 files changed, 231 insertions, 3 deletions
diff --git a/engines/dreamweb/talk.cpp b/engines/dreamweb/talk.cpp index 86d1b886ef..a73a5091c0 100644 --- a/engines/dreamweb/talk.cpp +++ b/engines/dreamweb/talk.cpp @@ -24,15 +24,243 @@ namespace DreamGen { -uint16 DreamGenContext::getPersFrame(uint8 index) { - return getSegment(data.word(kPeople)).word(kPersonframes + index * 2); +void DreamBase::talk() { + data.byte(kTalkpos) = 0; + data.byte(kInmaparea) = 0; + data.byte(kCharacter) = data.byte(kCommand); + createPanel(); + showPanel(); + showMan(); + showExit(); + underTextLine(); + convIcons(); + startTalk(); + data.byte(kCommandtype) = 255; + readMouse(); + showPointer(); + workToScreen(); + + RectWithCallback<DreamGenContext> talkList[] = { + { 273,320,157,198,&DreamBase::getBack1 }, + { 240,290,2,44,&DreamBase::moreTalk }, + { 0,320,0,200,&DreamBase::blank }, + { 0xFFFF,0,0,0,0 } + }; + + do { + delPointer(); + readMouse(); + animPointer(); + showPointer(); + vSync(); + dumpPointer(); + dumpTextLine(); + data.byte(kGetback) = 0; + checkCoords(talkList); + if (data.byte(kQuitrequested)) + break; + } while (!data.byte(kGetback)); + + if (data.byte(kTalkpos) >= 4) + _personData->b7 |= 128; + + redrawMainScrn(); + workToScreenM(); + if (data.byte(kSpeechloaded) == 1) { + cancelCh1(); + data.byte(kVolumedirection) = (byte)-1; + data.byte(kVolumeto) = 0; + } } -void DreamGenContext::convIcons() { +void DreamBase::convIcons() { uint8 index = data.byte(kCharacter) & 127; uint16 frame = getPersFrame(index); const Frame *base = findSource(frame); showFrame(base, 234, 2, frame, 0); } +uint16 DreamBase::getPersFrame(uint8 index) { + return getSegment(data.word(kPeople)).word(kPersonframes + index * 2); +} + +void DreamBase::startTalk() { + data.byte(kTalkmode) = 0; + + const uint8 *str = getPersonText(data.byte(kCharacter) & 0x7F, 0); + uint16 y; + + data.word(kCharshift) = 91+91; + y = 64; + printDirect(&str, 66, &y, 241, true); + + data.word(kCharshift) = 0; + y = 80; + printDirect(&str, 66, &y, 241, true); + + data.byte(kSpeechloaded) = 0; + loadSpeech('R', data.byte(kReallocation), 'C', 64*(data.byte(kCharacter) & 0x7F)); + if (data.byte(kSpeechloaded) == 1) { + data.byte(kVolumedirection) = 1; + data.byte(kVolumeto) = 6; + playChannel1(50 + 12); + } +} + +const uint8 *DreamBase::getPersonText(uint8 index, uint8 talkPos) { + uint16 offset = kPersontext + getSegment(data.word(kPeople)).word(((index * 64 + talkPos) * 2) + kPersontxtdat); + return getSegment(data.word(kPeople)).ptr(offset, 0); +} + +void DreamBase::moreTalk() { + if (data.byte(kTalkmode) != 0) { + redes(); + return; + } + + if (data.byte(kCommandtype) != 215) { + data.byte(kCommandtype) = 215; + commandOnly(49); + } + + if (data.word(kMousebutton) == data.word(kOldbutton)) + return; // nomore + + if (!(data.word(kMousebutton) & 1)) + return; + + data.byte(kTalkmode) = 2; + data.byte(kTalkpos) = 4; + + if (data.byte(kCharacter) >= 100) + data.byte(kTalkpos) = 48; // second part + doSomeTalk(); +} + +void DreamBase::doSomeTalk() { + while (true) { + const uint8 *str = getPersonText(data.byte(kCharacter) & 0x7F, data.byte(kTalkpos)); + + if (*str == 0) { + // endheartalk + data.byte(kPointermode) = 0; + return; + } + + createPanel(); + showPanel(); + showMan(); + showExit(); + convIcons(); + + printDirect(str, 164, 64, 144, false); + + loadSpeech('R', data.byte(kReallocation), 'C', (64 * (data.byte(kCharacter) & 0x7F)) + data.byte(kTalkpos)); + if (data.byte(kSpeechloaded) != 0) + playChannel1(62); + + data.byte(kPointermode) = 3; + workToScreenM(); + if (hangOnPQ()) + return; + + data.byte(kTalkpos)++; + + str = getPersonText(data.byte(kCharacter) & 0x7F, data.byte(kTalkpos)); + if (*str == 0) { + // endheartalk + data.byte(kPointermode) = 0; + return; + } + + if (*str != ':' && *str != 32) { + createPanel(); + showPanel(); + showMan(); + showExit(); + convIcons(); + printDirect(str, 48, 128, 144, false); + + loadSpeech('R', data.byte(kReallocation), 'C', (64 * (data.byte(kCharacter) & 0x7F)) + data.byte(kTalkpos)); + if (data.byte(kSpeechloaded) != 0) + playChannel1(62); + + data.byte(kPointermode) = 3; + workToScreenM(); + if (hangOnPQ()) + return; + } + + data.byte(kTalkpos)++; + } +} + +bool DreamBase::hangOnPQ() { + data.byte(kGetback) = 0; + + RectWithCallback<DreamBase> quitList[] = { + { 273,320,157,198,&DreamBase::getBack1 }, + { 0,320,0,200,&DreamBase::blank }, + { 0xFFFF,0,0,0,0 } + }; + + uint16 speechFlag = 0; + + do { + delPointer(); + readMouse(); + animPointer(); + showPointer(); + vSync(); + dumpPointer(); + dumpTextLine(); + checkCoords(quitList); + + if (data.byte(kGetback) == 1 || data.byte(kQuitrequested)) { + // Quit conversation + delPointer(); + data.byte(kPointermode) = 0; + cancelCh1(); + return true; + } + + if (data.byte(kSpeechloaded) == 1 && data.byte(kCh1playing) == 255) { + speechFlag++; + if (speechFlag == 40) + break; + } + } while (!data.word(kMousebutton) || data.word(kOldbutton)); + + delPointer(); + data.byte(kPointermode) = 0; + return false; +} + +void DreamBase::redes() { + if (data.byte(kCh1playing) != 255 || data.byte(kTalkmode) != 2) { + blank(); + return; + } + + if (data.byte(kCommandtype) != 217) { + data.byte(kCommandtype) = 217; + commandOnly(50); + } + + if (!(data.word(kMousebutton) & 1)) + return; + + delPointer(); + createPanel(); + showPanel(); + showMan(); + showExit(); + convIcons(); + startTalk(); + readMouse(); + showPointer(); + workToScreen(); + delPointer(); +} + } // End of namespace DreamGen |