diff options
author | Willem Jan Palenstijn | 2011-06-25 16:40:41 +0200 |
---|---|---|
committer | Willem Jan Palenstijn | 2011-07-28 21:25:10 +0200 |
commit | ea05f6804608b48798c0f5b40cec7324d1d490bd (patch) | |
tree | d74e80cc8362085c2722fccd2d8365b2e690bd4b | |
parent | c54cae6aea614c6303424d64b81a7327c069070a (diff) | |
download | scummvm-rg350-ea05f6804608b48798c0f5b40cec7324d1d490bd.tar.gz scummvm-rg350-ea05f6804608b48798c0f5b40cec7324d1d490bd.tar.bz2 scummvm-rg350-ea05f6804608b48798c0f5b40cec7324d1d490bd.zip |
DREAMWEB: Rewrite main loop
-rw-r--r-- | engines/dreamweb/stubs.cpp | 239 |
1 files changed, 127 insertions, 112 deletions
diff --git a/engines/dreamweb/stubs.cpp b/engines/dreamweb/stubs.cpp index 65ed5bd9cd..00d082b4d3 100644 --- a/engines/dreamweb/stubs.cpp +++ b/engines/dreamweb/stubs.cpp @@ -42,122 +42,137 @@ void DreamGenContext::dreamweb() { set16colpalette(); readsetdata(); data.byte(kWongame) = 0; + dx = 1909; loadsample(); setsoundoff(); - scanfornames(); - _cmp(al, 0); - if (!flags.z()) - goto dodecisions; - setmode(); - loadpalfromiff(); - titles(); - credits(); - goto playgame; -dodecisions: - cls(); - setmode(); - decide(); - _cmp(data.byte(kQuitrequested), 0); - if (!flags.z()) - return /* (exitgame) */; - _cmp(data.byte(kGetback), 4); - if (flags.z()) - goto mainloop; - titles(); - _cmp(data.byte(kQuitrequested), 0); - if (!flags.z()) - return /* (exitgame) */; - credits(); -playgame: - _cmp(data.byte(kQuitrequested), 0); - if (!flags.z()) - return /* (exitgame) */; - clearchanges(); - setmode(); - loadpalfromiff(); - data.byte(kLocation) = 255; - data.byte(kRoomafterdream) = 1; - data.byte(kNewlocation) = 35; - data.byte(kVolume) = 7; - loadroom(); - clearsprites(); - initman(); - entrytexts(); - entryanims(); - data.byte(kDestpos) = 3; - initialinv(); - data.byte(kLastflag) = 32; - startup1(); - data.byte(kVolumeto) = 0; - data.byte(kVolumedirection) = -1; - data.byte(kCommandtype) = 255; - goto mainloop; -loadnew: - clearbeforeload(); - loadroom(); - clearsprites(); - initman(); - entrytexts(); - entryanims(); - data.byte(kNewlocation) = 255; - startup(); - data.byte(kCommandtype) = 255; - worktoscreenm(); - goto mainloop; - data.byte(kNewlocation) = 255; - clearsprites(); - initman(); - startup(); - data.byte(kCommandtype) = 255; -mainloop: - _cmp(data.byte(kQuitrequested), 0); - if (!flags.z()) - return /* (exitgame) */; - screenupdate(); - _cmp(data.byte(kWongame), 0); - if (!flags.z()) - goto endofgame; - _cmp(data.byte(kMandead), 1); - if (flags.z()) - goto gameover; - _cmp(data.byte(kMandead), 2); - if (flags.z()) - goto gameover; - _cmp(data.word(kWatchingtime), 0); - if (flags.z()) - goto notwatching; - al = data.byte(kFinaldest); - _cmp(al, data.byte(kManspath)); - if (!flags.z()) - goto mainloop; - _dec(data.word(kWatchingtime)); - if (!flags.z()) - goto mainloop; -notwatching: - _cmp(data.byte(kMandead), 4); - if (flags.z()) - goto gameover; - _cmp(data.byte(kNewlocation), 255); - if (!flags.z()) - goto loadnew; - goto mainloop; -gameover: - clearbeforeload(); - showgun(); - fadescreendown(); - cx = 100; - hangon(); - goto dodecisions; -endofgame: - clearbeforeload(); - fadescreendowns(); - cx = 200; - hangon(); - endgame(); - { quickquit2(); return; }; -} + bool firstLoop = true; + + while (true) { + + scanfornames(); + + bool startNewGame = true; + + if (al == 0 && firstLoop) { + + // no savegames found, and we're not restarting. + + setmode(); + loadpalfromiff(); + + } else { + // "dodecisions" + + // Savegames found, so ask if we should load one. + // (If we're restarting after game over, we also always show these + // options.) + + cls(); + setmode(); + decide(); + if (data.byte(kQuitrequested)) + return; // exit game + + if (data.byte(kGetback) == 4) + startNewGame = false; // savegame has been loaded + + } + + firstLoop = false; + + if (startNewGame) { + // "playgame" + + titles(); + if (data.byte(kQuitrequested)) + return; // exit game + credits(); + + if (data.byte(kQuitrequested)) + return; // exit game + + clearchanges(); + setmode(); + loadpalfromiff(); + data.byte(kLocation) = 255; + data.byte(kRoomafterdream) = 1; + data.byte(kNewlocation) = 35; + data.byte(kVolume) = 7; + loadroom(); + clearsprites(); + initman(); + entrytexts(); + entryanims(); + data.byte(kDestpos) = 3; + initialinv(); + data.byte(kLastflag) = 32; + startup1(); + data.byte(kVolumeto) = 0; + data.byte(kVolumedirection) = -1; + data.byte(kCommandtype) = 255; + + } + + // main loop + while (true) { + + if (data.byte(kQuitrequested)) + return; // exit game + + screenupdate(); + + if (data.byte(kWongame) != 0) { + // "endofgame" + clearbeforeload(); + fadescreendowns(); + cx = 200; + hangon(); + endgame(); + quickquit2(); + return; + } + + if (data.byte(kMandead) == 1 || data.byte(kMandead) == 2) + break; + + if (data.word(kWatchingtime) > 0) { + if (data.byte(kFinaldest) == data.byte(kManspath)) + data.word(kWatchingtime)--; + } + + if (data.word(kWatchingtime) == 0) { + // "notwatching" + + if (data.byte(kMandead) == 4) + break; + + if (data.byte(kNewlocation) != 255) { + // "loadnew" + clearbeforeload(); + loadroom(); + clearsprites(); + initman(); + entrytexts(); + entryanims(); + data.byte(kNewlocation) = 255; + startup(); + data.byte(kCommandtype) = 255; + worktoscreenm(); + } + } + } + + // "gameover" + clearbeforeload(); + showgun(); + fadescreendown(); + cx = 100; + hangon(); + + } +} Common::String getFilename(Context &context) { uint16 name_ptr = context.dx; |