aboutsummaryrefslogtreecommitdiff
path: root/engines/gob/pregob/gctfile.h
blob: 504634c0fdea656756b8ffba010c0f95730cf888 (plain)
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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/* 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 2
 * 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, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 */

#ifndef GOB_PREGOB_GCTFILE_H
#define GOB_PREGOB_GCTFILE_H

#include "common/str.h"
#include "common/array.h"
#include "common/list.h"

#include "gob/backbuffer.h"

namespace Common {
	class RandomSource;
	class SeekableReadStream;
}

namespace Gob {

class Surface;
class Font;

class GCTFile : public BackBuffer {
public:
	static const uint16 kSelectorAll    = 0xFFFE; ///< Print all lines.
	static const uint16 kSelectorRandom = 0xFFFF; ///< Print a random line.


	GCTFile(Common::SeekableReadStream &gct, Common::RandomSource &rnd);
	~GCTFile();

	/** Return the number of lines in an item. */
	uint16 getLineCount(uint item) const;

	/** Set the area the text will be printed in. */
	void setArea(int16 left, int16 top, int16 right, int16 bottom);

	/** Set which line of this item should be printed. */
	void selectLine(uint item, uint16 line);

	/** Change the text of an items' line. */
	void setText(uint item, uint16 line, const Common::String &text);
	/** Change the item into one one line and set that line's text. */
	void setText(uint item, const Common::String &text);

	/** Reset the item drawing state. */
	void reset();

	/** Clear the drawn text, restoring the original content. */
	bool clear(Surface &dest, int16 &left, int16 &top, int16 &right, int16 &bottom);

	/** Fill the text area with a color. */
	bool fill(Surface &dest, uint8 color, int16 &left, int16 &top, int16 &right, int16 &bottom);

	/** Draw an item onto the surface, until all text has been drawn or the area is filled. */
	bool draw(Surface &dest, uint16 item, const Font &font, uint8 color,
	          int16 &left, int16 &top, int16 &right, int16 &bottom);

	/** Did we draw all text? */
	bool finished() const;

private:
	/** The type of a chunk. */
	enum ChunkType {
		kChunkTypeNone   = 0, ///< Do nothing.
		kChunkTypeString    , ///< A direct string.
		kChunkTypeItem        ///< A reference to an item to print instead.
	};

	/** A chunk in an item text line. */
	struct Chunk {
		ChunkType type; ///< The type of the chunk.

		Common::String text; ///< Text to print.

		int item; ///< Item to print instead.

		Chunk();
	};

	typedef Common::List<Chunk> Chunks;

	/** A line in an item. */
	struct Line {
		Chunks chunks; ///< The chunks that make up the line.
	};

	typedef Common::Array<Line> Lines;

	/** A GCT item. */
	struct Item {
		Lines  lines;    ///< The text lines in the item
		uint16 selector; ///< Which line to print.
	};

	typedef Common::Array<Item> Items;


	Common::RandomSource *_rnd;

	Items _items; ///< All GCT items.

	// The area on which to print
	bool  _hasArea;
	int16 _areaLeft;
	int16 _areaTop;
	int16 _areaRight;
	int16 _areaBottom;

	/** Index of the current item we're drawing. */
	uint16 _currentItem;
	/** Text left to draw. */
	Common::List<Common::String> _currentText;


	// -- Loading helpers --

	void load(Common::SeekableReadStream &gct);
	void readLine(Common::SeekableReadStream &gct, Line &line, uint16 lineSize) const;


	// -- Draw helpers --

	Common::String getLineText(const Line &line) const;
	void getItemText(uint item, Common::List<Common::String> &text) const;
};

} // End of namespace Gob

#endif // GOB_PREGOB_GCTFILE_H