1 /* ScummVM - Graphic Adventure Engine
2 *
3 * ScummVM is the legal property of its developers, whose names
4 * are too numerous to list here. Please refer to the COPYRIGHT
5 * file distributed with this source distribution.
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 *
21 */
22
23 #include "titanic/support/movie_range_info.h"
24 #include "titanic/support/movie_clip.h"
25 #include "titanic/core/game_object.h"
26
27 namespace Titanic {
28
CMovieRangeInfo()29 CMovieRangeInfo::CMovieRangeInfo() : ListItem(), _startFrame(0), _endFrame(0) {
30 }
31
~CMovieRangeInfo()32 CMovieRangeInfo::~CMovieRangeInfo() {
33 _events.destroyContents();
34 }
35
CMovieRangeInfo(const CMovieRangeInfo * src)36 CMovieRangeInfo::CMovieRangeInfo(const CMovieRangeInfo *src) : ListItem() {
37 _startFrame = src->_startFrame;
38 _endFrame = src->_endFrame;
39 _initialFrame = src->_initialFrame;
40 _isReversed = src->_isReversed;
41 _isRepeat = src->_isRepeat;
42
43 // Duplicate the events list
44 for (CMovieEventList::const_iterator i = _events.begin();
45 i != _events.end(); ++i) {
46 _events.push_back(new CMovieEvent(*i));
47 }
48 }
49
save(SimpleFile * file,int indent)50 void CMovieRangeInfo::save(SimpleFile *file, int indent) {
51 file->writeNumberLine(0, indent);
52 file->writeNumberLine(_startFrame, indent + 1);
53 file->writeNumberLine(_endFrame, indent + 1);
54 file->writeNumberLine(_initialFrame, indent + 1);
55 file->writeNumberLine(_isRepeat, indent + 1);
56 file->writeNumberLine(_isReversed, indent + 1);
57 _events.save(file, indent + 1);
58
59 ListItem::save(file, indent);
60 }
61
load(SimpleFile * file)62 void CMovieRangeInfo::load(SimpleFile *file) {
63 int val = file->readNumber();
64 if (!val) {
65 _startFrame = file->readNumber();
66 _endFrame = file->readNumber();
67 _initialFrame = file->readNumber();
68 _isRepeat = file->readNumber();
69 _isReversed = file->readNumber();
70 _events.load(file);
71 }
72
73 ListItem::load(file);
74 }
75
getMovieEnd(CMovieEventList & list)76 void CMovieRangeInfo::getMovieEnd(CMovieEventList &list) {
77 for (CMovieEventList::iterator i = _events.begin(); i != _events.end(); ++i) {
78 CMovieEvent *movieEvent = *i;
79 if (movieEvent->_type == MET_MOVIE_END)
80 list.push_back(new CMovieEvent(movieEvent));
81 }
82 }
83
getMovieFrame(CMovieEventList & list,int frameNumber)84 void CMovieRangeInfo::getMovieFrame(CMovieEventList &list, int frameNumber) {
85 for (CMovieEventList::iterator i = _events.begin(); i != _events.end(); ++i) {
86 CMovieEvent *movieEvent = *i;
87 if (movieEvent->_type == MET_FRAME && movieEvent->_initialFrame == frameNumber)
88 list.push_back(new CMovieEvent(movieEvent));
89 }
90 }
91
process(CGameObject * owner)92 void CMovieRangeInfo::process(CGameObject *owner) {
93 int flags = 0;
94 if (_isRepeat)
95 flags |= MOVIE_REPEAT;
96 if (_isReversed)
97 flags |= MOVIE_REVERSE;
98
99 for (CMovieEventList::iterator i = _events.begin(); i != _events.end(); ++i) {
100 CMovieEvent *movieEvent = *i;
101 if (movieEvent->_type == MET_MOVIE_END) {
102 flags |= CLIPFLAG_PLAY;
103 break;
104 }
105 }
106
107 owner->playMovie(_startFrame, _endFrame, _initialFrame, flags);
108
109 for (CMovieEventList::iterator i = _events.begin(); i != _events.end(); ++i) {
110 CMovieEvent *movieEvent = *i;
111 if (movieEvent->_type == MET_PLAY)
112 owner->movieEvent(movieEvent->_initialFrame);
113 }
114 }
115
116 } // End of namespace Titanic
117