openmohaa/code/script/scriptvariable.cpp

2598 lines
68 KiB
C++
Raw Normal View History

2016-03-27 11:49:47 +02:00
/*
===========================================================================
Copyright (C) 2023 the OpenMoHAA team
2016-03-27 11:49:47 +02:00
This file is part of OpenMoHAA source code.
OpenMoHAA source code 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.
OpenMoHAA source code 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 OpenMoHAA source code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
===========================================================================
*/
// scriptvariable.cpp : Dynamic variables for scripts
#include "scriptvariable.h"
2023-01-29 20:59:31 +01:00
#include "scriptexception.h"
#include "../qcommon/str.h"
#include "../qcommon/con_set.h"
2016-03-27 11:49:47 +02:00
#ifdef GAME_DLL
2023-07-05 21:23:39 +02:00
# include "../fgame/archive.h"
# include "../fgame/g_local.h"
# include "../fgame/navigate.h"
2016-03-27 11:49:47 +02:00
#endif
#ifdef WITH_SCRIPT_ENGINE
# include "../fgame/worldspawn.h"
2023-07-05 21:23:39 +02:00
# include "../fgame/scriptmaster.h"
# include "../fgame/simpleentity.h"
2016-03-27 11:49:47 +02:00
#endif
2023-02-07 20:50:26 +01:00
#include <utility>
2016-03-27 11:49:47 +02:00
template<>
2023-07-05 21:23:39 +02:00
int HashCode<ScriptVariable>(const ScriptVariable& key)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
#if defined(GAME_DLL)
Entity *e;
2016-03-27 11:49:47 +02:00
#endif
2023-07-05 21:23:39 +02:00
switch (key.GetType()) {
case VARIABLE_STRING:
case VARIABLE_CONSTSTRING:
return HashCode<str>(key.stringValue());
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER:
return key.m_data.intValue;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
#if defined(GAME_DLL)
case VARIABLE_LISTENER:
e = (Entity *)key.listenerValue();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (checkInheritance(&Entity::ClassInfo, e->classinfo())) {
return e->entnum;
}
2016-03-27 11:49:47 +02:00
#endif
2023-07-05 21:23:39 +02:00
default:
throw ScriptException("Bad hash code value: %s", key.stringValue().c_str());
}
2016-03-27 11:49:47 +02:00
}
2023-01-29 20:59:31 +01:00
#if defined(ARCHIVE_SUPPORTED)
2016-03-27 11:49:47 +02:00
template<>
void con_set<ScriptVariable, ScriptVariable>::Entry::Archive(Archiver& arc)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
key.ArchiveInternal(arc);
value.ArchiveInternal(arc);
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptArrayHolder::Archive(Archiver& arc)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
arc.ArchiveUnsigned(&refCount);
arrayValue.Archive(arc);
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptArrayHolder::Archive(Archiver& arc, ScriptArrayHolder *& arrayValue)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
qboolean newRef;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (arc.Loading()) {
arc.ArchiveBoolean(&newRef);
} else {
newRef = !arc.ObjectPositionExists(arrayValue);
arc.ArchiveBoolean(&newRef);
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (newRef) {
if (arc.Loading()) {
arrayValue = new ScriptArrayHolder();
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
arc.ArchiveObjectPosition(arrayValue);
arrayValue->Archive(arc);
return;
} else {
arc.ArchiveObjectPointer((LightClass **)&arrayValue);
2023-07-05 21:23:39 +02:00
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptConstArrayHolder::Archive(Archiver& arc)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
arc.ArchiveUnsigned(&refCount);
arc.ArchiveUnsigned(&size);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (arc.Loading()) {
constArrayValue = new ScriptVariable[size + 1] - 1;
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
for (unsigned int i = 1; i <= size; i++) {
constArrayValue[i].ArchiveInternal(arc);
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptConstArrayHolder::Archive(Archiver& arc, ScriptConstArrayHolder *& constArrayValue)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
qboolean newRef;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (arc.Loading()) {
arc.ArchiveBoolean(&newRef);
} else {
newRef = !arc.ObjectPositionExists(constArrayValue);
arc.ArchiveBoolean(&newRef);
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (newRef) {
if (arc.Loading()) {
constArrayValue = new ScriptConstArrayHolder();
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
arc.ArchiveObjectPosition(constArrayValue);
constArrayValue->Archive(arc);
return;
} else {
arc.ArchiveObjectPointer((LightClass **)&constArrayValue);
2023-07-05 21:23:39 +02:00
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptPointer::Archive(Archiver& arc)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
list.Archive(arc, ScriptVariable::Archive);
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptPointer::Archive(Archiver& arc, ScriptPointer *& pointerValue)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
qboolean newRef;
if (arc.Loading()) {
arc.ArchiveBoolean(&newRef);
} else {
newRef = !arc.ObjectPositionExists(pointerValue);
arc.ArchiveBoolean(&newRef);
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (newRef) {
if (arc.Loading()) {
pointerValue = new ScriptPointer();
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
arc.ArchiveObjectPosition(pointerValue);
pointerValue->Archive(arc);
return;
} else {
arc.ArchiveObjectPointer((LightClass **)&pointerValue);
2023-07-05 21:23:39 +02:00
}
2016-03-27 11:49:47 +02:00
}
2023-01-29 20:59:31 +01:00
void ScriptVariable::Archive(Archiver& arc)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
# ifdef WITH_SCRIPT_ENGINE
const_str s;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (arc.Loading()) {
Director.ArchiveString(arc, s);
key = s;
} else {
s = key;
Director.ArchiveString(arc, s);
}
# endif
ArchiveInternal(arc);
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::Archive(Archiver& arc, ScriptVariable **obj)
2016-03-27 11:49:47 +02:00
{
arc.ArchiveObjectPointer((LightClass **)obj);
2016-03-27 11:49:47 +02:00
}
2023-01-29 20:59:31 +01:00
void ScriptVariable::ArchiveInternal(Archiver& arc)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
arc.ArchiveObjectPosition(this);
arc.ArchiveByte(&type);
switch (type) {
case VARIABLE_STRING:
if (arc.Loading()) {
2023-09-04 22:06:13 +02:00
m_data.stringValue = new str;
2023-07-05 21:23:39 +02:00
}
arc.ArchiveString(m_data.stringValue);
break;
case VARIABLE_INTEGER:
arc.ArchiveInteger(&m_data.intValue);
break;
case VARIABLE_FLOAT:
arc.ArchiveFloat(&m_data.floatValue);
break;
case VARIABLE_CHAR:
arc.ArchiveChar(&m_data.charValue);
break;
# ifdef WITH_SCRIPT_ENGINE
case VARIABLE_CONSTSTRING:
if (arc.Loading()) {
str s;
arc.ArchiveString(&s);
m_data.intValue = Director.AddString(s);
} else {
str s = Director.GetString(m_data.intValue);
arc.ArchiveString(&s);
}
break;
# endif
case VARIABLE_LISTENER:
if (arc.Loading()) {
m_data.listenerValue = new SafePtr<Listener>;
}
arc.ArchiveSafePointer(m_data.listenerValue);
break;
case VARIABLE_ARRAY:
ScriptArrayHolder::Archive(arc, m_data.arrayValue);
break;
case VARIABLE_CONSTARRAY:
ScriptConstArrayHolder::Archive(arc, m_data.constArrayValue);
break;
case VARIABLE_REF:
case VARIABLE_CONTAINER:
arc.ArchiveObjectPointer((LightClass **)&m_data.refValue);
2023-07-05 21:23:39 +02:00
break;
case VARIABLE_SAFECONTAINER:
if (arc.Loading()) {
m_data.safeContainerValue = new SafePtr<ConList>;
}
arc.ArchiveSafePointer(m_data.safeContainerValue);
break;
case VARIABLE_POINTER:
ScriptPointer::Archive(arc, m_data.pointerValue);
break;
case VARIABLE_VECTOR:
if (arc.Loading()) {
m_data.vectorValue = new float[3];
}
arc.ArchiveVec3(m_data.vectorValue);
break;
default:
break;
}
2016-03-27 11:49:47 +02:00
}
2024-02-28 22:52:25 +01:00
void ScriptVariable::MakePrimitive()
{
switch (type) {
case VARIABLE_LISTENER:
case VARIABLE_REF:
case VARIABLE_CONTAINER:
case VARIABLE_SAFECONTAINER:
Com_Error(ERR_DROP, "^~^~^ game.%s cannot be archived since it is of type '%s'.", getName().c_str(), GetTypeName());
Clear();
break;
}
}
2023-01-29 20:59:31 +01:00
#endif
2023-08-18 01:42:10 +02:00
ScriptArrayHolder::ScriptArrayHolder()
2023-10-01 22:47:25 +02:00
: refCount(0)
{}
2023-08-18 01:42:10 +02:00
2023-07-05 21:23:39 +02:00
ScriptConstArrayHolder::ScriptConstArrayHolder(ScriptVariable *pVar, unsigned int size)
2023-01-29 20:59:31 +01:00
{
2023-07-05 21:23:39 +02:00
refCount = 0;
this->size = size;
2023-01-29 20:59:31 +01:00
2023-07-05 21:23:39 +02:00
constArrayValue = new ScriptVariable[size + 1] - 1;
2023-01-29 20:59:31 +01:00
2023-07-05 21:23:39 +02:00
for (unsigned int i = 1; i <= size; i++) {
constArrayValue[i] = pVar[i];
}
2023-01-29 20:59:31 +01:00
}
ScriptConstArrayHolder::ScriptConstArrayHolder(unsigned int size)
{
2023-07-05 21:23:39 +02:00
refCount = 0;
this->size = size;
2023-01-29 20:59:31 +01:00
2023-07-05 21:23:39 +02:00
constArrayValue = new ScriptVariable[size + 1] - 1;
2023-01-29 20:59:31 +01:00
}
ScriptConstArrayHolder::ScriptConstArrayHolder()
{
2023-07-05 21:23:39 +02:00
refCount = 0;
size = 0;
constArrayValue = NULL;
2023-01-29 20:59:31 +01:00
}
ScriptConstArrayHolder::~ScriptConstArrayHolder()
{
2023-07-05 21:23:39 +02:00
if (constArrayValue) {
ScriptVariable *const offset = constArrayValue + 1;
delete[] offset;
}
2023-01-29 20:59:31 +01:00
}
void ScriptPointer::Clear()
{
2023-07-05 21:23:39 +02:00
for (int i = 0; i < list.NumObjects(); i++) {
ScriptVariable *variable = list[i];
2023-01-29 20:59:31 +01:00
2023-07-05 21:23:39 +02:00
variable->type = 0;
}
2023-01-29 20:59:31 +01:00
2023-07-05 21:23:39 +02:00
delete this;
2023-01-29 20:59:31 +01:00
}
2023-07-05 21:23:39 +02:00
void ScriptPointer::add(ScriptVariable *var)
2023-01-29 20:59:31 +01:00
{
2023-07-05 21:23:39 +02:00
list.AddObject(var);
2023-01-29 20:59:31 +01:00
}
2023-07-05 21:23:39 +02:00
void ScriptPointer::remove(ScriptVariable *var)
2023-01-29 20:59:31 +01:00
{
2023-07-05 21:23:39 +02:00
list.RemoveObject(var);
2023-01-29 20:59:31 +01:00
if (list.NumObjects() == 0) {
2023-07-05 21:23:39 +02:00
delete this;
}
2023-01-29 20:59:31 +01:00
}
2023-07-05 21:23:39 +02:00
void ScriptPointer::setValue(const ScriptVariable& var)
2023-01-29 20:59:31 +01:00
{
2023-07-05 21:23:39 +02:00
int i;
ScriptVariable *pVar;
2023-01-29 20:59:31 +01:00
2023-10-01 22:47:25 +02:00
if (var.type == VARIABLE_POINTER) {
for (i = list.NumObjects(); i > 0; i--) {
pVar = list.ObjectAt(i);
2023-01-29 20:59:31 +01:00
pVar->m_data.pointerValue = var.m_data.pointerValue;
var.m_data.pointerValue->add(pVar);
}
2023-10-01 22:47:25 +02:00
} else {
for (i = list.NumObjects(); i > 0; i--) {
pVar = list.ObjectAt(i);
pVar->type = 0;
2023-10-01 22:47:25 +02:00
*pVar = var;
}
2023-07-05 21:23:39 +02:00
}
2023-01-29 20:59:31 +01:00
2023-07-05 21:23:39 +02:00
delete this;
2023-01-29 20:59:31 +01:00
}
ScriptVariable::ScriptVariable()
{
#if defined(GAME_DLL)
2023-07-05 21:23:39 +02:00
key = 0;
2023-01-29 20:59:31 +01:00
#endif
2023-07-05 21:23:39 +02:00
type = 0;
m_data.pointerValue = NULL;
2023-01-29 20:59:31 +01:00
}
2023-02-07 20:50:26 +01:00
ScriptVariable::ScriptVariable(const ScriptVariable& variable)
2023-01-29 20:59:31 +01:00
{
2023-07-05 21:23:39 +02:00
type = 0;
m_data.pointerValue = NULL;
2023-01-29 20:59:31 +01:00
2023-07-05 21:23:39 +02:00
*this = variable;
2023-01-29 20:59:31 +01:00
}
2023-02-07 20:50:26 +01:00
ScriptVariable::ScriptVariable(ScriptVariable&& variable)
{
#if defined(GAME_DLL)
2023-07-05 21:23:39 +02:00
key = variable.GetKey();
variable.key = 0;
2023-02-07 20:50:26 +01:00
#endif
2023-07-05 21:23:39 +02:00
type = variable.GetType();
m_data = variable.m_data;
variable.type = VARIABLE_NONE;
2023-02-07 20:50:26 +01:00
}
2023-01-29 20:59:31 +01:00
ScriptVariable::~ScriptVariable()
{
2023-07-05 21:23:39 +02:00
ClearInternal();
2023-01-29 20:59:31 +01:00
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
void ScriptVariable::CastBoolean(void)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
int newvalue = booleanValue();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
ClearInternal();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
type = VARIABLE_INTEGER;
m_data.intValue = newvalue;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::CastConstArrayValue(void)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
con_map_enum<ScriptVariable, ScriptVariable> en;
ScriptConstArrayHolder *constArrayValue;
ScriptVariable *value;
int i;
ConList *listeners;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
switch (GetType()) {
case VARIABLE_POINTER:
ClearPointerInternal();
case VARIABLE_NONE:
throw ScriptException("cannot cast NIL to an array");
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_CONSTARRAY:
return;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_ARRAY:
constArrayValue = new ScriptConstArrayHolder(m_data.arrayValue->arrayValue.size());
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
en = m_data.arrayValue->arrayValue;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
i = 0;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
for (value = en.NextValue(); value != NULL; value = en.NextValue()) {
i++;
constArrayValue->constArrayValue[i] = *value;
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_CONTAINER:
constArrayValue = new ScriptConstArrayHolder(m_data.containerValue->NumObjects());
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
for (int i = m_data.containerValue->NumObjects(); i > 0; i--) {
constArrayValue->constArrayValue[i].setListenerValue(m_data.containerValue->ObjectAt(i));
}
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_SAFECONTAINER:
listeners = *m_data.safeContainerValue;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (listeners) {
constArrayValue = new ScriptConstArrayHolder(listeners->NumObjects());
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
for (int i = listeners->NumObjects(); i > 0; i--) {
constArrayValue->constArrayValue[i].setListenerValue(listeners->ObjectAt(i));
}
} else {
constArrayValue = new ScriptConstArrayHolder(0);
}
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
default:
constArrayValue = new ScriptConstArrayHolder(1);
constArrayValue->constArrayValue[1] = *this;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
break;
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
ClearInternal();
type = VARIABLE_CONSTARRAY;
m_data.constArrayValue = constArrayValue;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::CastEntity(void)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
setListenerValue((Listener *)entityValue());
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::CastFloat(void)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
setFloatValue(floatValue());
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::CastInteger(void)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
setIntValue(intValue());
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::CastString(void)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
setStringValue(stringValue());
2016-03-27 11:49:47 +02:00
}
void ScriptVariable::Clear()
{
2023-07-05 21:23:39 +02:00
ClearInternal();
type = 0;
2016-03-27 11:49:47 +02:00
}
void ScriptVariable::ClearInternal()
{
2023-07-05 21:23:39 +02:00
switch (GetType()) {
case VARIABLE_STRING:
if (m_data.stringValue) {
delete m_data.stringValue;
m_data.stringValue = NULL;
}
break;
case VARIABLE_ARRAY:
if (m_data.arrayValue->refCount) {
m_data.arrayValue->refCount--;
} else {
delete m_data.arrayValue;
}
m_data.arrayValue = NULL;
break;
case VARIABLE_CONSTARRAY:
if (m_data.constArrayValue->refCount) {
m_data.constArrayValue->refCount--;
} else {
delete m_data.constArrayValue;
}
m_data.constArrayValue = NULL;
break;
2023-10-01 22:47:25 +02:00
case VARIABLE_LISTENER:
if (m_data.listenerValue) {
delete m_data.listenerValue;
m_data.listenerValue = NULL;
}
2023-10-01 22:47:25 +02:00
break;
2023-07-05 21:23:39 +02:00
case VARIABLE_SAFECONTAINER:
if (m_data.safeContainerValue) {
delete m_data.safeContainerValue;
m_data.safeContainerValue = NULL;
2023-07-05 21:23:39 +02:00
}
break;
case VARIABLE_POINTER:
m_data.pointerValue->remove(this);
m_data.pointerValue = NULL;
break;
case VARIABLE_VECTOR:
delete[] m_data.vectorValue;
m_data.vectorValue = NULL;
break;
default:
break;
}
2016-03-27 11:49:47 +02:00
}
void ScriptVariable::ClearPointer()
{
2023-07-05 21:23:39 +02:00
if (type == VARIABLE_POINTER) {
return ClearPointerInternal();
}
2016-03-27 11:49:47 +02:00
}
void ScriptVariable::ClearPointerInternal() const
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
m_data.pointerValue->Clear();
2016-03-27 11:49:47 +02:00
}
const char *ScriptVariable::GetTypeName() const
{
2023-07-05 21:23:39 +02:00
return typenames[type];
2016-03-27 11:49:47 +02:00
}
variabletype ScriptVariable::GetType() const
{
2023-07-05 21:23:39 +02:00
return (variabletype)type;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
qboolean ScriptVariable::IsEntity(void)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
if (type == VARIABLE_LISTENER) {
2023-04-30 01:42:36 +02:00
if (!m_data.listenerValue->Pointer()
2023-07-05 21:23:39 +02:00
#if defined(GAME_DLL)
|| checkInheritance(Entity::classinfostatic(), m_data.listenerValue->Pointer()->classinfo())
2016-03-27 11:49:47 +02:00
#endif
2023-07-05 21:23:39 +02:00
) {
return true;
}
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return false;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
qboolean ScriptVariable::IsListener(void)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
return type == VARIABLE_LISTENER;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
qboolean ScriptVariable::IsNumeric(void)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
return type == VARIABLE_INTEGER || type == VARIABLE_FLOAT;
2016-03-27 11:49:47 +02:00
}
2023-02-02 23:48:04 +01:00
qboolean ScriptVariable::IsConstArray() const
{
2023-07-05 21:23:39 +02:00
return type == VARIABLE_CONSTARRAY || type == VARIABLE_CONTAINER || type == VARIABLE_SAFECONTAINER;
2023-02-02 23:48:04 +01:00
}
#ifdef WITH_SCRIPT_ENGINE
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
qboolean ScriptVariable::IsSimpleEntity(void)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
if (type == VARIABLE_LISTENER) {
if (!m_data.listenerValue->Pointer()
|| checkInheritance(&SimpleEntity::ClassInfo, m_data.listenerValue->Pointer()->classinfo())) {
return true;
}
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return false;
2016-03-27 11:49:47 +02:00
}
#endif
2023-07-05 21:23:39 +02:00
qboolean ScriptVariable::IsString(void)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
return (type == VARIABLE_STRING || type == VARIABLE_CONSTSTRING);
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
qboolean ScriptVariable::IsVector(void)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
return type == VARIABLE_VECTOR;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::PrintValue(void)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
switch (GetType()) {
case VARIABLE_NONE:
printf("None");
break;
2016-03-27 11:49:47 +02:00
#ifdef WITH_SCRIPT_ENGINE
2023-07-05 21:23:39 +02:00
case VARIABLE_CONSTSTRING:
printf("%s", Director.GetString(m_data.intValue).c_str());
break;
2016-03-27 11:49:47 +02:00
#endif
2023-07-05 21:23:39 +02:00
case VARIABLE_STRING:
printf("%s", m_data.stringValue->c_str());
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER:
printf("%d", m_data.intValue);
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT:
printf("%f", m_data.floatValue);
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_CHAR:
printf("%c", m_data.charValue);
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_LISTENER:
printf("<Listener>%p", m_data.listenerValue->Pointer());
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_REF:
case VARIABLE_ARRAY:
case VARIABLE_CONSTARRAY:
case VARIABLE_CONTAINER:
case VARIABLE_SAFECONTAINER:
case VARIABLE_POINTER:
printf("type: %s", GetTypeName());
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_VECTOR:
printf("( %f %f %f )", m_data.vectorValue[0], m_data.vectorValue[1], m_data.vectorValue[2]);
break;
default:
printf("unknown");
break;
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::SetFalse(void)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
setIntValue(0);
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::SetTrue(void)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
setIntValue(1);
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
int ScriptVariable::arraysize(void) const
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
switch (GetType()) {
case VARIABLE_NONE:
return -1;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_ARRAY:
return m_data.arrayValue->arrayValue.size();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_CONSTARRAY:
return m_data.constArrayValue->size;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_CONTAINER:
return m_data.containerValue->NumObjects();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_SAFECONTAINER:
if (*m_data.safeContainerValue) {
return (*m_data.safeContainerValue)->NumObjects();
} else {
return 0;
2023-10-01 22:47:25 +02:00
}
2023-10-01 22:47:25 +02:00
case VARIABLE_POINTER:
ClearPointerInternal();
2023-10-01 22:47:25 +02:00
return -1;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
default:
return 1;
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return 0;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
size_t ScriptVariable::size(void) const
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
switch (GetType()) {
case VARIABLE_NONE:
2023-07-05 21:23:39 +02:00
return -1;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_CONSTSTRING:
case VARIABLE_STRING:
return stringValue().length();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_LISTENER:
return *m_data.listenerValue != NULL;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_ARRAY:
return m_data.arrayValue->arrayValue.size();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_CONSTARRAY:
return m_data.constArrayValue->size;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_CONTAINER:
return m_data.containerValue->NumObjects();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_SAFECONTAINER:
if (*m_data.safeContainerValue) {
return (*m_data.safeContainerValue)->NumObjects();
} else {
return 0;
2023-10-01 22:47:25 +02:00
}
2023-10-01 22:47:25 +02:00
case VARIABLE_POINTER:
ClearPointerInternal();
2023-10-01 22:47:25 +02:00
return -1;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
default:
return 1;
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return 0;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
bool ScriptVariable::booleanNumericValue(void)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
str value;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
switch (GetType()) {
case VARIABLE_STRING:
case VARIABLE_CONSTSTRING:
value = stringValue();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return atoi(value.c_str()) ? true : false;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER:
return m_data.intValue != 0;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT:
return fabs(m_data.floatValue) >= 0.00009999999747378752;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_LISTENER:
return (*m_data.listenerValue) != NULL;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
default:
throw ScriptException("Cannot cast '%s' to boolean numeric", GetTypeName());
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return true;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
bool ScriptVariable::booleanValue(void) const
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
switch (GetType()) {
case VARIABLE_NONE:
return false;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_STRING:
if (m_data.stringValue) {
return m_data.stringValue->length() != 0;
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return false;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER:
return m_data.intValue != 0;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT:
return fabs(m_data.floatValue) >= 0.00009999999747378752;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_CONSTSTRING:
return m_data.intValue != STRING_EMPTY;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_LISTENER:
return (*m_data.listenerValue) != NULL;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
default:
return true;
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
char ScriptVariable::charValue(void) const
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
str value;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
switch (GetType()) {
case VARIABLE_CHAR:
return m_data.charValue;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_CONSTSTRING:
case VARIABLE_STRING:
value = stringValue();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (value.length() != 1) {
throw ScriptException("Cannot cast string not of length 1 to char");
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return *value;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
default:
throw ScriptException("Cannot cast '%s' to char", GetTypeName());
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return 0;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
ScriptVariable *ScriptVariable::constArrayValue(void)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
return m_data.constArrayValue->constArrayValue;
2016-03-27 11:49:47 +02:00
}
#ifdef WITH_SCRIPT_ENGINE
2016-03-27 11:49:47 +02:00
str getname_null = "";
2023-07-05 21:23:39 +02:00
str& ScriptVariable::getName(void)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
return Director.GetString(GetKey());
2016-03-27 11:49:47 +02:00
}
short3& ScriptVariable::GetKey()
{
2023-07-05 21:23:39 +02:00
return key;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::SetKey(const short3& key)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
this->key = key;
2016-03-27 11:49:47 +02:00
}
#endif
2023-07-05 21:23:39 +02:00
Entity *ScriptVariable::entityValue(void)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
#if defined(GAME_DLL)
return (Entity *)listenerValue();
2016-03-27 11:49:47 +02:00
#else
2023-07-05 21:23:39 +02:00
return NULL;
2016-03-27 11:49:47 +02:00
#endif
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::evalArrayAt(ScriptVariable& var)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
unsigned int index;
str string;
ScriptVariable *array;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
switch (GetType()) {
case VARIABLE_VECTOR:
index = var.intValue();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (index > 2) {
Clear();
throw ScriptException("Vector index '%d' out of range", index);
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return setFloatValue(m_data.vectorValue[index]);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_NONE:
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_CONSTSTRING:
case VARIABLE_STRING:
index = var.intValue();
string = stringValue();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (index >= string.length()) {
Clear();
throw ScriptException("String index %d out of range", index);
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return setCharValue(string[index]);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_LISTENER:
index = var.intValue();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (index != 1) {
Clear();
throw ScriptException("array index %d out of range", index);
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_ARRAY:
array = m_data.arrayValue->arrayValue.find(var);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (array) {
*this = *array;
} else {
Clear();
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_CONSTARRAY:
index = var.intValue();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (!index || index > m_data.constArrayValue->size) {
throw ScriptException("array index %d out of range", index);
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
*this = m_data.constArrayValue->constArrayValue[index];
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_CONTAINER:
index = var.intValue();
2016-03-27 11:49:47 +02:00
if (!index || index > m_data.containerValue->NumObjects()) {
2023-07-05 21:23:39 +02:00
throw ScriptException("array index %d out of range", index);
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
setListenerValue(m_data.containerValue->ObjectAt(index));
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_SAFECONTAINER:
index = var.intValue();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (!*m_data.safeContainerValue || !index || index > m_data.constArrayValue->size) {
throw ScriptException("array index %d out of range", index);
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
setListenerValue((*m_data.safeContainerValue)->ObjectAt(index));
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
default:
Clear();
throw ScriptException("[] applied to invalid type '%s'", typenames[GetType()]);
break;
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
float ScriptVariable::floatValue(void) const
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
const char *string;
float val;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
switch (type) {
case VARIABLE_FLOAT:
return m_data.floatValue;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER:
return (float)m_data.intValue;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
/* Transform the string into an integer if possible */
case VARIABLE_STRING:
case VARIABLE_CONSTSTRING:
string = stringValue();
val = atof((const char *)string);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return val;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
default:
throw ScriptException("Cannot cast '%s' to float", typenames[type]);
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
int ScriptVariable::intValue(void) const
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
str string;
int val;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
switch (type) {
case VARIABLE_INTEGER:
return m_data.intValue;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT:
return (int)m_data.floatValue;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_STRING:
case VARIABLE_CONSTSTRING:
string = stringValue();
val = atoi(string);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return val;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
default:
throw ScriptException("Cannot cast '%s' to int", typenames[type]);
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
Listener *ScriptVariable::listenerValue(void) const
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
switch (type) {
#ifdef WITH_SCRIPT_ENGINE
2023-07-05 21:23:39 +02:00
case VARIABLE_CONSTSTRING:
return world->GetScriptTarget(Director.GetString(m_data.intValue));
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_STRING:
return world->GetScriptTarget(stringValue());
2016-03-27 11:49:47 +02:00
#endif
2023-07-05 21:23:39 +02:00
case VARIABLE_LISTENER:
return (Listener *)m_data.listenerValue->Pointer();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
default:
throw ScriptException("Cannot cast '%s' to listener", typenames[type]);
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return NULL;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
Listener *ScriptVariable::listenerAt(uintptr_t index) const
2023-02-02 23:48:04 +01:00
{
2023-07-05 21:23:39 +02:00
switch (type) {
case VARIABLE_CONSTARRAY:
return m_data.constArrayValue->constArrayValue[index].listenerValue();
2023-02-02 23:48:04 +01:00
2023-07-05 21:23:39 +02:00
case VARIABLE_CONTAINER:
return m_data.containerValue->ObjectAt(index);
2023-02-02 23:48:04 +01:00
2023-07-05 21:23:39 +02:00
case VARIABLE_SAFECONTAINER:
assert(*m_data.safeContainerValue);
return (*m_data.safeContainerValue)->ObjectAt(index);
2023-02-02 23:48:04 +01:00
2023-07-05 21:23:39 +02:00
default:
throw ScriptException("Cannot cast '%s' to listener", typenames[type]);
}
2023-02-02 23:48:04 +01:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::newPointer(void)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
type = VARIABLE_POINTER;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
m_data.pointerValue = new ScriptPointer();
m_data.pointerValue->add(this);
2016-03-27 11:49:47 +02:00
}
#ifdef WITH_SCRIPT_ENGINE
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
SimpleEntity *ScriptVariable::simpleEntityValue(void) const
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
return (SimpleEntity *)listenerValue();
2016-03-27 11:49:47 +02:00
}
#endif
str ScriptVariable::stringValue() const
{
2023-07-05 21:23:39 +02:00
str string;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
switch (GetType()) {
case VARIABLE_NONE:
return "NIL";
2016-03-27 11:49:47 +02:00
#ifdef WITH_SCRIPT_ENGINE
2023-07-05 21:23:39 +02:00
case VARIABLE_CONSTSTRING:
return Director.GetString(m_data.intValue);
2016-03-27 11:49:47 +02:00
#endif
2023-07-05 21:23:39 +02:00
case VARIABLE_STRING:
return *m_data.stringValue;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER:
return str(m_data.intValue);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT:
return str(m_data.floatValue);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_CHAR:
return str(m_data.charValue);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_LISTENER:
if (m_data.listenerValue->Pointer()) {
#ifdef WITH_SCRIPT_ENGINE
2023-07-05 21:23:39 +02:00
if (m_data.listenerValue->Pointer()->isSubclassOf(SimpleEntity)) {
SimpleEntity *s = (SimpleEntity *)m_data.listenerValue->Pointer();
return s->targetname;
} else {
string = "class '" + str(m_data.listenerValue->Pointer()->getClassname()) + "'";
return string;
}
2016-03-27 11:49:47 +02:00
#else
2023-07-05 21:23:39 +02:00
string = "class '" + str(m_data.listenerValue->Pointer()->getClassname()) + "'";
return string;
2016-03-27 11:49:47 +02:00
#endif
2023-07-05 21:23:39 +02:00
} else {
return "NULL";
}
case VARIABLE_VECTOR:
return str("( ") + str(m_data.vectorValue[0]) + str(" ") + str(m_data.vectorValue[1]) + str(" ")
+ str(m_data.vectorValue[2]) + str(" )");
default:
throw ScriptException("Cannot cast '%s' to string", typenames[GetType()]);
break;
}
return "";
}
Vector ScriptVariable::vectorValue(void) const
{
const char *string;
float x = 0.f, y = 0.f, z = 0.f;
switch (type) {
case VARIABLE_VECTOR:
return Vector(m_data.vectorValue);
case VARIABLE_CONSTSTRING:
case VARIABLE_STRING:
string = stringValue();
if (strcmp(string, "") == 0) {
throw ScriptException("cannot cast empty string to vector");
}
if (*string == '(') {
if (sscanf(string, "(%f %f %f)", &x, &y, &z) != 3) {
if (sscanf(string, "(%f, %f, %f)", &x, &y, &z) != 3) {
throw ScriptException("Couldn't convert string to vector - malformed string '%s'", string);
}
}
} else {
if (sscanf(string, "%f %f %f", &x, &y, &z) != 3) {
if (sscanf(string, "%f, %f, %f", &x, &y, &z) != 3) {
throw ScriptException("Couldn't convert string to vector - malformed string '%s'", string);
}
}
}
return Vector(x, y, z);
case VARIABLE_LISTENER:
{
if (!m_data.listenerValue->Pointer()) {
throw ScriptException("Cannot cast NULL to vector");
}
2016-03-27 11:49:47 +02:00
#ifdef WITH_SCRIPT_ENGINE
2023-07-05 21:23:39 +02:00
if (!checkInheritance(&SimpleEntity::ClassInfo, m_data.listenerValue->Pointer()->classinfo())) {
throw ScriptException("Cannot cast '%s' to vector", GetTypeName());
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
SimpleEntity *ent = (SimpleEntity *)m_data.listenerValue->Pointer();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return Vector(ent->origin[0], ent->origin[1], ent->origin[2]);
2016-03-27 11:49:47 +02:00
#else
2023-07-05 21:23:39 +02:00
throw ScriptException("Cannot cast '%s' to vector", GetTypeName());
2016-03-27 11:49:47 +02:00
#endif
2023-07-05 21:23:39 +02:00
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
default:
throw ScriptException("Cannot cast '%s' to vector", GetTypeName());
}
2016-03-27 11:49:47 +02:00
}
#ifdef GAME_DLL
2023-07-05 21:23:39 +02:00
PathNode *ScriptVariable::pathNodeValue(void) const
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
Listener *node = listenerValue();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (!node) {
throw ScriptException("listener is NULL");
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (!node->isSubclassOf(PathNode)) {
throw ScriptException("listener is not a path node");
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return (PathNode *)node;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
Waypoint *ScriptVariable::waypointValue(void) const
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
Listener *node = listenerValue();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (!node) {
throw ScriptException("listener is NULL");
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (!node->isSubclassOf(Waypoint)) {
throw ScriptException("listener is not a way point");
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return (Waypoint *)node;
2016-03-27 11:49:47 +02:00
}
#endif
2023-07-05 21:23:39 +02:00
void ScriptVariable::setArrayAt(ScriptVariable& index, ScriptVariable& value)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
return m_data.refValue->setArrayAtRef(index, value);
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::setArrayAtRef(ScriptVariable& index, ScriptVariable& value)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
unsigned int intValue;
str string;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
switch (type) {
case VARIABLE_VECTOR:
intValue = index.intValue();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (intValue > 2) {
throw ScriptException("Vector index '%d' out of range", intValue);
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
m_data.vectorValue[intValue] = value.floatValue();
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_REF:
return;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_NONE:
type = VARIABLE_ARRAY;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
m_data.arrayValue = new ScriptArrayHolder;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (value.GetType() != VARIABLE_NONE) {
m_data.arrayValue->arrayValue[index] = value;
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_ARRAY:
if (value.GetType() == VARIABLE_NONE) {
m_data.arrayValue->arrayValue.remove(index);
} else {
m_data.arrayValue->arrayValue[index] = value;
}
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_STRING:
case VARIABLE_CONSTSTRING:
intValue = index.intValue();
string = stringValue();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (intValue >= strlen(string)) {
throw ScriptException("String index '%d' out of range", intValue);
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
string[intValue] = value.charValue();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
setStringValue(string);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_CONSTARRAY:
intValue = index.intValue();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (!intValue || intValue > m_data.constArrayValue->size) {
throw ScriptException("array index %d out of range", intValue);
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (value.GetType()) {
m_data.constArrayValue->constArrayValue[intValue] = value;
} else {
m_data.constArrayValue->constArrayValue[intValue].Clear();
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
default:
throw ScriptException("[] applied to invalid type '%s'\n", typenames[GetType()]);
break;
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::setArrayRefValue(ScriptVariable& var)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
setRefValue(&(*m_data.refValue)[var]);
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::setCharValue(char newvalue)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
ClearInternal();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
type = VARIABLE_CHAR;
m_data.charValue = newvalue;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::setContainerValue(Container<SafePtr<Listener>> *newvalue)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
ClearInternal();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
type = VARIABLE_CONTAINER;
m_data.containerValue = newvalue;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::setSafeContainerValue(ConList *newvalue)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
ClearInternal();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (newvalue) {
type = VARIABLE_SAFECONTAINER;
m_data.safeContainerValue = new SafePtr<ConList>(newvalue);
} else {
type = VARIABLE_NONE;
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::setConstArrayValue(ScriptVariable *pVar, unsigned int size)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
ScriptConstArrayHolder *constArray = new ScriptConstArrayHolder(pVar - 1, size);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
ClearInternal();
type = VARIABLE_CONSTARRAY;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
m_data.constArrayValue = constArray;
2016-03-27 11:49:47 +02:00
}
#ifdef WITH_SCRIPT_ENGINE
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
const_str ScriptVariable::constStringValue(void) const
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
if (GetType() == VARIABLE_CONSTSTRING) {
return m_data.intValue;
} else {
return Director.AddString(stringValue());
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::setConstStringValue(const_str s)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
ClearInternal();
type = VARIABLE_CONSTSTRING;
m_data.intValue = s;
2016-03-27 11:49:47 +02:00
}
#endif
2023-07-05 21:23:39 +02:00
void ScriptVariable::setFloatValue(float newvalue)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
ClearInternal();
type = VARIABLE_FLOAT;
m_data.floatValue = newvalue;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::setIntValue(int newvalue)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
ClearInternal();
type = VARIABLE_INTEGER;
m_data.intValue = newvalue;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::setListenerValue(Listener *newvalue)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
ClearInternal();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
type = VARIABLE_LISTENER;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
m_data.listenerValue = new SafePtr<Listener>(newvalue);
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::setPointer(const ScriptVariable& newvalue)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
if (GetType() == VARIABLE_POINTER) {
m_data.pointerValue->setValue(newvalue);
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::setRefValue(ScriptVariable *ref)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
ClearInternal();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
type = VARIABLE_REF;
m_data.refValue = ref;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::setStringValue(str newvalue)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
str *s;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
ClearInternal();
type = VARIABLE_STRING;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
s = new str(newvalue);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
m_data.stringValue = s;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::setVectorValue(const Vector& newvector)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
ClearInternal();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
type = VARIABLE_VECTOR;
m_data.vectorValue = new float[3];
newvector.copyTo(m_data.vectorValue);
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::operator+=(const ScriptVariable& value)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
int type = GetType();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
switch (type + value.GetType() * VARIABLE_MAX) {
default:
Clear();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
throw ScriptException(
"binary '+' applied to incompatible types '%s' and '%s'", typenames[type], typenames[value.GetType()]
);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER + VARIABLE_INTEGER *VARIABLE_MAX: // ( int ) + ( int )
m_data.intValue = m_data.intValue + value.m_data.intValue;
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER + VARIABLE_FLOAT *VARIABLE_MAX: // ( int ) + ( float )
setFloatValue((float)m_data.intValue + value.m_data.floatValue);
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT + VARIABLE_FLOAT *VARIABLE_MAX: // ( float ) + ( float )
m_data.floatValue = m_data.floatValue + value.m_data.floatValue;
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT + VARIABLE_INTEGER *VARIABLE_MAX: // ( float ) + ( int )
m_data.floatValue = m_data.floatValue + value.m_data.intValue;
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_STRING + VARIABLE_STRING *VARIABLE_MAX: // ( string ) + ( string )
case VARIABLE_INTEGER
+ VARIABLE_STRING *VARIABLE_MAX: // ( int ) + ( string )
case VARIABLE_FLOAT + VARIABLE_STRING *VARIABLE_MAX: // ( float ) + ( string )
case VARIABLE_CHAR
+ VARIABLE_STRING *VARIABLE_MAX: // ( char ) + ( string )
case VARIABLE_CONSTSTRING
+ VARIABLE_STRING *VARIABLE_MAX: // ( const string ) + ( string )
case VARIABLE_LISTENER + VARIABLE_STRING *VARIABLE_MAX: // ( listener ) + ( string )
case VARIABLE_VECTOR + VARIABLE_STRING *VARIABLE_MAX: // ( vector ) + ( string )
case VARIABLE_STRING + VARIABLE_INTEGER *VARIABLE_MAX: // ( string ) + ( int )
case VARIABLE_CONSTSTRING + VARIABLE_INTEGER *VARIABLE_MAX: // ( const string ) + ( int )
case VARIABLE_STRING + VARIABLE_FLOAT *VARIABLE_MAX: // ( string ) + ( float )
case VARIABLE_CONSTSTRING + VARIABLE_FLOAT *VARIABLE_MAX: // ( const string ) + ( float )
case VARIABLE_STRING + VARIABLE_CHAR *VARIABLE_MAX: // ( string ) + ( char )
case VARIABLE_CONSTSTRING + VARIABLE_CHAR *VARIABLE_MAX: // ( const string ) + ( char )
case VARIABLE_STRING
+ VARIABLE_CONSTSTRING *VARIABLE_MAX: // ( string ) + ( const string )
case VARIABLE_INTEGER
+ VARIABLE_CONSTSTRING *VARIABLE_MAX: // ( int ) + ( const string )
case VARIABLE_FLOAT
+ VARIABLE_CONSTSTRING *VARIABLE_MAX: // ( float ) + ( const string )
case VARIABLE_CHAR
+ VARIABLE_CONSTSTRING *VARIABLE_MAX: // ( char ) + ( const string )
case VARIABLE_CONSTSTRING
+ VARIABLE_CONSTSTRING *VARIABLE_MAX: // ( const string ) + ( const string )
case VARIABLE_LISTENER
+ VARIABLE_CONSTSTRING *VARIABLE_MAX: // ( listener ) + ( const string )
case VARIABLE_VECTOR
2023-10-01 22:47:25 +02:00
+ VARIABLE_CONSTSTRING *VARIABLE_MAX: // ( vector ) + ( const string )
case VARIABLE_STRING
+ VARIABLE_LISTENER *VARIABLE_MAX: // ( string ) + ( listener )
2023-07-05 21:23:39 +02:00
case VARIABLE_CONSTSTRING
+ VARIABLE_LISTENER *VARIABLE_MAX: // ( const string ) + ( listener )
case VARIABLE_STRING + VARIABLE_VECTOR *VARIABLE_MAX: // ( string ) + ( vector )
case VARIABLE_CONSTSTRING + VARIABLE_VECTOR *VARIABLE_MAX: // ( const string ) + ( vector )
2023-07-05 21:23:39 +02:00
setStringValue(stringValue() + value.stringValue());
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_VECTOR + VARIABLE_VECTOR *VARIABLE_MAX:
VectorAdd(m_data.vectorValue, value.m_data.vectorValue, m_data.vectorValue);
break;
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::operator-=(const ScriptVariable& value)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
switch (GetType() + value.GetType() * VARIABLE_MAX) {
default:
Clear();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
throw ScriptException(
"binary '-' applied to incompatible types '%s' and '%s'", typenames[GetType()], typenames[value.GetType()]
);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER + VARIABLE_INTEGER *VARIABLE_MAX: // ( int ) - ( int )
m_data.intValue = m_data.intValue - value.m_data.intValue;
break;
case VARIABLE_INTEGER + VARIABLE_FLOAT *VARIABLE_MAX: // ( int ) - ( float )
setFloatValue((float)m_data.intValue - value.m_data.floatValue);
break;
case VARIABLE_FLOAT + VARIABLE_FLOAT *VARIABLE_MAX: // ( float ) - ( float )
m_data.floatValue = m_data.floatValue - value.m_data.floatValue;
break;
case VARIABLE_FLOAT + VARIABLE_INTEGER *VARIABLE_MAX: // ( float ) - ( int )
m_data.floatValue = m_data.floatValue - value.m_data.intValue;
break;
case VARIABLE_VECTOR + VARIABLE_VECTOR *VARIABLE_MAX: // ( vector ) - ( vector )
VectorSubtract(m_data.vectorValue, value.m_data.vectorValue, m_data.vectorValue);
break;
}
}
void ScriptVariable::operator*=(const ScriptVariable& value)
{
switch (GetType() + value.GetType() * VARIABLE_MAX) {
default:
Clear();
throw ScriptException(
"binary '*' applied to incompatible types '%s' and '%s'", typenames[GetType()], typenames[value.GetType()]
);
break;
case VARIABLE_INTEGER + VARIABLE_INTEGER *VARIABLE_MAX: // ( int ) * ( int )
m_data.intValue = m_data.intValue * value.m_data.intValue;
break;
case VARIABLE_VECTOR + VARIABLE_INTEGER *VARIABLE_MAX: // ( vector ) * ( int )
VectorScale(m_data.vectorValue, (float)value.m_data.intValue, m_data.vectorValue);
break;
case VARIABLE_VECTOR + VARIABLE_FLOAT *VARIABLE_MAX: // ( vector ) * ( float )
VectorScale(m_data.vectorValue, value.m_data.floatValue, m_data.vectorValue);
break;
case VARIABLE_INTEGER + VARIABLE_FLOAT *VARIABLE_MAX: // ( int ) * ( float )
setFloatValue((float)m_data.intValue * value.m_data.floatValue);
break;
case VARIABLE_FLOAT + VARIABLE_FLOAT *VARIABLE_MAX: // ( float ) * ( float )
m_data.floatValue = m_data.floatValue * value.m_data.floatValue;
break;
case VARIABLE_FLOAT + VARIABLE_INTEGER *VARIABLE_MAX: // ( float ) * ( int )
m_data.floatValue = m_data.floatValue * value.m_data.intValue;
break;
case VARIABLE_INTEGER + VARIABLE_VECTOR *VARIABLE_MAX: // ( int ) * ( vector )
setVectorValue((float)m_data.intValue * Vector(value.m_data.vectorValue));
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT + VARIABLE_VECTOR *VARIABLE_MAX: // ( float ) * ( vector )
setVectorValue(m_data.floatValue * Vector(value.m_data.vectorValue));
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_VECTOR + VARIABLE_VECTOR *VARIABLE_MAX: // ( vector ) * ( vector )
setFloatValue(DotProduct(m_data.vectorValue, value.m_data.vectorValue));
break;
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::operator/=(const ScriptVariable& value)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
switch (GetType() + value.GetType() * VARIABLE_MAX) {
default:
Clear();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
throw ScriptException(
"binary '/' applied to incompatible types '%s' and '%s'", typenames[GetType()], typenames[value.GetType()]
);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER + VARIABLE_INTEGER *VARIABLE_MAX: // ( int ) / ( int )
if (value.m_data.intValue == 0) {
throw ScriptException("Division by zero error\n");
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
m_data.intValue = m_data.intValue / value.m_data.intValue;
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_VECTOR + VARIABLE_INTEGER *VARIABLE_MAX: // ( vector ) / ( int )
if (value.m_data.intValue == 0) {
throw ScriptException("Division by zero error\n");
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
(Vector) m_data.vectorValue = (Vector)m_data.vectorValue / (float)value.m_data.intValue;
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_VECTOR + VARIABLE_FLOAT *VARIABLE_MAX: // ( vector ) / ( float )
if (value.m_data.floatValue == 0) {
throw ScriptException("Division by zero error\n");
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
m_data.vectorValue[0] = m_data.vectorValue[0] / value.m_data.floatValue;
m_data.vectorValue[1] = m_data.vectorValue[1] / value.m_data.floatValue;
m_data.vectorValue[2] = m_data.vectorValue[2] / value.m_data.floatValue;
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER + VARIABLE_FLOAT *VARIABLE_MAX: // ( int ) / ( float )
if (value.m_data.floatValue == 0) {
throw ScriptException("Division by zero error\n");
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
setFloatValue((float)m_data.intValue / value.m_data.floatValue);
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT + VARIABLE_FLOAT *VARIABLE_MAX: // ( float ) / ( float )
if (value.m_data.floatValue == 0) {
throw ScriptException("Division by zero error\n");
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
m_data.floatValue = m_data.floatValue / value.m_data.floatValue;
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT + VARIABLE_INTEGER *VARIABLE_MAX: // ( float ) / ( int )
if (value.m_data.intValue == 0) {
throw ScriptException("Division by zero error\n");
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
m_data.floatValue = m_data.floatValue / value.m_data.intValue;
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER + VARIABLE_VECTOR *VARIABLE_MAX: // ( int ) / ( vector )
if (m_data.intValue == 0) {
throw ScriptException("Division by zero error\n");
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
setVectorValue((float)m_data.intValue / Vector(value.m_data.vectorValue));
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT + VARIABLE_VECTOR *VARIABLE_MAX: // ( float ) / ( vector )
if (m_data.floatValue == 0) {
throw ScriptException("Division by zero error\n");
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
setVectorValue(m_data.floatValue / Vector(value.m_data.vectorValue));
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_VECTOR + VARIABLE_VECTOR *VARIABLE_MAX: // ( vector ) / ( vector )
m_data.vectorValue = vec_zero;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (value.m_data.vectorValue[0] != 0) {
m_data.vectorValue[0] = m_data.vectorValue[0] / value.m_data.vectorValue[0];
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (value.m_data.vectorValue[1] != 0) {
m_data.vectorValue[1] = m_data.vectorValue[1] / value.m_data.vectorValue[1];
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (value.m_data.vectorValue[2] != 0) {
m_data.vectorValue[2] = m_data.vectorValue[2] / value.m_data.vectorValue[2];
}
break;
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::operator%=(const ScriptVariable& value)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
float mult = 0.0f;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
switch (GetType() + value.GetType() * VARIABLE_MAX) {
default:
Clear();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
throw ScriptException(
"binary '%%' applied to incompatible types '%s' and '%s'", typenames[GetType()], typenames[value.GetType()]
);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER + VARIABLE_INTEGER *VARIABLE_MAX: // ( int ) % ( int )
if (value.m_data.intValue == 0) {
throw ScriptException("Division by zero error\n");
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
m_data.intValue = m_data.intValue % value.m_data.intValue;
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_VECTOR + VARIABLE_INTEGER *VARIABLE_MAX: // ( vector ) % ( int )
if (value.m_data.intValue == 0) {
throw ScriptException("Division by zero error\n");
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
m_data.vectorValue[0] = fmod(m_data.vectorValue[0], value.m_data.intValue);
m_data.vectorValue[1] = fmod(m_data.vectorValue[1], value.m_data.intValue);
m_data.vectorValue[2] = fmod(m_data.vectorValue[2], value.m_data.intValue);
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_VECTOR + VARIABLE_FLOAT *VARIABLE_MAX: // ( vector ) % ( float )
if (value.m_data.floatValue == 0) {
throw ScriptException("Division by zero error\n");
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
m_data.vectorValue[0] = fmod(m_data.vectorValue[0], value.m_data.floatValue);
m_data.vectorValue[1] = fmod(m_data.vectorValue[1], value.m_data.floatValue);
m_data.vectorValue[2] = fmod(m_data.vectorValue[2], value.m_data.floatValue);
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER + VARIABLE_FLOAT *VARIABLE_MAX: // ( int ) % ( float )
if (value.m_data.floatValue == 0) {
throw ScriptException("Division by zero error\n");
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
setFloatValue(fmod((float)m_data.intValue, value.m_data.floatValue));
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT + VARIABLE_FLOAT *VARIABLE_MAX: // ( float ) % ( float )
if (value.m_data.floatValue == 0) {
throw ScriptException("Division by zero error\n");
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
m_data.floatValue = fmod(m_data.floatValue, value.m_data.floatValue);
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT + VARIABLE_INTEGER *VARIABLE_MAX: // ( float ) % ( int )
if (value.m_data.intValue == 0) {
throw ScriptException("Division by zero error\n");
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
m_data.floatValue = fmod(m_data.floatValue, (float)value.m_data.intValue);
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER + VARIABLE_VECTOR *VARIABLE_MAX: // ( int ) % ( vector )
mult = (float)m_data.intValue;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (mult == 0) {
throw ScriptException("Division by zero error\n");
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
setVectorValue(vec_zero);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
m_data.vectorValue[0] = fmod(value.m_data.vectorValue[0], mult);
m_data.vectorValue[1] = fmod(value.m_data.vectorValue[1], mult);
m_data.vectorValue[2] = fmod(value.m_data.vectorValue[2], mult);
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT + VARIABLE_VECTOR *VARIABLE_MAX: // ( float ) % ( vector )
mult = m_data.floatValue;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (mult == 0) {
throw ScriptException("Division by zero error\n");
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
setVectorValue(vec_zero);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
m_data.vectorValue[0] = fmod(m_data.vectorValue[0], mult);
m_data.vectorValue[1] = fmod(m_data.vectorValue[1], mult);
m_data.vectorValue[2] = fmod(m_data.vectorValue[2], mult);
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_VECTOR + VARIABLE_VECTOR *VARIABLE_MAX: // ( vector ) % ( vector )
m_data.vectorValue = vec_zero;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (value.m_data.vectorValue[0] != 0) {
m_data.vectorValue[0] = fmod(m_data.vectorValue[0], value.m_data.vectorValue[0]);
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (value.m_data.vectorValue[1] != 0) {
m_data.vectorValue[1] = fmod(m_data.vectorValue[1], value.m_data.vectorValue[1]);
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (value.m_data.vectorValue[2] != 0) {
m_data.vectorValue[2] = fmod(m_data.vectorValue[2], value.m_data.vectorValue[2]);
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
break;
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::operator&=(const ScriptVariable& value)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
int type = GetType();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
switch (type + value.GetType() * VARIABLE_MAX) {
default:
Clear();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
throw ScriptException(
"binary '&' applied to incompatible types '%s' and '%s'", typenames[type], typenames[value.GetType()]
);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER + VARIABLE_INTEGER *VARIABLE_MAX: // ( int ) &= ( int )
m_data.intValue &= value.m_data.intValue;
break;
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::operator^=(const ScriptVariable& value)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
int type = GetType();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
switch (type + value.GetType() * VARIABLE_MAX) {
default:
Clear();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
throw ScriptException(
"binary '^' applied to incompatible types '%s' and '%s'", typenames[type], typenames[value.GetType()]
);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER + VARIABLE_INTEGER *VARIABLE_MAX: // ( int ) ^= ( int )
m_data.intValue ^= value.m_data.intValue;
break;
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::operator|=(const ScriptVariable& value)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
int type = GetType();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
switch (type + value.GetType() * VARIABLE_MAX) {
default:
Clear();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
throw ScriptException(
"binary '|' applied to incompatible types '%s' and '%s'", typenames[type], typenames[value.GetType()]
);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER + VARIABLE_INTEGER *VARIABLE_MAX: // ( int ) |= ( int )
m_data.intValue |= value.m_data.intValue;
break;
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::operator<<=(const ScriptVariable& value)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
int type = GetType();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
switch (type + value.GetType() * VARIABLE_MAX) {
default:
Clear();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
throw ScriptException(
"binary '<<' applied to incompatible types '%s' and '%s'", typenames[type], typenames[value.GetType()]
);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER + VARIABLE_INTEGER *VARIABLE_MAX: // ( int ) <<= ( int )
m_data.intValue <<= value.m_data.intValue;
break;
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::operator>>=(const ScriptVariable& value)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
int type = GetType();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
switch (type + value.GetType() * VARIABLE_MAX) {
default:
Clear();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
throw ScriptException(
"binary '>>' applied to incompatible types '%s' and '%s'", typenames[type], typenames[value.GetType()]
);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER + VARIABLE_INTEGER *VARIABLE_MAX: // ( int ) >>= ( int )
m_data.intValue >>= value.m_data.intValue;
break;
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
bool ScriptVariable::operator!=(const ScriptVariable& value)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
return !(*this == value);
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
bool ScriptVariable::operator==(const ScriptVariable& value)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
int type = GetType();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
switch (type + value.GetType() * VARIABLE_MAX) {
default: // ( lval ) == ( nil )
// ( nil ) == ( rval )
Clear();
return false;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_NONE + VARIABLE_NONE *VARIABLE_MAX: // ( nil ) == ( nil )
return true;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_LISTENER + VARIABLE_LISTENER *VARIABLE_MAX: // ( listener ) == ( listener )
{
Class *lval = NULL;
Class *rval = NULL;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (m_data.listenerValue) {
lval = m_data.listenerValue->Pointer();
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (value.m_data.listenerValue) {
rval = value.m_data.listenerValue->Pointer();
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return lval == rval;
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER + VARIABLE_INTEGER *VARIABLE_MAX: // ( int ) == ( int )
return m_data.intValue == value.m_data.intValue;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER + VARIABLE_FLOAT *VARIABLE_MAX: // ( int ) == ( float )
return m_data.intValue == value.m_data.floatValue;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT + VARIABLE_FLOAT *VARIABLE_MAX: // ( float ) == ( float )
return m_data.floatValue == value.m_data.floatValue;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT + VARIABLE_INTEGER *VARIABLE_MAX: // ( float ) == ( int )
return m_data.floatValue == value.m_data.intValue;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_CONSTSTRING
+ VARIABLE_CONSTSTRING *VARIABLE_MAX: // ( const string ) == ( const string )
return m_data.intValue == value.m_data.intValue;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_STRING + VARIABLE_STRING *VARIABLE_MAX: // ( string ) == ( string )
case VARIABLE_INTEGER
+ VARIABLE_STRING *VARIABLE_MAX: // ( int ) == ( string )
case VARIABLE_FLOAT + VARIABLE_STRING *VARIABLE_MAX: // ( float ) == ( string )
case VARIABLE_CHAR
+ VARIABLE_STRING *VARIABLE_MAX: // ( char ) == ( string )
case VARIABLE_CONSTSTRING + VARIABLE_STRING *VARIABLE_MAX: // ( const string ) == ( string )
2023-10-01 22:47:25 +02:00
case VARIABLE_LISTENER
+ VARIABLE_STRING *VARIABLE_MAX: // ( listener ) == ( string )
case VARIABLE_VECTOR + VARIABLE_STRING *VARIABLE_MAX: // ( vector ) == ( string )
2023-07-05 21:23:39 +02:00
case VARIABLE_STRING
+ VARIABLE_CONSTSTRING *VARIABLE_MAX: // ( string ) == ( const string )
case VARIABLE_INTEGER
+ VARIABLE_CONSTSTRING *VARIABLE_MAX: // ( int ) == ( const string )
case VARIABLE_FLOAT
+ VARIABLE_CONSTSTRING *VARIABLE_MAX: // ( float ) == ( const string )
case VARIABLE_CHAR
+ VARIABLE_CONSTSTRING *VARIABLE_MAX: // ( char ) == ( const string )
case VARIABLE_LISTENER
+ VARIABLE_CONSTSTRING *VARIABLE_MAX: // ( listener ) == ( const string )
case VARIABLE_VECTOR
+ VARIABLE_CONSTSTRING *VARIABLE_MAX: // ( vector ) == ( const string )
case VARIABLE_STRING + VARIABLE_INTEGER *VARIABLE_MAX: // ( string ) == ( int )
case VARIABLE_CONSTSTRING + VARIABLE_INTEGER *VARIABLE_MAX: // ( const string ) == ( int )
case VARIABLE_STRING + VARIABLE_FLOAT *VARIABLE_MAX: // ( string ) == ( float )
case VARIABLE_CONSTSTRING + VARIABLE_FLOAT *VARIABLE_MAX: // ( const string ) == ( float )
case VARIABLE_STRING + VARIABLE_CHAR *VARIABLE_MAX: // ( string ) == ( char )
case VARIABLE_CONSTSTRING + VARIABLE_CHAR *VARIABLE_MAX: // ( const string ) == ( char )
case VARIABLE_STRING + VARIABLE_LISTENER *VARIABLE_MAX: // ( string ) == ( listener )
case VARIABLE_CONSTSTRING
+ VARIABLE_LISTENER *VARIABLE_MAX: // ( const string ) == ( listener )
case VARIABLE_STRING + VARIABLE_VECTOR *VARIABLE_MAX: // ( string ) == ( vector )
case VARIABLE_CONSTSTRING + VARIABLE_VECTOR *VARIABLE_MAX: // ( const string ) == ( vector )
2023-07-05 21:23:39 +02:00
{
str lval = stringValue();
str rval = value.stringValue();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return (!lval.length() && !rval.length()) || (lval == rval);
}
2023-10-01 22:47:25 +02:00
case VARIABLE_CHAR + VARIABLE_CHAR *VARIABLE_MAX: // ( char ) == ( char )
return m_data.charValue == value.m_data.charValue;
2023-07-05 21:23:39 +02:00
case VARIABLE_VECTOR + VARIABLE_VECTOR *VARIABLE_MAX: // ( vector ) == ( vector )
return VectorCompare(m_data.vectorValue, value.m_data.vectorValue) ? true : false;
}
}
ScriptVariable& ScriptVariable::operator=(const ScriptVariable& variable)
{
if (type == variable.GetType() && m_data.anyValue == variable.m_data.anyValue) {
return *this;
}
2023-07-05 21:23:39 +02:00
if (type != variable.GetType()) {
ClearInternal();
2023-07-05 21:23:39 +02:00
type = variable.GetType();
2023-07-05 21:23:39 +02:00
switch (type) {
case VARIABLE_NONE:
break;
2023-07-05 21:23:39 +02:00
case VARIABLE_CONSTSTRING:
m_data.intValue = variable.m_data.intValue;
break;
2023-07-05 21:23:39 +02:00
case VARIABLE_STRING:
2023-09-04 22:06:13 +02:00
m_data.stringValue = new str(*variable.m_data.stringValue);
break;
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT:
m_data.floatValue = variable.m_data.floatValue;
break;
2023-07-05 21:23:39 +02:00
case VARIABLE_CHAR:
m_data.charValue = variable.m_data.charValue;
break;
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER:
m_data.intValue = variable.m_data.intValue;
break;
2023-07-05 21:23:39 +02:00
case VARIABLE_LISTENER:
m_data.listenerValue = new SafePtr<Listener>(*variable.m_data.listenerValue);
break;
2023-07-05 21:23:39 +02:00
case VARIABLE_ARRAY:
m_data.arrayValue = variable.m_data.arrayValue;
m_data.arrayValue->refCount++;
break;
case VARIABLE_CONSTARRAY:
m_data.constArrayValue = variable.m_data.constArrayValue;
m_data.constArrayValue->refCount++;
break;
2023-07-05 21:23:39 +02:00
case VARIABLE_CONTAINER:
m_data.containerValue = variable.m_data.containerValue;
break;
2023-07-05 21:23:39 +02:00
case VARIABLE_SAFECONTAINER:
m_data.safeContainerValue = new SafePtr<ConList>(*variable.m_data.safeContainerValue);
break;
2023-07-05 21:23:39 +02:00
case VARIABLE_POINTER:
m_data.pointerValue = variable.m_data.pointerValue;
m_data.pointerValue->add(this);
break;
case VARIABLE_VECTOR:
2023-10-01 22:47:25 +02:00
m_data.vectorValue = (float *)new float[3];
VectorCopy(variable.m_data.vectorValue, m_data.vectorValue);
break;
}
} else {
type = variable.GetType();
switch (type) {
case VARIABLE_NONE:
break;
case VARIABLE_CONSTSTRING:
m_data.intValue = variable.m_data.intValue;
break;
case VARIABLE_STRING:
2023-09-04 22:06:13 +02:00
*m_data.stringValue = *variable.m_data.stringValue;
break;
case VARIABLE_FLOAT:
m_data.floatValue = variable.m_data.floatValue;
break;
case VARIABLE_CHAR:
m_data.charValue = variable.m_data.charValue;
break;
case VARIABLE_INTEGER:
m_data.intValue = variable.m_data.intValue;
break;
case VARIABLE_LISTENER:
*m_data.listenerValue = *variable.m_data.listenerValue;
break;
case VARIABLE_ARRAY:
ClearInternal();
m_data.arrayValue = variable.m_data.arrayValue;
m_data.arrayValue->refCount++;
break;
case VARIABLE_CONSTARRAY:
ClearInternal();
m_data.constArrayValue = variable.m_data.constArrayValue;
m_data.constArrayValue->refCount++;
break;
case VARIABLE_CONTAINER:
ClearInternal();
m_data.containerValue = variable.m_data.containerValue;
break;
case VARIABLE_SAFECONTAINER:
ClearInternal();
m_data.safeContainerValue = new SafePtr<ConList>(*variable.m_data.safeContainerValue);
break;
case VARIABLE_POINTER:
ClearInternal();
m_data.pointerValue = variable.m_data.pointerValue;
m_data.pointerValue->add(this);
break;
case VARIABLE_VECTOR:
VectorCopy(variable.m_data.vectorValue, m_data.vectorValue);
break;
}
2023-07-05 21:23:39 +02:00
}
return *this;
2023-02-07 20:50:26 +01:00
}
ScriptVariable& ScriptVariable::operator=(ScriptVariable&& variable)
{
2023-07-05 21:23:39 +02:00
ClearInternal();
2023-02-07 20:50:26 +01:00
#if defined(GAME_DLL)
2023-07-05 21:23:39 +02:00
key = variable.GetKey();
variable.key = 0;
2023-02-07 20:50:26 +01:00
#endif
2023-07-05 21:23:39 +02:00
type = variable.GetType();
m_data = variable.m_data;
variable.type = VARIABLE_NONE;
2023-02-07 20:50:26 +01:00
2023-10-01 22:47:25 +02:00
if (type == VARIABLE_POINTER) {
// if it's a pointer, make sure to properly point
m_data.pointerValue->add(this);
m_data.pointerValue->remove(&variable);
}
2023-07-05 21:23:39 +02:00
return *this;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
ScriptVariable& ScriptVariable::operator[](ScriptVariable& index)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
int i;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
switch (GetType()) {
case VARIABLE_NONE:
type = VARIABLE_ARRAY;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
m_data.arrayValue = new ScriptArrayHolder;
return m_data.arrayValue->arrayValue[index];
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_ARRAY:
return m_data.arrayValue->arrayValue[index];
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_CONSTARRAY:
i = index.intValue();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
if (i == 0 || i > m_data.constArrayValue->size) {
throw ScriptException("array index %d out of range", i);
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return m_data.constArrayValue->constArrayValue[i];
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
default:
throw ScriptException("[] applied to invalid type '%s'", typenames[GetType()]);
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
ScriptVariable *ScriptVariable::operator[](unsigned index) const
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
return &m_data.constArrayValue->constArrayValue[index];
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
ScriptVariable *ScriptVariable::operator*()
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
return m_data.refValue;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::complement(void)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
if (type == VARIABLE_INTEGER) {
m_data.intValue = ~m_data.intValue;
} else {
float value = floatValue();
int i = ~*(int *)&value; // ley0k: evil floating point hack
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
setFloatValue(*(float *)&i);
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::greaterthan(ScriptVariable& variable)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
switch (GetType() + variable.GetType() * VARIABLE_MAX) {
default:
Clear();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
throw ScriptException(
"binary '>' applied to incompatible types '%s' and '%s'",
typenames[GetType()],
typenames[variable.GetType()]
);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER + VARIABLE_INTEGER *VARIABLE_MAX: // ( int ) > ( int )
m_data.intValue = m_data.intValue > variable.m_data.intValue;
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER + VARIABLE_FLOAT *VARIABLE_MAX: // ( int ) > ( float )
m_data.intValue = m_data.intValue > variable.m_data.floatValue;
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT + VARIABLE_FLOAT *VARIABLE_MAX: // ( float ) > ( float )
type = VARIABLE_INTEGER;
m_data.intValue = m_data.floatValue > variable.m_data.floatValue;
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT + VARIABLE_INTEGER *VARIABLE_MAX: // ( float ) > ( int )
type = VARIABLE_INTEGER;
m_data.intValue = m_data.floatValue > variable.m_data.intValue;
break;
case VARIABLE_CHAR + VARIABLE_CHAR *VARIABLE_MAX: // ( char ) >= ( char )
type = VARIABLE_INTEGER;
m_data.intValue = m_data.charValue >= variable.m_data.charValue;
break;
2023-07-05 21:23:39 +02:00
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::greaterthanorequal(ScriptVariable& variable)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
switch (GetType() + variable.GetType() * VARIABLE_MAX) {
default:
Clear();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
throw ScriptException(
"binary '>=' applied to incompatible types '%s' and '%s'",
typenames[GetType()],
typenames[variable.GetType()]
);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER + VARIABLE_INTEGER *VARIABLE_MAX: // ( int ) >= ( int )
m_data.intValue = m_data.intValue >= variable.m_data.intValue;
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER + VARIABLE_FLOAT *VARIABLE_MAX: // ( int ) >= ( float )
m_data.intValue = m_data.intValue >= variable.m_data.floatValue;
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT + VARIABLE_FLOAT *VARIABLE_MAX: // ( float ) >= ( float )
type = VARIABLE_INTEGER;
m_data.intValue = m_data.floatValue >= variable.m_data.floatValue;
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT + VARIABLE_INTEGER *VARIABLE_MAX: // ( float ) >= ( int )
type = VARIABLE_INTEGER;
m_data.intValue = m_data.floatValue >= variable.m_data.intValue;
break;
case VARIABLE_CHAR + VARIABLE_CHAR *VARIABLE_MAX: // ( char ) >= ( char )
type = VARIABLE_INTEGER;
m_data.intValue = m_data.charValue >= variable.m_data.charValue;
break;
2023-07-05 21:23:39 +02:00
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::lessthan(ScriptVariable& variable)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
switch (GetType() + variable.GetType() * VARIABLE_MAX) {
default:
Clear();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
throw ScriptException(
"binary '<' applied to incompatible types '%s' and '%s'",
typenames[GetType()],
typenames[variable.GetType()]
);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER + VARIABLE_INTEGER *VARIABLE_MAX: // ( int ) < ( int )
m_data.intValue = m_data.intValue < variable.m_data.intValue;
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER + VARIABLE_FLOAT *VARIABLE_MAX: // ( int ) < ( float )
m_data.intValue = m_data.intValue < variable.m_data.floatValue;
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT + VARIABLE_FLOAT *VARIABLE_MAX: // ( float ) < ( float )
type = VARIABLE_INTEGER;
m_data.intValue = m_data.floatValue < variable.m_data.floatValue;
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT + VARIABLE_INTEGER *VARIABLE_MAX: // ( float ) < ( int )
type = VARIABLE_INTEGER;
m_data.intValue = m_data.floatValue < variable.m_data.intValue;
break;
case VARIABLE_CHAR + VARIABLE_CHAR *VARIABLE_MAX: // ( char ) < ( char )
type = VARIABLE_INTEGER;
m_data.intValue = m_data.charValue < variable.m_data.charValue;
break;
2023-07-05 21:23:39 +02:00
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::lessthanorequal(ScriptVariable& variable)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
switch (GetType() + variable.GetType() * VARIABLE_MAX) {
default:
Clear();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
throw ScriptException(
"binary '<=' applied to incompatible types '%s' and '%s'",
typenames[GetType()],
typenames[variable.GetType()]
);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER + VARIABLE_INTEGER *VARIABLE_MAX: // ( int ) <= ( int )
m_data.intValue = m_data.intValue <= variable.m_data.intValue;
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER + VARIABLE_FLOAT *VARIABLE_MAX: // ( int ) <= ( float )
m_data.intValue = m_data.intValue <= variable.m_data.floatValue;
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT + VARIABLE_FLOAT *VARIABLE_MAX: // ( float ) <= ( float )
type = VARIABLE_INTEGER;
m_data.intValue = m_data.floatValue <= variable.m_data.floatValue;
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT + VARIABLE_INTEGER *VARIABLE_MAX: // ( float ) <= ( int )
type = VARIABLE_INTEGER;
m_data.intValue = m_data.floatValue <= variable.m_data.intValue;
break;
case VARIABLE_CHAR + VARIABLE_CHAR *VARIABLE_MAX: // ( char ) <= ( char )
type = VARIABLE_INTEGER;
m_data.intValue = m_data.charValue <= variable.m_data.charValue;
break;
2023-07-05 21:23:39 +02:00
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariable::minus(void)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
if (GetType() == VARIABLE_INTEGER) {
m_data.intValue = -m_data.intValue;
} else if (GetType() == VARIABLE_FLOAT) {
m_data.floatValue = -m_data.floatValue;
} else {
setIntValue(-intValue());
}
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
ScriptVariable ScriptVariable::operator++(int)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
switch (type) {
case VARIABLE_NONE:
return *this;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER:
setIntValue(intValue() + 1);
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_POINTER:
ClearPointerInternal();
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT:
setFloatValue(floatValue() + 1.0f);
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
default:
int newvalue = intValue();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
ClearInternal();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
type = VARIABLE_INTEGER;
m_data.intValue = newvalue + 1;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
break;
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return *this;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
ScriptVariable ScriptVariable::operator--(int)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
switch (type) {
case VARIABLE_NONE:
return *this;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_INTEGER:
setIntValue(intValue() - 1);
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_POINTER:
ClearPointerInternal();
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
case VARIABLE_FLOAT:
setFloatValue(floatValue() - 1.0f);
break;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
default:
int newvalue = intValue();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
ClearInternal();
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
type = VARIABLE_INTEGER;
m_data.intValue = newvalue - 1;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
break;
}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return *this;
2016-03-27 11:49:47 +02:00
}
#ifdef WITH_SCRIPT_ENGINE
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
ScriptVariableList::ScriptVariableList() {}
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
void ScriptVariableList::ClearList(void)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
list.clear();
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
ScriptVariable *ScriptVariableList::GetOrCreateVariable(str name)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
return GetOrCreateVariable(Director.AddString(name));
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
ScriptVariable *ScriptVariableList::GetOrCreateVariable(unsigned int name)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
return &list.addKeyValue(name);
2016-03-27 11:49:47 +02:00
}
ScriptVariable *ScriptVariableList::GetVariable(str name) const
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
return GetVariable(Director.AddString(name));
2016-03-27 11:49:47 +02:00
}
ScriptVariable *ScriptVariableList::GetVariable(unsigned int name) const
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
return list.findKeyValue(name);
2016-03-27 11:49:47 +02:00
}
bool ScriptVariableList::VariableExists(str name) const
{
return GetVariable(name) != NULL;
}
2023-07-05 21:23:39 +02:00
ScriptVariable *ScriptVariableList::SetVariable(const char *name, int value)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
ScriptVariable *variable = GetOrCreateVariable(name);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
variable->setIntValue(value);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return variable;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
ScriptVariable *ScriptVariableList::SetVariable(const char *name, float value)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
ScriptVariable *variable = GetOrCreateVariable(name);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
variable->setFloatValue(value);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return variable;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
ScriptVariable *ScriptVariableList::SetVariable(const char *name, const char *value)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
ScriptVariable *variable = GetOrCreateVariable(name);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
variable->setStringValue(value);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return variable;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
# if defined(GAME_DLL)
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
ScriptVariable *ScriptVariableList::SetVariable(const char *name, Entity *value)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
ScriptVariable *variable = GetOrCreateVariable(name);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
variable->setListenerValue((Listener *)value);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return variable;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
# endif
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
ScriptVariable *ScriptVariableList::SetVariable(const char *name, Listener *value)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
ScriptVariable *variable = GetOrCreateVariable(name);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
variable->setListenerValue(value);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return variable;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
ScriptVariable *ScriptVariableList::SetVariable(const char *name, ScriptVariable& value)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
ScriptVariable *variable = GetOrCreateVariable(name);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
*variable = value;
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return variable;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
ScriptVariable *ScriptVariableList::SetVariable(const char *name, Vector& value)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
ScriptVariable *variable = GetOrCreateVariable(name);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
variable->setVectorValue(value);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return variable;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
ScriptVariable *ScriptVariableList::SetVariable(unsigned int name, ScriptVariable& value)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
ScriptVariable *variable = GetOrCreateVariable(name);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
*variable = value;
variable->SetKey(name);
2016-03-27 11:49:47 +02:00
2023-07-05 21:23:39 +02:00
return variable;
2016-03-27 11:49:47 +02:00
}
2023-07-05 21:23:39 +02:00
ScriptVariable *ScriptVariableList::SetVariable(unsigned int name, ScriptVariable&& value)
2023-02-02 23:48:04 +01:00
{
2023-07-05 21:23:39 +02:00
ScriptVariable *variable = GetOrCreateVariable(name);
2023-02-02 23:48:04 +01:00
2023-07-05 21:23:39 +02:00
*variable = std::move(value);
variable->SetKey(name);
2023-02-02 23:48:04 +01:00
2023-07-05 21:23:39 +02:00
return variable;
2023-02-02 23:48:04 +01:00
}
2023-07-05 21:23:39 +02:00
void ScriptVariableList::Archive(Archiver& arc)
2016-03-27 11:49:47 +02:00
{
2023-07-05 21:23:39 +02:00
Class::Archive(arc);
list.Archive(arc);
2016-03-27 11:49:47 +02:00
}
2024-02-28 22:52:25 +01:00
void ScriptVariableList::MakePrimitive()
{
con_set_enum<short3, ScriptVariable> en = list;
for (con_set_enum<short3, ScriptVariable>::Entry *entry = en.NextElement(); entry; entry = en.NextElement()) {
entry->value.MakePrimitive();
}
}
2023-07-05 21:23:39 +02:00
CLASS_DECLARATION(Class, ScriptVariableList, NULL) {
{NULL, NULL}
2016-03-27 11:49:47 +02:00
};
#endif