File: qd_interface_save.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 (220 lines) | stat: -rw-r--r-- 8,083 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
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
/* 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 QDENGINE_QDCORE_QD_INTERFACE_SAVE_H
#define QDENGINE_QDCORE_QD_INTERFACE_SAVE_H

#include "qdengine/parser/xml_fwd.h"
#include "qdengine/qdcore/qd_interface_element.h"
#include "qdengine/qdcore/qd_interface_element_state.h"


namespace QDEngine {


//! Интерфейсный элемент - сэйв.
class qdInterfaceSave : public qdInterfaceElement {
public:
	qdInterfaceSave();
	qdInterfaceSave(const qdInterfaceSave &sv);
	~qdInterfaceSave();

	qdInterfaceSave &operator = (const qdInterfaceSave &sv);

	//! Возвращает тип элемента.
	qdInterfaceElement::element_type get_element_type() const {
		return qdInterfaceElement::EL_SAVE;
	}

	//! Обработчик событий мыши.
	bool mouse_handler(int x, int y, mouseDispatcher::mouseEvent ev);
	//! Обработчик ввода с клавиатуры.
	bool keyboard_handler(Common::KeyCode vkey);

	//! Инициализация элемента.
	/**
	Вызывается каждый раз при заходе на экран, которому принадлежит элемент.
	*/
	bool init(bool is_game_active = true);

	//! Отрисовка элемента.
	bool redraw() const;

	grScreenRegion screen_region() const;

	//! Возвращает размер элемента по горизонтали в пикселах.
	int size_x() const;
	//! Возвращает размер элемента по вертикали в пикселах.
	int size_y() const;

	//! Возвращает размер картики-превью по горизонтали в пикселах.
	int thumbnail_size_x() const {
		return _thumbnail_size_x;
	}
	//! Возвращает размер картики-превью по вертикали в пикселах.
	int thumbnail_size_y() const {
		return _thumbnail_size_y;
	}

	//! Назначает размер картики-превью по горизонтали в пикселах.
	void set_thumbnail_size_x(int sx) {
		_thumbnail_size_x = sx;
	}
	//! Назначает размер картики-превью по вертикали в пикселах.
	void set_thumbnail_size_y(int sy) {
		_thumbnail_size_y = sy;
	}

	//! Смещение текста, выводимого в сэйве, относительно левого-верхнего угла
	int text_dx() const {
		return _text_dx;
	}
	int text_dy() const {
		return _text_dy;
	}
	void set_test_dx(int val) {
		_text_dx = val;
	}
	void set_test_dy(int val) {
		_text_dy = val;
	}

	//! Обсчет логики, параметр - время в секундах.
	bool quant(float dt);

	//! Возвращает true, если точка с экранными координатами (x,у) попадает в элемент.
	bool hit_test(int x, int y) const;

	//! Возвращает номер сэйва.
	int save_ID() const {
		return _save_ID;
	}
	//! Устанавливает номер сэйва.
	void set_save_ID(int id) {
		_save_ID = id;
	}

	//! Устанавливает режим работы - записывать (state == true) или загружать (state == false) сэйвы.
	static void set_save_mode(bool state) {
		_save_mode = state;
	}

	//! Устанавливает имя файла для анимации.
	/**
	Если надо убрать анимацию - передать NULL в качестве имени файла.
	*/
	void set_frame_animation_file(const Common::Path name, qdInterfaceElementState::state_mode_t mode = qdInterfaceElementState::MOUSE_HOVER_MODE) {
		_frame.set_animation_file(name, mode);
	}
	//! Возвращает имя файла для анимации.
	const Common::Path frame_animation_file(qdInterfaceElementState::state_mode_t mode = qdInterfaceElementState::MOUSE_HOVER_MODE) const {
		return _frame.animation_file(mode);
	}
	//! Возвращает флаги анимации.
	int frame_animation_flags(qdInterfaceElementState::state_mode_t mode = qdInterfaceElementState::MOUSE_HOVER_MODE) const {
		return _frame.animation_flags(mode);
	}

	//! Устанавливает флаг анимации.
	void set_frame_animation_flag(int fl, qdInterfaceElementState::state_mode_t mode = qdInterfaceElementState::MOUSE_HOVER_MODE) {
		_frame.set_animation_flag(fl, mode);
	}
	//! Скидывает флаг анимации.
	void drop_frame_animation_flag(int fl, qdInterfaceElementState::state_mode_t mode = qdInterfaceElementState::MOUSE_HOVER_MODE) {
		_frame.drop_animation_flag(fl, mode);
	}
	//! Возвращает true, если для анимации установлен флаг fl.
	bool check_frame_animation_flag(int fl, qdInterfaceElementState::state_mode_t mode = qdInterfaceElementState::MOUSE_HOVER_MODE) const {
		return _frame.check_animation_flag(fl, mode);
	}

	//! Возвращает true, если к сейву привязана анимация рамки.
	bool frame_has_animation(qdInterfaceElementState::state_mode_t mode = qdInterfaceElementState::MOUSE_HOVER_MODE) const {
		return _frame.has_animation(mode);
	}

	void set_frame_sound_file(const char *name, qdInterfaceElementState::state_mode_t mode = qdInterfaceElementState::MOUSE_HOVER_MODE) {
		_frame.set_sound_file(name, mode);
	}
	const Common::Path frame_sound_file(qdInterfaceElementState::state_mode_t mode = qdInterfaceElementState::MOUSE_HOVER_MODE) const {
		return _frame.sound_file(mode);
	}

	bool isAutosaveSlot() const {
		return _isAutosaveSlot;
	}
	void setAutosaveSlot(bool state) {
		_isAutosaveSlot = state;
	}

	void set_title(const char *title) {
		_save_title = title;
	}
	const char *title() const {
		return _save_title.c_str();
	}

	//! Осуществить сохранение текущего состояния игры в ячейку сэйва.
	bool perform_save();

protected:

	//! Запись данных в скрипт.
	bool save_script_body(Common::WriteStream &fh, int indent = 0) const;
	//! Загрузка данных из скрипта.
	bool load_script_body(const xml::tag *p);

private:

	//! Горизонтальный размер картинки-превью сэйва.
	int _thumbnail_size_x;
	//! Вертикальный размер картинки-превью сэйва.
	int _thumbnail_size_y;

	//! Смещение текста, выводимого в сэйве, относительно левого-верхнего угла
	int _text_dx;
	int _text_dy;

	//! Номер сэйва, имя файла имеет вид saveNNN.dat, где NNN - save_ID_.
	int _save_ID;

	/// если true, то игрок сам не может записать игру в этот слот
	bool _isAutosaveSlot;

	//! Превью сэйва.
	qdInterfaceElementState _thumbnail;

	Common::String _save_title;

	//! Опциональная рамка вокруг картинки-превью сэйва.
	qdInterfaceElementState _frame;

	//! Режим работы сэйвов - чтение/запись (== false/true).
	static bool _save_mode;

	//! Текущий номер сэйва.
	static int _current_save_ID;
};

} // namespace QDEngine

#endif // QDENGINE_QDCORE_QD_INTERFACE_SAVE_H