using Newtonsoft.Json; using System; using UAssetAPI.UnrealTypes; namespace UAssetAPI.Kismet.Bytecode { /// /// Represents an FText as serialized in Kismet bytecode. /// [JsonObject(MemberSerialization.OptIn)] public class FScriptText { [JsonProperty] public EBlueprintTextLiteralType TextLiteralType; /// /// Source of this text if it is localized text. Used when is . /// [JsonProperty] public KismetExpression LocalizedSource; /// /// Key of this text if it is localized text. Used when is . /// [JsonProperty] public KismetExpression LocalizedKey; /// /// Namespace of this text if it is localized text. Used when is . /// [JsonProperty] public KismetExpression LocalizedNamespace; /// /// Value of this text if it is an invariant string literal. Used when is . /// [JsonProperty] public KismetExpression InvariantLiteralString; /// /// Value of this text if it is a string literal. Used when is . /// [JsonProperty] public KismetExpression LiteralString; /// /// Pointer to this text's UStringTable. Not used at runtime, but exists for asset dependency gathering. Used when is . /// [JsonProperty] public FPackageIndex StringTableAsset; /// /// Table ID string literal (namespace). Used when is . /// [JsonProperty] public KismetExpression StringTableId; /// /// String table key string literal. Used when is . /// [JsonProperty] public KismetExpression StringTableKey; /// /// Reads out an FBlueprintText from a BinaryReader. /// /// The BinaryReader to read from. public virtual void Read(AssetBinaryReader reader) { TextLiteralType = (EBlueprintTextLiteralType)reader.ReadByte(); switch (TextLiteralType) { case EBlueprintTextLiteralType.Empty: break; case EBlueprintTextLiteralType.LocalizedText: LocalizedSource = ExpressionSerializer.ReadExpression(reader); LocalizedKey = ExpressionSerializer.ReadExpression(reader); LocalizedNamespace = ExpressionSerializer.ReadExpression(reader); break; case EBlueprintTextLiteralType.InvariantText: // IsCultureInvariant InvariantLiteralString = ExpressionSerializer.ReadExpression(reader); break; case EBlueprintTextLiteralType.LiteralString: LiteralString = ExpressionSerializer.ReadExpression(reader); break; case EBlueprintTextLiteralType.StringTableEntry: StringTableAsset = reader.XFER_OBJECT_POINTER(); StringTableId = ExpressionSerializer.ReadExpression(reader); StringTableKey = ExpressionSerializer.ReadExpression(reader); break; default: throw new NotImplementedException("Unimplemented blueprint text literal type " + TextLiteralType); } } /// /// Writes an FBlueprintText to a BinaryWriter. /// /// The BinaryWriter to write from. /// The iCode offset of the data that was written. public virtual int Write(AssetBinaryWriter writer) { int offset = 0; writer.Write((byte)TextLiteralType); offset += sizeof(byte); switch (TextLiteralType) { case EBlueprintTextLiteralType.Empty: break; case EBlueprintTextLiteralType.LocalizedText: offset += ExpressionSerializer.WriteExpression(LocalizedSource, writer); offset += ExpressionSerializer.WriteExpression(LocalizedKey, writer); offset += ExpressionSerializer.WriteExpression(LocalizedNamespace, writer); break; case EBlueprintTextLiteralType.InvariantText: // IsCultureInvariant offset += ExpressionSerializer.WriteExpression(InvariantLiteralString, writer); break; case EBlueprintTextLiteralType.LiteralString: offset += ExpressionSerializer.WriteExpression(LiteralString, writer); break; case EBlueprintTextLiteralType.StringTableEntry: offset += writer.XFER_OBJECT_POINTER(StringTableAsset); offset += ExpressionSerializer.WriteExpression(StringTableId, writer); offset += ExpressionSerializer.WriteExpression(StringTableKey, writer); break; default: throw new NotImplementedException("Unimplemented blueprint text literal type " + TextLiteralType); } return offset; } } }