mirror of
https://github.com/sfall-team/sfall.git
synced 2026-07-27 16:52:34 -07:00
Replaced DATATYPE_* constants with enum class
This commit is contained in:
@@ -30,14 +30,14 @@ DWORD stackArrayId;
|
||||
|
||||
static char get_all_arrays_special_key[] = "...all_arrays...";
|
||||
|
||||
sArrayElement::sArrayElement() : len(0), intVal(0), type(DATATYPE_NONE)
|
||||
sArrayElement::sArrayElement() : len(0), intVal(0), type(DataType::NONE)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
sArrayElement::sArrayElement( DWORD _val, DWORD _dataType ) : len(0), type(_dataType), intVal(_val)
|
||||
sArrayElement::sArrayElement( DWORD _val, DataType _dataType ) : len(0), type(_dataType), intVal(_val)
|
||||
{
|
||||
if (DATATYPE_STR == _dataType)
|
||||
if (DataType::STR == _dataType)
|
||||
len = strlen((char*)_val);
|
||||
}
|
||||
|
||||
@@ -48,20 +48,20 @@ sArrayElement::sArrayElement(const long& other)
|
||||
|
||||
void sArrayElement::clear()
|
||||
{
|
||||
if (type == DATATYPE_STR && strVal)
|
||||
if (type == DataType::STR && strVal)
|
||||
delete[] strVal;
|
||||
}
|
||||
|
||||
void sArrayElement::setByType( DWORD val, DWORD dataType )
|
||||
void sArrayElement::setByType( DWORD val, DataType dataType )
|
||||
{
|
||||
switch(dataType) {
|
||||
case DATATYPE_STR:
|
||||
case DataType::STR:
|
||||
set((char*)val);
|
||||
break;
|
||||
case DATATYPE_INT:
|
||||
case DataType::INT:
|
||||
set(*(long*)&val);
|
||||
break;
|
||||
case DATATYPE_FLOAT:
|
||||
case DataType::FLOAT:
|
||||
set(*(float*)&val);
|
||||
break;
|
||||
}
|
||||
@@ -70,21 +70,21 @@ void sArrayElement::setByType( DWORD val, DWORD dataType )
|
||||
void sArrayElement::set( long val )
|
||||
{
|
||||
clear();
|
||||
type = DATATYPE_INT;
|
||||
type = DataType::INT;
|
||||
intVal = val;
|
||||
}
|
||||
|
||||
void sArrayElement::set( float val )
|
||||
{
|
||||
clear();
|
||||
type = DATATYPE_FLOAT;
|
||||
type = DataType::FLOAT;
|
||||
floatVal = val;
|
||||
}
|
||||
|
||||
void sArrayElement::set( const char* val, int _len /*= -1*/ )
|
||||
{
|
||||
clear();
|
||||
type = DATATYPE_STR;
|
||||
type = DataType::STR;
|
||||
if (_len == -1)
|
||||
_len = strlen(val);
|
||||
if (_len > ARRAY_MAX_STRING-1) // memory safety
|
||||
@@ -98,13 +98,13 @@ void sArrayElement::set( const char* val, int _len /*= -1*/ )
|
||||
void sArrayElement::unset()
|
||||
{
|
||||
clear();
|
||||
type = DATATYPE_NONE;
|
||||
type = DataType::NONE;
|
||||
len = intVal = 0;
|
||||
}
|
||||
|
||||
DWORD sArrayElement::getHashStatic(DWORD value, DWORD type) {
|
||||
DWORD sArrayElement::getHashStatic(DWORD value, DataType type) {
|
||||
switch (type) {
|
||||
case DATATYPE_STR:
|
||||
case DataType::STR:
|
||||
const char* str;
|
||||
str = (const char*)value;
|
||||
int i;
|
||||
@@ -113,8 +113,8 @@ DWORD sArrayElement::getHashStatic(DWORD value, DWORD type) {
|
||||
res = ((res << 5) + res) + str[i];
|
||||
}
|
||||
return res;
|
||||
case DATATYPE_INT:
|
||||
case DATATYPE_FLOAT:
|
||||
case DataType::INT:
|
||||
case DataType::FLOAT:
|
||||
return value;
|
||||
default:
|
||||
return 0;
|
||||
@@ -127,11 +127,11 @@ bool sArrayElement::operator<( const sArrayElement &el ) const
|
||||
return true;
|
||||
} else if (type == el.type) {
|
||||
switch (type) {
|
||||
case DATATYPE_STR:
|
||||
case DataType::STR:
|
||||
return strcmp(strVal, el.strVal) < 0;
|
||||
case DATATYPE_FLOAT:
|
||||
case DataType::FLOAT:
|
||||
return floatVal < el.floatVal;
|
||||
case DATATYPE_INT:
|
||||
case DataType::INT:
|
||||
default:
|
||||
return intVal < el.intVal;
|
||||
}
|
||||
@@ -145,10 +145,10 @@ bool sArrayElement_EqualFunc::operator()( const sArrayElement &elA, const sArray
|
||||
if (elA.type != elB.type)
|
||||
return false;
|
||||
switch (elA.type) {
|
||||
case DATATYPE_STR:
|
||||
case DataType::STR:
|
||||
return strcmp(elA.strVal, elB.strVal) == 0;
|
||||
case DATATYPE_INT:
|
||||
case DATATYPE_FLOAT:
|
||||
case DataType::INT:
|
||||
case DataType::FLOAT:
|
||||
return elA.intVal == elB.intVal;
|
||||
default:
|
||||
return true;
|
||||
@@ -169,7 +169,7 @@ void SaveArrayElement(sArrayElement* el, HANDLE h)
|
||||
{
|
||||
DWORD unused;
|
||||
WriteFile(h, &el->type, 4, &unused, 0);
|
||||
if (el->type == DATATYPE_STR) {
|
||||
if (el->type == DataType::STR) {
|
||||
WriteFile(h, &el->len, 4, &unused, 0);
|
||||
WriteFile(h, el->strVal, el->len, &unused, 0);
|
||||
} else {
|
||||
@@ -181,7 +181,7 @@ void LoadArrayElement(sArrayElement* el, HANDLE h)
|
||||
{
|
||||
DWORD unused;
|
||||
ReadFile(h, &el->type, 4, &unused, 0);
|
||||
if (el->type == DATATYPE_STR) {
|
||||
if (el->type == DataType::STR) {
|
||||
ReadFile(h, &el->len, 4, &unused, 0);
|
||||
if (el->len > 0) {
|
||||
el->strVal = new char[el->len];
|
||||
@@ -211,20 +211,20 @@ void LoadArraysOld(HANDLE h) {
|
||||
varN.val.resize(var.len);
|
||||
for (j=0; j<var.len; j++) {
|
||||
switch (var.types[j]) {
|
||||
case DATATYPE_INT:
|
||||
case DataType::INT:
|
||||
varN.val[j].set(*(long*)(&var.data[var.datalen*j]));
|
||||
break;
|
||||
case DATATYPE_FLOAT:
|
||||
case DataType::FLOAT:
|
||||
varN.val[j].set(*(float*)(&var.data[var.datalen*j]));
|
||||
break;
|
||||
case DATATYPE_STR:
|
||||
case DataType::STR:
|
||||
varN.val[j].set(&var.data[var.datalen*j], var.datalen - 1);
|
||||
break;
|
||||
}
|
||||
}
|
||||
delete[] var.types;
|
||||
delete[] var.data;
|
||||
varN.key = sArrayElement(id, DATATYPE_INT);
|
||||
varN.key = sArrayElement(id, DataType::INT);
|
||||
arrays.insert(array_pair(id, varN));
|
||||
savedArrays[varN.key] = id;
|
||||
}
|
||||
@@ -240,9 +240,9 @@ void LoadArrays(HANDLE h) {
|
||||
nextarrayid = 1;
|
||||
for (DWORD i=0; i<count; i++) {
|
||||
LoadArrayElement(&arrayVar.key, h);
|
||||
if (arrayVar.key.type > 4 || arrayVar.key.intVal == 0) { // partial compatibility with 3.4
|
||||
arrayVar.key.intVal = arrayVar.key.type;
|
||||
arrayVar.key.type = DATATYPE_INT;
|
||||
if (static_cast<long>(arrayVar.key.type) > 4 || arrayVar.key.intVal == 0) { // partial compatibility with 3.4
|
||||
arrayVar.key.intVal = static_cast<long>(arrayVar.key.type);
|
||||
arrayVar.key.type = DataType::INT;
|
||||
}
|
||||
ReadFile(h, &arrayVar.flags, 4, &unused, 0);
|
||||
ReadFile(h, &elCount, 4, &unused, 0); // actual number of elements: keys+values
|
||||
@@ -335,7 +335,7 @@ DWORD _stdcall CreateArray(int len, DWORD nothing) {
|
||||
while(arrays.find(nextarrayid)!=arrays.end()) nextarrayid++;
|
||||
if (nextarrayid == 0) nextarrayid++;
|
||||
if (arraysBehavior == 0) {
|
||||
var.key = sArrayElement(nextarrayid, DATATYPE_INT);
|
||||
var.key = sArrayElement(nextarrayid, DataType::INT);
|
||||
savedArrays[var.key] = nextarrayid;
|
||||
}
|
||||
stackArrayId = nextarrayid;
|
||||
@@ -369,13 +369,13 @@ ScriptValue _stdcall GetArrayKey(DWORD id, int index) {
|
||||
index *= 2;
|
||||
// for associative array - return key at the specified index
|
||||
switch(arrays[id].val[index].type) {
|
||||
case DATATYPE_INT:
|
||||
case DataType::INT:
|
||||
return ScriptValue(arrays[id].val[index].intVal);
|
||||
case DATATYPE_FLOAT:
|
||||
case DataType::FLOAT:
|
||||
return ScriptValue(arrays[id].val[index].floatVal);
|
||||
case DATATYPE_STR:
|
||||
case DataType::STR:
|
||||
return ScriptValue(arrays[id].val[index].strVal);
|
||||
case DATATYPE_NONE:
|
||||
case DataType::NONE:
|
||||
default:
|
||||
return ScriptValue(0);
|
||||
}
|
||||
@@ -405,12 +405,12 @@ ScriptValue _stdcall GetArray(DWORD id, const ScriptValue& key) {
|
||||
}
|
||||
}
|
||||
switch (arr.val[el].type) {
|
||||
case DATATYPE_NONE: return ScriptValue();
|
||||
case DATATYPE_INT:
|
||||
case DataType::NONE: return ScriptValue();
|
||||
case DataType::INT:
|
||||
return ScriptValue(arr.val[el].intVal);
|
||||
case DATATYPE_FLOAT:
|
||||
case DataType::FLOAT:
|
||||
return ScriptValue(arr.val[el].floatVal);
|
||||
case DATATYPE_STR:
|
||||
case DataType::STR:
|
||||
return ScriptValue(arr.val[el].strVal);
|
||||
}
|
||||
return ScriptValue(0);
|
||||
@@ -526,7 +526,7 @@ ScriptValue _stdcall ScanArray(DWORD id, const ScriptValue& val) {
|
||||
(val.isString() && strcmp(el.strVal, val.asString()) == 0)) {
|
||||
if (arrays[id].isAssoc()) { // return key instead of index for associative arrays
|
||||
return ScriptValue(
|
||||
static_cast<SfallDataType>(arrays[id].val[i].type),
|
||||
static_cast<DataType>(arrays[id].val[i].type),
|
||||
static_cast<DWORD>(arrays[id].val[i].intVal)
|
||||
);
|
||||
} else {
|
||||
@@ -541,7 +541,7 @@ ScriptValue _stdcall ScanArray(DWORD id, const ScriptValue& val) {
|
||||
DWORD _stdcall LoadArray(const ScriptValue& key) {
|
||||
if (!key.isInt() || key.asInt() != 0) { // returns arrayId by it's key (ignoring int(0) because it is used to "unsave" array)
|
||||
sArrayElement keyEl = sArrayElement(key.rawValue(), key.type());
|
||||
if (keyEl.type == DATATYPE_STR && strcmp(keyEl.strVal, get_all_arrays_special_key) == 0) { // this is a special case to get temp array containing all saved arrays
|
||||
if (keyEl.type == DataType::STR && strcmp(keyEl.strVal, get_all_arrays_special_key) == 0) { // this is a special case to get temp array containing all saved arrays
|
||||
DWORD tmpArrId = TempArray(savedArrays.size(), 0);
|
||||
if (tmpArrId > 0) {
|
||||
std::vector<sArrayElement>::iterator elIt;
|
||||
|
||||
@@ -5,6 +5,8 @@
|
||||
#include <set>
|
||||
#include <Windows.h>
|
||||
|
||||
#include "ScriptValue.h"
|
||||
|
||||
namespace sfall
|
||||
{
|
||||
namespace script
|
||||
@@ -22,13 +24,11 @@ namespace script
|
||||
|
||||
extern char get_all_arrays_special_key[];
|
||||
|
||||
class ScriptValue;
|
||||
|
||||
// TODO: rewrite (or replace with ScriptValue)
|
||||
class sArrayElement
|
||||
{
|
||||
public:
|
||||
DWORD type; // DATATYPE_*
|
||||
DataType type;
|
||||
DWORD len; // for strings
|
||||
union {
|
||||
long intVal;
|
||||
@@ -37,12 +37,12 @@ public:
|
||||
};
|
||||
sArrayElement();
|
||||
// this constructor does not copy strings (for performance), use set() for actual array elements
|
||||
sArrayElement(DWORD _val, DWORD _dataType);
|
||||
sArrayElement(DWORD _val, DataType _dataType);
|
||||
sArrayElement(const long&);
|
||||
// free string resource from memory, has to be called manually when deleting element
|
||||
void clear();
|
||||
// set* methods will actually COPY strings, use this when acquiring data from the scripting engine
|
||||
void setByType(DWORD val, DWORD dataType);
|
||||
void setByType(DWORD val, DataType dataType);
|
||||
void sArrayElement::set( const sArrayElement &el )
|
||||
{
|
||||
setByType(el.intVal, el.type);
|
||||
@@ -55,7 +55,7 @@ public:
|
||||
{
|
||||
return getHashStatic(*(DWORD*)&intVal, type);
|
||||
}
|
||||
DWORD static getHashStatic(DWORD value, DWORD type);
|
||||
DWORD static getHashStatic(DWORD value, DataType type);
|
||||
bool operator < (const sArrayElement &el) const;
|
||||
};
|
||||
|
||||
|
||||
@@ -32,7 +32,7 @@ namespace script
|
||||
void sf_create_array(OpcodeContext& ctx) {
|
||||
auto arrayId = CreateArray(ctx.arg(0).asInt(), ctx.arg(1).asInt());
|
||||
ctx.setReturn(
|
||||
ScriptValue(DATATYPE_INT, arrayId)
|
||||
ScriptValue(DataType::INT, arrayId)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -83,7 +83,7 @@ void sf_resize_array(OpcodeContext& ctx) {
|
||||
void sf_temp_array(OpcodeContext& ctx) {
|
||||
auto arrayId = TempArray(ctx.arg(0).asInt(), ctx.arg(1).asInt());
|
||||
ctx.setReturn(
|
||||
ScriptValue(DATATYPE_INT, arrayId)
|
||||
ScriptValue(DataType::INT, arrayId)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -209,14 +209,14 @@ static void _stdcall ListEnd(sList* list) {
|
||||
void sf_list_begin(OpcodeContext& ctx) {
|
||||
auto list = ListBegin(ctx.arg(0).asInt());
|
||||
ctx.setReturn(
|
||||
ScriptValue(DATATYPE_INT, reinterpret_cast<DWORD>(list))
|
||||
ScriptValue(DataType::INT, reinterpret_cast<DWORD>(list))
|
||||
);
|
||||
}
|
||||
|
||||
void sf_list_as_array(OpcodeContext& ctx) {
|
||||
auto arrayId = ListAsArray(ctx.arg(0).asInt());
|
||||
ctx.setReturn(
|
||||
ScriptValue(DATATYPE_INT, arrayId)
|
||||
ScriptValue(DataType::INT, arrayId)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -71,13 +71,13 @@ void sf_test(OpcodeContext& ctx) {
|
||||
const ScriptValue &arg = ctx.arg(i);
|
||||
sstream << ", ";
|
||||
switch (arg.type()) {
|
||||
case DATATYPE_INT:
|
||||
case DataType::INT:
|
||||
sstream << arg.asInt();
|
||||
break;
|
||||
case DATATYPE_FLOAT:
|
||||
case DataType::FLOAT:
|
||||
sstream << arg.asFloat();
|
||||
break;
|
||||
case DATATYPE_STR:
|
||||
case DataType::STR:
|
||||
sstream << '"' << arg.asString() << '"';
|
||||
break;
|
||||
default:
|
||||
@@ -99,7 +99,7 @@ void sf_get_metarule_table(OpcodeContext& ctx) {
|
||||
arrays[arr].val[i].set(it->first.c_str());
|
||||
i++;
|
||||
}
|
||||
ctx.setReturn(arr, DATATYPE_INT);
|
||||
ctx.setReturn(arr, DataType::INT);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -258,7 +258,7 @@ void sf_make_straight_path(OpcodeContext& ctx) {
|
||||
resultObj, arg6;
|
||||
arg6 = (type == BLOCKING_TYPE_SHOOT) ? 32 : 0;
|
||||
make_straight_path_func_wrapper(objFrom, *(DWORD*)(objFrom + 4), 0, tileTo, &resultObj, arg6, getBlockingFunc(type));
|
||||
ctx.setReturn(resultObj, DATATYPE_INT);
|
||||
ctx.setReturn(resultObj, DataType::INT);
|
||||
}
|
||||
|
||||
void sf_make_path(OpcodeContext& ctx) {
|
||||
@@ -270,7 +270,7 @@ void sf_make_path(OpcodeContext& ctx) {
|
||||
arr;
|
||||
long pathLength, a5 = 1;
|
||||
if (!objFrom) {
|
||||
ctx.setReturn(0, DATATYPE_INT);
|
||||
ctx.setReturn(0, DataType::INT);
|
||||
return;
|
||||
}
|
||||
tileFrom = *(DWORD*)(objFrom + 4);
|
||||
@@ -290,7 +290,7 @@ void sf_make_path(OpcodeContext& ctx) {
|
||||
for (int i = 0; i < pathLength; i++) {
|
||||
arrays[arr].val[i].set((long)pathData[i]);
|
||||
}
|
||||
ctx.setReturn(arr, DATATYPE_INT);
|
||||
ctx.setReturn(arr, DataType::INT);
|
||||
}
|
||||
|
||||
void sf_obj_blocking_at(OpcodeContext& ctx) {
|
||||
@@ -303,7 +303,7 @@ void sf_obj_blocking_at(OpcodeContext& ctx) {
|
||||
// this check was added because the engine always does exactly this when using shoot blocking checks
|
||||
resultObj = 0;
|
||||
}
|
||||
ctx.setReturn(resultObj, DATATYPE_INT);
|
||||
ctx.setReturn(resultObj, DataType::INT);
|
||||
}
|
||||
|
||||
void sf_tile_get_objects(OpcodeContext& ctx) {
|
||||
@@ -324,7 +324,7 @@ void sf_tile_get_objects(OpcodeContext& ctx) {
|
||||
mov obj, eax;
|
||||
}
|
||||
}
|
||||
ctx.setReturn(arrayId, DATATYPE_INT);
|
||||
ctx.setReturn(arrayId, DataType::INT);
|
||||
}
|
||||
|
||||
void sf_get_party_members(OpcodeContext& ctx) {
|
||||
@@ -349,7 +349,7 @@ void sf_get_party_members(OpcodeContext& ctx) {
|
||||
}
|
||||
arrays[arrayId].push_back((long)obj);
|
||||
}
|
||||
ctx.setReturn(arrayId, DATATYPE_INT);
|
||||
ctx.setReturn(arrayId, DataType::INT);
|
||||
}
|
||||
|
||||
void sf_art_exists(OpcodeContext& ctx) {
|
||||
|
||||
@@ -72,7 +72,7 @@ DWORD OpcodeContext::opcode() const {
|
||||
return _opcode;
|
||||
}
|
||||
|
||||
void OpcodeContext::setReturn(unsigned long value, SfallDataType type) {
|
||||
void OpcodeContext::setReturn(unsigned long value, DataType type) {
|
||||
_ret = ScriptValue(type, value);
|
||||
}
|
||||
|
||||
@@ -99,13 +99,13 @@ bool OpcodeContext::validateArguments(const OpcodeArgumentType argTypes[], const
|
||||
auto actualType = arg(i).type();
|
||||
// display invalid type error if type is set and differs from actual type
|
||||
// exception is when type set to
|
||||
if ((argType == ARG_INT || argType == ARG_OBJECT) && !(actualType == DATATYPE_INT)) {
|
||||
if ((argType == ARG_INT || argType == ARG_OBJECT) && !(actualType == DataType::INT)) {
|
||||
printOpcodeError("%s() - argument #%d is not an integer.", opcodeName, i);
|
||||
return false;
|
||||
} else if (argType == ARG_NUMBER && !(actualType == DATATYPE_INT || actualType == DATATYPE_FLOAT)) {
|
||||
} else if (argType == ARG_NUMBER && !(actualType == DataType::INT || actualType == DataType::FLOAT)) {
|
||||
printOpcodeError("%s() - argument #%d is not a number.", opcodeName, i);
|
||||
return false;
|
||||
} else if (argType == ARG_STRING && !(actualType == DATATYPE_STR)) {
|
||||
} else if (argType == ARG_STRING && !(actualType == DataType::STR)) {
|
||||
printOpcodeError("%s() - argument #%d is not a string.", opcodeName, i);
|
||||
return false;
|
||||
} else if (argType == ARG_OBJECT && arg(i).rawValue() == 0) {
|
||||
@@ -146,40 +146,40 @@ void __stdcall OpcodeContext::handleOpcodeStatic(TProgram* program, DWORD opcode
|
||||
|
||||
const char* OpcodeContext::getSfallTypeName(DWORD dataType) {
|
||||
switch (dataType) {
|
||||
case DATATYPE_NONE:
|
||||
case DataType::NONE:
|
||||
return "(none)";
|
||||
case DATATYPE_STR:
|
||||
case DataType::STR:
|
||||
return "string";
|
||||
case DATATYPE_FLOAT:
|
||||
case DataType::FLOAT:
|
||||
return "float";
|
||||
case DATATYPE_INT:
|
||||
case DataType::INT:
|
||||
return "integer";
|
||||
default:
|
||||
return "(unknown)";
|
||||
}
|
||||
}
|
||||
|
||||
DWORD OpcodeContext::getSfallTypeByScriptType(DWORD varType) {
|
||||
DataType OpcodeContext::getSfallTypeByScriptType(DWORD varType) {
|
||||
varType &= 0xffff;
|
||||
switch (varType) {
|
||||
case VAR_TYPE_STR:
|
||||
case VAR_TYPE_STR2:
|
||||
return DATATYPE_STR;
|
||||
return DataType::STR;
|
||||
case VAR_TYPE_FLOAT:
|
||||
return DATATYPE_FLOAT;
|
||||
return DataType::FLOAT;
|
||||
case VAR_TYPE_INT:
|
||||
default:
|
||||
return DATATYPE_INT;
|
||||
return DataType::INT;
|
||||
}
|
||||
}
|
||||
|
||||
DWORD OpcodeContext::getScriptTypeBySfallType(DWORD dataType) {
|
||||
DWORD OpcodeContext::getScriptTypeBySfallType(DataType dataType) {
|
||||
switch (dataType) {
|
||||
case DATATYPE_STR:
|
||||
case DataType::STR:
|
||||
return VAR_TYPE_STR;
|
||||
case DATATYPE_FLOAT:
|
||||
case DataType::FLOAT:
|
||||
return VAR_TYPE_FLOAT;
|
||||
case DATATYPE_INT:
|
||||
case DataType::INT:
|
||||
default:
|
||||
return VAR_TYPE_INT;
|
||||
}
|
||||
@@ -191,10 +191,10 @@ void OpcodeContext::_popArguments() {
|
||||
// get argument from stack
|
||||
DWORD rawValueType = Wrapper::interpretPopShort(_program);
|
||||
DWORD rawValue = Wrapper::interpretPopLong(_program);
|
||||
SfallDataType type = static_cast<SfallDataType>(getSfallTypeByScriptType(rawValueType));
|
||||
DataType type = static_cast<DataType>(getSfallTypeByScriptType(rawValueType));
|
||||
|
||||
// retrieve string argument
|
||||
if (type == DATATYPE_STR) {
|
||||
if (type == DataType::STR) {
|
||||
_args.at(i) = Wrapper::interpretGetString(_program, rawValueType, rawValue);
|
||||
} else {
|
||||
_args.at(i) = ScriptValue(type, rawValue);
|
||||
@@ -204,12 +204,12 @@ void OpcodeContext::_popArguments() {
|
||||
|
||||
void OpcodeContext::_pushReturnValue() {
|
||||
if (_hasReturn) {
|
||||
if (_ret.type() == DATATYPE_NONE) {
|
||||
if (_ret.type() == DataType::NONE) {
|
||||
// if no value was set in handler, force return 0 to avoid stack error
|
||||
_ret = ScriptValue(0);
|
||||
}
|
||||
DWORD rawResult = _ret.rawValue();
|
||||
if (_ret.type() == DATATYPE_STR) {
|
||||
if (_ret.type() == DataType::STR) {
|
||||
rawResult = Wrapper::interpretAddString(_program, _ret.asString());
|
||||
}
|
||||
Wrapper::interpretPushLong(_program, rawResult);
|
||||
|
||||
@@ -100,7 +100,7 @@ public:
|
||||
DWORD opcode() const;
|
||||
|
||||
// set return value for current opcode
|
||||
void setReturn(unsigned long value, SfallDataType type);
|
||||
void setReturn(unsigned long value, DataType type);
|
||||
|
||||
// set return value for current opcode
|
||||
void setReturn(const ScriptValue& val);
|
||||
@@ -127,9 +127,9 @@ public:
|
||||
|
||||
static const char* getSfallTypeName(DWORD dataType);
|
||||
|
||||
static DWORD getSfallTypeByScriptType(DWORD varType);
|
||||
static DataType getSfallTypeByScriptType(DWORD varType);
|
||||
|
||||
static DWORD getScriptTypeBySfallType(DWORD dataType);
|
||||
static DWORD getScriptTypeBySfallType(DataType dataType);
|
||||
|
||||
private:
|
||||
// pops arguments from data stack
|
||||
|
||||
@@ -23,7 +23,7 @@ namespace sfall
|
||||
namespace script
|
||||
{
|
||||
|
||||
ScriptValue::ScriptValue( SfallDataType type, unsigned long value )
|
||||
ScriptValue::ScriptValue( DataType type, unsigned long value )
|
||||
{
|
||||
_val.dw = value;
|
||||
_type = type;
|
||||
@@ -31,45 +31,45 @@ ScriptValue::ScriptValue( SfallDataType type, unsigned long value )
|
||||
|
||||
ScriptValue::ScriptValue() {
|
||||
_val.dw = 0;
|
||||
_type = DATATYPE_NONE;
|
||||
_type = DataType::NONE;
|
||||
}
|
||||
|
||||
ScriptValue::ScriptValue(const char* strval) {
|
||||
_val.str = strval;
|
||||
_type = DATATYPE_STR;
|
||||
_type = DataType::STR;
|
||||
}
|
||||
|
||||
ScriptValue::ScriptValue(int val) {
|
||||
_val.i = val;
|
||||
_type = DATATYPE_INT;
|
||||
_type = DataType::INT;
|
||||
}
|
||||
|
||||
ScriptValue::ScriptValue(float val) {
|
||||
_val.f = val;
|
||||
_type = DATATYPE_FLOAT;
|
||||
_type = DataType::FLOAT;
|
||||
}
|
||||
|
||||
ScriptValue::ScriptValue(bool val) {
|
||||
_val.i = val ? 1 : 0;
|
||||
_type = DATATYPE_INT;
|
||||
_type = DataType::INT;
|
||||
}
|
||||
|
||||
ScriptValue::ScriptValue(TGameObj* obj) {
|
||||
_val.gObj = obj;
|
||||
_type = DATATYPE_INT;
|
||||
_type = DataType::INT;
|
||||
}
|
||||
|
||||
bool ScriptValue::isInt() const
|
||||
{
|
||||
return _type == DATATYPE_INT;
|
||||
return _type == DataType::INT;
|
||||
}
|
||||
|
||||
bool ScriptValue::isFloat() const {
|
||||
return _type == DATATYPE_FLOAT;
|
||||
return _type == DataType::FLOAT;
|
||||
}
|
||||
|
||||
bool ScriptValue::isString() const {
|
||||
return _type == DATATYPE_STR;
|
||||
return _type == DataType::STR;
|
||||
}
|
||||
|
||||
unsigned long ScriptValue::rawValue() const {
|
||||
@@ -78,9 +78,9 @@ unsigned long ScriptValue::rawValue() const {
|
||||
|
||||
int ScriptValue::asInt() const {
|
||||
switch (_type) {
|
||||
case DATATYPE_FLOAT:
|
||||
case DataType::FLOAT:
|
||||
return static_cast<int>(_val.f);
|
||||
case DATATYPE_INT:
|
||||
case DataType::INT:
|
||||
return _val.i;
|
||||
default:
|
||||
return 0;
|
||||
@@ -89,9 +89,9 @@ int ScriptValue::asInt() const {
|
||||
|
||||
bool ScriptValue::asBool() const {
|
||||
switch (_type) {
|
||||
case DATATYPE_FLOAT:
|
||||
case DataType::FLOAT:
|
||||
return static_cast<int>(_val.f) != 0;
|
||||
case DATATYPE_INT:
|
||||
case DataType::INT:
|
||||
return _val.i != 0;
|
||||
default:
|
||||
return true;
|
||||
@@ -100,9 +100,9 @@ bool ScriptValue::asBool() const {
|
||||
|
||||
float ScriptValue::asFloat() const {
|
||||
switch (_type) {
|
||||
case DATATYPE_FLOAT:
|
||||
case DataType::FLOAT:
|
||||
return _val.f;
|
||||
case DATATYPE_INT:
|
||||
case DataType::INT:
|
||||
return static_cast<float>(_val.i);
|
||||
default:
|
||||
return 0.0;
|
||||
@@ -110,18 +110,18 @@ float ScriptValue::asFloat() const {
|
||||
}
|
||||
|
||||
const char* ScriptValue::asString() const {
|
||||
return (_type == DATATYPE_STR)
|
||||
return (_type == DataType::STR)
|
||||
? _val.str
|
||||
: "";
|
||||
}
|
||||
|
||||
TGameObj* ScriptValue::asObject() const {
|
||||
return (_type == DATATYPE_INT)
|
||||
return (_type == DataType::INT)
|
||||
? _val.gObj
|
||||
: nullptr;
|
||||
}
|
||||
|
||||
SfallDataType ScriptValue::type() const {
|
||||
DataType ScriptValue::type() const {
|
||||
return _type;
|
||||
}
|
||||
|
||||
|
||||
@@ -25,12 +25,11 @@ namespace sfall
|
||||
namespace script
|
||||
{
|
||||
|
||||
// TODO: replace with enum class
|
||||
enum SfallDataType {
|
||||
DATATYPE_NONE = 0,
|
||||
DATATYPE_INT,
|
||||
DATATYPE_FLOAT,
|
||||
DATATYPE_STR
|
||||
enum class DataType : unsigned long {
|
||||
NONE = 0,
|
||||
INT,
|
||||
FLOAT,
|
||||
STR
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -38,7 +37,7 @@ enum SfallDataType {
|
||||
*/
|
||||
class ScriptValue {
|
||||
public:
|
||||
ScriptValue(SfallDataType type, unsigned long value);
|
||||
ScriptValue(DataType type, unsigned long value);
|
||||
|
||||
ScriptValue();
|
||||
|
||||
@@ -75,7 +74,7 @@ public:
|
||||
// returns value as object pointer or nullptr if value is not integer
|
||||
TGameObj* asObject() const;
|
||||
|
||||
SfallDataType type() const;
|
||||
DataType type() const;
|
||||
|
||||
private:
|
||||
union Value {
|
||||
@@ -86,7 +85,7 @@ private:
|
||||
TGameObj* gObj;
|
||||
} _val;
|
||||
|
||||
SfallDataType _type; // TODO: replace with enum class
|
||||
DataType _type; // TODO: replace with enum class
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user