diff options
Diffstat (limited to 'graphics')
-rw-r--r-- | graphics/animation.cpp | 103 | ||||
-rw-r--r-- | graphics/animation.h | 1 |
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 |