aboutsummaryrefslogtreecommitdiff
path: root/graphics
diff options
context:
space:
mode:
Diffstat (limited to 'graphics')
-rw-r--r--graphics/animation.cpp103
-rw-r--r--graphics/animation.h1
2 files changed, 104 insertions, 0 deletions
diff --git a/graphics/animation.cpp b/graphics/animation.cpp
index d8219c5a55..4808402a46 100644
--- a/graphics/animation.cpp
+++ b/graphics/animation.cpp
@@ -47,6 +47,109 @@ BaseAnimationState::~BaseAnimationState() {
}
+bool BaseAnimationState::init(const char *name) {
+#ifdef USE_MPEG2
+ char tempFile[512];
+
+ decoder = NULL;
+ mpgfile = NULL;
+ sndfile = NULL;
+ bgSoundStream = NULL;
+
+#ifdef BACKEND_8BIT
+
+ uint i, p;
+
+ // Load lookup palettes
+ // TODO: Binary format so we can use File class
+ sprintf(tempFile, "%s.pal", name);
+ FILE *f = fopen(tempFile, "r");
+
+ if (!f) {
+ warning("Cutscene: %s.pal palette missing", name);
+ return false;
+ }
+
+ p = 0;
+ while (!feof(f)) {
+ int end, cnt;
+
+ if (fscanf(f, "%i %i", &end, &cnt) != 2)
+ break;
+
+ palettes[p].end = (uint) end;
+ palettes[p].cnt = (uint) cnt;
+
+ for (i = 0; i < palettes[p].cnt; i++) {
+ int r, g, b;
+ fscanf(f, "%i", &r);
+ fscanf(f, "%i", &g);
+ fscanf(f, "%i", &b);
+ palettes[p].pal[4 * i] = r;
+ palettes[p].pal[4 * i + 1] = g;
+ palettes[p].pal[4 * i + 2] = b;
+ palettes[p].pal[4 * i + 3] = 0;
+ }
+ for (; i < 256; i++) {
+ palettes[p].pal[4 * i] = 0;
+ palettes[p].pal[4 * i + 1] = 0;
+ palettes[p].pal[4 * i + 2] = 0;
+ palettes[p].pal[4 * i + 3] = 0;
+ }
+ p++;
+ }
+ fclose(f);
+
+ palnum = 0;
+ maxPalnum = p;
+ setPalette(palettes[palnum].pal);
+ lut = lut2 = lookup[0];
+ curpal = -1;
+ cr = 0;
+ buildLookup(palnum, 256);
+ lut2 = lookup[1];
+ lutcalcnum = (BITDEPTH + palettes[palnum].end + 2) / (palettes[palnum].end + 2);
+#else
+ buildLookup();
+ overlay = (OverlayColor*)calloc(MOVIE_WIDTH * MOVIE_HEIGHT, sizeof(OverlayColor));
+ _sys->show_overlay();
+#endif
+
+ // Open MPEG2 stream
+ mpgfile = new File();
+ sprintf(tempFile, "%s.mp2", name);
+ if (!mpgfile->open(tempFile)) {
+ warning("Cutscene: Could not open %s", tempFile);
+ return false;
+ }
+
+ // Load and configure decoder
+ decoder = mpeg2_init();
+ if (decoder == NULL) {
+ warning("Cutscene: Could not allocate an MPEG2 decoder");
+ return false;
+ }
+
+ info = mpeg2_info(decoder);
+ framenum = 0;
+ frameskipped = 0;
+ ticks = _sys->get_msecs();
+
+ // Play audio
+ sndfile = new File();
+ bgSoundStream = AudioStream::openStreamFile(name, sndfile);
+
+ if (bgSoundStream != NULL) {
+ _snd->playInputStream(&bgSound, bgSoundStream, false, 255, 0, -1, false);
+ } else {
+ warning("Cutscene: Could not open Audio Track for %s", name);
+ }
+
+ return true;
+#else /* USE_MPEG2 */
+ return false;
+#endif
+}
bool BaseAnimationState::checkPaletteSwitch() {
#ifdef BACKEND_8BIT
diff --git a/graphics/animation.h b/graphics/animation.h
index 0ddaf76e5c..e532036929 100644
--- a/graphics/animation.h
+++ b/graphics/animation.h
@@ -122,6 +122,7 @@ public:
BaseAnimationState(SoundMixer *snd, OSystem *sys, int width, int height);
virtual ~BaseAnimationState();
+ bool init(const char *name);
protected:
bool checkPaletteSwitch();
#ifdef BACKEND_8BIT