File: qd_conditional_object.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 (163 lines) | stat: -rw-r--r-- 5,955 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
/* 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_CONDITIONAL_OBJECT_H
#define QDENGINE_QDCORE_CONDITIONAL_OBJECT_H

#include "qdengine/parser/xml_fwd.h"
#include "qdengine/qdcore/qd_condition.h"
#include "qdengine/qdcore/qd_condition_group.h"
#include "qdengine/qdcore/qd_named_object.h"

namespace Common {
class WriteStream;
}

namespace QDEngine {

//! Объект с условиями.
class qdConditionalObject : public qdNamedObject {
public:
	qdConditionalObject();
	qdConditionalObject(const qdConditionalObject &obj);
	~qdConditionalObject();

	qdConditionalObject &operator = (const qdConditionalObject &obj);

	//! Режим проверки условий.
	enum ConditionsMode {
		//! "И" - должны выполниться все условия.
		CONDITIONS_AND,
		//! "ИЛИ" - достаточно выполнения одного из условий.
		CONDITIONS_OR
	};

	typedef Std::vector<qdCondition> conditions_container_t;
	typedef Std::vector<qdConditionGroup> condition_groups_container_t;

	//! Возвращает true, если условия выполняются.
	virtual bool check_conditions();
	//! Добавляет условие. Возвращает поярдковый номер,-1 в случае ошибки.
	int add_condition(const qdCondition *p);
	//! Обновляет условие условие с порядковым номером num.
	bool update_condition(int num, const qdCondition &p);

	//! Удаляет условие.
	bool remove_conditon(int idx);

	//! Возвращает указатель на условие.
	const qdCondition *get_condition(int idx = 0) const {
		return &*(_conditions.begin() + idx);
	}

	//! Возвращает количество условий.
	int conditions_count() const {
		return _conditions.size();
	}

	//! Добавляет группу условий. Возвращает поярдковый номер,-1 в случае ошибки.
	int add_condition_group(const qdConditionGroup *p);
	//! Обновляет группу условий с порядковым номером num.
	bool update_condition_group(int num, const qdConditionGroup &p);

	//! Удаляет группу условий.
	bool remove_conditon_group(int idx);

	//! Возвращает указатель на группу условий.
	const qdConditionGroup *get_condition_group(int idx = 0) const {
		return &*(_condition_groups.begin() + idx);
	}

	//! Возвращает количество групп условий.
	int condition_groups_count() const {
		return _condition_groups.size();
	}

	//! Возвращает режим проверки условий.
	ConditionsMode conditions_mode() const {
		return _conditions_mode;
	}
	//! Устанавливает режим проверки условий.
	void set_conditions_mode(ConditionsMode m) {
		_conditions_mode = m;
	}

	//! Возвращает true, если список условий не пустой.
	bool has_conditions() const {
		return !_conditions.empty();
	}

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

	//! Инициализация объекта, вызывается при старте и перезепуске игры.
	virtual bool init();

	//! Загрузка данных из сэйва.
	bool load_data(Common::SeekableReadStream &fh, int save_version);
	//! Запись данных в сэйв.
	bool save_data(Common::WriteStream &fh) const;

	bool is_condition_in_group(int condition_idx) const;

	//! Варианты старта триггера.
	enum trigger_start_mode {
		//! запуск не удался
		TRIGGER_START_FAILED,
		//! включить активный режим у триггера
		TRIGGER_START_ACTIVATE,
		//! включить ждущий режим у триггера
		TRIGGER_START_WAIT
	};
	//! Активация триггера.
	virtual trigger_start_mode trigger_start() = 0;

	//! Возвращает true, если триггер может быть активирован при выполнении его внутренних условий.
	/**
	Объект должен принадлежать активной сцене (игровые объекты, зоны на сетке, музыка)
	или не зависеть от нее (сцены, мини-игры и т.д.).
	*/
	virtual bool trigger_can_start() const;

protected:

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

private:

	//! Логика проверки условий - И/ИЛИ.
	ConditionsMode _conditions_mode;

	//! Условия.
	conditions_container_t _conditions;

	//! Группы условий.
	condition_groups_container_t _condition_groups;

	bool check_group_conditions(const qdConditionGroup &gr);
};

} // namespace QDEngine

#endif // QDENGINE_QDCORE_CONDITIONAL_OBJECT_H