diff --git a/include/RE/B/BSScriptUtil.h b/include/RE/B/BSScriptUtil.h index 2608732f..7339c8ff 100644 --- a/include/RE/B/BSScriptUtil.h +++ b/include/RE/B/BSScriptUtil.h @@ -782,12 +782,10 @@ namespace RE::BSScript return T(); } - using value_type = typename T::value_type; - T out; const auto in = get(a_var); for (const auto& var : in->elements) { - out.push_back(detail::UnpackVariable(var)); + out.push_back(detail::UnpackVariable(var)); } return out; diff --git a/include/RE/T/TypeInfo.h b/include/RE/T/TypeInfo.h index b1cf9ca8..8c9b34dc 100644 --- a/include/RE/T/TypeInfo.h +++ b/include/RE/T/TypeInfo.h @@ -76,37 +76,54 @@ namespace RE::BSScript } } - [[nodiscard]] bool IsComplex() const noexcept { return data.rawType >= RawType::kArrayEnd; } + [[nodiscard]] bool IsComplex() const noexcept + { + // do not use GetRawType() here, may cause infinite recursion + return data.rawType >= RawType::kArrayEnd; + } [[nodiscard]] bool IsObjectArray() const noexcept { return GetRawType() == RawType::kArrayObject; } + [[nodiscard]] bool IsStructArray() const noexcept { return GetRawType() == RawType::kArrayStruct; } + [[nodiscard]] bool IsComplexTypeArray() const noexcept { return (IsComplex() && IsArray()); } + + [[nodiscard]] bool IsNone() const { return GetRawType() == RawType::kNone; } [[nodiscard]] bool IsObject() const { return GetRawType() == RawType::kObject; } + [[nodiscard]] bool IsString() const { return GetRawType() == RawType::kString; } + [[nodiscard]] bool IsInt() const { return GetRawType() == RawType::kInt; } + [[nodiscard]] bool IsFloat() const { return GetRawType() == RawType::kFloat; } + [[nodiscard]] bool IsBool() const { return GetRawType() == RawType::kBool; } + [[nodiscard]] bool IsVar() const { return GetRawType() == RawType::kVar; } [[nodiscard]] bool IsStruct() const { return GetRawType() == RawType::kStruct; } - IComplexType* GetComplexType() const + + IComplexType* GetComplexType() const { return IsComplex() ? reinterpret_cast( reinterpret_cast(data.complexTypeInfo) & ~static_cast(1)) : nullptr; } + ObjectTypeInfo* GetObjectTypeInfo() const { return IsObject() || IsObjectArray() ? reinterpret_cast(GetComplexType()) : nullptr; } + StructTypeInfo* GetStructTypeInfo() const { return IsStruct() || IsStructArray() ? reinterpret_cast(GetComplexType()) : nullptr; } + void SetArray(bool a_set) noexcept { if (IsComplex()) { diff --git a/include/RE/V/Variable.h b/include/RE/V/Variable.h index 243cba06..46c873c9 100644 --- a/include/RE/V/Variable.h +++ b/include/RE/V/Variable.h @@ -119,67 +119,67 @@ namespace RE::BSScript SF_HEAP_REDEFINE_NEW(Variable); template - [[nodiscard]] bool is() const // + [[nodiscard]] bool is() const requires(std::same_as) { - return varType.GetRawType() == RawType::kNone; + return varType.IsNone(); } template - [[nodiscard]] bool is() const // + [[nodiscard]] bool is() const requires(std::same_as) { - return varType.GetRawType() == RawType::kObject; + return varType.IsObject(); } template - [[nodiscard]] bool is() const // + [[nodiscard]] bool is() const requires(std::same_as) { - return varType.GetRawType() == RawType::kString; + return varType.IsString(); } template - [[nodiscard]] bool is() const // + [[nodiscard]] bool is() const requires(std::same_as || std::same_as) { - return varType.GetRawType() == RawType::kInt; + return varType.IsInt(); } template - [[nodiscard]] bool is() const // + [[nodiscard]] bool is() const requires(std::same_as) { - return varType.GetRawType() == RawType::kFloat; + return varType.IsFloat(); } template - [[nodiscard]] bool is() const // + [[nodiscard]] bool is() const requires(std::same_as) { - return varType.GetRawType() == RawType::kBool; + return varType.IsBool(); } template - [[nodiscard]] bool is() const // + [[nodiscard]] bool is() const requires(std::same_as) { - return varType.GetRawType() == RawType::kVar; + return varType.IsVar(); } template - [[nodiscard]] bool is() const // + [[nodiscard]] bool is() const requires(std::same_as) { - return varType.GetRawType() == RawType::kStruct; + return varType.IsStruct() && value.t; } template - [[nodiscard]] bool is() const // + [[nodiscard]] bool is() const requires(std::same_as) { - return varType.IsArray(); + return varType.IsArray() && value.a; } TypeInfo GetType() const