File: overlay.h

package info (click to toggle)
scummvm 2.9.1%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 450,580 kB
  • sloc: cpp: 4,299,825; asm: 28,322; python: 12,901; sh: 11,302; java: 9,289; xml: 7,895; perl: 2,639; ansic: 2,465; yacc: 1,670; javascript: 1,020; makefile: 933; lex: 578; awk: 275; objc: 82; sed: 11; php: 1
file content (135 lines) | stat: -rw-r--r-- 4,518 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/* 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 <http://www.gnu.org/licenses/>.
 *
 */

#ifndef NANCY_ACTION_OVERLAY_H
#define NANCY_ACTION_OVERLAY_H

#include "engines/nancy/action/actionrecord.h"

namespace Nancy {
namespace Action {

// Places a static image or a looping animation on top of the background
// Can move along with the scene's background frame, however:
// - in animation mode, the animation is the same for every background frame
// - in static mode, every background frame gets its own static image
// Also supports:
// - playing a sound;
// - playing backwards;
// - looping (non-looping animated overlays are very rare);
// - getting interrupted by an event flag;
// - changing the scene/setting flags when clicked/interrupted
// Originally introduced in nancy1, where it was split into two different types:
// PlayStaticBitmapAnimation and PlayIntStaticBitmapAnimation (the latter was interruptible)
// In nancy2, the two got merged inside the newly-renamed Overlay;
// that was also when static mode got introduced.
class Overlay : public RenderActionRecord {
public:
	Overlay(bool interruptible) : RenderActionRecord(7), _isInterruptible(interruptible), _usesAutotext(false) {}
	virtual ~Overlay() { _fullSurface.free(); }

	void init() override;
	void handleInput(NancyInput &input) override;

	void readData(Common::SeekableReadStream &stream) override;
	void execute() override;

	Common::Path _imageName;

	uint16 _transparency = kPlayOverlayPlain;
	uint16 _hasSceneChange = kPlayOverlaySceneChange;
	uint16 _enableHotspot = kPlayOverlayNoHotspot;
	uint16 _overlayType = kPlayOverlayAnimated;
	uint16 _playDirection = kPlayOverlayForward;
	uint16 _loop = kPlayOverlayOnce;
	uint16 _firstFrame = 0;
	uint16 _loopFirstFrame = 0;
	uint16 _loopLastFrame = 0;
	uint32 _frameTime = 0;
	FlagDescription _interruptCondition;
	SceneChangeDescription _sceneChange;
	MultiEventFlagDescription _flagsOnTrigger;

	Nancy::SoundDescription _sound;

	// Describes a single frame in this animation
	Common::Array<Common::Rect> _srcRects;
	// Describes how the animation will be displayed on a single
	// frame of the viewport
	Common::Array<FrameBlitDescription> _blitDescriptions;

	int16 _currentFrame = -1;
	int16 _currentViewportFrame = -1;
	uint32 _nextFrameTime = 0;
	bool _isInterruptible;
	bool _usesAutotext;

protected:
	bool canHaveHotspot() const override { return true; }
	Common::String getRecordTypeName() const override;
	bool isViewportRelative() const override { return true; }

	Graphics::ManagedSurface _fullSurface;
};

// Short version of a static overlay; assumes scene background doesn't move
class OverlayStaticTerse : public Overlay {
public:
	OverlayStaticTerse() : Overlay(true) {}
	virtual ~OverlayStaticTerse() {}

	void readData(Common::SeekableReadStream &stream) override;

protected:
	Common::String getRecordTypeName() const override { return "OverlayStaticTerse"; }
};

// Short version of an animated overlay; assumes scene background doesn't move
class OverlayAnimTerse : public Overlay {
public:
	OverlayAnimTerse() : Overlay(true) {}
	virtual ~OverlayAnimTerse() {}

	void readData(Common::SeekableReadStream &stream) override;

protected:
	Common::String getRecordTypeName() const override { return "OverlayAnimTerse"; }
};

class TableIndexOverlay : public Overlay {
public:
	TableIndexOverlay() : Overlay(true) {}
	virtual ~TableIndexOverlay() {}

	void readData(Common::SeekableReadStream &stream) override;
	void execute() override;

protected:
	Common::String getRecordTypeName() const override { return "TableIndexOverlay"; }

	uint16 _tableIndex = 0;
	int16 _lastIndexVal = -1;
};

} // End of namespace Action
} // End of namespace Nancy

#endif // NANCY_ACTION_OVERLAY_H