Second commit
This commit is contained in:
commit
36840f3ad4
999 files changed
+61364
No files matched your search
@@ -0,0 +1,98 @@
|
||||
//
|
||||
// This file is part of the Tremble package by Tiny Goose.
|
||||
// Copyright (c) 2024-2026 TinyGoose Ltd., All Rights Reserved.
|
||||
//
|
||||
|
||||
using System;
|
||||
using System.Reflection;
|
||||
using UnityEngine;
|
||||
|
||||
namespace TinyGoose.Tremble
|
||||
{
|
||||
public class EnumFieldConverter : TrembleFieldConverter
|
||||
{
|
||||
public override bool TryGetValueFromMap(BspEntity entity, string key, GameObject gameObject, MemberInfo target, out object value)
|
||||
{
|
||||
// Enum special case - parse as int or string
|
||||
if (entity.TryGetInt(key, out int enumIntValue))
|
||||
{
|
||||
value = enumIntValue;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (entity.TryGetString(key, out string enumStringValue))
|
||||
{
|
||||
if (Enum.TryParse(target.GetFieldOrPropertyTypeOrElementType(), enumStringValue, true, out object enumObjValue))
|
||||
{
|
||||
value = (int)enumObjValue;
|
||||
return true;
|
||||
}
|
||||
|
||||
string entityName = entity.GetID().IsNullOrEmpty() ? entity.GetClassname() : $"'{entity.GetID()}' ({entity.GetClassname()})";
|
||||
Debug.LogWarning($"Failed to parse value '{enumStringValue}' for enum {target.GetFieldOrPropertyTypeOrElementType()} in entity {entityName}. Using default.");
|
||||
}
|
||||
|
||||
value = null;
|
||||
return false;
|
||||
}
|
||||
|
||||
public override bool TryGetValuesFromMap(BspEntity entity, string key, GameObject gameObject, MemberInfo target, out object[] values)
|
||||
{
|
||||
if (!entity.TryGetString(key, out string commaDelimitedValue))
|
||||
{
|
||||
values = Array.Empty<object>();
|
||||
return false;
|
||||
}
|
||||
|
||||
string[] parts = commaDelimitedValue.Split(',');
|
||||
|
||||
values = new object[parts.Length];
|
||||
for (int i = 0; i < parts.Length; i++)
|
||||
{
|
||||
// Enum special case - parse as int or string
|
||||
if (int.TryParse(parts[i], out int enumIntValue))
|
||||
{
|
||||
values[i] = Enum.GetValues(target.GetFieldOrPropertyTypeOrElementType()).GetValue(enumIntValue);
|
||||
}
|
||||
else if (Enum.TryParse(target.GetFieldOrPropertyTypeOrElementType(), parts[i], true, out object enumObjValue))
|
||||
{
|
||||
values[i] = enumObjValue;
|
||||
}
|
||||
else
|
||||
{
|
||||
string entityName = entity.GetID().IsNullOrEmpty() ? entity.GetClassname() : $"'{entity.GetID()}' ({entity.GetClassname()})";
|
||||
Debug.LogWarning($"Failed to parse value '{parts[i]}' for enum {target.GetFieldOrPropertyTypeOrElementType()} in entity {entityName}. Using default.");
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public override void AddFieldToFgd(FgdClass entityClass, string fieldName, object defaultValue, MemberInfo target)
|
||||
{
|
||||
string tooltip = target.GetCustomAttribute<TooltipAttribute>()?.tooltip;
|
||||
|
||||
bool isFlags = target.GetFieldOrPropertyTypeOrElementType().GetCustomAttribute<FlagsAttribute>() != null;
|
||||
|
||||
if (isFlags)
|
||||
{
|
||||
entityClass.AddField(new FgdFlagsField
|
||||
{
|
||||
EnumClassName = target.GetFieldOrPropertyTypeOrElementType().FullName,
|
||||
Name = fieldName,
|
||||
Description = tooltip ?? $"{target.GetFieldOrPropertyTypeOrElementType()} {target.Name}",
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
entityClass.AddField(new FgdEnumField
|
||||
{
|
||||
EnumClassName = target.GetFieldOrPropertyTypeOrElementType().FullName,
|
||||
Name = fieldName,
|
||||
Description = tooltip ?? $"{target.GetFieldOrPropertyTypeOrElementType()} {target.Name}",
|
||||
DefaultValue = defaultValue == null ? 0 : (int)defaultValue
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user