From 1648a71e45c00296094f0505c79f8d8b2f7f8fa6 Mon Sep 17 00:00:00 2001 From: Randy Heit Date: Tue, 29 Mar 2016 22:49:12 -0500 Subject: [PATCH] Add support for Name and String types to ACS's GetUserVariable - Reading one of these types will copy its value into the global ACS string table and return the index. --- src/p_acs.cpp | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/src/p_acs.cpp b/src/p_acs.cpp index 9dbbd5eea..143683602 100644 --- a/src/p_acs.cpp +++ b/src/p_acs.cpp @@ -4529,12 +4529,12 @@ int DLevelScript::LineFromID(int id) } } -bool GetVarAddrType(AActor *self, FName varname, int index, void *&addr, PType *&type, bool allownative) +bool GetVarAddrType(AActor *self, FName varname, int index, void *&addr, PType *&type, bool readonly) { PField *var = dyn_cast(self->GetClass()->Symbols.FindSymbol(varname, true)); PArray *arraytype; - if (var == NULL || (!allownative && (var->Flags & VARF_Native))) + if (var == NULL || (!readonly && (var->Flags & VARF_Native))) { return false; } @@ -4561,6 +4561,11 @@ bool GetVarAddrType(AActor *self, FName varname, int index, void *&addr, PType * // but we do want to support Float subclasses like Fixed. if (!type->IsA(RUNTIME_CLASS(PInt)) || !type->IsKindOf(RUNTIME_CLASS(PFloat))) { + // For reading, we also support Name and String types. + if (readonly && (type->IsA(RUNTIME_CLASS(PName)) || type->IsA(RUNTIME_CLASS(PString)))) + { + return true; + } return false; } return true; @@ -4591,13 +4596,21 @@ static int GetUserVariable(AActor *self, FName varname, int index) if (GetVarAddrType(self, varname, index, addr, type, true)) { - if (!type->IsKindOf(RUNTIME_CLASS(PFloat))) + if (type->IsKindOf(RUNTIME_CLASS(PFloat))) { - return type->GetValueInt(addr); + return FLOAT2FIXED(type->GetValueFloat(addr)); + } + else if (type->IsA(RUNTIME_CLASS(PName))) + { + return GlobalACSStrings.AddString(FName(ENamedName(type->GetValueInt(addr))).GetChars()); + } + else if (type->IsA(RUNTIME_CLASS(PString))) + { + return GlobalACSStrings.AddString(*(FString *)addr); } else { - return FLOAT2FIXED(type->GetValueFloat(addr)); + return type->GetValueInt(addr); } } return 0;