Kursach_StealthAction/Assets/Tremble/FieldConverters/EnumFieldConverter.cs
2026-10-11 19:16:11 +03:00

98 lines
3.1 KiB
C#

//
// 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
});
}
}
}
}