diff options
Diffstat (limited to 'engines/dreamweb')
-rw-r--r-- | engines/dreamweb/dreamgen.cpp | 321 | ||||
-rw-r--r-- | engines/dreamweb/dreamgen.h | 35 | ||||
-rw-r--r-- | engines/dreamweb/dreamweb.cpp | 79 | ||||
-rw-r--r-- | engines/dreamweb/dreamweb.h | 3 |
4 files changed, 285 insertions, 153 deletions
diff --git a/engines/dreamweb/dreamgen.cpp b/engines/dreamweb/dreamgen.cpp index dca8d5fa17..187f1f9981 100644 --- a/engines/dreamweb/dreamgen.cpp +++ b/engines/dreamweb/dreamgen.cpp @@ -29,6 +29,7 @@ void fadescreendown(Context &context); void hangon(Context &context); void fadescreendowns(Context &context); void endgame(Context &context); +void makename(Context &context); void standardload(Context &context); void getroomspaths(Context &context); void readheader(Context &context); @@ -1660,6 +1661,7 @@ notmonk2text2: notmonk2text3: context._cmp(context.data.byte(kIntrocount), 10); if (!context.flags.z()) goto notmonk2text4; + context.data.byte(kIntrocount) = 12; context.al = 11; context.bl = 0; context.bh = 105; @@ -1668,6 +1670,8 @@ notmonk2text3: notmonk2text4: context._cmp(context.data.byte(kIntrocount), 13); if (!context.flags.z()) goto notmonk2text5; + context.data.byte(kIntrocount) = 17; + {assert(stack_depth == context.stack.size()); return; } context.al = 12; context.bl = 0; context.bh = 120; @@ -1708,7 +1712,7 @@ notmonk2text8: context.cx = 100; goto gotmonks2text; notmonk2text9: - context._cmp(context.data.byte(kIntrocount), 28); + context._cmp(context.data.byte(kIntrocount), 27); if (!context.flags.z()) goto notmonk2text10; context.al = 17; context.bl = 36; @@ -1763,6 +1767,10 @@ notintro1text3: gotintro1text: context.dx = 1; context.ah = 82; + context._cmp(context.data.byte(kCh1playing), 255); + if (context.flags.z()) goto oktalk2; + context._dec(context.data.byte(kIntrocount)); + {assert(stack_depth == context.stack.size()); return; } oktalk2: setuptimedtemp(context); {assert(stack_depth == context.stack.size()); return; } @@ -1804,7 +1812,7 @@ void intro3text(Context & context) { context.cx = 100; goto gotintro3text; notintro3text1: - context._cmp(context.ax, 109); + context._cmp(context.ax, 108); if (!context.flags.z()) goto notintro3text2; context.al = 46; context.bl = 36; @@ -2059,13 +2067,13 @@ notfirstmad: context.bx = context.pop(); context.es = context.pop(); context.ax = 53; - context._cmp(context.data.byte(kCombatcount), 62); + context._cmp(context.data.byte(kCombatcount), 64); if (context.flags.c()) goto nomadspeak; - context._cmp(context.data.byte(kCombatcount), 68); + context._cmp(context.data.byte(kCombatcount), 70); if (context.flags.z()) goto killryan; context._cmp(context.data.byte(kLastweapon), 8); if (!context.flags.z()) goto nomadspeak; - context.data.byte(kCombatcount) = 70; + context.data.byte(kCombatcount) = 72; context.data.byte(kLastweapon) = -1; context.data.byte(kMadmanflag) = 1; context.ax = 67; @@ -2099,14 +2107,12 @@ ryansded: void madmantext(Context & context) { uint stack_depth = context.stack.size(); - context._cmp(context.data.byte(kCombatcount), 61); + context._cmp(context.data.byte(kSpeechcount), 63); if (!context.flags.c()) goto nomadtext; - context.al = context.data.byte(kCombatcount); - context._and(context.al, 3); + context._cmp(context.data.byte(kCh1playing), 255); if (!context.flags.z()) goto nomadtext; - context.al = context.data.byte(kCombatcount); - context._shr(context.al, 1); - context._shr(context.al, 1); + context.al = context.data.byte(kSpeechcount); + context._inc(context.data.byte(kSpeechcount)); context._add(context.al, 47); context.bl = 72; context.bh = 80; @@ -2122,9 +2128,9 @@ void madmode(Context & context) { uint stack_depth = context.stack.size(); context.data.word(kWatchingtime) = 2; context.data.byte(kPointermode) = 0; - context._cmp(context.data.byte(kCombatcount), 63); + context._cmp(context.data.byte(kCombatcount), 65); if (context.flags.c()) goto iswatchmad; - context._cmp(context.data.byte(kCombatcount), 68); + context._cmp(context.data.byte(kCombatcount), 70); if (!context.flags.c()) goto iswatchmad; context.data.byte(kPointermode) = 2; iswatchmad: @@ -2162,7 +2168,7 @@ void textforend(Context & context) { context.cx = 60; goto gotendtext; notendtext1: - context._cmp(context.data.byte(kIntrocount), 65); + context._cmp(context.data.byte(kIntrocount), 50); if (!context.flags.z()) goto notendtext2; context.al = 1; context.bl = 34; @@ -2170,7 +2176,7 @@ notendtext1: context.cx = 60; goto gotendtext; notendtext2: - context._cmp(context.data.byte(kIntrocount), 110); + context._cmp(context.data.byte(kIntrocount), 85); if (!context.flags.z()) goto notendtext3; context.al = 2; context.bl = 34; @@ -2220,7 +2226,7 @@ notmonktext3: context.cx = 120; goto gotmonktext; notmonktext4: - context._cmp(context.data.byte(kIntrocount), 17); + context._cmp(context.data.byte(kIntrocount), 15); if (!context.flags.z()) goto notmonktext5; context.al = 23; context.bl = 68; @@ -2284,7 +2290,7 @@ notmonktext11: context.cx = 120; goto gotmonktext; notmonktext12: - context._cmp(context.data.byte(kIntrocount), 49); + context._cmp(context.data.byte(kIntrocount), 52); if (!context.flags.z()) goto notmonktext13; context.al = 31; context.bl = 68; @@ -2295,11 +2301,17 @@ notmonktext13: context._cmp(context.data.byte(kIntrocount), 53); if (!context.flags.z()) goto notendtitles; fadescreendowns(context); + context.data.byte(kVolumeto) = 7; + context.data.byte(kVolumedirection) = 1; notendtitles: {assert(stack_depth == context.stack.size()); return; } gotmonktext: context.dx = 1; context.ah = 82; + context._cmp(context.data.byte(kCh1playing), 255); + if (context.flags.z()) goto oktalk; + context._dec(context.data.byte(kIntrocount)); + {assert(stack_depth == context.stack.size()); return; } oktalk: setuptimedtemp(context); {assert(stack_depth == context.stack.size()); return; } @@ -2845,7 +2857,7 @@ continuewalk: context.push(context.bx); context.dx = context.data; context.es = context.dx; - context.bx = 8141; + context.bx = 8173; context._add(context.bx, context.ax); context.ax = context.es.word(context.bx); context.bx = context.pop(); @@ -5704,7 +5716,7 @@ void monkspeaking(Context & context) { worktoscreen(context); context.data.byte(kVolume) = 7; context.data.byte(kVolumedirection) = -1; - context.data.byte(kVolumeto) = 0; + context.data.byte(kVolumeto) = 5; context.al = 12; context.ah = 255; playchannel0(context); @@ -5712,37 +5724,22 @@ void monkspeaking(Context & context) { context.cx = 300; hangon(context); context.al = 40; -nextmonkspeak: +loadspeech2: context.push(context.ax); + context.dl = 'T'; + context.dh = 83; + context.cl = 'T'; context.ah = 0; - context.si = context.ax; - context._add(context.si, context.si); - context.es = context.data.word(kTextfile1); - context.ax = context.es.word(context.si); - context._add(context.ax, (66*2)); - context.si = context.ax; -nextbit: - context.di = 36; - context.bx = 140; - context.dl = 239; - printdirect(context); - context.push(context.ax); - context.push(context.si); - context.push(context.es); - worktoscreen(context); - clearwork(context); - showmonk(context); - context.cx = 240; - hangon(context); - context.es = context.pop(); - context.si = context.pop(); - context.ax = context.pop(); - context._cmp(context.al, 0); - if (!context.flags.z()) goto nextbit; + loadspeech(context); + context.al = 50+12; + playchannel1(context); +notloadspeech2: + context._cmp(context.data.byte(kCh1playing), 255); + if (!context.flags.z()) goto notloadspeech2; context.ax = context.pop(); context._inc(context.al); - context._cmp(context.al, 44); - if (!context.flags.z()) goto nextmonkspeak; + context._cmp(context.al, 48); + if (!context.flags.z()) goto loadspeech2; context.data.byte(kVolumedirection) = 1; context.data.byte(kVolumeto) = 7; fadescreendowns(context); @@ -5831,7 +5828,7 @@ void intro(Context & context) { loadintroroom(context); context.data.byte(kVolume) = 7; context.data.byte(kVolumedirection) = -1; - context.data.byte(kVolumeto) = 0; + context.data.byte(kVolumeto) = 4; context.al = 12; context.ah = 255; playchannel0(context); @@ -9569,6 +9566,22 @@ void starttalk(Context & context) { context.al = 0; context.ah = 0; printdirect(context); + context.data.byte(kSpeechloaded) = 0; + context.al = context.data.byte(kCharacter); + context._and(context.al, 127); + context.ah = 0; + context.cx = 64; + context._mul(context.cx); + context.cl = 'C'; + context.dl = 'R'; + context.dh = context.data.byte(kReallocation); + loadspeech(context); + context._cmp(context.data.byte(kSpeechloaded), 1); + if (!context.flags.z()) goto nospeech1; + context.data.byte(kVolumedirection) = 1; + context.data.byte(kVolumeto) = 6; + context.al = 50+12; + playchannel1(context); nospeech1: {assert(stack_depth == context.stack.size()); return; } } @@ -9621,7 +9634,7 @@ notsecondpart: void dosometalk(Context & context) { uint stack_depth = context.stack.size(); -watchtalk: +dospeech: context.al = context.data.byte(kTalkpos); context.al = context.data.byte(kCharacter); context._and(context.al, 127); @@ -9641,7 +9654,7 @@ watchtalk: context._add(context.ax, context.cx); context.si = context.ax; context._cmp(context.es.byte(context.si), 0); - if (context.flags.z()) goto endwatchtalk; + if (context.flags.z()) goto endheartalk; context.push(context.es); context.push(context.si); createpanel(context); @@ -9657,6 +9670,23 @@ watchtalk: context.al = 0; context.ah = 0; printdirect(context); + context.al = context.data.byte(kCharacter); + context._and(context.al, 127); + context.ah = 0; + context.cx = 64; + context._mul(context.cx); + context.cl = context.data.byte(kTalkpos); + context.ch = 0; + context._add(context.ax, context.cx); + context.cl = 'C'; + context.dl = 'R'; + context.dh = context.data.byte(kReallocation); + loadspeech(context); + context._cmp(context.data.byte(kSpeechloaded), 0); + if (context.flags.z()) goto noplay1; + context.al = 62; + playchannel1(context); +noplay1: context.data.byte(kPointermode) = 3; worktoscreenm(context); context.cx = 180; @@ -9681,11 +9711,11 @@ watchtalk: context._add(context.ax, context.cx); context.si = context.ax; context._cmp(context.es.byte(context.si), 0); - if (context.flags.z()) goto endwatchtalk; + if (context.flags.z()) goto endheartalk; context._cmp(context.es.byte(context.si), ':'); - if (context.flags.z()) goto skiptalk; + if (context.flags.z()) goto skiptalk2; context._cmp(context.es.byte(context.si), 32); - if (context.flags.z()) goto skiptalk; + if (context.flags.z()) goto skiptalk2; context.push(context.es); context.push(context.si); createpanel(context); @@ -9701,14 +9731,31 @@ watchtalk: context.al = 0; context.ah = 0; printdirect(context); + context.al = context.data.byte(kCharacter); + context._and(context.al, 127); + context.ah = 0; + context.cx = 64; + context._mul(context.cx); + context.cl = context.data.byte(kTalkpos); + context.ch = 0; + context._add(context.ax, context.cx); + context.cl = 'C'; + context.dl = 'R'; + context.dh = context.data.byte(kReallocation); + loadspeech(context); + context._cmp(context.data.byte(kSpeechloaded), 0); + if (context.flags.z()) goto noplay2; + context.al = 62; + playchannel1(context); +noplay2: context.data.byte(kPointermode) = 3; worktoscreenm(context); context.cx = 180; hangonpq(context); -skiptalk: +skiptalk2: context._inc(context.data.byte(kTalkpos)); - goto watchtalk; -endwatchtalk: + goto dospeech; +endheartalk: context.data.byte(kPointermode) = 0; {assert(stack_depth == context.stack.size()); return; } } @@ -10022,14 +10069,14 @@ void getdestinfo(Context & context) { context.push(context.ax); context.dx = context.data; context.es = context.dx; - context.si = 7979; + context.si = 8011; context._add(context.si, context.ax); context.cl = context.es.byte(context.si); context.ax = context.pop(); context.push(context.cx); context.dx = context.data; context.es = context.dx; - context.si = 7995; + context.si = 8027; context._add(context.si, context.ax); context.ax = context.pop(); {assert(stack_depth == context.stack.size()); return; } @@ -10162,7 +10209,7 @@ void getlocation(Context & context) { context.bx = context.ax; context.dx = context.data; context.es = context.dx; - context._add(context.bx, 7979); + context._add(context.bx, 8011); context.al = context.es.byte(context.bx); {assert(stack_depth == context.stack.size()); return; } } @@ -10173,7 +10220,7 @@ void setlocation(Context & context) { context.bx = context.ax; context.dx = context.data; context.es = context.dx; - context._add(context.bx, 7979); + context._add(context.bx, 8011); context.es.byte(context.bx) = 1; {assert(stack_depth == context.stack.size()); return; } } @@ -10221,7 +10268,7 @@ clearedlocations: context.bx = context.ax; context.dx = context.data; context.es = context.dx; - context._add(context.bx, 7979); + context._add(context.bx, 8011); context.es.byte(context.bx) = 0; {assert(stack_depth == context.stack.size()); return; } } @@ -10623,7 +10670,7 @@ void locklightoff(Context & context) { void input(Context & context) { uint stack_depth = context.stack.size(); context.es = context.cs; - context.di = 8013; + context.di = 8045; context.cx = 64; context.al = 0; while(context.cx--) context._stosb(); @@ -10672,7 +10719,7 @@ notleadingspace: context.es = context.cs; context.si = context.data.word(kCurpos); context._add(context.si, context.si); - context._add(context.si, 8013); + context._add(context.si, 8045); context.es.byte(context.si) = context.al; context._cmp(context.al, 'Z'+1); if (!context.flags.c()) goto waitkey; @@ -10725,7 +10772,7 @@ void delchar(Context & context) { context.si = context.data.word(kCurpos); context._add(context.si, context.si); context.es = context.cs; - context._add(context.si, 8013); + context._add(context.si, 8045); context.es.byte(context.si) = 0; context.al = context.es.byte(context.si+1); context.ah = 0; @@ -10753,7 +10800,7 @@ void execcommand(Context & context) { context.es = context.cs; context.bx = 2776; context.ds = context.cs; - context.si = 8013; + context.si = 8045; context.al = context.ds.byte(context.si); context._cmp(context.al, 0); if (!context.flags.z()) goto notblankinp; @@ -10943,7 +10990,7 @@ notyetassigned: context.push(context.bx); context._add(context.bx, 2); context.ds = context.cs; - context.si = 8013; + context.si = 8045; checkpass: context._lodsw(); context.ah = context.es.byte(context.bx); @@ -11251,7 +11298,7 @@ void parser(Context & context) { context.al = '='; context._stosb(); context.ds = context.cs; - context.si = 8013; + context.si = 8045; notspace1: context._lodsw(); context._cmp(context.al, 32); @@ -12551,7 +12598,7 @@ void isitright(Context & context) { uint stack_depth = context.stack.size(); context.bx = context.data; context.es = context.bx; - context.bx = 8541; + context.bx = 8573; context._cmp(context.es.byte(context.bx+0), context.al); if (!context.flags.z()) goto notright; context._cmp(context.es.byte(context.bx+1), context.ah); @@ -14111,6 +14158,19 @@ cantsetup: void setuptimedtemp(Context & context) { uint stack_depth = context.stack.size(); + context._cmp(context.ah, 0); + if (context.flags.z()) goto notloadspeech3; + context.dl = 'T'; + context.dh = context.ah; + context.cl = 'T'; + context.ah = 0; + loadspeech(context); + context._cmp(context.data.byte(kSpeechloaded), 1); + if (!context.flags.z()) goto notloadspeech3; + context.al = 50+12; + playchannel1(context); + {assert(stack_depth == context.stack.size()); return; } +notloadspeech3: context._cmp(context.data.word(kTimecount), 0); if (!context.flags.z()) goto cantsetup2; context.data.byte(kTimedy) = context.bh; @@ -14673,7 +14733,7 @@ not10: context.bx = context.data.word(kPresspointer); context.dx = context.data; context.es = context.dx; - context._add(context.bx, 8541); + context._add(context.bx, 8573); context.es.byte(context.bx) = context.al; context._inc(context.data.word(kPresspointer)); nomorekeys: @@ -16242,7 +16302,7 @@ loadops: getridoftemp(context); context.dx = context.data; context.es = context.dx; - context.bx = 7947; + context.bx = 7979; startloading(context); loadroomssample(context); context.data.byte(kRoomloaded) = 1; @@ -16375,7 +16435,7 @@ alreadyactsave: if (context.flags.z()) goto noactsave; context.dx = context.data; context.ds = context.dx; - context.si = 8547; + context.si = 8579; context.al = context.data.byte(kCurrentslot); context.ah = 0; context.cx = 17; @@ -16389,9 +16449,9 @@ alreadyactsave: context.cx = 32; context._mul(context.cx); context.ds = context.cs; - context.si = 6155; + context.si = 6187; context._add(context.si, context.ax); - context.di = 7947; + context.di = 7979; context.bx = context.di; context.es = context.cs; context.cx = 16; @@ -16438,7 +16498,7 @@ alreadyactload: if (!context.flags.z()) goto notactload; context.dx = context.data; context.ds = context.dx; - context.si = 8547; + context.si = 8579; context.al = context.data.byte(kCurrentslot); context.ah = 0; context.cx = 17; @@ -16515,7 +16575,7 @@ void getnamepos(Context & context) { context._mul(context.cx); context.dx = context.data; context.es = context.dx; - context.bx = 8547; + context.bx = 8579; context._add(context.bx, context.ax); context.al = context.data.byte(kCursorpos); context.ah = 0; @@ -16669,7 +16729,7 @@ void shownames(Context & context) { uint stack_depth = context.stack.size(); context.dx = context.data; context.es = context.dx; - context.si = 8547+1; + context.si = 8579+1; context.di = (60)+21; context.bx = (52)+10; context.cl = 0; @@ -16735,7 +16795,7 @@ afterprintname: void namestoold(Context & context) { uint stack_depth = context.stack.size(); context.ds = context.cs; - context.si = 8547; + context.si = 8579; context.di = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)); context.es = context.data.word(kBuffers); context.cx = 17*4; @@ -16746,7 +16806,7 @@ void namestoold(Context & context) { void oldtonames(Context & context) { uint stack_depth = context.stack.size(); context.es = context.cs; - context.di = 8547; + context.di = 8579; context.si = (0+(180*10)+32+60+(32*32)+(11*10*3)+768+768+768+(32*32)+(128*5)+(80*5)+(100*5)+(12*5)); context.ds = context.data.word(kBuffers); context.cx = 17*4; @@ -16764,23 +16824,23 @@ void saveposition(Context & context) { context._mul(context.cx); context.dx = context.data; context.ds = context.dx; - context.dx = 8666; + context.dx = 8698; context._add(context.dx, context.ax); openforsave(context); context.dx = context.data; context.ds = context.dx; - context.dx = 6059; - context.cx = (6155-6059); + context.dx = 6091; + context.cx = (6187-6091); savefilewrite(context); context.dx = context.data; context.es = context.dx; - context.di = 6109; + context.di = 6141; context.ax = context.pop(); context.cx = 17; context._mul(context.cx); context.dx = context.data; context.ds = context.dx; - context.dx = 8547; + context.dx = 8579; context._add(context.dx, context.ax); saveseg(context); context.dx = context.data; @@ -16795,7 +16855,7 @@ void saveposition(Context & context) { saveseg(context); context.dx = context.data; context.ds = context.dx; - context.dx = 7947; + context.dx = 7979; saveseg(context); context.dx = context.data; context.ds = context.dx; @@ -16817,21 +16877,21 @@ void loadposition(Context & context) { context._mul(context.cx); context.dx = context.data; context.ds = context.dx; - context.dx = 8666; + context.dx = 8698; context._add(context.dx, context.ax); - openfile(context); + openfilefromc(context); context.ds = context.cs; - context.dx = 6059; - context.cx = (6155-6059); + context.dx = 6091; + context.cx = (6187-6091); savefileread(context); context.es = context.cs; - context.di = 6109; + context.di = 6141; context.ax = context.pop(); context.cx = 17; context._mul(context.cx); context.dx = context.data; context.ds = context.dx; - context.dx = 8547; + context.dx = 8579; context._add(context.dx, context.ax); loadseg(context); context.dx = context.data; @@ -16846,7 +16906,7 @@ void loadposition(Context & context) { loadseg(context); context.dx = context.data; context.ds = context.dx; - context.dx = 7947; + context.dx = 7979; loadseg(context); context.ds = context.cs; context.dx = 534; @@ -16859,7 +16919,7 @@ void makeheader(Context & context) { uint stack_depth = context.stack.size(); context.dx = context.data; context.es = context.dx; - context.di = 6109; + context.di = 6141; context.ax = 17; storeit(context); context.ax = (68-0); @@ -16904,10 +16964,10 @@ void scanfornames(Context & context) { uint stack_depth = context.stack.size(); context.dx = context.data; context.es = context.dx; - context.di = 8547; + context.di = 8579; context.dx = context.data; context.ds = context.dx; - context.dx = 8666; + context.dx = 8698; context.cx = 7; scanloop: context.push(context.es); @@ -16915,7 +16975,7 @@ scanloop: context.push(context.di); context.push(context.dx); context.push(context.cx); - openfilenocheck(context); + openfilefromc(context); if (context.flags.c()) goto notexist; context.cx = context.pop(); context._inc(context.ch); @@ -16924,12 +16984,12 @@ scanloop: context.push(context.es); context.dx = context.data; context.ds = context.dx; - context.dx = 6059; - context.cx = (6155-6059); + context.dx = 6091; + context.cx = (6187-6091); savefileread(context); context.dx = context.data; context.es = context.dx; - context.di = 6109; + context.di = 6141; context.ds = context.pop(); context.dx = context.pop(); loadseg(context); @@ -17045,7 +17105,7 @@ loadops: getridoftemp(context); context.dx = context.data; context.es = context.dx; - context.bx = 7947; + context.bx = 7979; startloading(context); loadroomssample(context); context.data.byte(kRoomloaded) = 1; @@ -17811,7 +17871,7 @@ void clearchanges(Context & context) { context.di = 0; while(context.cx--) context._stosw(); context.es = context.cs; - context.di = 7979; + context.di = 8011; context.al = 1; context._stosb(); context._stosb(); @@ -18983,6 +19043,18 @@ notweb: if (!context.flags.z()) goto notlouisvol; context.data.byte(kVolume) = 5; notlouisvol: + context._cmp(context.data.byte(kReallocation), 14); + if (!context.flags.z()) goto notmad1; + context._cmp(context.data.byte(kMapx), 33); + if (context.flags.z()) goto ismad2; + context._cmp(context.data.byte(kMapx), 22); + if (!context.flags.z()) goto notmad1; + context.data.byte(kVolume) = 5; + {assert(stack_depth == context.stack.size()); return; } +ismad2: + context.data.byte(kVolume) = 0; + {assert(stack_depth == context.stack.size()); return; } +notmad1: playingalready: context._cmp(context.data.byte(kReallocation), 2); if (!context.flags.z()) goto notlouisvol2; @@ -19490,7 +19562,7 @@ void bresenhams(Context & context) { workoutframes(context); context.dx = context.data; context.es = context.dx; - context.di = 8141; + context.di = 8173; context.si = 1; context.data.byte(kLinedirection) = 0; context.cx = context.data.word(kLineendx); @@ -19592,7 +19664,7 @@ line23: context._inc(context.al); if (--context.cx) goto hiloop; lineexit: - context._sub(context.di, 8141); + context._sub(context.di, 8173); context.ax = context.di; context._shr(context.ax, 1); context.data.byte(kLinelength) = context.al; @@ -21132,7 +21204,7 @@ void getroomdata(Context & context) { context.ah = 0; context.cx = 32; context._mul(context.cx); - context.bx = 6155; + context.bx = 6187; context._add(context.bx, context.ax); {assert(stack_depth == context.stack.size()); return; } } @@ -21140,11 +21212,11 @@ void getroomdata(Context & context) { void readheader(Context & context) { uint stack_depth = context.stack.size(); context.ds = context.cs; - context.dx = 6059; - context.cx = (6155-6059); + context.dx = 6091; + context.cx = (6187-6091); readfromfile(context); context.es = context.cs; - context.di = 6109; + context.di = 6141; {assert(stack_depth == context.stack.size()); return; } } @@ -21256,6 +21328,21 @@ novolumeload: {assert(stack_depth == context.stack.size()); return; } } +void makename(Context & context) { + uint stack_depth = context.stack.size(); + context.si = context.dx; + context.di = 6061; +transfer: + context.al = context.cs.byte(context.si); + context.cs.byte(context.di) = context.al; + context._inc(context.si); + context._inc(context.di); + context._cmp(context.al, 0); + if (!context.flags.z()) goto transfer; + context.dx = 6059; + {assert(stack_depth == context.stack.size()); return; } +} + void dreamweb(Context & context) { uint stack_depth = context.stack.size(); seecommandtail(context); @@ -21749,6 +21836,8 @@ void __start(Context &context) { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x3a, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x52, 0x45, 0x41, 0x4d, 0x57, 0x45, 0x42, 0x20, 0x44, 0x41, 0x54, 0x41, 0x20, 0x46, 0x49, 0x4c, 0x45, 0x20, 0x43, 0x4f, 0x50, 0x59, 0x52, 0x49, 0x47, 0x48, 0x54, 0x20, 0x31, 0x39, 0x39, 0x32, 0x20, 0x43, 0x52, 0x45, @@ -22674,16 +22763,18 @@ void __dispatch_call(Context &context, unsigned addr) { case 0xcb88: readsetdata(context); break; case 0xcb8c: createfile(context); break; case 0xcb90: openfile(context); break; - case 0xcb94: openfilenocheck(context); break; - case 0xcb98: openforsave(context); break; - case 0xcb9c: closefile(context); break; - case 0xcba0: readfromfile(context); break; - case 0xcba4: setkeyboardint(context); break; - case 0xcba8: resetkeyboard(context); break; - case 0xcbac: keyboardread(context); break; - case 0xcbb0: walkandexamine(context); break; - case 0xcbb4: doload(context); break; - case 0xcbb8: generalerror(context); break; + case 0xcb94: openfilefromc(context); break; + case 0xcb98: makename(context); break; + case 0xcb9c: openfilenocheck(context); break; + case 0xcba0: openforsave(context); break; + case 0xcba4: closefile(context); break; + case 0xcba8: readfromfile(context); break; + case 0xcbac: setkeyboardint(context); break; + case 0xcbb0: resetkeyboard(context); break; + case 0xcbb4: keyboardread(context); break; + case 0xcbb8: walkandexamine(context); break; + case 0xcbbc: doload(context); break; + case 0xcbc0: generalerror(context); break; default: ::error("invalid call to %04x dispatched", (uint16)context.ax); } } diff --git a/engines/dreamweb/dreamgen.h b/engines/dreamweb/dreamgen.h index f97099d697..a09fb7b08c 100644 --- a/engines/dreamweb/dreamgen.h +++ b/engines/dreamweb/dreamgen.h @@ -26,6 +26,7 @@ namespace dreamgen { void closefile(Context &context); void openforsave(Context &context); void openfilenocheck(Context &context); + void openfilefromc(Context &context); void openfile(Context &context); void createfile(Context &context); void dontloadseg(Context &context); @@ -533,21 +534,21 @@ namespace dreamgen { const static uint16 kPalettescreen = 2481; const static uint16 kCurrentfile = 2970; const static uint16 kDmaaddresses = 5118; - const static uint16 kFileheader = 6059; - const static uint16 kFiledata = 6109; - const static uint16 kExtradata = 6149; - const static uint16 kRoomdata = 6155; - const static uint16 kMadeuproomdat = 7947; - const static uint16 kRoomscango = 7979; - const static uint16 kRoompics = 7995; - const static uint16 kOplist = 8010; - const static uint16 kInputline = 8013; - const static uint16 kLinedata = 8141; - const static uint16 kPresslist = 8541; - const static uint16 kSavenames = 8547; - const static uint16 kSavefiles = 8666; - const static uint16 kRecname = 8757; - const static uint16 kStak = 8770; + const static uint16 kFileheader = 6091; + const static uint16 kFiledata = 6141; + const static uint16 kExtradata = 6181; + const static uint16 kRoomdata = 6187; + const static uint16 kMadeuproomdat = 7979; + const static uint16 kRoomscango = 8011; + const static uint16 kRoompics = 8027; + const static uint16 kOplist = 8042; + const static uint16 kInputline = 8045; + const static uint16 kLinedata = 8173; + const static uint16 kPresslist = 8573; + const static uint16 kSavenames = 8579; + const static uint16 kSavefiles = 8698; + const static uint16 kRecname = 8789; + const static uint16 kStak = 8802; const static uint16 kBlocktextdat = (0); const static uint16 kPersonframes = (0); const static uint16 kDebuglevel1 = (0); @@ -565,7 +566,6 @@ namespace dreamgen { const static uint16 kPathdata = (0); const static uint16 kDemo = (0); const static uint16 kExframedata = (0); - const static uint16 kCd = (0); const static uint16 kIntextdat = (0); const static uint16 kFreetextdat = (0); const static uint16 kFrframedata = (0); @@ -606,6 +606,7 @@ namespace dreamgen { const static uint16 kPersontxtdat = (0+24); const static uint16 kPersontext = (0+24+(1026*2)); const static uint16 kInputport = (0x63); + const static uint16 kCd = (1); const static uint16 kUndertextsizey = (10); const static uint16 kNumexobjects = (114); const static uint16 kZoomy = (132); @@ -627,7 +628,7 @@ namespace dreamgen { const static uint16 kMenuy = (60); const static uint16 kOpsx = (60); const static uint16 kMaplength = (60); - const static uint16 kHeaderlen = (6155-6059); + const static uint16 kHeaderlen = (6187-6091); const static uint16 kSymbolx = (64); const static uint16 kSetdatlen = (64*128); const static uint16 kMapwidth = (66); diff --git a/engines/dreamweb/dreamweb.cpp b/engines/dreamweb/dreamweb.cpp index 2daf905b3e..fc8753f77c 100644 --- a/engines/dreamweb/dreamweb.cpp +++ b/engines/dreamweb/dreamweb.cpp @@ -380,30 +380,45 @@ void DreamWebEngine::cls() { } void DreamWebEngine::playSound(uint8 channel, uint8 id, uint8 loops) { + debug(1, "playSound(%u, %u, %u)", channel, id, loops); const SoundData &data = _soundData[id >= 12? 1: 0]; Audio::Mixer::SoundType type; + bool speech = id == 62; //actually 50 if (id >= 12) { id -= 12; type = Audio::Mixer::kSFXSoundType; - } else + } else if (speech) + type = Audio::Mixer::kSpeechSoundType; + else type = Audio::Mixer::kMusicSoundType; - if (id >= data.samples.size()) { - warning("invalid sample #%u played", id); - return; - } - - const Sample &sample = data.samples[id]; - - uint8 *buffer = (uint8 *)malloc(sample.size); - if (!buffer) - error("out of memory: cannot allocate memory for sound(%u bytes)", sample.size); - memcpy(buffer, data.data.begin() + sample.offset, sample.size); + Audio::SeekableAudioStream *raw; + if (!speech) { + if (id >= data.samples.size() || data.samples[id].size == 0) { + warning("invalid sample #%u played", id); + return; + } - Audio::SeekableAudioStream *raw = Audio::makeRawStream( - buffer, - sample.size, 22050, Audio::FLAG_UNSIGNED); + const Sample &sample = data.samples[id]; + uint8 *buffer = (uint8 *)malloc(sample.size); + if (!buffer) + error("out of memory: cannot allocate memory for sound(%u bytes)", sample.size); + memcpy(buffer, data.data.begin() + sample.offset, sample.size); + + raw = Audio::makeRawStream( + buffer, + sample.size, 22050, Audio::FLAG_UNSIGNED); + } else { + uint8 *buffer = (uint8 *)malloc(_speechData.size()); + memcpy(buffer, _speechData.begin(), _speechData.size()); + if (!buffer) + error("out of memory: cannot allocate memory for sound(%u bytes)", _speechData.size()); + raw = Audio::makeRawStream( + buffer, + _speechData.size(), 22050, Audio::FLAG_UNSIGNED); + + } Audio::AudioStream *stream; if (loops > 1) { @@ -416,6 +431,21 @@ void DreamWebEngine::playSound(uint8 channel, uint8 id, uint8 loops) { _mixer->playStream(type, &_channelHandle[channel], stream); } +bool DreamWebEngine::playSpeech(const Common::String &filename) { + debug(1, "playSpeech(%s)", filename.c_str()); + Common::File file; + if (!file.open("speech/" + filename)) + return false; + + debug(1, "\tfound speech file"); + uint size = file.size(); + _speechData.resize(size); + file.read(_speechData.begin(), size); + file.close(); + return true; +} + + void DreamWebEngine::soundHandler() { //uint8 volume = _context.data.byte(dreamgen::kVolume); uint8 ch0 = _context.data.byte(dreamgen::kCh0playing); @@ -429,16 +459,12 @@ void DreamWebEngine::soundHandler() { if (_channel0 != ch0) { _channel0 = ch0; if (ch0) { - //Audio::AudioStream *stream = LoopingAudioStream(Audio::makeRawStream(data, size, 22050, 0), ch0loops); - //_mixer->playStream(Audio::Mixer::kMusicType, &_musicHandle, stream); //dispose is YES by default - debug(1, "playing sound %u at channel 0, loop: %u", ch0, ch0loop); playSound(0, ch0, ch0loop); } } if (_channel1 != ch1) { _channel1 = ch1; if (ch1) { - debug(1, "playing sound %u at channel 1", ch1); playSound(1, ch1, 1); } } @@ -632,6 +658,10 @@ void openfilenocheck(Context &context) { context.flags._c = !ok; } +void openfilefromc(Context &context) { + openfile(context); +} + void openfile(Context &context) { Common::String name = getFilename(context); debug(1, "opening file: %s", name.c_str()); @@ -797,7 +827,6 @@ void loadsample(Context &context) { void cancelch0(Context &context); void cancelch1(Context &context); - void loadsecondsample(Context &context) { uint8 ch0 = context.data.byte(kCh0playing); if (ch0 >= 12 && ch0 != 255) @@ -808,8 +837,16 @@ void loadsecondsample(Context &context) { context.engine->loadSounds(1, (const char *)context.data.ptr(context.dx, 13)); } +void createname(Context &context); + void loadspeech(Context &context) { - ::error("loadspeech"); + cancelch1(context); + context.data.byte(kSpeechloaded) = 0; + createname(context); + const char *name = (const char *)context.data.ptr(context.di, 13); + //warning("name = %s", name); + if (context.engine->playSpeech(name)) + context.data.byte(kSpeechloaded) = 1; } void saveseg(Context &context) { diff --git a/engines/dreamweb/dreamweb.h b/engines/dreamweb/dreamweb.h index 447aff931f..0645fbaa9f 100644 --- a/engines/dreamweb/dreamweb.h +++ b/engines/dreamweb/dreamweb.h @@ -104,6 +104,7 @@ public: void quit(); void loadSounds(uint bank, const Common::String &file); + bool playSpeech(const Common::String &filename); private: void keyPressed(uint16 ascii); @@ -124,6 +125,7 @@ private: struct Sample { uint offset; uint size; + Sample(): offset(), size() {} }; struct SoundData { @@ -131,6 +133,7 @@ private: Common::Array<uint8> data; }; SoundData _soundData[2]; + Common::Array<uint8> _speechData; Audio::SoundHandle _channelHandle[2]; uint8 _channel0, _channel1; |