mirror of
https://mirror.ghproxy.com/https://github.com/dexyfex/CodeWalker
synced 2025-01-24 14:32:54 +08:00
Merge branch 'dexyfex:master' into master
This commit is contained in:
commit
63f42f9fcc
326
CodeWalker.Core/GameFiles/FileTypes/DistantLightsFile.cs
Normal file
326
CodeWalker.Core/GameFiles/FileTypes/DistantLightsFile.cs
Normal file
@ -0,0 +1,326 @@
|
||||
using SharpDX;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
using TC = System.ComponentModel.TypeConverterAttribute;
|
||||
using EXP = System.ComponentModel.ExpandableObjectConverter;
|
||||
|
||||
namespace CodeWalker.GameFiles
|
||||
{
|
||||
[TC(typeof(EXP))] public class DistantLightsFile : GameFile, PackedFile
|
||||
{
|
||||
public bool HD { get; set; } = true;
|
||||
public uint GridSize { get; set; } = 32;
|
||||
public uint CellSize { get; set; } = 512;
|
||||
public uint CellCount { get; set; } = 1024;
|
||||
public uint NodeCount { get; set; }
|
||||
public uint PathCount { get; set; }
|
||||
public uint[] PathIndices { get; set; } //CellCount
|
||||
public uint[] PathCounts1 { get; set; } //CellCount
|
||||
public uint[] PathCounts2 { get; set; } //CellCount
|
||||
public DistantLightsNode[] Nodes { get; set; } //NodeCount
|
||||
public DistantLightsPath[] Paths { get; set; } //PathCount
|
||||
public DistantLightsCell[] Cells { get; set; } //CellCount (built from loaded data)
|
||||
|
||||
|
||||
public DistantLightsFile() : base(null, GameFileType.DistantLights)
|
||||
{
|
||||
}
|
||||
public DistantLightsFile(RpfFileEntry entry) : base(entry, GameFileType.DistantLights)
|
||||
{
|
||||
RpfFileEntry = entry;
|
||||
}
|
||||
|
||||
|
||||
public void Load(byte[] data, RpfFileEntry entry)
|
||||
{
|
||||
if (entry != null)
|
||||
{
|
||||
RpfFileEntry = entry;
|
||||
Name = entry.Name;
|
||||
|
||||
if (!entry.NameLower.EndsWith("_hd.dat"))
|
||||
{
|
||||
HD = false;
|
||||
GridSize = 16;
|
||||
CellSize = 1024;
|
||||
CellCount = 256;
|
||||
}
|
||||
}
|
||||
|
||||
using (MemoryStream ms = new MemoryStream(data))
|
||||
{
|
||||
DataReader r = new DataReader(ms, Endianess.BigEndian);
|
||||
|
||||
Read(r);
|
||||
};
|
||||
|
||||
Loaded = true;
|
||||
}
|
||||
public byte[] Save()
|
||||
{
|
||||
MemoryStream s = new MemoryStream();
|
||||
DataWriter w = new DataWriter(s);
|
||||
|
||||
Write(w);
|
||||
|
||||
var buf = new byte[s.Length];
|
||||
s.Position = 0;
|
||||
s.Read(buf, 0, buf.Length);
|
||||
return buf;
|
||||
}
|
||||
|
||||
|
||||
private void Read(DataReader r)
|
||||
{
|
||||
NodeCount = r.ReadUInt32();
|
||||
PathCount = r.ReadUInt32();
|
||||
PathIndices = new uint[CellCount];
|
||||
PathCounts1 = new uint[CellCount];
|
||||
PathCounts2 = new uint[CellCount];
|
||||
Nodes = new DistantLightsNode[NodeCount];
|
||||
Paths = new DistantLightsPath[PathCount];
|
||||
for (uint i = 0; i < CellCount; i++)
|
||||
{
|
||||
PathIndices[i] = r.ReadUInt32();
|
||||
}
|
||||
for (uint i = 0; i < CellCount; i++)
|
||||
{
|
||||
PathCounts1[i] = r.ReadUInt32();
|
||||
}
|
||||
for (uint i = 0; i < CellCount; i++)
|
||||
{
|
||||
PathCounts2[i] = r.ReadUInt32();
|
||||
}
|
||||
for (uint i = 0; i < NodeCount; i++)
|
||||
{
|
||||
Nodes[i] = new DistantLightsNode(r);
|
||||
}
|
||||
for (uint i = 0; i < PathCount; i++)
|
||||
{
|
||||
Paths[i] = new DistantLightsPath(r, HD);
|
||||
}
|
||||
|
||||
|
||||
BuildCells();
|
||||
|
||||
}
|
||||
private void Write(DataWriter w)
|
||||
{
|
||||
w.Write(NodeCount);
|
||||
w.Write(PathCount);
|
||||
|
||||
for (uint i = 0; i < CellCount; i++)
|
||||
{
|
||||
w.Write(PathIndices[i]);
|
||||
}
|
||||
for (uint i = 0; i < CellCount; i++)
|
||||
{
|
||||
w.Write(PathCounts1[i]);
|
||||
}
|
||||
for (uint i = 0; i < CellCount; i++)
|
||||
{
|
||||
w.Write(PathCounts2[i]);
|
||||
}
|
||||
for (uint i = 0; i < NodeCount; i++)
|
||||
{
|
||||
Nodes[i].Write(w);
|
||||
}
|
||||
for (uint i = 0; i < PathCount; i++)
|
||||
{
|
||||
Paths[i].Write(w, HD);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
private void BuildCells()
|
||||
{
|
||||
for (uint i = 0; i < PathCount; i++)
|
||||
{
|
||||
var path = Paths[i];
|
||||
path.Nodes = new DistantLightsNode[path.NodeCount];
|
||||
for (uint n = 0; n < path.NodeCount; n++)
|
||||
{
|
||||
path.Nodes[n] = Nodes[path.NodeIndex + n];
|
||||
}
|
||||
}
|
||||
|
||||
Cells = new DistantLightsCell[CellCount];
|
||||
for (uint x = 0; x < GridSize; x++)
|
||||
{
|
||||
for (uint y = 0; y < GridSize; y++)
|
||||
{
|
||||
var i = x * GridSize + y;
|
||||
var cell = new DistantLightsCell();
|
||||
cell.Index = i;
|
||||
cell.CellX = x;
|
||||
cell.CellY = y;
|
||||
cell.CellMin = new Vector2(x, y) * CellSize - 8192.0f;
|
||||
cell.CellMax = cell.CellMin + CellSize;
|
||||
var pc1 = PathCounts1[i];
|
||||
if (pc1 > 0)
|
||||
{
|
||||
cell.Paths1 = new DistantLightsPath[pc1];
|
||||
for (uint l = 0; l < pc1; l++)
|
||||
{
|
||||
cell.Paths1[l] = Paths[PathIndices[i] + l];
|
||||
}
|
||||
}
|
||||
var pc2 = PathCounts2[i];
|
||||
if (pc2 > 0)
|
||||
{
|
||||
cell.Paths2 = new DistantLightsPath[pc2];
|
||||
for (uint l = 0; l < pc2; l++)
|
||||
{
|
||||
cell.Paths2[l] = Paths[PathIndices[i] + l + pc1];
|
||||
}
|
||||
}
|
||||
Cells[i] = cell;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
[TC(typeof(EXP))] public class DistantLightsNode
|
||||
{
|
||||
public short X { get; set; }
|
||||
public short Y { get; set; }
|
||||
public short Z { get; set; }
|
||||
|
||||
public DistantLightsNode()
|
||||
{ }
|
||||
public DistantLightsNode(DataReader r)
|
||||
{
|
||||
Read(r);
|
||||
}
|
||||
|
||||
public void Read(DataReader r)
|
||||
{
|
||||
X = r.ReadInt16();
|
||||
Y = r.ReadInt16();
|
||||
Z = r.ReadInt16();
|
||||
}
|
||||
public void Write(DataWriter w)
|
||||
{
|
||||
w.Write(X);
|
||||
w.Write(Y);
|
||||
w.Write(Z);
|
||||
}
|
||||
|
||||
public Vector3 Vector
|
||||
{
|
||||
get { return new Vector3(X, Y, Z); }
|
||||
set { X = (short)Math.Round(value.X); Y = (short)Math.Round(value.Y); Z = (short)Math.Round(value.Z); }
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return Vector.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
[TC(typeof(EXP))] public class DistantLightsPath
|
||||
{
|
||||
public short CenterX { get; set; }
|
||||
public short CenterY { get; set; }
|
||||
public ushort SizeX { get; set; }
|
||||
public ushort SizeY { get; set; }
|
||||
public ushort NodeIndex { get; set; }
|
||||
public ushort NodeCount { get; set; }
|
||||
public ushort Short7 { get; set; }
|
||||
public ushort Short8 { get; set; }
|
||||
public float Float1 { get; set; }
|
||||
public byte Byte1 { get; set; }
|
||||
public byte Byte2 { get; set; }
|
||||
public byte Byte3 { get; set; }
|
||||
public byte Byte4 { get; set; }
|
||||
|
||||
public DistantLightsNode[] Nodes { get; set; }
|
||||
|
||||
public DistantLightsPath()
|
||||
{ }
|
||||
public DistantLightsPath(DataReader r, bool hd)
|
||||
{
|
||||
Read(r, hd);
|
||||
}
|
||||
|
||||
public void Read(DataReader r, bool hd)
|
||||
{
|
||||
CenterX = r.ReadInt16();
|
||||
CenterY = r.ReadInt16();
|
||||
SizeX = r.ReadUInt16();
|
||||
SizeY = r.ReadUInt16();
|
||||
NodeIndex = r.ReadUInt16();
|
||||
NodeCount = r.ReadUInt16();
|
||||
if (hd)
|
||||
{
|
||||
Short7 = r.ReadUInt16();
|
||||
Short8 = r.ReadUInt16();
|
||||
Float1 = r.ReadSingle();
|
||||
Byte1 = r.ReadByte();
|
||||
Byte2 = r.ReadByte();
|
||||
Byte3 = r.ReadByte();
|
||||
Byte4 = r.ReadByte();
|
||||
}
|
||||
else
|
||||
{
|
||||
Byte1 = r.ReadByte();
|
||||
Byte2 = r.ReadByte();
|
||||
}
|
||||
}
|
||||
public void Write(DataWriter w, bool hd)
|
||||
{
|
||||
w.Write(CenterX);
|
||||
w.Write(CenterY);
|
||||
w.Write(SizeX);
|
||||
w.Write(SizeY);
|
||||
w.Write(NodeIndex);
|
||||
w.Write(NodeCount);
|
||||
if (hd)
|
||||
{
|
||||
w.Write(Short7);
|
||||
w.Write(Short8);
|
||||
w.Write(Float1);
|
||||
w.Write(Byte1);
|
||||
w.Write(Byte2);
|
||||
w.Write(Byte3);
|
||||
w.Write(Byte4);
|
||||
}
|
||||
else
|
||||
{
|
||||
w.Write(Byte1);
|
||||
w.Write(Byte2);
|
||||
}
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return CenterX.ToString() + ", " + CenterY.ToString() + ", " + SizeX.ToString() + ", " + SizeY.ToString() + ", " +
|
||||
NodeIndex.ToString() + ", " + NodeCount.ToString() + ", " + Short7.ToString() + ", " + Short8.ToString() + ", " +
|
||||
FloatUtil.ToString(Float1) + ", " + Byte1.ToString() + ", " + Byte2.ToString() + ", " + Byte3.ToString() + ", " + Byte4.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
[TC(typeof(EXP))] public class DistantLightsCell
|
||||
{
|
||||
public uint Index { get; set; }
|
||||
public uint CellX { get; set; }
|
||||
public uint CellY { get; set; }
|
||||
public Vector2 CellMin { get; set; }
|
||||
public Vector2 CellMax { get; set; }
|
||||
public DistantLightsPath[] Paths1 { get; set; }
|
||||
public DistantLightsPath[] Paths2 { get; set; }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return Index.ToString() + " (" + CellX.ToString() + ", " + CellY.ToString() + ") - " +
|
||||
(Paths1?.Length ?? 0).ToString() + ", " + (Paths2?.Length ?? 0).ToString() + " - (" +
|
||||
CellMin.ToString() + " - " + CellMax.ToString() + ")";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -1,9 +1,11 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml;
|
||||
|
||||
namespace CodeWalker.GameFiles
|
||||
{
|
||||
@ -56,10 +58,68 @@ namespace CodeWalker.GameFiles
|
||||
InitDictionaries();
|
||||
}
|
||||
|
||||
public byte[] Save()
|
||||
{
|
||||
byte[] data = ResourceBuilder.Build(ExpressionDictionary, 25); //yed is type/version 25...
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
|
||||
public void InitDictionaries()
|
||||
{
|
||||
ExprMap = ExpressionDictionary?.ExprMap ?? new Dictionary<MetaHash, Expression>();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public class YedXml : MetaXmlBase
|
||||
{
|
||||
|
||||
public static string GetXml(YedFile yed, string outputFolder = "")
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.AppendLine(XmlHeader);
|
||||
|
||||
if (yed?.ExpressionDictionary != null)
|
||||
{
|
||||
ExpressionDictionary.WriteXmlNode(yed.ExpressionDictionary, sb, 0);
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public class XmlYed
|
||||
{
|
||||
|
||||
public static YedFile GetYed(string xml, string inputFolder = "")
|
||||
{
|
||||
XmlDocument doc = new XmlDocument();
|
||||
doc.LoadXml(xml);
|
||||
return GetYed(doc, inputFolder);
|
||||
}
|
||||
|
||||
public static YedFile GetYed(XmlDocument doc, string inputFolder = "")
|
||||
{
|
||||
YedFile r = new YedFile();
|
||||
|
||||
var node = doc.DocumentElement;
|
||||
if (node != null)
|
||||
{
|
||||
r.ExpressionDictionary = ExpressionDictionary.ReadXmlNode(node);
|
||||
|
||||
r.InitDictionaries();
|
||||
}
|
||||
|
||||
r.Name = Path.GetFileName(inputFolder);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -1,8 +1,10 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml;
|
||||
|
||||
namespace CodeWalker.GameFiles
|
||||
{
|
||||
@ -58,4 +60,51 @@ namespace CodeWalker.GameFiles
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
public class YvrXml : MetaXmlBase
|
||||
{
|
||||
|
||||
public static string GetXml(YvrFile yvr)
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.AppendLine(XmlHeader);
|
||||
|
||||
if (yvr?.Records != null)
|
||||
{
|
||||
VehicleRecordList.WriteXmlNode(yvr.Records, sb, 0);
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public class XmlYvr
|
||||
{
|
||||
|
||||
public static YvrFile GetYvr(string xml, string inputFolder = "")
|
||||
{
|
||||
XmlDocument doc = new XmlDocument();
|
||||
doc.LoadXml(xml);
|
||||
return GetYvr(doc, inputFolder);
|
||||
}
|
||||
|
||||
public static YvrFile GetYvr(XmlDocument doc, string inputFolder = "")
|
||||
{
|
||||
YvrFile r = new YvrFile();
|
||||
|
||||
var node = doc.DocumentElement;
|
||||
if (node != null)
|
||||
{
|
||||
r.Records = VehicleRecordList.ReadXmlNode(node);
|
||||
}
|
||||
|
||||
r.Name = Path.GetFileName(inputFolder);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -1,8 +1,10 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml;
|
||||
|
||||
namespace CodeWalker.GameFiles
|
||||
{
|
||||
@ -58,4 +60,52 @@ namespace CodeWalker.GameFiles
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
public class YwrXml : MetaXmlBase
|
||||
{
|
||||
|
||||
public static string GetXml(YwrFile ywr)
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.AppendLine(XmlHeader);
|
||||
|
||||
if (ywr?.Waypoints != null)
|
||||
{
|
||||
WaypointRecordList.WriteXmlNode(ywr.Waypoints, sb, 0);
|
||||
}
|
||||
|
||||
return sb.ToString();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public class XmlYwr
|
||||
{
|
||||
|
||||
public static YwrFile GetYwr(string xml, string inputFolder = "")
|
||||
{
|
||||
XmlDocument doc = new XmlDocument();
|
||||
doc.LoadXml(xml);
|
||||
return GetYwr(doc, inputFolder);
|
||||
}
|
||||
|
||||
public static YwrFile GetYwr(XmlDocument doc, string inputFolder = "")
|
||||
{
|
||||
YwrFile r = new YwrFile();
|
||||
|
||||
var node = doc.DocumentElement;
|
||||
if (node != null)
|
||||
{
|
||||
r.Waypoints = WaypointRecordList.ReadXmlNode(node);
|
||||
}
|
||||
|
||||
r.Name = Path.GetFileName(inputFolder);
|
||||
|
||||
return r;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -83,6 +83,7 @@ namespace CodeWalker.GameFiles
|
||||
Heightmap = 27,
|
||||
Watermap = 28,
|
||||
Mrf = 29,
|
||||
DistantLights = 30,
|
||||
}
|
||||
|
||||
|
||||
|
@ -212,6 +212,8 @@ namespace CodeWalker.GameFiles
|
||||
//TestYfts();
|
||||
//TestYpts();
|
||||
//TestYnvs();
|
||||
//TestYvrs();
|
||||
//TestYwrs();
|
||||
//TestYmaps();
|
||||
//TestMrfs();
|
||||
//TestPlacements();
|
||||
@ -3518,6 +3520,15 @@ namespace CodeWalker.GameFiles
|
||||
YedFile yed = new YedFile(rfe);
|
||||
RpfMan.LoadFile(yed, rfe);
|
||||
|
||||
var xml = YedXml.GetXml(yed);
|
||||
var yed2 = XmlYed.GetYed(xml);
|
||||
var data2 = yed2.Save();
|
||||
var yed3 = new YedFile();
|
||||
RpfFile.LoadResourceFile(yed3, data2, 25);//full roundtrip
|
||||
var xml2 = YedXml.GetXml(yed3);
|
||||
if (xml != xml2)
|
||||
{ }
|
||||
|
||||
}
|
||||
}
|
||||
#if !DEBUG
|
||||
@ -4396,6 +4407,102 @@ namespace CodeWalker.GameFiles
|
||||
if (errorfiles.Count > 0)
|
||||
{ }
|
||||
}
|
||||
public void TestYvrs()
|
||||
{
|
||||
|
||||
var exceptions = new List<Exception>();
|
||||
|
||||
foreach (RpfFile file in AllRpfs)
|
||||
{
|
||||
foreach (RpfEntry entry in file.AllEntries)
|
||||
{
|
||||
#if !DEBUG
|
||||
try
|
||||
#endif
|
||||
{
|
||||
var rfe = entry as RpfFileEntry;
|
||||
if (rfe == null) continue;
|
||||
|
||||
if (rfe.NameLower.EndsWith(".yvr"))
|
||||
{
|
||||
if (rfe.NameLower == "agencyprep001.yvr") continue; //this file seems corrupted
|
||||
|
||||
UpdateStatus(string.Format(entry.Path));
|
||||
|
||||
YvrFile yvr = new YvrFile(rfe);
|
||||
RpfMan.LoadFile(yvr, rfe);
|
||||
|
||||
var xml = YvrXml.GetXml(yvr);
|
||||
var yvr2 = XmlYvr.GetYvr(xml);
|
||||
var data2 = yvr2.Save();
|
||||
var yvr3 = new YvrFile();
|
||||
RpfFile.LoadResourceFile(yvr3, data2, 1);//full roundtrip
|
||||
var xml2 = YvrXml.GetXml(yvr3);
|
||||
if (xml != xml2)
|
||||
{ }
|
||||
|
||||
}
|
||||
}
|
||||
#if !DEBUG
|
||||
catch (Exception ex)
|
||||
{
|
||||
UpdateStatus("Error! " + ex.ToString());
|
||||
exceptions.Add(ex);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
if (exceptions.Count > 0)
|
||||
{ }
|
||||
}
|
||||
public void TestYwrs()
|
||||
{
|
||||
|
||||
var exceptions = new List<Exception>();
|
||||
|
||||
foreach (RpfFile file in AllRpfs)
|
||||
{
|
||||
foreach (RpfEntry entry in file.AllEntries)
|
||||
{
|
||||
#if !DEBUG
|
||||
try
|
||||
#endif
|
||||
{
|
||||
var rfe = entry as RpfFileEntry;
|
||||
if (rfe == null) continue;
|
||||
|
||||
if (rfe.NameLower.EndsWith(".ywr"))
|
||||
{
|
||||
UpdateStatus(string.Format(entry.Path));
|
||||
|
||||
YwrFile ywr = new YwrFile(rfe);
|
||||
RpfMan.LoadFile(ywr, rfe);
|
||||
|
||||
var xml = YwrXml.GetXml(ywr);
|
||||
var ywr2 = XmlYwr.GetYwr(xml);
|
||||
var data2 = ywr2.Save();
|
||||
var ywr3 = new YwrFile();
|
||||
RpfFile.LoadResourceFile(ywr3, data2, 1);//full roundtrip
|
||||
var xml2 = YwrXml.GetXml(ywr3);
|
||||
if (xml != xml2)
|
||||
{ }
|
||||
|
||||
}
|
||||
}
|
||||
#if !DEBUG
|
||||
catch (Exception ex)
|
||||
{
|
||||
UpdateStatus("Error! " + ex.ToString());
|
||||
exceptions.Add(ex);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
if (exceptions.Count > 0)
|
||||
{ }
|
||||
}
|
||||
public void TestYmaps()
|
||||
{
|
||||
foreach (RpfFile file in AllRpfs)
|
||||
|
@ -18617,6 +18617,91 @@ namespace CodeWalker.GameFiles
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
//MRF related hashes from Disquse
|
||||
statemachine = 429383484,
|
||||
success = 975994832,
|
||||
cutting = 1599956773,
|
||||
leftfailure = 1765753571,
|
||||
enterfinish = 663756144,
|
||||
approach = 61579965,
|
||||
win = 3732660434,
|
||||
loss = 42942348,
|
||||
altwalk = 2629052680,
|
||||
standidle = 1244639780,
|
||||
bottlehold = 1250922115,
|
||||
bottleshake = 2761060053,
|
||||
champagnespray = 2153350042,
|
||||
back = 927041140,
|
||||
front = 2314350754,
|
||||
partone = 1335537449,
|
||||
parttwo = 2585437493,
|
||||
partthree = 3894308744,
|
||||
partfour = 4103663607,
|
||||
partfive = 288022579,
|
||||
backpartone = 3350093298,
|
||||
backparttwo = 3195341626,
|
||||
backpartthree = 3228129062,
|
||||
backpartfour = 1672309095,
|
||||
backpartfive = 3417257801,
|
||||
wobble = 3603821314,
|
||||
x_axis = 3546530265,
|
||||
y_axis = 2645075825,
|
||||
z_axis = 1604254135,
|
||||
drill_force = 1362721915,
|
||||
shake_intensity = 612782192,
|
||||
horizontal_aim = 3036116190,
|
||||
verticle_aim = 3709155216,
|
||||
direction_up_down = 1282217224,
|
||||
phase_out = 3243435260,
|
||||
upperbodyonoff = 2718654972,
|
||||
introphase = 3905075704,
|
||||
pitch = 1061927116,
|
||||
isblocked = 2611301023,
|
||||
isfirstperson = 1776409970,
|
||||
idle2 = 2046496619,
|
||||
idle3 = 2202608135,
|
||||
idle4 = 1261318610,
|
||||
lossfinished = 2337837154,
|
||||
winfinished = 3589054106,
|
||||
introfinished = 3677288433,
|
||||
outrofinished = 601717917,
|
||||
leftfailfinish = 1788424853,
|
||||
readyforfadein = 3896574076,
|
||||
idlestarted = 1321201090,
|
||||
blendout = 1842457532,
|
||||
idle_a = 3851133436,
|
||||
escape = 3655182927,
|
||||
upperbodyclipended = 3141014298,
|
||||
result_perfect = 2007828787,
|
||||
result_good = 1148916770,
|
||||
result_average = 1939741573,
|
||||
result_bad = 1402208964,
|
||||
perfectresult = 452682106,
|
||||
goodresult = 1109180461,
|
||||
averageresult = 2674371639,
|
||||
badresult = 3234678822,
|
||||
cancelneutral = 3758646108,
|
||||
dance = 1152043290,
|
||||
stage_1_loop = 2623060900,
|
||||
stage_2_loop = 3632312862,
|
||||
stage_3_loop = 125163859,
|
||||
stage_4_loop = 931907947,
|
||||
no_bag = 429567348,
|
||||
nomover_filter = 819979025,
|
||||
botharms_filter = 384947232,
|
||||
rightarm_nospine_filter = 1924927269,
|
||||
upperbodyfeathered_filter = 265147401,
|
||||
ignoremoverblend_filter = 2738335535,
|
||||
upperbodyandik_filter = 4248997943,
|
||||
bonemask_head_neck_and_l_arm = 3177231635,
|
||||
bonemask_head_neck_and_r_arm = 3921347753,
|
||||
bonemask_head_neck_and_arms = 1573924551,
|
||||
bonemask_headonly = 697476694,
|
||||
bonemask_upperonly = 3633914286,
|
||||
bonemask_armonly_l = 1739926164,
|
||||
bonemask_armonly_r = 3772128476,
|
||||
}
|
||||
|
||||
|
||||
|
@ -105,7 +105,22 @@ namespace CodeWalker.GameFiles
|
||||
else if (fnl.EndsWith(".yld"))
|
||||
{
|
||||
YldFile yld = RpfFile.GetFile<YldFile>(e, data);
|
||||
return GetXml(yld, out filename, outputfolder);
|
||||
return GetXml(yld, out filename);
|
||||
}
|
||||
else if (fnl.EndsWith(".yed"))
|
||||
{
|
||||
YedFile yed = RpfFile.GetFile<YedFile>(e, data);
|
||||
return GetXml(yed, out filename);
|
||||
}
|
||||
else if (fnl.EndsWith(".ywr"))
|
||||
{
|
||||
YwrFile ywr = RpfFile.GetFile<YwrFile>(e, data);
|
||||
return GetXml(ywr, out filename);
|
||||
}
|
||||
else if (fnl.EndsWith(".yvr"))
|
||||
{
|
||||
YvrFile yvr = RpfFile.GetFile<YvrFile>(e, data);
|
||||
return GetXml(yvr, out filename);
|
||||
}
|
||||
else if (fnl.EndsWith(".awc"))
|
||||
{
|
||||
@ -235,11 +250,29 @@ namespace CodeWalker.GameFiles
|
||||
filename = fn + ".xml";
|
||||
return YptXml.GetXml(ypt, outputfolder);
|
||||
}
|
||||
public static string GetXml(YldFile yld, out string filename, string outputfolder)
|
||||
public static string GetXml(YldFile yld, out string filename)
|
||||
{
|
||||
var fn = (yld?.Name) ?? "";
|
||||
filename = fn + ".xml";
|
||||
return YldXml.GetXml(yld, outputfolder);
|
||||
return YldXml.GetXml(yld);
|
||||
}
|
||||
public static string GetXml(YedFile yed, out string filename)
|
||||
{
|
||||
var fn = (yed?.Name) ?? "";
|
||||
filename = fn + ".xml";
|
||||
return YedXml.GetXml(yed);
|
||||
}
|
||||
public static string GetXml(YwrFile ywr, out string filename)
|
||||
{
|
||||
var fn = (ywr?.Name) ?? "";
|
||||
filename = fn + ".xml";
|
||||
return YwrXml.GetXml(ywr);
|
||||
}
|
||||
public static string GetXml(YvrFile yvr, out string filename)
|
||||
{
|
||||
var fn = (yvr?.Name) ?? "";
|
||||
filename = fn + ".xml";
|
||||
return YvrXml.GetXml(yvr);
|
||||
}
|
||||
public static string GetXml(AwcFile awc, out string filename, string outputfolder)
|
||||
{
|
||||
@ -2169,8 +2202,11 @@ namespace CodeWalker.GameFiles
|
||||
Yft = 13,
|
||||
Ypt = 14,
|
||||
Yld = 15,
|
||||
Awc = 16,
|
||||
Heightmap = 17,
|
||||
Yed = 16,
|
||||
Ywr = 17,
|
||||
Yvr = 18,
|
||||
Awc = 19,
|
||||
Heightmap = 20,
|
||||
}
|
||||
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -1,8 +1,10 @@
|
||||
using System;
|
||||
using SharpDX;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml;
|
||||
|
||||
namespace CodeWalker.GameFiles
|
||||
{
|
||||
@ -11,7 +13,7 @@ namespace CodeWalker.GameFiles
|
||||
{
|
||||
public override long BlockLength => 0x20;
|
||||
|
||||
public ResourceSimpleList64<VehicleRecordEntry> Entries;
|
||||
public ResourceSimpleList64<VehicleRecordEntry> Entries { get; set; }
|
||||
|
||||
public VehicleRecordList()
|
||||
{
|
||||
@ -24,13 +26,68 @@ namespace CodeWalker.GameFiles
|
||||
|
||||
this.Entries = reader.ReadBlock<ResourceSimpleList64<VehicleRecordEntry>>();
|
||||
}
|
||||
|
||||
public override void Write(ResourceDataWriter writer, params object[] parameters)
|
||||
{
|
||||
base.Write(writer, parameters);
|
||||
|
||||
writer.WriteBlock(this.Entries);
|
||||
}
|
||||
public void WriteXml(StringBuilder sb, int indent)
|
||||
{
|
||||
|
||||
if (Entries?.data_items != null)
|
||||
{
|
||||
foreach (var e in Entries.data_items)
|
||||
{
|
||||
YvrXml.OpenTag(sb, indent, "Item");
|
||||
e.WriteXml(sb, indent + 1);
|
||||
YvrXml.CloseTag(sb, indent, "Item");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
public void ReadXml(XmlNode node)
|
||||
{
|
||||
var entries = new List<VehicleRecordEntry>();
|
||||
|
||||
var inodes = node.SelectNodes("Item");
|
||||
if (inodes != null)
|
||||
{
|
||||
foreach (XmlNode inode in inodes)
|
||||
{
|
||||
var e = new VehicleRecordEntry();
|
||||
e.ReadXml(inode);
|
||||
entries.Add(e);
|
||||
}
|
||||
}
|
||||
|
||||
Entries = new ResourceSimpleList64<VehicleRecordEntry>();
|
||||
Entries.data_items = entries.ToArray();
|
||||
|
||||
}
|
||||
public static void WriteXmlNode(VehicleRecordList l, StringBuilder sb, int indent, string name = "VehicleRecordList")
|
||||
{
|
||||
if (l == null) return;
|
||||
if ((l.Entries?.data_items == null) || (l.Entries.data_items.Length == 0))
|
||||
{
|
||||
YvrXml.SelfClosingTag(sb, indent, name);
|
||||
}
|
||||
else
|
||||
{
|
||||
YvrXml.OpenTag(sb, indent, name);
|
||||
l.WriteXml(sb, indent + 1);
|
||||
YvrXml.CloseTag(sb, indent, name);
|
||||
}
|
||||
}
|
||||
public static VehicleRecordList ReadXmlNode(XmlNode node)
|
||||
{
|
||||
if (node == null) return null;
|
||||
var l = new VehicleRecordList();
|
||||
l.ReadXml(node);
|
||||
return l;
|
||||
}
|
||||
|
||||
|
||||
|
||||
public override Tuple<long, IResourceBlock>[] GetParts()
|
||||
{
|
||||
@ -50,22 +107,104 @@ namespace CodeWalker.GameFiles
|
||||
|
||||
// structure data
|
||||
public uint Time;
|
||||
public short VelocityX;
|
||||
public short VelocityX; //factor to convert to m/s is 273.0583 .. or 1/0.0036622214, or 32767/120
|
||||
public short VelocityY;
|
||||
public short VelocityZ;
|
||||
public sbyte RightX;
|
||||
public sbyte RightY;
|
||||
public sbyte RightZ;
|
||||
public sbyte TopX;
|
||||
public sbyte TopY;
|
||||
public sbyte TopZ;
|
||||
public byte SteeringAngle;
|
||||
public byte GasPedalPower;
|
||||
public byte BrakePedalPower;
|
||||
public byte HandbrakeUsed;
|
||||
public float PositionX;
|
||||
public float PositionY;
|
||||
public float PositionZ;
|
||||
public sbyte ForwardX;
|
||||
public sbyte ForwardY;
|
||||
public sbyte ForwardZ;
|
||||
public sbyte SteeringAngle; // factor to convert to game angle is 20 (ie radians)
|
||||
public sbyte GasPedalPower; //-100 to +100, negative = reverse
|
||||
public sbyte BrakePedalPower;//0 to 100
|
||||
public byte HandbrakeUsed;//0 or 1
|
||||
public Vector3 Position;
|
||||
|
||||
public Vector3 Velocity
|
||||
{
|
||||
get
|
||||
{
|
||||
return new Vector3(VelocityX / 273.0583f, VelocityY / 273.0583f, VelocityZ / 273.0583f);
|
||||
}
|
||||
set
|
||||
{
|
||||
VelocityX = (short)Math.Round(value.X * 273.0583f);
|
||||
VelocityY = (short)Math.Round(value.Y * 273.0583f);
|
||||
VelocityZ = (short)Math.Round(value.Z * 273.0583f);
|
||||
}
|
||||
}
|
||||
public Vector3 Forward
|
||||
{
|
||||
get
|
||||
{
|
||||
return new Vector3(ForwardX / 127.0f, ForwardY / 127.0f, ForwardZ / 127.0f);
|
||||
}
|
||||
set
|
||||
{
|
||||
ForwardX = (sbyte)Math.Round(value.X * 127.0f);
|
||||
ForwardY = (sbyte)Math.Round(value.Y * 127.0f);
|
||||
ForwardZ = (sbyte)Math.Round(value.Z * 127.0f);
|
||||
}
|
||||
}
|
||||
public Vector3 Right
|
||||
{
|
||||
get
|
||||
{
|
||||
return new Vector3(RightX / 127.0f, RightY / 127.0f, RightZ / 127.0f);
|
||||
}
|
||||
set
|
||||
{
|
||||
RightX = (sbyte)Math.Round(value.X * 127.0f);
|
||||
RightY = (sbyte)Math.Round(value.Y * 127.0f);
|
||||
RightZ = (sbyte)Math.Round(value.Z * 127.0f);
|
||||
}
|
||||
}
|
||||
public float Steering
|
||||
{
|
||||
get
|
||||
{
|
||||
return SteeringAngle / 20.0f;
|
||||
}
|
||||
set
|
||||
{
|
||||
SteeringAngle = (sbyte)Math.Round(value * 20.0f);
|
||||
}
|
||||
}
|
||||
public float GasPedal
|
||||
{
|
||||
get
|
||||
{
|
||||
return GasPedalPower / 100.0f;
|
||||
}
|
||||
set
|
||||
{
|
||||
GasPedalPower = (sbyte)Math.Round(value * 100.0f);
|
||||
}
|
||||
}
|
||||
public float BrakePedal
|
||||
{
|
||||
get
|
||||
{
|
||||
return BrakePedalPower / 100.0f;
|
||||
}
|
||||
set
|
||||
{
|
||||
BrakePedalPower = (sbyte)Math.Round(value * 100.0f);
|
||||
}
|
||||
}
|
||||
public bool Handbrake
|
||||
{
|
||||
get
|
||||
{
|
||||
return HandbrakeUsed == 1;
|
||||
}
|
||||
set
|
||||
{
|
||||
HandbrakeUsed = value ? (byte)1 : (byte)0;
|
||||
}
|
||||
}
|
||||
|
||||
public override void Read(ResourceDataReader reader, params object[] parameters)
|
||||
{
|
||||
@ -77,18 +216,15 @@ namespace CodeWalker.GameFiles
|
||||
this.RightX = (sbyte)reader.ReadByte();
|
||||
this.RightY = (sbyte)reader.ReadByte();
|
||||
this.RightZ = (sbyte)reader.ReadByte();
|
||||
this.TopX = (sbyte)reader.ReadByte();
|
||||
this.TopY = (sbyte)reader.ReadByte();
|
||||
this.TopZ = (sbyte)reader.ReadByte();
|
||||
this.SteeringAngle = reader.ReadByte();
|
||||
this.GasPedalPower = reader.ReadByte();
|
||||
this.BrakePedalPower = reader.ReadByte();
|
||||
this.ForwardX = (sbyte)reader.ReadByte();
|
||||
this.ForwardY = (sbyte)reader.ReadByte();
|
||||
this.ForwardZ = (sbyte)reader.ReadByte();
|
||||
this.SteeringAngle = (sbyte)reader.ReadByte();
|
||||
this.GasPedalPower = (sbyte)reader.ReadByte();
|
||||
this.BrakePedalPower = (sbyte)reader.ReadByte();
|
||||
this.HandbrakeUsed = reader.ReadByte();
|
||||
this.PositionX = reader.ReadSingle();
|
||||
this.PositionY = reader.ReadSingle();
|
||||
this.PositionZ = reader.ReadSingle();
|
||||
this.Position = reader.ReadVector3();
|
||||
}
|
||||
|
||||
public override void Write(ResourceDataWriter writer, params object[] parameters)
|
||||
{
|
||||
// write structure data
|
||||
@ -96,20 +232,43 @@ namespace CodeWalker.GameFiles
|
||||
writer.Write(this.VelocityX);
|
||||
writer.Write(this.VelocityY);
|
||||
writer.Write(this.VelocityZ);
|
||||
writer.Write(this.RightX);
|
||||
writer.Write(this.RightY);
|
||||
writer.Write(this.RightZ);
|
||||
writer.Write(this.TopX);
|
||||
writer.Write(this.TopY);
|
||||
writer.Write(this.TopZ);
|
||||
writer.Write(this.SteeringAngle);
|
||||
writer.Write(this.GasPedalPower);
|
||||
writer.Write(this.BrakePedalPower);
|
||||
writer.Write((byte)this.RightX);
|
||||
writer.Write((byte)this.RightY);
|
||||
writer.Write((byte)this.RightZ);
|
||||
writer.Write((byte)this.ForwardX);
|
||||
writer.Write((byte)this.ForwardY);
|
||||
writer.Write((byte)this.ForwardZ);
|
||||
writer.Write((byte)this.SteeringAngle);
|
||||
writer.Write((byte)this.GasPedalPower);
|
||||
writer.Write((byte)this.BrakePedalPower);
|
||||
writer.Write(this.HandbrakeUsed);
|
||||
writer.Write(this.PositionX);
|
||||
writer.Write(this.PositionY);
|
||||
writer.Write(this.PositionZ);
|
||||
writer.Write(this.Position);
|
||||
}
|
||||
public void WriteXml(StringBuilder sb, int indent)
|
||||
{
|
||||
YvrXml.ValueTag(sb, indent, "Time", Time.ToString());
|
||||
YvrXml.SelfClosingTag(sb, indent, "Position " + FloatUtil.GetVector3XmlString(Position));
|
||||
YvrXml.SelfClosingTag(sb, indent, "Velocity " + FloatUtil.GetVector3XmlString(Velocity));
|
||||
YvrXml.SelfClosingTag(sb, indent, "Forward " + FloatUtil.GetVector3XmlString(Forward));
|
||||
YvrXml.SelfClosingTag(sb, indent, "Right " + FloatUtil.GetVector3XmlString(Right));
|
||||
YvrXml.ValueTag(sb, indent, "Steering", FloatUtil.ToString(Steering));
|
||||
YvrXml.ValueTag(sb, indent, "GasPedal", FloatUtil.ToString(GasPedal));
|
||||
YvrXml.ValueTag(sb, indent, "BrakePedal", FloatUtil.ToString(BrakePedal));
|
||||
YvrXml.ValueTag(sb, indent, "Handbrake", Handbrake.ToString());
|
||||
}
|
||||
public void ReadXml(XmlNode node)
|
||||
{
|
||||
Time = Xml.GetChildUIntAttribute(node, "Time", "value");
|
||||
Position = Xml.GetChildVector3Attributes(node, "Position");
|
||||
Velocity = Xml.GetChildVector3Attributes(node, "Velocity");
|
||||
Forward = Xml.GetChildVector3Attributes(node, "Forward");
|
||||
Right = Xml.GetChildVector3Attributes(node, "Right");
|
||||
Steering = Xml.GetChildFloatAttribute(node, "Steering", "value");
|
||||
GasPedal = Xml.GetChildFloatAttribute(node, "GasPedal", "value");
|
||||
BrakePedal = Xml.GetChildFloatAttribute(node, "BrakePedal", "value");
|
||||
Handbrake = Xml.GetChildBoolAttribute(node, "Handbrake", "value");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -1,8 +1,10 @@
|
||||
using System;
|
||||
using SharpDX;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
using System.Threading.Tasks;
|
||||
using System.Xml;
|
||||
|
||||
namespace CodeWalker.GameFiles
|
||||
{
|
||||
@ -38,7 +40,6 @@ namespace CodeWalker.GameFiles
|
||||
this.EntriesCount
|
||||
);
|
||||
}
|
||||
|
||||
public override void Write(ResourceDataWriter writer, params object[] parameters)
|
||||
{
|
||||
base.Write(writer, parameters);
|
||||
@ -56,6 +57,61 @@ namespace CodeWalker.GameFiles
|
||||
writer.Write(this.Unknown_28h);
|
||||
writer.Write(this.Unknown_2Ch);
|
||||
}
|
||||
public void WriteXml(StringBuilder sb, int indent)
|
||||
{
|
||||
|
||||
if (Entries?.Data != null)
|
||||
{
|
||||
foreach (var e in Entries.Data)
|
||||
{
|
||||
YwrXml.OpenTag(sb, indent, "Item");
|
||||
e.WriteXml(sb, indent + 1);
|
||||
YwrXml.CloseTag(sb, indent, "Item");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
public void ReadXml(XmlNode node)
|
||||
{
|
||||
var entries = new List<WaypointRecordEntry>();
|
||||
|
||||
var inodes = node.SelectNodes("Item");
|
||||
if (inodes != null)
|
||||
{
|
||||
foreach (XmlNode inode in inodes)
|
||||
{
|
||||
var e = new WaypointRecordEntry();
|
||||
e.ReadXml(inode);
|
||||
entries.Add(e);
|
||||
}
|
||||
}
|
||||
|
||||
Entries = new ResourceSimpleArray<WaypointRecordEntry>();
|
||||
Entries.Data = entries;
|
||||
|
||||
}
|
||||
public static void WriteXmlNode(WaypointRecordList l, StringBuilder sb, int indent, string name = "WaypointRecordList")
|
||||
{
|
||||
if (l == null) return;
|
||||
if ((l.Entries?.Data == null) || (l.Entries.Data.Count == 0))
|
||||
{
|
||||
YwrXml.SelfClosingTag(sb, indent, name);
|
||||
}
|
||||
else
|
||||
{
|
||||
YwrXml.OpenTag(sb, indent, name);
|
||||
l.WriteXml(sb, indent + 1);
|
||||
YwrXml.CloseTag(sb, indent, name);
|
||||
}
|
||||
}
|
||||
public static WaypointRecordList ReadXmlNode(XmlNode node)
|
||||
{
|
||||
if (node == null) return null;
|
||||
var l = new WaypointRecordList();
|
||||
l.ReadXml(node);
|
||||
return l;
|
||||
}
|
||||
|
||||
|
||||
public override IResourceBlock[] GetReferences()
|
||||
{
|
||||
@ -70,9 +126,7 @@ namespace CodeWalker.GameFiles
|
||||
{
|
||||
public override long BlockLength => 20;
|
||||
|
||||
public float PositionX;
|
||||
public float PositionY;
|
||||
public float PositionZ;
|
||||
public Vector3 Position;
|
||||
public ushort Unk0;
|
||||
public ushort Unk1;
|
||||
public ushort Unk2;
|
||||
@ -81,26 +135,38 @@ namespace CodeWalker.GameFiles
|
||||
public override void Read(ResourceDataReader reader, params object[] parameters)
|
||||
{
|
||||
// read structure data
|
||||
this.PositionX = reader.ReadSingle();
|
||||
this.PositionY = reader.ReadSingle();
|
||||
this.PositionZ = reader.ReadSingle();
|
||||
this.Position = reader.ReadVector3();
|
||||
this.Unk0 = reader.ReadUInt16();
|
||||
this.Unk1 = reader.ReadUInt16();
|
||||
this.Unk2 = reader.ReadUInt16();
|
||||
this.Unk3 = reader.ReadUInt16();
|
||||
}
|
||||
|
||||
public override void Write(ResourceDataWriter writer, params object[] parameters)
|
||||
{
|
||||
// write structure data
|
||||
writer.Write(this.PositionX);
|
||||
writer.Write(this.PositionY);
|
||||
writer.Write(this.PositionZ);
|
||||
writer.Write(this.Position);
|
||||
writer.Write(this.Unk0);
|
||||
writer.Write(this.Unk1);
|
||||
writer.Write(this.Unk2);
|
||||
writer.Write(this.Unk3);
|
||||
}
|
||||
public void WriteXml(StringBuilder sb, int indent)
|
||||
{
|
||||
YwrXml.SelfClosingTag(sb, indent, "Position " + FloatUtil.GetVector3XmlString(Position));
|
||||
YwrXml.ValueTag(sb, indent, "Unk0", Unk0.ToString());
|
||||
YwrXml.ValueTag(sb, indent, "Unk1", Unk1.ToString());
|
||||
YwrXml.ValueTag(sb, indent, "Unk2", Unk2.ToString());
|
||||
YwrXml.ValueTag(sb, indent, "Unk3", Unk3.ToString());
|
||||
}
|
||||
public void ReadXml(XmlNode node)
|
||||
{
|
||||
Position = Xml.GetChildVector3Attributes(node, "Position");
|
||||
Unk0 = (ushort)Xml.GetChildUIntAttribute(node, "Unk0", "value");
|
||||
Unk1 = (ushort)Xml.GetChildUIntAttribute(node, "Unk1", "value");
|
||||
Unk2 = (ushort)Xml.GetChildUIntAttribute(node, "Unk2", "value");
|
||||
Unk3 = (ushort)Xml.GetChildUIntAttribute(node, "Unk3", "value");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -276,10 +276,10 @@ namespace CodeWalker
|
||||
InitFileType(".gfx", "Scaleform Flash", 7);
|
||||
InitFileType(".ynd", "Path Nodes", 8, FileTypeAction.ViewYnd, true);
|
||||
InitFileType(".ynv", "Nav Mesh", 9, FileTypeAction.ViewModel, true);
|
||||
InitFileType(".yvr", "Vehicle Record", 9, FileTypeAction.ViewYvr);
|
||||
InitFileType(".ywr", "Waypoint Record", 9, FileTypeAction.ViewYwr);
|
||||
InitFileType(".yvr", "Vehicle Record", 9, FileTypeAction.ViewYvr, true);
|
||||
InitFileType(".ywr", "Waypoint Record", 9, FileTypeAction.ViewYwr, true);
|
||||
InitFileType(".fxc", "Compiled Shaders", 9, FileTypeAction.ViewFxc);
|
||||
InitFileType(".yed", "Expression Dictionary", 9, FileTypeAction.ViewYed);
|
||||
InitFileType(".yed", "Expression Dictionary", 9, FileTypeAction.ViewYed, true);
|
||||
InitFileType(".yld", "Cloth Dictionary", 9, FileTypeAction.ViewYld, true);
|
||||
InitFileType(".yfd", "Frame Filter Dictionary", 9, FileTypeAction.ViewYfd);
|
||||
InitFileType(".asi", "ASI Plugin", 9);
|
||||
@ -313,6 +313,8 @@ namespace CodeWalker
|
||||
InitSubFileType(".dat", "cache_y.dat", "Cache File", 6, FileTypeAction.ViewCacheDat, true);
|
||||
InitSubFileType(".dat", "heightmap.dat", "Heightmap", 6, FileTypeAction.ViewHeightmap, true);
|
||||
InitSubFileType(".dat", "heightmapheistisland.dat", "Heightmap", 6, FileTypeAction.ViewHeightmap, true);
|
||||
InitSubFileType(".dat", "distantlights.dat", "Distant Lights", 6, FileTypeAction.ViewDistantLights);
|
||||
InitSubFileType(".dat", "distantlights_hd.dat", "Distant Lights", 6, FileTypeAction.ViewDistantLights);
|
||||
}
|
||||
private void InitFileType(string ext, string name, int imgidx, FileTypeAction defaultAction = FileTypeAction.ViewHex, bool xmlConvertible = false)
|
||||
{
|
||||
@ -1404,6 +1406,7 @@ namespace CodeWalker
|
||||
case FileTypeAction.ViewYfd:
|
||||
case FileTypeAction.ViewHeightmap:
|
||||
case FileTypeAction.ViewMrf:
|
||||
case FileTypeAction.ViewDistantLights:
|
||||
return true;
|
||||
case FileTypeAction.ViewHex:
|
||||
default:
|
||||
@ -1539,6 +1542,9 @@ namespace CodeWalker
|
||||
case FileTypeAction.ViewNametable:
|
||||
ViewNametable(name, path, data, fe);
|
||||
break;
|
||||
case FileTypeAction.ViewDistantLights:
|
||||
ViewDistantLights(name, path, data, fe);
|
||||
break;
|
||||
case FileTypeAction.ViewHex:
|
||||
default:
|
||||
ViewHex(name, path, data);
|
||||
@ -1748,16 +1754,16 @@ namespace CodeWalker
|
||||
private void ViewYed(string name, string path, byte[] data, RpfFileEntry e)
|
||||
{
|
||||
var yed = RpfFile.GetFile<YedFile>(e, data);
|
||||
GenericForm f = new GenericForm(this);
|
||||
MetaForm f = new MetaForm(this);
|
||||
f.Show();
|
||||
f.LoadFile(yed, yed.RpfFileEntry);
|
||||
f.LoadMeta(yed);
|
||||
}
|
||||
private void ViewYld(string name, string path, byte[] data, RpfFileEntry e)
|
||||
{
|
||||
var yld = RpfFile.GetFile<YldFile>(e, data);
|
||||
GenericForm f = new GenericForm(this);
|
||||
MetaForm f = new MetaForm(this);
|
||||
f.Show();
|
||||
f.LoadFile(yld, yld.RpfFileEntry);
|
||||
f.LoadMeta(yld);
|
||||
}
|
||||
private void ViewYfd(string name, string path, byte[] data, RpfFileEntry e)
|
||||
{
|
||||
@ -1793,6 +1799,13 @@ namespace CodeWalker
|
||||
f.Show();
|
||||
f.LoadNametable(name, path, data, e);
|
||||
}
|
||||
private void ViewDistantLights(string name, string path, byte[] data, RpfFileEntry e)
|
||||
{
|
||||
var dlf = RpfFile.GetFile<DistantLightsFile>(e, data);
|
||||
GenericForm f = new GenericForm(this);
|
||||
f.Show();
|
||||
f.LoadFile(dlf, dlf.RpfFileEntry);
|
||||
}
|
||||
|
||||
private RpfFileEntry CreateFileEntry(string name, string path, ref byte[] data)
|
||||
{
|
||||
@ -2741,6 +2754,18 @@ namespace CodeWalker
|
||||
{
|
||||
mformat = MetaFormat.Yld;
|
||||
}
|
||||
if (fnamel.EndsWith(".yed.xml"))
|
||||
{
|
||||
mformat = MetaFormat.Yed;
|
||||
}
|
||||
if (fnamel.EndsWith(".ywr.xml"))
|
||||
{
|
||||
mformat = MetaFormat.Ywr;
|
||||
}
|
||||
if (fnamel.EndsWith(".yvr.xml"))
|
||||
{
|
||||
mformat = MetaFormat.Yvr;
|
||||
}
|
||||
if (fnamel.EndsWith(".awc.xml"))
|
||||
{
|
||||
mformat = MetaFormat.Awc;
|
||||
@ -2924,6 +2949,39 @@ namespace CodeWalker
|
||||
data = yld.Save();
|
||||
break;
|
||||
}
|
||||
case MetaFormat.Yed:
|
||||
{
|
||||
var yed = XmlYed.GetYed(doc, fpathin);
|
||||
if (yed.ExpressionDictionary == null)
|
||||
{
|
||||
MessageBox.Show(fname + ": Schema not supported.", "Cannot import YED XML");
|
||||
continue;
|
||||
}
|
||||
data = yed.Save();
|
||||
break;
|
||||
}
|
||||
case MetaFormat.Ywr:
|
||||
{
|
||||
var ywr = XmlYwr.GetYwr(doc, fpathin);
|
||||
if (ywr.Waypoints == null)
|
||||
{
|
||||
MessageBox.Show(fname + ": Schema not supported.", "Cannot import YWR XML");
|
||||
continue;
|
||||
}
|
||||
data = ywr.Save();
|
||||
break;
|
||||
}
|
||||
case MetaFormat.Yvr:
|
||||
{
|
||||
var yvr = XmlYvr.GetYvr(doc, fpathin);
|
||||
if (yvr.Records == null)
|
||||
{
|
||||
MessageBox.Show(fname + ": Schema not supported.", "Cannot import YVR XML");
|
||||
continue;
|
||||
}
|
||||
data = yvr.Save();
|
||||
break;
|
||||
}
|
||||
case MetaFormat.Awc:
|
||||
{
|
||||
var awc = XmlAwc.GetAwc(doc, fpathin);
|
||||
@ -4819,6 +4877,7 @@ namespace CodeWalker
|
||||
ViewHeightmap = 23,
|
||||
ViewMrf = 24,
|
||||
ViewNametable = 25,
|
||||
ViewDistantLights = 26,
|
||||
}
|
||||
|
||||
|
||||
|
@ -318,6 +318,34 @@ namespace CodeWalker.Forms
|
||||
metaFormat = MetaFormat.Ynd;
|
||||
}
|
||||
}
|
||||
public void LoadMeta(YldFile yld)
|
||||
{
|
||||
var fn = ((yld?.RpfFileEntry?.Name) ?? "") + ".xml";
|
||||
Xml = MetaXml.GetXml(yld, out fn);
|
||||
FileName = fn;
|
||||
RawPropertyGrid.SelectedObject = yld;
|
||||
rpfFileEntry = yld?.RpfFileEntry;
|
||||
modified = false;
|
||||
metaFormat = MetaFormat.XML;
|
||||
if (yld?.RpfFileEntry != null)
|
||||
{
|
||||
metaFormat = MetaFormat.Yld;
|
||||
}
|
||||
}
|
||||
public void LoadMeta(YedFile yed)
|
||||
{
|
||||
var fn = ((yed?.RpfFileEntry?.Name) ?? "") + ".xml";
|
||||
Xml = MetaXml.GetXml(yed, out fn);
|
||||
FileName = fn;
|
||||
RawPropertyGrid.SelectedObject = yed;
|
||||
rpfFileEntry = yed?.RpfFileEntry;
|
||||
modified = false;
|
||||
metaFormat = MetaFormat.XML;
|
||||
if (yed?.RpfFileEntry != null)
|
||||
{
|
||||
metaFormat = MetaFormat.Yed;
|
||||
}
|
||||
}
|
||||
public void LoadMeta(CacheDatFile cachedat)
|
||||
{
|
||||
var fn = ((cachedat?.FileEntry?.Name) ?? "") + ".xml";
|
||||
@ -404,6 +432,24 @@ namespace CodeWalker.Forms
|
||||
}
|
||||
data = ynd.Save();
|
||||
break;
|
||||
case MetaFormat.Yld:
|
||||
var yld = XmlYld.GetYld(doc);
|
||||
if (yld.ClothDictionary == null)
|
||||
{
|
||||
MessageBox.Show("Schema not supported.", "Cannot import YLD XML");
|
||||
return false;
|
||||
}
|
||||
data = yld.Save();
|
||||
break;
|
||||
case MetaFormat.Yed:
|
||||
var yed = XmlYed.GetYed(doc);
|
||||
if (yed.ExpressionDictionary == null)
|
||||
{
|
||||
MessageBox.Show("Schema not supported.", "Cannot import YED XML");
|
||||
return false;
|
||||
}
|
||||
data = yed.Save();
|
||||
break;
|
||||
case MetaFormat.CacheFile:
|
||||
MessageBox.Show("Sorry, CacheFile import is not supported.", "Cannot import CacheFile XML");
|
||||
return false;
|
||||
|
36
CodeWalker/Forms/YvrForm.Designer.cs
generated
36
CodeWalker/Forms/YvrForm.Designer.cs
generated
@ -41,9 +41,9 @@
|
||||
this.RightXColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.RightYColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.RightZColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.TopXColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.TopYColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.TopZColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.ForwardXColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.ForwardYColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.ForwardZColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.SteeringAngleColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.GasPedalPowerColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
this.BrakePedalPowerColumn = ((System.Windows.Forms.ColumnHeader)(new System.Windows.Forms.ColumnHeader()));
|
||||
@ -81,9 +81,9 @@
|
||||
this.RightXColumn,
|
||||
this.RightYColumn,
|
||||
this.RightZColumn,
|
||||
this.TopXColumn,
|
||||
this.TopYColumn,
|
||||
this.TopZColumn,
|
||||
this.ForwardXColumn,
|
||||
this.ForwardYColumn,
|
||||
this.ForwardZColumn,
|
||||
this.SteeringAngleColumn,
|
||||
this.GasPedalPowerColumn,
|
||||
this.BrakePedalPowerColumn,
|
||||
@ -146,20 +146,20 @@
|
||||
this.RightZColumn.Text = "Right Z";
|
||||
this.RightZColumn.Width = 48;
|
||||
//
|
||||
// TopXColumn
|
||||
// ForwardXColumn
|
||||
//
|
||||
this.TopXColumn.Text = "Top X";
|
||||
this.TopXColumn.Width = 44;
|
||||
this.ForwardXColumn.Text = "Fwd X";
|
||||
this.ForwardXColumn.Width = 44;
|
||||
//
|
||||
// TopYColumn
|
||||
// ForwardYColumn
|
||||
//
|
||||
this.TopYColumn.Text = "Top Y";
|
||||
this.TopYColumn.Width = 44;
|
||||
this.ForwardYColumn.Text = "Fwd Y";
|
||||
this.ForwardYColumn.Width = 44;
|
||||
//
|
||||
// TopZColumn
|
||||
// ForwardZColumn
|
||||
//
|
||||
this.TopZColumn.Text = "Top Z";
|
||||
this.TopZColumn.Width = 44;
|
||||
this.ForwardZColumn.Text = "Fwd Z";
|
||||
this.ForwardZColumn.Width = 44;
|
||||
//
|
||||
// SteeringAngleColumn
|
||||
//
|
||||
@ -236,9 +236,9 @@
|
||||
private System.Windows.Forms.ColumnHeader RightXColumn;
|
||||
private System.Windows.Forms.ColumnHeader RightYColumn;
|
||||
private System.Windows.Forms.ColumnHeader RightZColumn;
|
||||
private System.Windows.Forms.ColumnHeader TopXColumn;
|
||||
private System.Windows.Forms.ColumnHeader TopYColumn;
|
||||
private System.Windows.Forms.ColumnHeader TopZColumn;
|
||||
private System.Windows.Forms.ColumnHeader ForwardXColumn;
|
||||
private System.Windows.Forms.ColumnHeader ForwardYColumn;
|
||||
private System.Windows.Forms.ColumnHeader ForwardZColumn;
|
||||
private System.Windows.Forms.ColumnHeader SteeringAngleColumn;
|
||||
private System.Windows.Forms.ColumnHeader GasPedalPowerColumn;
|
||||
private System.Windows.Forms.ColumnHeader BrakePedalPowerColumn;
|
||||
|
@ -66,42 +66,42 @@ namespace CodeWalker.Forms
|
||||
private string GenerateText()
|
||||
{
|
||||
StringBuilder sb = new StringBuilder();
|
||||
sb.AppendLine("PositionX, PositionY, PositionZ, Time, VelocityX, VelocityY, VelocityZ, RightX, RightY, RightZ, TopX, TopY, TopZ, SteeringAngle, GasPedalPower, BrakePedalPower, HandbrakeUsed");
|
||||
sb.AppendLine("PositionX, PositionY, PositionZ, Time, VelocityX, VelocityY, VelocityZ, RightX, RightY, RightZ, ForwardX, ForwardY, ForwardZ, SteeringAngle, GasPedalPower, BrakePedalPower, HandbrakeUsed");
|
||||
foreach (var entry in yvr.Records.Entries.data_items)
|
||||
{
|
||||
sb.Append(FloatUtil.ToString(entry.PositionX));
|
||||
sb.Append(FloatUtil.ToString(entry.Position.X));
|
||||
sb.Append(", ");
|
||||
sb.Append(FloatUtil.ToString(entry.PositionY));
|
||||
sb.Append(FloatUtil.ToString(entry.Position.Y));
|
||||
sb.Append(", ");
|
||||
sb.Append(FloatUtil.ToString(entry.PositionZ));
|
||||
sb.Append(FloatUtil.ToString(entry.Position.Z));
|
||||
sb.Append(", ");
|
||||
sb.Append(entry.Time.ToString());
|
||||
sb.Append(", ");
|
||||
sb.Append(entry.VelocityX.ToString());
|
||||
sb.Append(FloatUtil.ToString(entry.Velocity.X));
|
||||
sb.Append(", ");
|
||||
sb.Append(entry.VelocityY.ToString());
|
||||
sb.Append(FloatUtil.ToString(entry.Velocity.Y));
|
||||
sb.Append(", ");
|
||||
sb.Append(entry.VelocityZ.ToString());
|
||||
sb.Append(FloatUtil.ToString(entry.Velocity.Z));
|
||||
sb.Append(", ");
|
||||
sb.Append(entry.RightX.ToString());
|
||||
sb.Append(FloatUtil.ToString(entry.Right.X));
|
||||
sb.Append(", ");
|
||||
sb.Append(entry.RightY.ToString());
|
||||
sb.Append(FloatUtil.ToString(entry.Right.Y));
|
||||
sb.Append(", ");
|
||||
sb.Append(entry.RightZ.ToString());
|
||||
sb.Append(FloatUtil.ToString(entry.Right.Z));
|
||||
sb.Append(", ");
|
||||
sb.Append(entry.TopX.ToString());
|
||||
sb.Append(FloatUtil.ToString(entry.Forward.X));
|
||||
sb.Append(", ");
|
||||
sb.Append(entry.TopY.ToString());
|
||||
sb.Append(FloatUtil.ToString(entry.Forward.Y));
|
||||
sb.Append(", ");
|
||||
sb.Append(entry.TopZ.ToString());
|
||||
sb.Append(FloatUtil.ToString(entry.Forward.Z));
|
||||
sb.Append(", ");
|
||||
sb.Append(entry.SteeringAngle.ToString());
|
||||
sb.Append(FloatUtil.ToString(entry.Steering));
|
||||
sb.Append(", ");
|
||||
sb.Append(entry.GasPedalPower.ToString());
|
||||
sb.Append(FloatUtil.ToString(entry.GasPedal));
|
||||
sb.Append(", ");
|
||||
sb.Append(entry.BrakePedalPower.ToString());
|
||||
sb.Append(FloatUtil.ToString(entry.BrakePedal));
|
||||
sb.Append(", ");
|
||||
sb.Append(entry.HandbrakeUsed.ToString());
|
||||
sb.Append(entry.Handbrake.ToString());
|
||||
sb.AppendLine();
|
||||
}
|
||||
return sb.ToString();
|
||||
@ -114,23 +114,23 @@ namespace CodeWalker.Forms
|
||||
{
|
||||
string[] row =
|
||||
{
|
||||
FloatUtil.ToString(entry.PositionX),
|
||||
FloatUtil.ToString(entry.PositionY),
|
||||
FloatUtil.ToString(entry.PositionZ),
|
||||
FloatUtil.ToString(entry.Position.X),
|
||||
FloatUtil.ToString(entry.Position.Y),
|
||||
FloatUtil.ToString(entry.Position.Z),
|
||||
entry.Time.ToString(),
|
||||
entry.VelocityX.ToString(),
|
||||
entry.VelocityY.ToString(),
|
||||
entry.VelocityZ.ToString(),
|
||||
entry.RightX.ToString(),
|
||||
entry.RightY.ToString(),
|
||||
entry.RightZ.ToString(),
|
||||
entry.TopX.ToString(),
|
||||
entry.TopY.ToString(),
|
||||
entry.TopZ.ToString(),
|
||||
entry.SteeringAngle.ToString(),
|
||||
entry.GasPedalPower.ToString(),
|
||||
entry.BrakePedalPower.ToString(),
|
||||
entry.HandbrakeUsed.ToString(),
|
||||
FloatUtil.ToString(entry.Velocity.X),
|
||||
FloatUtil.ToString(entry.Velocity.Y),
|
||||
FloatUtil.ToString(entry.Velocity.Z),
|
||||
FloatUtil.ToString(entry.Right.X),
|
||||
FloatUtil.ToString(entry.Right.Y),
|
||||
FloatUtil.ToString(entry.Right.Z),
|
||||
FloatUtil.ToString(entry.Forward.X),
|
||||
FloatUtil.ToString(entry.Forward.Y),
|
||||
FloatUtil.ToString(entry.Forward.Z),
|
||||
FloatUtil.ToString(entry.Steering),
|
||||
FloatUtil.ToString(entry.GasPedal),
|
||||
FloatUtil.ToString(entry.BrakePedal),
|
||||
entry.Handbrake.ToString(),
|
||||
};
|
||||
MainListView.Items.Add(new ListViewItem(row));
|
||||
}
|
||||
|
@ -72,11 +72,11 @@ namespace CodeWalker.Forms
|
||||
sb.AppendLine("PositionX, PositionY, PositionZ, Unk0, Unk1, Unk2, Unk3");
|
||||
foreach (var entry in ywr.Waypoints.Entries)
|
||||
{
|
||||
sb.Append(FloatUtil.ToString(entry.PositionX));
|
||||
sb.Append(FloatUtil.ToString(entry.Position.X));
|
||||
sb.Append(", ");
|
||||
sb.Append(FloatUtil.ToString(entry.PositionY));
|
||||
sb.Append(FloatUtil.ToString(entry.Position.Y));
|
||||
sb.Append(", ");
|
||||
sb.Append(FloatUtil.ToString(entry.PositionZ));
|
||||
sb.Append(FloatUtil.ToString(entry.Position.Z));
|
||||
sb.Append(", ");
|
||||
sb.Append(entry.Unk0.ToString());
|
||||
sb.Append(", ");
|
||||
@ -97,9 +97,9 @@ namespace CodeWalker.Forms
|
||||
{
|
||||
string[] row =
|
||||
{
|
||||
FloatUtil.ToString(entry.PositionX),
|
||||
FloatUtil.ToString(entry.PositionY),
|
||||
FloatUtil.ToString(entry.PositionZ),
|
||||
FloatUtil.ToString(entry.Position.X),
|
||||
FloatUtil.ToString(entry.Position.Y),
|
||||
FloatUtil.ToString(entry.Position.Z),
|
||||
entry.Unk0.ToString(),
|
||||
entry.Unk1.ToString(),
|
||||
entry.Unk2.ToString(),
|
||||
|
Loading…
Reference in New Issue
Block a user