aboutsummaryrefslogtreecommitdiff
path: root/engines/sky/intro.cpp
diff options
context:
space:
mode:
authorMax Horn2006-02-11 22:45:04 +0000
committerMax Horn2006-02-11 22:45:04 +0000
commit26ee630756ebdd7c96bccede0881a8c8b98e8f2b (patch)
tree26e378d5cf990a2b81c2c96e9e683a7f333b62e8 /engines/sky/intro.cpp
parent2a9a0d4211b1ea5723f1409d91cb95de8984429e (diff)
downloadscummvm-rg350-26ee630756ebdd7c96bccede0881a8c8b98e8f2b.tar.gz
scummvm-rg350-26ee630756ebdd7c96bccede0881a8c8b98e8f2b.tar.bz2
scummvm-rg350-26ee630756ebdd7c96bccede0881a8c8b98e8f2b.zip
Moved engines to the new engines/ directory
svn-id: r20582
Diffstat (limited to 'engines/sky/intro.cpp')
-rw-r--r--engines/sky/intro.cpp926
1 files changed, 926 insertions, 0 deletions
diff --git a/engines/sky/intro.cpp b/engines/sky/intro.cpp
new file mode 100644
index 0000000000..ce6849fbd0
--- /dev/null
+++ b/engines/sky/intro.cpp
@@ -0,0 +1,926 @@
+/* ScummVM - Scumm Interpreter
+ * Copyright (C) 2003-2006 The ScummVM project
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * $URL$
+ * $Id$
+ *
+ */
+
+#include "common/stdafx.h"
+#include "common/util.h"
+#include "common/system.h"
+#include "sky/disk.h"
+#include "sky/intro.h"
+#include "sky/music/musicbase.h"
+#include "sky/screen.h"
+#include "sky/sky.h"
+#include "sky/sound.h"
+#include "sky/struc.h"
+#include "sky/text.h"
+
+namespace Sky {
+
+#ifdef MACOSX
+// FIXME: DELAY is already defined in sys/param.h !
+// Better fix would be to remove sys/param.h froms stdafx.h, or
+// to change the name DELAY here to something else.
+#undef DELAY
+#endif
+
+#define SHOWSCREEN 0
+#define COMMANDEND 0 // end of COMMANDFLIRT block
+#define FADEUP 1 // fade up palette
+#define FADEDOWN 2
+#define DELAY 3
+#define DOFLIRT 4 // start flirt sequence (and wait for it to finish)
+#define SCROLLFLIRT 5 // start special floppy intro flirt sequence (and wait for it)
+#define COMMANDFLIRT 6 // start flirt sequence and wait for it, while processing command block
+#define BGFLIRT 7 // start flirt sequence without waiting for it
+#define WAITFLIRT 8 // wait for sequence started by BGFLIRT
+#define STOPFLIRT 9
+#define STARTMUSIC 10
+#define WAITMUSIC 11
+#define PLAYVOICE 12
+#define WAITVOICE 13
+#define LOADBG 14 // load new background sound
+#define PLAYBG 15 // play background sound
+#define LOOPBG 16 // loop background sound
+#define STOPBG 17 // stop background sound
+#define SEQEND 65535 // end of intro sequence
+
+#define IC_PREPARE_TEXT 20 // commands used in COMMANDFLIRT block
+#define IC_SHOW_TEXT 21
+#define IC_REMOVE_TEXT 22
+#define IC_MAKE_SOUND 23
+#define IC_FX_VOLUME 24
+
+#define FRAME_SIZE (GAME_SCREEN_WIDTH * GAME_SCREEN_HEIGHT)
+#define INTRO_TEXT_WIDTH 128
+//CD intro file defines
+#define CDV_00 59500
+#define CD_PAL 59501
+#define CD_1_LOG 59502
+#define CD_1 59503
+#define CDV_01 59504
+#define CDV_02 59505
+#define CD_2 59506
+#define CDV_03 59507
+#define CDV_04 59508
+#define CD_3 59509
+#define CDV_05 59510
+#define CDV_06 59511
+#define CD_5 59512
+#define CDV_07 59513
+#define CDV_08 59514
+#define CDV_09 59515
+#define CD_7 59516
+#define CDV_10 59518
+#define CD_11 59519
+#define CDV_11 59520
+#define CD_11_PAL 59521
+#define CD_11_LOG 59522
+#define CDV_12 59523
+#define CD_13 59524
+#define CDV_13 59525
+#define CDV_14 59527
+#define CDV_15 59528
+#define CD_15_PAL 59529
+#define CD_15_LOG 59530
+#define CDV_16 59531
+#define CD_17_LOG 59532
+#define CD_17 59533
+#define CDV_17 59534
+#define CDV_18 59535
+#define CDV_19 59536
+#define CD_19_PAL 59537
+#define CD_19_LOG 59538
+#define CDV_20 59539
+#define CD_20_LOG 59540
+#define CDV_21 59541
+#define CD_21_LOG 59542
+#define CDV_22 59545
+#define CDV_23 59546
+#define CD_23_PAL 59547
+#define CD_24_LOG 59550
+#define CDV_24 59551
+#define CDV_25 59554
+#define CDV_26 59556
+#define CD_27 59557
+#define CDV_27 59558
+#define CD_27_PAL 59559
+#define CD_27_LOG 59560
+#define CDV_28 59561
+#define CDV_29 59562
+#define CDV_30 59563
+#define CDV_31 59565
+#define CDV_32 59566
+#define CDV_33 59567
+#define CDV_34 59568
+#define CD_35 59569
+#define CDV_35 59570
+#define CD_35_PAL 59571
+#define CD_35_LOG 59572
+#define CDV_36 59574
+#define CD_37 59575
+#define CDV_37 59576
+#define CD_37_PAL 59577
+#define CD_37_LOG 59578
+#define CDV_38 59579
+#define CDV_39 59581
+#define CDV_40 59583
+#define CD_40_PAL 59584
+#define CD_40_LOG 59585
+#define CDV_41 59587
+#define CDV_42 59588
+#define CD_43 59589
+#define CDV_43 59590
+#define CD_43_PAL 59591
+#define CD_43_LOG 59592
+#define CDV_44 59594
+#define CD_45 59595
+#define CDV_45 59596
+#define CD_45_PAL 59597
+#define CD_45_LOG 59598
+#define CDV_46 59600
+#define CDV_47 59602
+#define CD_47_PAL 59603
+#define CD_47_LOG 59604
+#define CD_48 59605
+#define CDV_48 59606
+#define CD_48_PAL 59607
+#define CD_48_LOG 59608
+#define CD_49 59609
+#define CDV_49 59610
+#define CD_50 59611
+#define CDV_50 59612
+#define CDV_51 59613
+#define CDV_52 59614
+#define CDV_53 59615
+#define CDV_54 59616
+#define CDV_55 59618
+#define CD_55_PAL 59619
+#define CD_55_LOG 59620
+#define CDV_56 59621
+#define CDV_57 59622
+#define CD_58 59623
+#define CDV_58 59624
+#define CD_58_PAL 59625
+#define CD_58_LOG 59626
+#define CDV_59 59627
+#define CDV_60 59628
+#define CDV_61 59629
+#define CDV_62 59630
+#define CDV_63 59631
+#define CDV_64 59632
+#define CDV_65 59633
+#define CDV_66 59635
+#define CD_66_PAL 59636
+#define CD_66_LOG 59637
+#define CDV_67 59639
+#define CD_67_PAL 59640
+#define CD_67_LOG 59641
+#define CDV_68 59642
+#define CD_69 59643
+#define CDV_69 59644
+#define CD_69_PAL 59645
+#define CD_69_LOG 59646
+#define CDV_70 59647
+#define CDV_71 59648
+#define CDV_72 59649
+#define CD_72_PAL 59650
+#define CD_72_LOG 59651
+#define CD_73_PAL 59652
+#define CD_73_LOG 59653
+#define CDV_73 59654
+#define CDV_74 59655
+#define CDV_75 59656
+#define CD_76_PAL 59657
+#define CD_76_LOG 59658
+#define CDV_76 59659
+#define CDV_77 59660
+#define CD_78_PAL 59661
+#define CD_78_LOG 59662
+#define CDV_78 59663
+#define CDV_79 59664
+#define CDV_80 59665
+#define CDV_81 59666
+#define CDV_82 59667
+#define CDV_83 59668
+#define CDV_84 59669
+#define CDV_85 59670
+#define CDV_86 59671
+#define CDV_87 59672
+#define CD_100 60087
+#define CD_101_LOG 60088
+#define CD_101 60099
+#define CD_102_LOG 60090
+#define CD_102 60091
+#define CD_103_PAL 60092
+#define CD_103_LOG 60093
+#define CD_103 60094
+#define CD_104_PAL 60095
+#define CD_104_LOG 60096
+#define CD_104 60097
+#define CD_105 60098
+
+
+uint16 Intro::_mainIntroSeq[] = {
+ DELAY, 3000, // keep virgin screen up
+ FADEDOWN,
+ SHOWSCREEN, 60112, // revo screen + palette
+ FADEUP, 60113,
+ DELAY, 8000,
+ FADEDOWN,
+ SHOWSCREEN, 60114, // gibbo screen + palette
+ FADEUP, 60115,
+ DELAY, 2000,
+ FADEDOWN,
+ SEQEND
+};
+
+uint16 Intro::_cdIntroSeq[] = {
+ PLAYVOICE, 59500,
+ LOADBG, 59499,
+ LOOPBG,
+ WAITVOICE,
+ PLAYVOICE, 59504,
+ SHOWSCREEN, CD_1_LOG,
+ FADEUP, CD_PAL,
+ BGFLIRT, CD_1,
+ WAITVOICE,
+ PLAYVOICE, CDV_02,
+ WAITVOICE,
+ STOPFLIRT,
+ BGFLIRT, CD_2,
+ PLAYVOICE, CDV_03,
+ WAITVOICE,
+ PLAYVOICE, CDV_04,
+ WAITFLIRT,
+ WAITVOICE,
+ PLAYVOICE, CDV_05,
+ DELAY, 2000,
+ BGFLIRT, CD_3,
+ WAITVOICE,
+ PLAYVOICE, CDV_06,
+ WAITFLIRT,
+ WAITVOICE,
+ PLAYVOICE, CDV_07,
+ BGFLIRT, CD_5,
+ WAITVOICE,
+ PLAYVOICE, CDV_08,
+ WAITVOICE,
+ PLAYVOICE, CDV_09,
+ WAITFLIRT,
+ WAITVOICE,
+ PLAYVOICE, CDV_10,
+ BGFLIRT, CD_7,
+ WAITVOICE,
+ PLAYVOICE, CDV_11,
+ WAITFLIRT,
+ FADEDOWN,
+ SHOWSCREEN, CD_11_LOG,
+ FADEUP, CD_11_PAL,
+ WAITVOICE,
+ PLAYVOICE, CDV_12,
+ DELAY, 1600,
+ BGFLIRT, CD_11,
+ WAITVOICE,
+ PLAYVOICE, CDV_13,
+ WAITVOICE,
+ WAITFLIRT,
+ WAITVOICE,
+ PLAYVOICE, CDV_14,
+ LOADBG, 59498, // fade-in heli
+ PLAYBG,
+ DOFLIRT, CD_13,
+ WAITVOICE,
+ PLAYVOICE, CDV_15,
+ FADEDOWN,
+ SHOWSCREEN, CD_15_LOG,
+ FADEUP, CD_15_PAL,
+ WAITVOICE,
+ LOADBG, 59496, // quiet heli
+ LOOPBG,
+ PLAYVOICE, CDV_16,
+ WAITVOICE,
+ PLAYVOICE, CDV_17,
+ DELAY, 2000,
+ SHOWSCREEN, CD_17_LOG,
+ WAITVOICE,
+ BGFLIRT, CD_17,
+ PLAYVOICE, CDV_18,
+ LOADBG, 59497, // loud heli
+ LOOPBG,
+ WAITFLIRT,
+ WAITVOICE,
+ FADEDOWN,
+ SHOWSCREEN, CD_19_LOG,
+ FADEUP, CD_19_PAL,
+ PLAYVOICE, CDV_19,
+ WAITVOICE,
+ PLAYVOICE, CDV_20,
+ FADEDOWN,
+ SHOWSCREEN, CD_20_LOG,
+ FADEUP, CD_19_PAL,
+ WAITVOICE,
+ LOADBG, 59496, // quiet heli
+ LOOPBG,
+ PLAYVOICE, CDV_21,
+ FADEDOWN,
+ SHOWSCREEN, CD_21_LOG,
+ FADEUP, CD_19_PAL,
+ WAITVOICE,
+ PLAYVOICE, CDV_22,
+ LOADBG, 59494, // heli whine
+ PLAYBG,
+ WAITVOICE,
+ PLAYVOICE, CDV_23,
+ FADEDOWN,
+ WAITVOICE,
+ SHOWSCREEN, CD_24_LOG,
+ FADEUP, CD_23_PAL,
+ PLAYVOICE, CDV_24,
+ WAITVOICE,
+ PLAYVOICE, CDV_25,
+ WAITVOICE,
+ PLAYVOICE, CDV_26,
+ WAITVOICE,
+ FADEDOWN,
+ SHOWSCREEN, CD_27_LOG,
+ FADEUP, CD_27_PAL,
+ PLAYVOICE, CDV_27,
+ WAITVOICE,
+ PLAYVOICE, CDV_29,
+ WAITVOICE,
+ PLAYVOICE, CDV_30,
+ WAITVOICE,
+ BGFLIRT, CD_27,
+ PLAYVOICE, CDV_31,
+ WAITVOICE,
+ PLAYVOICE, CDV_32,
+ WAITVOICE,
+ PLAYVOICE, CDV_33,
+ WAITVOICE,
+ PLAYVOICE, CDV_34,
+ WAITFLIRT,
+ WAITVOICE,
+ PLAYVOICE, CDV_35,
+ WAITVOICE,
+ PLAYVOICE, CDV_36,
+ FADEDOWN,
+ SHOWSCREEN, CD_35_LOG,
+ FADEUP, CD_35_PAL,
+ WAITVOICE,
+ PLAYVOICE, CDV_37,
+ DOFLIRT, CD_35,
+ WAITVOICE,
+ PLAYVOICE, CDV_38,
+ DOFLIRT, CD_37,
+ WAITVOICE,
+ PLAYVOICE, CDV_39,
+ WAITVOICE,
+ FADEDOWN,
+ SHOWSCREEN, CD_40_LOG,
+ FADEUP, CD_40_PAL,
+ PLAYVOICE, CDV_40,
+ WAITVOICE,
+ PLAYVOICE, CDV_41,
+ WAITVOICE,
+ PLAYVOICE, CDV_42,
+ WAITVOICE,
+ FADEDOWN,
+ SHOWSCREEN, CD_43_LOG,
+ FADEUP, CD_43_PAL,
+ PLAYVOICE, CDV_43,
+ WAITVOICE,
+ DOFLIRT, CD_43,
+ PLAYVOICE, CDV_45,
+ FADEDOWN,
+ SHOWSCREEN, CD_45_LOG,
+ FADEUP, CD_45_PAL,
+ WAITVOICE,
+ PLAYVOICE, CDV_46,
+ DOFLIRT, CD_45,
+ WAITVOICE,
+ FADEDOWN,
+ SHOWSCREEN, CD_47_LOG,
+ FADEUP, CD_47_PAL,
+ PLAYVOICE, CDV_47,
+ WAITVOICE,
+ PLAYVOICE, CDV_48,
+ FADEDOWN,
+ SHOWSCREEN, CD_48_LOG,
+ FADEUP, CD_48_PAL,
+ WAITVOICE,
+ BGFLIRT, CD_48,
+ PLAYVOICE, CDV_49,
+ WAITVOICE,
+ PLAYVOICE, CDV_50,
+ WAITFLIRT,
+ WAITVOICE,
+ PLAYVOICE, CDV_51,
+ BGFLIRT, CD_49,
+ WAITVOICE,
+ PLAYVOICE, CDV_52,
+ WAITVOICE,
+ PLAYVOICE, CDV_53,
+ WAITVOICE,
+ WAITFLIRT,
+ PLAYVOICE, CDV_54,
+ DOFLIRT, CD_50,
+ WAITVOICE,
+ PLAYVOICE, CDV_55,
+ WAITVOICE,
+ PLAYVOICE, CDV_56,
+ FADEDOWN,
+ SHOWSCREEN, CD_55_LOG,
+ FADEUP, CD_55_PAL,
+ WAITVOICE,
+ PLAYVOICE, CDV_57,
+ WAITVOICE,
+ FADEDOWN,
+ SHOWSCREEN, CD_58_LOG,
+ FADEUP, CD_58_PAL,
+ PLAYVOICE, CDV_58,
+ WAITVOICE,
+ PLAYVOICE, CDV_59,
+ WAITVOICE,
+ PLAYVOICE, CDV_60,
+ WAITVOICE,
+ PLAYVOICE, CDV_61,
+ WAITVOICE,
+ PLAYVOICE, CDV_62,
+ BGFLIRT, CD_58,
+ WAITVOICE,
+ PLAYVOICE, CDV_63,
+ WAITVOICE,
+ PLAYVOICE, CDV_64,
+ WAITFLIRT,
+ WAITVOICE,
+ PLAYVOICE, CDV_65,
+ FADEDOWN,
+ WAITVOICE,
+ SHOWSCREEN, CD_66_LOG,
+ FADEUP, CD_66_PAL,
+ PLAYVOICE, CDV_66,
+ WAITVOICE,
+ PLAYVOICE, CDV_67,
+ FADEDOWN,
+ SHOWSCREEN, CD_67_LOG,
+ FADEUP, CD_67_PAL,
+ WAITVOICE,
+ PLAYVOICE, CDV_68,
+ WAITVOICE,
+ PLAYVOICE, CDV_69,
+ FADEDOWN,
+ SHOWSCREEN, CD_69_LOG,
+ FADEUP, CD_69_PAL,
+ WAITVOICE,
+ PLAYVOICE, CDV_70,
+ DOFLIRT, CD_69,
+ WAITVOICE,
+ FADEDOWN,
+ PLAYVOICE, CDV_71,
+ WAITVOICE,
+ SHOWSCREEN, CD_72_LOG,
+ FADEUP, CD_72_PAL,
+ PLAYVOICE, CDV_72,
+ WAITVOICE,
+ FADEDOWN,
+ SHOWSCREEN, CD_73_LOG,
+ FADEUP, CD_73_PAL,
+ PLAYVOICE, CDV_73,
+ WAITVOICE,
+ PLAYVOICE, CDV_74,
+ WAITVOICE,
+ PLAYVOICE, CDV_75,
+ FADEDOWN,
+ SHOWSCREEN, CD_76_LOG,
+ FADEUP, CD_76_PAL,
+ WAITVOICE,
+ PLAYVOICE, CDV_76,
+ WAITVOICE,
+ PLAYVOICE, CDV_77,
+ WAITVOICE,
+ FADEDOWN,
+ SHOWSCREEN, CD_78_LOG,
+ FADEUP, CD_78_PAL,
+ PLAYVOICE, CDV_78,
+ WAITVOICE,
+ PLAYVOICE, CDV_79,
+ WAITVOICE,
+ PLAYVOICE, CDV_80,
+ BGFLIRT, CD_100,
+ WAITVOICE,
+ PLAYVOICE, CDV_81,
+ WAITVOICE,
+ PLAYVOICE, CDV_82,
+ WAITVOICE,
+ WAITFLIRT,
+ SHOWSCREEN, CD_101_LOG,
+ BGFLIRT, CD_101,
+ PLAYVOICE, CDV_83,
+ WAITVOICE,
+ PLAYVOICE, CDV_84,
+ WAITVOICE,
+ PLAYVOICE, CDV_85,
+ WAITVOICE,
+ WAITFLIRT,
+ SHOWSCREEN, CD_102_LOG,
+ PLAYVOICE, CDV_86,
+ DOFLIRT, CD_102,
+ FADEDOWN,
+ SHOWSCREEN, CD_103_LOG,
+ FADEUP, CD_103_PAL,
+ BGFLIRT, CD_103,
+ WAITVOICE,
+ PLAYVOICE, CDV_87,
+ WAITFLIRT,
+ WAITVOICE,
+ STARTMUSIC, 2,
+ FADEDOWN,
+ SHOWSCREEN, CD_104_LOG,
+ FADEUP, CD_104_PAL,
+ DOFLIRT, CD_104,
+ DOFLIRT, CD_105,
+ SEQEND
+};
+
+uint16 Intro::_floppyIntroSeq[] = {
+ SHOWSCREEN, 60081,
+ FADEUP, 60080,
+ DOFLIRT, 60082,
+ DOFLIRT, 60083,
+ DOFLIRT, 60084, // Beneath a Steel Sky
+ DOFLIRT, 60085,
+ DOFLIRT, 60086,
+ SCROLLFLIRT,
+ COMMANDFLIRT, 60087, // => command list 4a
+ 136, IC_MAKE_SOUND, 1, 70,
+ 90, IC_FX_VOLUME, 80,
+ 50, IC_FX_VOLUME, 90,
+ 5, IC_FX_VOLUME, 100,
+ COMMANDEND,
+ SHOWSCREEN, 60088,
+ COMMANDFLIRT, 60089, // => command list 4b (cockpit)
+ 1000, IC_PREPARE_TEXT, 77,
+ 220, IC_SHOW_TEXT, 20, 160, // radar detects jamming signal
+ 105, IC_REMOVE_TEXT,
+ 105, IC_PREPARE_TEXT, 81,
+ 105, IC_SHOW_TEXT, 170, 86, // well switch to override you fool
+ 35, IC_REMOVE_TEXT,
+ 35, IC_PREPARE_TEXT, 477,
+ 35, IC_SHOW_TEXT, 30, 160,
+ 3, IC_REMOVE_TEXT,
+ COMMANDEND,
+ SHOWSCREEN, 60090,
+ COMMANDFLIRT, 60091, // => command list 4c
+ 1000, IC_FX_VOLUME, 100,
+ 25, IC_FX_VOLUME, 110,
+ 15, IC_FX_VOLUME, 120,
+ 4, IC_FX_VOLUME, 127,
+ COMMANDEND,
+ FADEDOWN,
+ SHOWSCREEN, 60093,
+ FADEUP, 60092,
+ COMMANDFLIRT, 60094, // => command list 5
+ 31, IC_MAKE_SOUND, 2, 127,
+ COMMANDEND,
+ WAITMUSIC,
+ FADEDOWN,
+ SHOWSCREEN, 60096,
+ STARTMUSIC, 2,
+ FADEUP, 60095,
+ COMMANDFLIRT, 60097, // => command list 6a
+ 1000, IC_PREPARE_TEXT, 478,
+ 13, IC_SHOW_TEXT, 175, 155,
+ COMMANDEND,
+ COMMANDFLIRT, 60098, // => command list 6b
+ 131, IC_REMOVE_TEXT,
+ 131, IC_PREPARE_TEXT, 479,
+ 74, IC_SHOW_TEXT, 175, 155,
+ 45, IC_REMOVE_TEXT,
+ 45, IC_PREPARE_TEXT, 162,
+ 44, IC_SHOW_TEXT, 175, 155,
+ 4, IC_REMOVE_TEXT,
+ COMMANDEND,
+ SEQEND
+};
+
+Intro::Intro(Disk *disk, Screen *screen, MusicBase *music, Sound *sound, Text *text, Audio::Mixer *mixer, OSystem *system) {
+
+ _skyDisk = disk;
+ _skyScreen = screen;
+ _skyMusic = music;
+ _skySound = sound;
+ _skyText = text;
+ _mixer = mixer;
+ _system = system;
+ _textBuf = (uint8*)malloc(10000);
+ _saveBuf = (uint8*)malloc(10000);
+ _bgBuf = NULL;
+ _quitProg = false;
+ _relDelay = 0;
+}
+
+Intro::~Intro(void) {
+
+ _mixer->stopAll();
+ _skyScreen->stopSequence();
+ if (_textBuf)
+ free(_textBuf);
+ if (_saveBuf)
+ free(_saveBuf);
+ if (_bgBuf)
+ free(_bgBuf);
+}
+
+bool Intro::doIntro(bool floppyIntro) {
+
+ if (!SkyEngine::isCDVersion())
+ floppyIntro = true;
+
+ _skyMusic->loadSection(0);
+ _skySound->loadSection(0);
+
+ if (!escDelay(3000))
+ return false;
+ if (floppyIntro)
+ _skyMusic->startMusic(1);
+
+ uint16 *seqData = _mainIntroSeq;
+ while (*seqData != SEQEND) {
+ if (!nextPart(seqData))
+ return false;
+ }
+ if (floppyIntro)
+ seqData = _floppyIntroSeq;
+ else
+ seqData = _cdIntroSeq;
+
+ while (*seqData != SEQEND) {
+ if (!nextPart(seqData))
+ return false;
+ }
+ return true;
+}
+
+bool Intro::nextPart(uint16 *&data) {
+
+ uint8 *vData = NULL;
+ // return false means cancel intro
+ uint16 command = *data++;
+ switch (command) {
+ case SHOWSCREEN:
+ _skyScreen->showScreen(*data++);
+ return true;
+ case FADEUP:
+ _skyScreen->paletteFadeUp(*data++);
+ _relDelay += 32 * 20; // hack: the screen uses a seperate delay function for the
+ // blocking fadeups. So add 32*20 msecs to out delay counter.
+ return true;
+ case FADEDOWN:
+ _skyScreen->fnFadeDown(0);
+ _relDelay += 32 * 20; // hack: see above.
+ return true;
+ case DELAY:
+ if (!escDelay(*data++))
+ return false;
+ return true;
+ case DOFLIRT:
+ _skyScreen->startSequence(*data++);
+ while (_skyScreen->sequenceRunning())
+ if (!escDelay(50))
+ return false;
+ return true;
+ case SCROLLFLIRT:
+ return floppyScrollFlirt();
+ case COMMANDFLIRT:
+ return commandFlirt(data);
+ case STOPFLIRT:
+ _skyScreen->stopSequence();
+ return true;
+ case STARTMUSIC:
+ _skyMusic->startMusic(*data++);
+ return true;
+ case WAITMUSIC:
+ while (_skyMusic->musicIsPlaying())
+ if (!escDelay(50))
+ return false;
+ return true;
+ case BGFLIRT:
+ _skyScreen->startSequence(*data++);
+ return true;
+ case WAITFLIRT:
+ while (_skyScreen->sequenceRunning())
+ if (!escDelay(50))
+ return false;
+ return true;
+ case PLAYVOICE:
+ if (!escDelay(200))
+ return false;
+ vData = _skyDisk->loadFile(*data++);
+ // HACK: Fill the header with silence. We should
+ // probably use _skySound instead of calling playRaw()
+ // directly, but this will have to do for now.
+ memset(vData, 127, sizeof(struct dataFileHeader));
+ _mixer->playRaw(&_voice, vData, _skyDisk->_lastLoadedFileSize, 11025,
+ Audio::Mixer::FLAG_AUTOFREE | Audio::Mixer::FLAG_UNSIGNED, SOUND_VOICE);
+ return true;
+ case WAITVOICE:
+ while (_mixer->isSoundHandleActive(_voice))
+ if (!escDelay(50))
+ return false;
+ return true;
+ case LOADBG:
+ _mixer->stopID(SOUND_BG);
+ if (_bgBuf)
+ free(_bgBuf);
+ _bgBuf = _skyDisk->loadFile(*data++);
+ _bgSize = _skyDisk->_lastLoadedFileSize;
+ return true;
+ case LOOPBG:
+ _mixer->stopID(SOUND_BG);
+ _mixer->playRaw(&_bgSfx, _bgBuf + 256, _bgSize - 768, 11025,
+ Audio::Mixer::FLAG_UNSIGNED | Audio::Mixer::FLAG_LOOP, SOUND_BG);
+ return true;
+ case PLAYBG:
+ _mixer->stopID(SOUND_BG);
+ _mixer->playRaw(&_bgSfx, _bgBuf + 256, _bgSize - 768, 11025,
+ Audio::Mixer::FLAG_UNSIGNED, SOUND_BG);
+ return true;
+ case STOPBG:
+ _mixer->stopID(SOUND_BG);
+ return true;
+ default:
+ error("Unknown intro command %X", command);
+ }
+ return true;
+}
+
+bool Intro::floppyScrollFlirt(void) {
+
+ uint8 *scrollScreen = (uint8*)malloc(FRAME_SIZE * 2);
+ memset(scrollScreen, 0, FRAME_SIZE);
+ memcpy(scrollScreen + FRAME_SIZE, _skyScreen->giveCurrent(), FRAME_SIZE);
+ uint8 *scrollPos = scrollScreen + FRAME_SIZE;
+ uint8 *vgaData = _skyDisk->loadFile(60100);
+ uint8 *diffData = _skyDisk->loadFile(60101);
+ uint16 frameNum = READ_LE_UINT16(diffData);
+ uint8 *diffPtr = diffData + 2;
+ uint8 *vgaPtr = vgaData;
+ bool doContinue = true;
+
+ for (uint16 frameCnt = 1; (frameCnt < frameNum) && doContinue; frameCnt++) {
+ uint8 scrollVal = *diffPtr++;
+ if (scrollVal)
+ scrollPos -= scrollVal * GAME_SCREEN_WIDTH;
+
+ uint16 scrPos = 0;
+ while (scrPos < FRAME_SIZE) {
+ uint8 nrToDo, nrToSkip;
+ do {
+ nrToSkip = *diffPtr++;
+ scrPos += nrToSkip;
+ } while (nrToSkip == 255);
+ do {
+ nrToDo = *diffPtr++;
+ memcpy(scrollPos + scrPos, vgaPtr, nrToDo);
+ scrPos += nrToDo;
+ vgaPtr += nrToDo;
+ } while (nrToDo == 255);
+ }
+ _system->copyRectToScreen(scrollPos, GAME_SCREEN_WIDTH, 0, 0, GAME_SCREEN_WIDTH, GAME_SCREEN_HEIGHT);
+ _system->updateScreen();
+ if (!escDelay(60))
+ doContinue = false;
+ }
+ memcpy(_skyScreen->giveCurrent(), scrollPos, FRAME_SIZE);
+ free(diffData);
+ free(vgaData);
+ free(scrollScreen);
+ return doContinue;
+}
+
+bool Intro::commandFlirt(uint16 *&data) {
+
+ _skyScreen->startSequence(*data++);
+ while ((*data != COMMANDEND) || _skyScreen->sequenceRunning()) {
+ while ((_skyScreen->seqFramesLeft() < *data)) {
+ data++;
+ uint16 command = *data++;
+ switch(command) {
+ case IC_PREPARE_TEXT:
+ _skyText->displayText(*data++, _textBuf, true, INTRO_TEXT_WIDTH, 255);
+ break;
+ case IC_SHOW_TEXT:
+ ((dataFileHeader*)_textBuf)->s_x = *data++;
+ ((dataFileHeader*)_textBuf)->s_y = *data++;
+ showTextBuf();
+ break;
+ case IC_REMOVE_TEXT:
+ restoreScreen();
+ break;
+ case IC_MAKE_SOUND:
+ _skySound->playSound(data[0], data[1], 0);
+ data += 2;
+ break;
+ case IC_FX_VOLUME:
+ _skySound->playSound(1, *data++, 0);
+ break;
+ default:
+ error("Unknown FLIRT command %X\n", command);
+ }
+ }
+ if (!escDelay(50)) {
+ _skyScreen->stopSequence();
+ return false;
+ }
+ }
+ data++; // move pointer over "COMMANDEND"
+ return true;
+}
+
+void Intro::showTextBuf(void) {
+
+ uint16 x = ((dataFileHeader*)_textBuf)->s_x;
+ uint16 y = ((dataFileHeader*)_textBuf)->s_y;
+ uint16 width = ((dataFileHeader*)_textBuf)->s_width;
+ uint16 height = ((dataFileHeader*)_textBuf)->s_height;
+ uint8 *screenBuf = _skyScreen->giveCurrent() + y * GAME_SCREEN_WIDTH + x;
+ memcpy(_saveBuf, _textBuf, sizeof(dataFileHeader));
+ uint8 *saveBuf = _saveBuf + sizeof(dataFileHeader);
+ uint8 *textBuf = _textBuf + sizeof(dataFileHeader);
+ for (uint16 cnty = 0; cnty < height; cnty++) {
+ memcpy(saveBuf, screenBuf, width);
+ for (uint16 cntx = 0; cntx < width; cntx++)
+ if (textBuf[cntx])
+ screenBuf[cntx] = textBuf[cntx];
+ screenBuf += GAME_SCREEN_WIDTH;
+ textBuf += width;
+ saveBuf += width;
+ }
+ screenBuf = _skyScreen->giveCurrent() + y * GAME_SCREEN_WIDTH + x;
+ _system->copyRectToScreen(screenBuf, GAME_SCREEN_WIDTH, x, y, width, height);
+}
+
+void Intro::restoreScreen(void) {
+
+ uint16 x = ((dataFileHeader*)_saveBuf)->s_x;
+ uint16 y = ((dataFileHeader*)_saveBuf)->s_y;
+ uint16 width = ((dataFileHeader*)_saveBuf)->s_width;
+ uint16 height = ((dataFileHeader*)_saveBuf)->s_height;
+ uint8 *screenBuf = _skyScreen->giveCurrent() + y * GAME_SCREEN_WIDTH + x;
+ uint8 *saveBuf = _saveBuf + sizeof(dataFileHeader);
+ for (uint16 cnt = 0; cnt < height; cnt++) {
+ memcpy(screenBuf, saveBuf, width);
+ screenBuf += GAME_SCREEN_WIDTH;
+ saveBuf += width;
+ }
+ _system->copyRectToScreen(_saveBuf + sizeof(dataFileHeader), width, x, y, width, height);
+}
+
+bool Intro::escDelay(uint32 msecs) {
+
+ OSystem::Event event;
+ if (_relDelay == 0) // first call, init with system time
+ _relDelay = (int32)_system->getMillis();
+
+ _relDelay += msecs; // now wait until _system->getMillis() >= _relDelay
+
+ int32 nDelay = 0;
+ do {
+ while (_system->pollEvent(event)) {
+ if (event.type == OSystem::EVENT_KEYDOWN) {
+ if (event.kbd.keycode == 27)
+ return false;
+ } else if (event.type == OSystem::EVENT_QUIT) {
+ _quitProg = true;
+ return false;
+ }
+ }
+ nDelay = _relDelay - _system->getMillis();
+ if (nDelay < 0)
+ nDelay = 0;
+ else if (nDelay > 15)
+ nDelay = 15;
+ _system->delayMillis(nDelay);
+ } while (nDelay == 15);
+ return true;
+}
+
+} // End of namespace Sky