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
|