/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* 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 3 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, see .
*
*/
#ifndef TITANIC_MOVIE_H
#define TITANIC_MOVIE_H
#include "common/list.h"
#include "video/video_decoder.h"
#include "titanic/core/list.h"
#include "titanic/core/resource_key.h"
#include "titanic/support/avi_surface.h"
#include "titanic/support/movie_range_info.h"
namespace Titanic {
class CGameObject;
class CMovie;
class CSoundManager;
class CVideoSurface;
class CMovieList : public List {
public:
};
class CMovie : public ListItem {
protected:
/**
* Adds the movie to the list of currently playing movies
*/
void addToPlayingMovies();
public:
bool _handled;
bool _hasVideoFrame;
public:
static CMovieList *_playingMovies;
static CVideoSurface *_movieSurface;
/**
* Initializes statics
*/
static void init();
/**
* Deinitializes statics
*/
static void deinit();
public:
CMovie();
~CMovie() override;
/**
* Starts playing the movie
*/
virtual void play(uint flags, CGameObject *obj) = 0;
/**
* Starts playing the movie
*/
virtual void play(uint startFrame, uint endFrame, uint flags, CGameObject *obj) = 0;
/**
* Starts playing the movie
*/
virtual void play(uint startFrame, uint endFrame, uint initialFrame, uint flags, CGameObject *obj) = 0;
/**
* Plays a sub-section of a movie, and doesn't return until either
* the playback ends or a key has been pressed
* @returns True if the cutscene was not interrupted
*/
virtual bool playCutscene(const Rect &drawRect, uint startFrame, uint endFrame) = 0;
/**
* Pauses a movie
* @remarks Acts a workaround for our video decoder, since some movies started
* as part of a scene load need to be paused until the scene is interactive,
* or else they get played back too quickly
*/
virtual void pause() = 0;
/**
* Stops the movie
*/
virtual void stop() = 0;
/**
* Add a playback event
*/
virtual void addEvent(int frameNumber, CGameObject *obj) = 0;
/**
* Set the current frame number
*/
virtual void setFrame(uint frameNumber) = 0;
/**
* Handle any pending movie events
*/
virtual bool handleEvents(CMovieEventList &events) = 0;
/**
* Return any movie range info associated with the movie
*/
virtual const CMovieRangeInfoList *getMovieRangeInfo() const = 0;
/**
* Set the sound manager reference
*/
virtual void setSoundManager(CSoundManager *soundManager) = 0;
/**
* Get the current movie frame
*/
virtual int getFrame() const = 0;
/**
* Set the frame rate for the movie
*/
virtual void setFrameRate(double rate) = 0;
/**
* Sets whether the video is playing (versus paused)
*/
virtual void setPlaying(bool playingFlag) = 0;
/**
* Creates a duplicate of the transparency surface
*/
virtual Graphics::ManagedSurface *duplicateTransparency() const = 0;
/**
* Removes the movie from the list of currently playing movies
*/
void removeFromPlayingMovies();
/**
* Returns true if the movie is currently active
*/
bool isActive() const;
/**
* Returns true if there's a video frame
*/
bool hasVideoFrame();
};
class OSMovie : public CMovie {
private:
AVISurface _aviSurface;
CVideoSurface *_videoSurface;
int _field18;
int _field24;
int _field28;
int _field2C;
private:
/**
* Called when a movie is started playing
*/
void movieStarted();
public:
OSMovie(const CResourceKey &name, CVideoSurface *surface);
~OSMovie() override;
/**
* Starts playing the movie
*/
void play(uint flags, CGameObject *obj) override;
/**
* Starts playing the movie
*/
void play(uint startFrame, uint endFrame, uint flags, CGameObject *obj) override;
/**
* Starts playing the movie
*/
void play(uint startFrame, uint endFrame, uint initialFrame, uint flags, CGameObject *obj) override;
/**
* Plays a sub-section of a movie, and doesn't return until either
* the playback ends or a key has been pressed
* @returns True if the cutscene was not interrupted
*/
bool playCutscene(const Rect &drawRect, uint startFrame, uint endFrame) override;
/**
* Pauses a movie
* @remarks Acts a workaround for our video decoder, since some movies started
* as part of a scene load need to be paused until the scene is interactive,
* or else they get played back too quickly
*/
void pause() override;
/**
* Stops the movie
*/
void stop() override;
/**
* Add a playback event
*/
void addEvent(int eventId, CGameObject *obj) override;
/**
* Set the current frame number
*/
void setFrame(uint frameNumber) override;
/**
* Handle any pending movie events
*/
bool handleEvents(CMovieEventList &events) override;
/**
* Get the current frame number
*/
int getFrame() const override;
/**
* Return any movie range info associated with the movie
*/
const CMovieRangeInfoList *getMovieRangeInfo() const override;
/**
* Set the sound manager reference
*/
void setSoundManager(CSoundManager *soundManager) override;
/**
* Set the frame rate for the movie
*/
void setFrameRate(double rate) override;
/**
* Sets whether the video is playing (versus paused)
*/
void setPlaying(bool playingFlag) override;
/**
* Creates a duplicate of the transparency surface
*/
Graphics::ManagedSurface *duplicateTransparency() const override;
};
} // End of namespace Titanic
#endif /* TITANIC_MOVIE_H */