mirror of
https://mirror.ghproxy.com/https://github.com/dexyfex/CodeWalker
synced 2026-05-14 23:15:27 +08:00
Added RPF Explorer .yed, .yfd, .yld generic support
This commit is contained in:
@@ -0,0 +1,427 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
/*
|
||||
Copyright(c) 2017 Neodymium
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
|
||||
|
||||
//ruthlessly stolen
|
||||
|
||||
|
||||
namespace CodeWalker.GameFiles
|
||||
{
|
||||
|
||||
[TypeConverter(typeof(ExpandableObjectConverter))] public class ExpressionDictionary : ResourceFileBase
|
||||
{
|
||||
// pgDictionaryBase
|
||||
// pgDictionary<crExpressions>
|
||||
public override long BlockLength => 0x40;
|
||||
|
||||
// structure data
|
||||
public uint Unknown_10h { get; set; }
|
||||
public uint Unknown_14h { get; set; }
|
||||
public uint Unknown_18h { get; set; }
|
||||
public uint Unknown_1Ch { get; set; }
|
||||
public ResourceSimpleList64_uint ExpressionNameHashes { get; set; }
|
||||
public ResourcePointerList64<Expression> Expressions { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Reads the data-block from a stream.
|
||||
/// </summary>
|
||||
public override void Read(ResourceDataReader reader, params object[] parameters)
|
||||
{
|
||||
base.Read(reader, parameters);
|
||||
|
||||
// read structure data
|
||||
this.Unknown_10h = reader.ReadUInt32();
|
||||
this.Unknown_14h = reader.ReadUInt32();
|
||||
this.Unknown_18h = reader.ReadUInt32();
|
||||
this.Unknown_1Ch = reader.ReadUInt32();
|
||||
this.ExpressionNameHashes = reader.ReadBlock<ResourceSimpleList64_uint>();
|
||||
this.Expressions = reader.ReadBlock<ResourcePointerList64<Expression>>();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes the data-block to a stream.
|
||||
/// </summary>
|
||||
public override void Write(ResourceDataWriter writer, params object[] parameters)
|
||||
{
|
||||
base.Write(writer, parameters);
|
||||
|
||||
// write structure data
|
||||
writer.Write(this.Unknown_10h);
|
||||
writer.Write(this.Unknown_14h);
|
||||
writer.Write(this.Unknown_18h);
|
||||
writer.Write(this.Unknown_1Ch);
|
||||
writer.WriteBlock(this.ExpressionNameHashes);
|
||||
writer.WriteBlock(this.Expressions);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a list of data blocks which are referenced by this block.
|
||||
/// </summary>
|
||||
public override IResourceBlock[] GetReferences()
|
||||
{
|
||||
var list = new List<IResourceBlock>(base.GetReferences());
|
||||
return list.ToArray();
|
||||
}
|
||||
|
||||
public override Tuple<long, IResourceBlock>[] GetParts()
|
||||
{
|
||||
return new Tuple<long, IResourceBlock>[] {
|
||||
new Tuple<long, IResourceBlock>(0x20, ExpressionNameHashes),
|
||||
new Tuple<long, IResourceBlock>(0x30, Expressions)
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
[TypeConverter(typeof(ExpandableObjectConverter))] public class Expression : ResourceSystemBlock
|
||||
{
|
||||
// pgBase
|
||||
// crExpressions
|
||||
public override long BlockLength => 0x90;
|
||||
|
||||
// structure data
|
||||
public uint VFT { get; set; }
|
||||
public uint Unknown_4h { get; set; }
|
||||
public uint Unknown_8h { get; set; }
|
||||
public uint Unknown_Ch { get; set; }
|
||||
public uint Unknown_10h { get; set; }
|
||||
public uint Unknown_14h { get; set; }
|
||||
public uint Unknown_18h { get; set; }
|
||||
public uint Unknown_1Ch { get; set; }
|
||||
public ResourcePointerList64<ExpressionUnk1> Unknown_20h { get; set; }
|
||||
public ResourceSimpleList64_uint Unknown_30h { get; set; }
|
||||
public ResourceSimpleList64<ExpressionUnk2> Unknown_40h { get; set; }
|
||||
public ResourceSimpleList64_uint Unknown_50h { get; set; }
|
||||
public ulong NamePointer { get; set; }
|
||||
public uint Unknown_68h { get; set; } // short, short, (name len, name len+1)
|
||||
public uint Unknown_6Ch { get; set; }
|
||||
public uint Unknown_70h { get; set; }
|
||||
public uint Unknown_74h { get; set; }
|
||||
public ushort len { get; set; }
|
||||
public ushort Unknown_7Ah { get; set; }
|
||||
public uint Unknown_7Ch { get; set; }
|
||||
public uint Unknown_80h { get; set; }
|
||||
public uint Unknown_84h { get; set; }
|
||||
public uint Unknown_88h { get; set; }
|
||||
public uint Unknown_8Ch { get; set; }
|
||||
|
||||
// reference data
|
||||
public string_r Name;
|
||||
|
||||
/// <summary>
|
||||
/// Reads the data-block from a stream.
|
||||
/// </summary>
|
||||
public override void Read(ResourceDataReader reader, params object[] parameters)
|
||||
{
|
||||
// read structure data
|
||||
this.VFT = reader.ReadUInt32();
|
||||
this.Unknown_4h = reader.ReadUInt32();
|
||||
this.Unknown_8h = reader.ReadUInt32();
|
||||
this.Unknown_Ch = reader.ReadUInt32();
|
||||
this.Unknown_10h = reader.ReadUInt32();
|
||||
this.Unknown_14h = reader.ReadUInt32();
|
||||
this.Unknown_18h = reader.ReadUInt32();
|
||||
this.Unknown_1Ch = reader.ReadUInt32();
|
||||
this.Unknown_20h = reader.ReadBlock<ResourcePointerList64<ExpressionUnk1>>();
|
||||
this.Unknown_30h = reader.ReadBlock<ResourceSimpleList64_uint>();
|
||||
this.Unknown_40h = reader.ReadBlock<ResourceSimpleList64<ExpressionUnk2>>();
|
||||
this.Unknown_50h = reader.ReadBlock<ResourceSimpleList64_uint>();
|
||||
this.NamePointer = reader.ReadUInt64();
|
||||
this.Unknown_68h = reader.ReadUInt32();
|
||||
this.Unknown_6Ch = reader.ReadUInt32();
|
||||
this.Unknown_70h = reader.ReadUInt32();
|
||||
this.Unknown_74h = reader.ReadUInt32();
|
||||
this.len = reader.ReadUInt16();
|
||||
this.Unknown_7Ah = reader.ReadUInt16();
|
||||
this.Unknown_7Ch = reader.ReadUInt32();
|
||||
this.Unknown_80h = reader.ReadUInt32();
|
||||
this.Unknown_84h = reader.ReadUInt32();
|
||||
this.Unknown_88h = reader.ReadUInt32();
|
||||
this.Unknown_8Ch = reader.ReadUInt32();
|
||||
|
||||
// read reference data
|
||||
this.Name = reader.ReadBlockAt<string_r>(
|
||||
this.NamePointer // offset
|
||||
);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes the data-block to a stream.
|
||||
/// </summary>
|
||||
public override void Write(ResourceDataWriter writer, params object[] parameters)
|
||||
{
|
||||
// update structure data
|
||||
this.NamePointer = (ulong)(this.Name != null ? this.Name.FilePosition : 0);
|
||||
|
||||
// write structure data
|
||||
writer.Write(this.VFT);
|
||||
writer.Write(this.Unknown_4h);
|
||||
writer.Write(this.Unknown_8h);
|
||||
writer.Write(this.Unknown_Ch);
|
||||
writer.Write(this.Unknown_10h);
|
||||
writer.Write(this.Unknown_14h);
|
||||
writer.Write(this.Unknown_18h);
|
||||
writer.Write(this.Unknown_1Ch);
|
||||
writer.WriteBlock(this.Unknown_20h);
|
||||
writer.WriteBlock(this.Unknown_30h);
|
||||
writer.WriteBlock(this.Unknown_40h);
|
||||
writer.WriteBlock(this.Unknown_50h);
|
||||
writer.Write(this.NamePointer);
|
||||
writer.Write(this.Unknown_68h);
|
||||
writer.Write(this.Unknown_6Ch);
|
||||
writer.Write(this.Unknown_70h);
|
||||
writer.Write(this.Unknown_74h);
|
||||
writer.Write(this.len);
|
||||
writer.Write(this.Unknown_7Ah);
|
||||
writer.Write(this.Unknown_7Ch);
|
||||
writer.Write(this.Unknown_80h);
|
||||
writer.Write(this.Unknown_84h);
|
||||
writer.Write(this.Unknown_88h);
|
||||
writer.Write(this.Unknown_8Ch);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns a list of data blocks which are referenced by this block.
|
||||
/// </summary>
|
||||
public override IResourceBlock[] GetReferences()
|
||||
{
|
||||
var list = new List<IResourceBlock>();
|
||||
if (Name != null) list.Add(Name);
|
||||
return list.ToArray();
|
||||
}
|
||||
|
||||
public override Tuple<long, IResourceBlock>[] GetParts()
|
||||
{
|
||||
return new Tuple<long, IResourceBlock>[] {
|
||||
new Tuple<long, IResourceBlock>(0x20, Unknown_20h),
|
||||
new Tuple<long, IResourceBlock>(0x30, Unknown_30h),
|
||||
new Tuple<long, IResourceBlock>(0x40, Unknown_40h),
|
||||
new Tuple<long, IResourceBlock>(0x50, Unknown_50h)
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
[TypeConverter(typeof(ExpandableObjectConverter))] public class ExpressionUnk1 : ResourceSystemBlock
|
||||
{
|
||||
public override long BlockLength
|
||||
{
|
||||
get { return 16 + Data1.Length + Data2.Length + Data3.Length; }
|
||||
}
|
||||
|
||||
// structure data
|
||||
public uint Unknown_0h { get; set; }
|
||||
public uint len1 { get; set; }
|
||||
public uint len2 { get; set; }
|
||||
public ushort len3 { get; set; }
|
||||
public ushort Unknown_Eh { get; set; }
|
||||
public byte[] Data1 { get; set; }
|
||||
public byte[] Data2 { get; set; }
|
||||
public byte[] Data3 { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Reads the data-block from a stream.
|
||||
/// </summary>
|
||||
public override void Read(ResourceDataReader reader, params object[] parameters)
|
||||
{
|
||||
// read structure data
|
||||
this.Unknown_0h = reader.ReadUInt32();
|
||||
this.len1 = reader.ReadUInt32();
|
||||
this.len2 = reader.ReadUInt32();
|
||||
this.len3 = reader.ReadUInt16();
|
||||
this.Unknown_Eh = reader.ReadUInt16();
|
||||
this.Data1 = reader.ReadBytes((int)len1);
|
||||
this.Data2 = reader.ReadBytes((int)len2);
|
||||
this.Data3 = reader.ReadBytes((int)len3);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes the data-block to a stream.
|
||||
/// </summary>
|
||||
public override void Write(ResourceDataWriter writer, params object[] parameters)
|
||||
{
|
||||
// write structure data
|
||||
writer.Write(this.Unknown_0h);
|
||||
writer.Write(this.len1);
|
||||
writer.Write(this.len2);
|
||||
writer.Write(this.len3);
|
||||
writer.Write(this.Unknown_Eh);
|
||||
writer.Write(this.Data1);
|
||||
writer.Write(this.Data2);
|
||||
writer.Write(this.Data3);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
[TypeConverter(typeof(ExpandableObjectConverter))] public class ExpressionUnk2 : ResourceSystemBlock
|
||||
{
|
||||
public override long BlockLength => 0xA0;
|
||||
|
||||
// structure data
|
||||
public float Unknown_0h { get; set; }
|
||||
public float Unknown_4h { get; set; }
|
||||
public float Unknown_8h { get; set; }
|
||||
public uint Unknown_Ch { get; set; }
|
||||
public float Unknown_10h { get; set; }
|
||||
public float Unknown_14h { get; set; }
|
||||
public float Unknown_18h { get; set; }
|
||||
public uint Unknown_1Ch { get; set; }
|
||||
public float Unknown_20h { get; set; }
|
||||
public float Unknown_24h { get; set; }
|
||||
public float Unknown_28h { get; set; }
|
||||
public uint Unknown_2Ch { get; set; }
|
||||
public float Unknown_30h { get; set; }
|
||||
public float Unknown_34h { get; set; }
|
||||
public float Unknown_38h { get; set; }
|
||||
public uint Unknown_3Ch { get; set; }
|
||||
public float Unknown_40h { get; set; }
|
||||
public float Unknown_44h { get; set; }
|
||||
public float Unknown_48h { get; set; }
|
||||
public uint Unknown_4Ch { get; set; }
|
||||
public float Unknown_50h { get; set; }
|
||||
public float Unknown_54h { get; set; }
|
||||
public float Unknown_58h { get; set; }
|
||||
public uint Unknown_5Ch { get; set; }
|
||||
public float Unknown_60h { get; set; }
|
||||
public float Unknown_64h { get; set; }
|
||||
public float Unknown_68h { get; set; }
|
||||
public uint Unknown_6Ch { get; set; }
|
||||
public float Unknown_70h { get; set; }
|
||||
public float Unknown_74h { get; set; }
|
||||
public float Unknown_78h { get; set; }
|
||||
public uint Unknown_7Ch { get; set; }
|
||||
public float Unknown_80h { get; set; }
|
||||
public float Unknown_84h { get; set; }
|
||||
public float Unknown_88h { get; set; }
|
||||
public uint Unknown_8Ch { get; set; }
|
||||
public float Unknown_90h { get; set; }
|
||||
public float Unknown_94h { get; set; }
|
||||
public float Unknown_98h { get; set; }
|
||||
public uint Unknown_9Ch { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// Reads the data-block from a stream.
|
||||
/// </summary>
|
||||
public override void Read(ResourceDataReader reader, params object[] parameters)
|
||||
{
|
||||
// read structure data
|
||||
this.Unknown_0h = reader.ReadSingle();
|
||||
this.Unknown_4h = reader.ReadSingle();
|
||||
this.Unknown_8h = reader.ReadSingle();
|
||||
this.Unknown_Ch = reader.ReadUInt32();
|
||||
this.Unknown_10h = reader.ReadSingle();
|
||||
this.Unknown_14h = reader.ReadSingle();
|
||||
this.Unknown_18h = reader.ReadSingle();
|
||||
this.Unknown_1Ch = reader.ReadUInt32();
|
||||
this.Unknown_20h = reader.ReadSingle();
|
||||
this.Unknown_24h = reader.ReadSingle();
|
||||
this.Unknown_28h = reader.ReadSingle();
|
||||
this.Unknown_2Ch = reader.ReadUInt32();
|
||||
this.Unknown_30h = reader.ReadSingle();
|
||||
this.Unknown_34h = reader.ReadSingle();
|
||||
this.Unknown_38h = reader.ReadSingle();
|
||||
this.Unknown_3Ch = reader.ReadUInt32();
|
||||
this.Unknown_40h = reader.ReadSingle();
|
||||
this.Unknown_44h = reader.ReadSingle();
|
||||
this.Unknown_48h = reader.ReadSingle();
|
||||
this.Unknown_4Ch = reader.ReadUInt32();
|
||||
this.Unknown_50h = reader.ReadSingle();
|
||||
this.Unknown_54h = reader.ReadSingle();
|
||||
this.Unknown_58h = reader.ReadSingle();
|
||||
this.Unknown_5Ch = reader.ReadUInt32();
|
||||
this.Unknown_60h = reader.ReadSingle();
|
||||
this.Unknown_64h = reader.ReadSingle();
|
||||
this.Unknown_68h = reader.ReadSingle();
|
||||
this.Unknown_6Ch = reader.ReadUInt32();
|
||||
this.Unknown_70h = reader.ReadSingle();
|
||||
this.Unknown_74h = reader.ReadSingle();
|
||||
this.Unknown_78h = reader.ReadSingle();
|
||||
this.Unknown_7Ch = reader.ReadUInt32();
|
||||
this.Unknown_80h = reader.ReadSingle();
|
||||
this.Unknown_84h = reader.ReadSingle();
|
||||
this.Unknown_88h = reader.ReadSingle();
|
||||
this.Unknown_8Ch = reader.ReadUInt32();
|
||||
this.Unknown_90h = reader.ReadSingle();
|
||||
this.Unknown_94h = reader.ReadSingle();
|
||||
this.Unknown_98h = reader.ReadSingle();
|
||||
this.Unknown_9Ch = reader.ReadUInt32();
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes the data-block to a stream.
|
||||
/// </summary>
|
||||
public override void Write(ResourceDataWriter writer, params object[] parameters)
|
||||
{
|
||||
// write structure data
|
||||
writer.Write(this.Unknown_0h);
|
||||
writer.Write(this.Unknown_4h);
|
||||
writer.Write(this.Unknown_8h);
|
||||
writer.Write(this.Unknown_Ch);
|
||||
writer.Write(this.Unknown_10h);
|
||||
writer.Write(this.Unknown_14h);
|
||||
writer.Write(this.Unknown_18h);
|
||||
writer.Write(this.Unknown_1Ch);
|
||||
writer.Write(this.Unknown_20h);
|
||||
writer.Write(this.Unknown_24h);
|
||||
writer.Write(this.Unknown_28h);
|
||||
writer.Write(this.Unknown_2Ch);
|
||||
writer.Write(this.Unknown_30h);
|
||||
writer.Write(this.Unknown_34h);
|
||||
writer.Write(this.Unknown_38h);
|
||||
writer.Write(this.Unknown_3Ch);
|
||||
writer.Write(this.Unknown_40h);
|
||||
writer.Write(this.Unknown_44h);
|
||||
writer.Write(this.Unknown_48h);
|
||||
writer.Write(this.Unknown_4Ch);
|
||||
writer.Write(this.Unknown_50h);
|
||||
writer.Write(this.Unknown_54h);
|
||||
writer.Write(this.Unknown_58h);
|
||||
writer.Write(this.Unknown_5Ch);
|
||||
writer.Write(this.Unknown_60h);
|
||||
writer.Write(this.Unknown_64h);
|
||||
writer.Write(this.Unknown_68h);
|
||||
writer.Write(this.Unknown_6Ch);
|
||||
writer.Write(this.Unknown_70h);
|
||||
writer.Write(this.Unknown_74h);
|
||||
writer.Write(this.Unknown_78h);
|
||||
writer.Write(this.Unknown_7Ch);
|
||||
writer.Write(this.Unknown_80h);
|
||||
writer.Write(this.Unknown_84h);
|
||||
writer.Write(this.Unknown_88h);
|
||||
writer.Write(this.Unknown_8Ch);
|
||||
writer.Write(this.Unknown_90h);
|
||||
writer.Write(this.Unknown_94h);
|
||||
writer.Write(this.Unknown_98h);
|
||||
writer.Write(this.Unknown_9Ch);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user