From bd7791ad9cedf2e8047ee51f7fe754f21ec4a934 Mon Sep 17 00:00:00 2001 From: Jason Francis Date: Mon, 19 Mar 2018 12:43:26 -0400 Subject: [PATCH] Allow setting string user variables in ACS --- src/p_acs.cpp | 17 +++++++++++------ src/p_setup.cpp | 4 ++-- src/scripting/types.h | 1 - 3 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 1b6c472d8..6f1d1635d 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -5065,10 +5065,10 @@ bool GetVarAddrType(AActor *self, FName varname, int index, void *&addr, PType * } addr = baddr; // We don't want Int subclasses like Name or Color to be accessible here. - if (!type->isInt() && !type->isFloat() && type != TypeBool) + if (!type->isInt() && !type->isFloat() && type != TypeBool && type != TypeString) { - // For reading, we also support Name and String types. - if (readonly && (type == TypeName || type == TypeString)) + // For reading, we also support Name types. + if (readonly && (type == TypeName)) { return true; } @@ -5084,13 +5084,18 @@ static void SetUserVariable(AActor *self, FName varname, int index, int value) if (GetVarAddrType(self, varname, index, addr, type, false)) { - if (!type->isFloat()) + if (type == TypeString) { - type->SetValue(addr, value); + FString str = FBehavior::StaticLookupString(value); + type->InitializeValue(addr, &str); + } + else if (type->isFloat()) + { + type->SetValue(addr, ACSToDouble(value)); } else { - type->SetValue(addr, ACSToDouble(value)); + type->SetValue(addr, value); } } } diff --git a/src/p_setup.cpp b/src/p_setup.cpp index 5a61b0560..dbc3d31d2 100644 --- a/src/p_setup.cpp +++ b/src/p_setup.cpp @@ -1658,7 +1658,7 @@ static void SetMapThingUserData(AActor *actor, unsigned udi) else { // Set the value of the specified user variable. void *addr = reinterpret_cast(actor) + var->Offset; - if (var->Type->isString()) + if (var->Type == TypeString) { var->Type->InitializeValue(addr, &MapThingsUserData[udi].StringVal); } @@ -1666,7 +1666,7 @@ static void SetMapThingUserData(AActor *actor, unsigned udi) { var->Type->SetValue(addr, MapThingsUserData[udi].FloatVal); } - else if (var->Type->isIntCompatible()) + else if (var->Type->isInt() || var->Type == TypeBool) { var->Type->SetValue(addr, MapThingsUserData[udi].IntVal); } diff --git a/src/scripting/types.h b/src/scripting/types.h index dbfca2039..5c55db6c1 100644 --- a/src/scripting/types.h +++ b/src/scripting/types.h @@ -200,7 +200,6 @@ public: bool isStruct() const { return TypeTableType == NAME_Struct; } bool isClass() const { return TypeTableType == NAME_Object; } bool isPrototype() const { return TypeTableType == NAME_Prototype; } - bool isString() const { return TypeTableType == NAME_String; } PContainerType *toContainer() { return isContainer() ? (PContainerType*)this : nullptr; } PPointer *toPointer() { return isPointer() ? (PPointer*)this : nullptr; }