OpenMoHAA 0.82.1
Loading...
Searching...
No Matches
scriptvariable.h
1/*
2===========================================================================
3Copyright (C) 2025 the OpenMoHAA team
4
5This file is part of OpenMoHAA source code.
6
7OpenMoHAA source code is free software; you can redistribute it
8and/or modify it under the terms of the GNU General Public License as
9published by the Free Software Foundation; either version 2 of the License,
10or (at your option) any later version.
11
12OpenMoHAA source code is distributed in the hope that it will be
13useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with OpenMoHAA source code; if not, write to the Free Software
19Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20===========================================================================
21*/
22
23// scriptvariable.h: Dynamic variables for scripts.
24
25#pragma once
26
27#include "../qcommon/listener.h"
28#include "../qcommon/short3.h"
29
30#ifdef GAME_DLL
31# include "../fgame/misc.h"
32#endif
33
34enum variabletype {
35 VARIABLE_NONE,
36 VARIABLE_STRING,
37 VARIABLE_INTEGER,
38 VARIABLE_FLOAT,
39 VARIABLE_CHAR,
40 VARIABLE_CONSTSTRING,
41 VARIABLE_LISTENER,
42 VARIABLE_REF,
43 VARIABLE_ARRAY,
44 VARIABLE_CONSTARRAY,
45 VARIABLE_CONTAINER,
46 VARIABLE_SAFECONTAINER,
47 VARIABLE_POINTER,
48 VARIABLE_VECTOR,
49 VARIABLE_MAX
50};
51
52static const char *typenames[] = {
53 "none",
54 "string",
55 "int",
56 "float",
57 "char",
58 "const string",
59 "listener",
60 "ref",
61 "array",
62 "const array",
63 "array",
64 "array",
65 "pointer",
66 "vector",
67 "double"
68};
69
72class ScriptPointer;
73
74class ScriptVariable : public LightClass
75{
76public:
77#ifdef GAME_DLL
78 short3 key; // variable name
79#endif
80 unsigned char type; // variable type
81
82 union {
83 public:
84 char charValue;
85 float floatValue;
86 int intValue;
87 SafePtr<Listener> *listenerValue;
88 str *stringValue;
89 float *vectorValue;
90 void *anyValue;
91
92 ScriptVariable *refValue;
93
94 ScriptArrayHolder *arrayValue;
95 ScriptConstArrayHolder *constArrayValue;
96
97 Container<SafePtr<Listener>> *containerValue;
98 SafePtr<ContainerClass<SafePtr<Listener>>> *safeContainerValue;
99
100 ScriptPointer *pointerValue;
101 } m_data;
102
103private:
104 void ClearInternal();
105 void ClearPointerInternal() const;
106
107public:
108 ScriptVariable();
109 ScriptVariable(const ScriptVariable& variable);
110 ScriptVariable(ScriptVariable&& variable);
111
112 ~ScriptVariable();
113
114 void CastBoolean(void);
115 void CastConstArrayValue(void);
116 void CastEntity(void);
117 void CastFloat(void);
118 void CastInteger(void);
119 void CastString(void);
120
121 void Clear();
122 void ClearPointer();
123
124 const char *GetTypeName(void) const;
125 variabletype GetType(void) const;
126
127 bool IsNone() const;
128 bool HasValue() const;
129 bool IsEntity() const;
130 bool IsListener() const;
131 bool IsNumeric() const;
132 bool IsConstArray() const;
133#ifdef WITH_SCRIPT_ENGINE
134 bool IsSimpleEntity() const;
135#endif
136 bool IsString() const;
137 bool IsVector() const;
138
139 void PrintValue(void);
140
141 void SetFalse(void);
142 void SetTrue(void);
143
144 int arraysize(void) const;
145 size_t size(void) const;
146
147 bool booleanNumericValue(void);
148 bool booleanValue(void) const;
149
150#ifdef WITH_SCRIPT_ENGINE
151 str& getName(void);
152
153 short3& GetKey();
154 void SetKey(const short3& key);
155#endif
156
157 Entity *entityValue(void);
158
159 void evalArrayAt(ScriptVariable& var);
160
161 void setArrayAt(ScriptVariable& index, ScriptVariable& value);
162 void setArrayAtRef(ScriptVariable& index, ScriptVariable& value);
163 void setArrayRefValue(ScriptVariable& var);
164
165 char charValue(void) const;
166 void setCharValue(char newvalue);
167
168 ScriptVariable *constArrayValue(void);
169 void setConstArrayValue(ScriptVariable *pVar, unsigned int size);
170
171#ifdef WITH_SCRIPT_ENGINE
172 const_str constStringValue(void) const;
173 void setConstStringValue(const_str s);
174#endif
175
176 void setContainerValue(Container<SafePtr<Listener>> *newvalue);
177 void setSafeContainerValue(ContainerClass<SafePtr<Listener>> *newvalue);
178
179 float floatValue(void) const;
180 void setFloatValue(float newvalue);
181
182 int intValue(void) const;
183 void setIntValue(int newvalue);
184
185 Listener *listenerValue(void) const;
186 Listener *listenerAt(uintptr_t index) const;
187 void setListenerValue(Listener *newvalue);
188
189 void newPointer(void);
190 void setPointer(const ScriptVariable& newvalue);
191
192 void setRefValue(ScriptVariable *ref);
193
194 //const char *stringValue( void );
195 str stringValue(void) const;
196 void setStringValue(str newvalue);
197
198#ifdef WITH_SCRIPT_ENGINE
199 SimpleEntity *simpleEntityValue(void) const;
200#endif
201
202 Vector vectorValue(void) const;
203 void setVectorValue(const Vector& newvector);
204
205 class PathNode *pathNodeValue(void) const;
206 class Waypoint *waypointValue(void) const;
207
208 void greaterthan(ScriptVariable& variable);
209 void greaterthanorequal(ScriptVariable& variable);
210 void lessthan(ScriptVariable& variable);
211 void lessthanorequal(ScriptVariable& variable);
212
213 void complement(void);
214 void minus(void);
215 ScriptVariable& operator=(const ScriptVariable& variable);
216 ScriptVariable& operator=(ScriptVariable&& variable);
217 ScriptVariable& operator[](ScriptVariable& index);
218 ScriptVariable *operator[](unsigned index) const;
219 ScriptVariable *operator*();
220 void operator+=(const ScriptVariable& value);
221 void operator-=(const ScriptVariable& value);
222 void operator*=(const ScriptVariable& value);
223 void operator/=(const ScriptVariable& value);
224 void operator%=(const ScriptVariable& value);
225 void operator&=(const ScriptVariable& value);
226 void operator^=(const ScriptVariable& value);
227 void operator|=(const ScriptVariable& value);
228 void operator<<=(const ScriptVariable& value);
229 void operator>>=(const ScriptVariable& value);
230
231 bool operator!=(const ScriptVariable& value);
232 bool operator==(const ScriptVariable& value);
233
234 ScriptVariable operator++(int);
235 ScriptVariable operator--(int);
236
237 void Archive(Archiver& arc);
238 static void Archive(Archiver& arc, ScriptVariable **obj);
239 void ArchiveInternal(Archiver& arc);
240
241 void MakePrimitive();
242};
243
244class ScriptArrayHolder : public LightClass
245{
246public:
248 unsigned int refCount;
249
250public:
251 ScriptArrayHolder();
252
253 void Archive(Archiver& arc);
254 static void Archive(Archiver& arc, ScriptArrayHolder *& arrayValue);
255};
256
257class ScriptConstArrayHolder : public LightClass
258{
259public:
260 ScriptVariable *constArrayValue;
261 unsigned int refCount;
262 unsigned int size;
263
264public:
265 void Archive(Archiver& arc);
266 static void Archive(Archiver& arc, ScriptConstArrayHolder *& constArrayValue);
267
268 ScriptConstArrayHolder(ScriptVariable *pVar, unsigned int size);
269 ScriptConstArrayHolder(unsigned int size);
270 ScriptConstArrayHolder();
271 ~ScriptConstArrayHolder();
272};
273
275{
276public:
278
279public:
280 void Archive(Archiver& arc);
281 static void Archive(Archiver& arc, ScriptPointer *& pointerValue);
282
283 void Clear();
284
285 void add(ScriptVariable *var);
286 void remove(ScriptVariable *var);
287 void setValue(const ScriptVariable& var);
288};
289
290#ifdef WITH_SCRIPT_ENGINE
291
292template<>
294{
297
298private:
299 con_set_Entry *next;
300
301public:
302 ScriptVariable value;
303
304public:
305 void *operator new(size_t size) { return con_set<short3, ScriptVariable>::NewEntry(size); }
306
307 void operator delete(void *ptr) { con_set<short3, ScriptVariable>::DeleteEntry(ptr); }
308
309# ifdef ARCHIVE_SUPPORTED
310 void Archive(Archiver& arc) { value.Archive(arc); }
311# endif
312 short3& GetKey() { return value.GetKey(); }
313
314 void SetKey(const short3& newKey) { value.SetKey(newKey); }
315};
316
317class ScriptVariableList : public Class
318{
319private:
320 con_set<short3, ScriptVariable> list;
321
322public:
323 CLASS_PROTOTYPE(ScriptVariableList);
324
325 ScriptVariableList();
326
327 void ClearList(void);
328 int size() const;
329
330 ScriptVariable *GetOrCreateVariable(str name);
331 ScriptVariable *GetOrCreateVariable(unsigned int name);
332
333 ScriptVariable *GetVariable(str name) const;
334 ScriptVariable *GetVariable(unsigned int name) const;
335 bool VariableExists(str name) const;
336
337 ScriptVariable *SetVariable(const char *name, int value);
338 ScriptVariable *SetVariable(const char *name, float value);
339 ScriptVariable *SetVariable(const char *name, const char *value);
340 ScriptVariable *SetVariable(const char *name, Entity *value);
341 ScriptVariable *SetVariable(const char *name, Listener *value);
342 ScriptVariable *SetVariable(const char *name, Vector& value);
343 ScriptVariable *SetVariable(const char *name, ScriptVariable& value);
344 ScriptVariable *SetVariable(unsigned int name, ScriptVariable& value);
345 ScriptVariable *SetVariable(unsigned int name, ScriptVariable&& value);
346
347 void Archive(Archiver& arc) override;
348 void Print(void (*PrintFn)(const char *format, ...));
349 void MakePrimitive();
350};
351
352#endif
Definition archive.h:86
Definition class.h:276
Definition containerclass.h:32
Definition container.h:85
Definition entity.h:203
Definition lightclass.h:30
Definition listener.h:450
Definition navigate.h:153
Definition safeptr.h:160
Definition scriptvariable.h:245
Definition scriptvariable.h:258
Definition scriptvariable.h:275
Definition scriptvariable.h:75
Definition simpleentity.h:42
Definition vector.h:61
Definition misc.h:320
Definition con_set.h:547
Definition con_set.h:87
Definition con_set.h:462
Definition con_set.h:119
Definition short3.h:38
Definition str.h:77