aboutsummaryrefslogtreecommitdiff
path: root/engines/access/martian/martian_scripts.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'engines/access/martian/martian_scripts.cpp')
-rw-r--r--engines/access/martian/martian_scripts.cpp293
1 files changed, 293 insertions, 0 deletions
diff --git a/engines/access/martian/martian_scripts.cpp b/engines/access/martian/martian_scripts.cpp
index 0578872092..a9b5de5597 100644
--- a/engines/access/martian/martian_scripts.cpp
+++ b/engines/access/martian/martian_scripts.cpp
@@ -34,7 +34,300 @@ MartianScripts::MartianScripts(AccessEngine *vm) : Scripts(vm) {
_game = (MartianEngine *)_vm;
}
+void MartianScripts::cmdSpecial0() {
+ _vm->_sound->stopSound();
+ _vm->_midi->stopSong();
+
+ _vm->_midi->loadMusic(47, 1);
+ _vm->_midi->midiPlay();
+ _vm->_midi->setLoop(true);
+
+ _vm->_events->_vbCount = 300;
+ while (!_vm->shouldQuit() && _vm->_events->_vbCount > 0)
+ _vm->_events->pollEventsAndWait();
+
+ _vm->_screen->forceFadeOut();
+ _vm->_files->loadScreen("HOUSE.SC");
+
+ _vm->_video->setVideo(_vm->_screen, Common::Point(46, 30), "HVID.VID", 20);
+
+ do {
+ _vm->_video->playVideo();
+ if (_vm->_video->_videoFrame == 4) {
+ _vm->_screen->flashPalette(16);
+ _vm->_sound->playSound(4);
+ do {
+ _vm->_events->pollEvents();
+ } while (!_vm->shouldQuit() && _vm->_sound->_playingSound);
+ _vm->_timers[31]._timer = _vm->_timers[31]._initTm = 40;
+ }
+ } while (!_vm->_video->_videoEnd && !_vm->shouldQuit());
+
+ if (_vm->_video->_videoEnd) {
+ _vm->_screen->flashPalette(12);
+ _vm->_sound->playSound(4);
+ do {
+ _vm->_events->pollEvents();
+ } while (!_vm->shouldQuit() && _vm->_sound->_playingSound);
+ _vm->_midi->stopSong();
+ _vm->_midi->freeMusic();
+ warning("TODO: Pop Midi");
+ }
+}
+
+void MartianScripts::cmdSpecial1(int param1) {
+ _vm->_events->hideCursor();
+
+ if (param1 != -1) {
+ _vm->_files->loadScreen(49, param1);
+ _vm->_buffer2.copyBuffer(_vm->_screen);
+ }
+
+ _vm->_screen->setIconPalette();
+ _vm->_screen->forceFadeIn();
+ _vm->_events->showCursor();
+}
+
+void MartianScripts::cmdSpecial3() {
+ _vm->_screen->forceFadeOut();
+ _vm->_events->hideCursor();
+ _vm->_files->loadScreen(57, 3);
+ _vm->_buffer2.copyFrom(*_vm->_screen);
+
+ _vm->_screen->setIconPalette();
+ _vm->_events->showCursor();
+ _vm->_screen->forceFadeIn();
+}
+
+void MartianScripts::doIntro(int param1) {
+ _game->doSpecial5(param1);
+}
+
+void MartianScripts::cmdSpecial6() {
+ _vm->_midi->stopSong();
+ _vm->_screen->setDisplayScan();
+ _vm->_events->clearEvents();
+ _vm->_screen->forceFadeOut();
+ _vm->_events->hideCursor();
+ _vm->_files->loadScreen(49, 9);
+ _vm->_events->showCursor();
+ _vm->_screen->setIconPalette();
+ _vm->_screen->forceFadeIn();
+
+ Resource *cellsRes = _vm->_files->loadFile("CELLS00.LZ");
+ _vm->_objectsTable[0] = new SpriteResource(_vm, cellsRes);
+ delete cellsRes;
+
+ _vm->_timers[20]._timer = _vm->_timers[20]._initTm = 30;
+ _vm->_fonts._charSet._lo = 1;
+ _vm->_fonts._charSet._hi = 10;
+ _vm->_fonts._charFor._lo = 1;
+ _vm->_fonts._charFor._hi = 255;
+
+ _vm->_screen->_maxChars = 50;
+ _vm->_screen->_printOrg = _vm->_screen->_printStart = Common::Point(24, 18);
+
+ Resource *notesRes = _vm->_files->loadFile("ETEXT.DAT");
+ notesRes->_stream->seek(72);
+
+ // Read the message
+ Common::String msg = "";
+ byte c;
+ while ((c = (char)notesRes->_stream->readByte()) != '\0')
+ msg += c;
+
+ //display the message
+ _game->showDeathText(msg);
+
+ delete notesRes;
+ delete _vm->_objectsTable[0];
+ _vm->_objectsTable[0] = nullptr;
+ _vm->_midi->stopSong();
+}
+
+void MartianScripts::cmdSpecial7() {
+ _vm->_room->clearRoom();
+ _vm->_midi->loadMusic(47, 8);
+
+ _vm->_sound->freeSounds();
+ Resource *sound = _vm->_sound->loadSound(46, 14);
+ _vm->_sound->_soundTable.push_back(SoundEntry(sound, 1));
+
+ _vm->_screen->setDisplayScan();
+ _vm->_screen->forceFadeOut();
+ _vm->_events->hideCursor();
+
+ _vm->_files->loadScreen(40, 3);
+ _vm->_buffer1.copyBuffer(_vm->_screen);
+ _vm->_buffer2.copyBuffer(_vm->_screen);
+
+ _vm->_events->showCursor();
+ _vm->_screen->setIconPalette();
+ _vm->_screen->forceFadeIn();
+
+ // Load objects specific to this special scene
+ Resource *data = _vm->_files->loadFile(40, 2);
+ _game->_spec7Objects = new SpriteResource(_vm, data);
+ delete data;
+
+ // Load animation data
+ _vm->_animation->freeAnimationData();
+ Resource *animResource = _vm->_files->loadFile(40, 1);
+ _vm->_animation->loadAnimations(animResource);
+ delete animResource;
+
+ // Load script
+ Resource *newScript = _vm->_files->loadFile(40, 0);
+ _vm->_scripts->setScript(newScript);
+
+ _vm->_images.clear();
+ _vm->_oldRects.clear();
+ _vm->_scripts->_sequence = 0;
+
+ _vm->_sound->playSound(0);
+
+ do {
+ charLoop();
+ } while (_vm->_flags[134] != 1);
+
+ do {
+ _vm->_events->pollEvents();
+ } while (!_vm->shouldQuit() && _vm->_sound->_playingSound);
+
+ _game->_numAnimTimers = 0;
+ _vm->_animation->freeAnimationData();
+ _vm->_scripts->freeScriptData();
+ _vm->_sound->freeSounds();
+
+ _vm->_screen->forceFadeOut();
+ _vm->_midi->midiPlay();
+ _vm->_midi->setLoop(true);
+ _vm->_events->hideCursor();
+
+ _vm->_files->loadScreen(40, 4);
+ _vm->_buffer1.copyBuffer(_vm->_screen);
+ _vm->_buffer2.copyBuffer(_vm->_screen);
+
+ _vm->_events->showCursor();
+ _vm->_screen->setIconPalette();
+ _vm->_screen->forceFadeIn();
+
+ // Setup fonts
+ _vm->_fonts._charSet._hi = 10;
+ _vm->_fonts._charSet._lo = 1;
+ _vm->_fonts._charFor._lo = 247;
+ _vm->_fonts._charFor._hi = 255;
+ _vm->_screen->_maxChars = 50;
+ _vm->_screen->_printOrg = Common::Point(24, 18);
+ _vm->_screen->_printStart = Common::Point(24, 18);
+
+ // Display death message
+ _game->showDeathText(Common::String(SPEC7MESSAGE));
+
+ _vm->_events->showCursor();
+ _vm->_screen->copyBuffer(&_vm->_buffer1);
+ _vm->_events->hideCursor();
+
+ _vm->_video->setVideo(_vm->_screen, Common::Point(120, 16), FileIdent(40, 5), 10);
+
+ while (!_vm->shouldQuit() && !_vm->_video->_videoEnd) {
+ _vm->_video->playVideo();
+ _vm->_events->pollEventsAndWait();
+ }
+
+ _vm->_sound->freeSounds();
+ sound = _vm->_sound->loadSound(40, 8);
+ _vm->_sound->_soundTable.push_back(SoundEntry(sound, 1));
+ sound = _vm->_sound->loadSound(40, 9);
+ _vm->_sound->_soundTable.push_back(SoundEntry(sound, 1));
+ sound = _vm->_sound->loadSound(40, 10);
+ _vm->_sound->_soundTable.push_back(SoundEntry(sound, 1));
+
+ _vm->_screen->forceFadeOut();
+ _vm->_files->loadScreen(40, 7);
+ _vm->_destIn = _vm->_screen;
+
+ _vm->_screen->plotImage(_game->_spec7Objects, 8, Common::Point(104, 176));
+ _vm->_screen->plotImage(_game->_spec7Objects, 7, Common::Point(102, 160));
+ _vm->_events->showCursor();
+ _vm->_screen->forceFadeIn();
+
+ _vm->_events->_vbCount = 100;
+ while (!_vm->shouldQuit() && _vm->_events->_vbCount > 0)
+ _vm->_events->pollEventsAndWait();
+
+ _vm->_sound->playSound(0);
+ do {
+ _vm->_events->pollEvents();
+ } while (!_vm->shouldQuit() && _vm->_sound->_playingSound);
+
+ _vm->_events->_vbCount = 80;
+ while (!_vm->shouldQuit() && _vm->_events->_vbCount > 0)
+ _vm->_events->pollEventsAndWait();
+
+ _vm->_sound->playSound(1);
+ do {
+ _vm->_events->pollEvents();
+ } while (!_vm->shouldQuit() && _vm->_sound->_playingSound);
+
+ _vm->_events->_vbCount = 80;
+ while (!_vm->shouldQuit() && _vm->_events->_vbCount > 0)
+ _vm->_events->pollEventsAndWait();
+
+ _vm->_sound->playSound(2);
+ do {
+ _vm->_events->pollEvents();
+ } while (!_vm->shouldQuit() && _vm->_sound->_playingSound);
+
+ _vm->_sound->freeSounds();
+
+ delete _game->_spec7Objects;
+ _game->_spec7Objects = nullptr;
+
+ _vm->_events->hideCursor();
+ _vm->_screen->forceFadeOut();
+ _vm->_files->loadScreen(40, 6);
+ _vm->_events->showCursor();
+ _vm->_screen->forceFadeIn();
+
+ _vm->_events->waitKeyMouse();
+ _vm->_midi->stopSong();
+ _vm->_midi->freeMusic();
+
+ // The original was jumping to the restart label in main
+ _vm->_restartFl = true;
+ _vm->_events->pollEvents();
+}
+
void MartianScripts::executeSpecial(int commandIndex, int param1, int param2) {
+ switch (commandIndex) {
+ case 0:
+ cmdSpecial0();
+ break;
+ case 1:
+ cmdSpecial1(param1);
+ break;
+ case 2:
+ warning("TODO: cmdSpecial2");
+ break;
+ case 3:
+ cmdSpecial3();
+ break;
+ case 4:
+ warning("TODO: cmdSpecial4");
+ break;
+ case 5:
+ doIntro(param1);
+ break;
+ case 6:
+ cmdSpecial6();
+ break;
+ case 7:
+ cmdSpecial7();
+ break;
+ default:
+ warning("Unexpected Special code %d - Skipped", commandIndex);
+ }
}
typedef void(MartianScripts::*MartianScriptMethodPtr)();