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