mirror of
https://mirror.ghproxy.com/https://github.com/dexyfex/CodeWalker
synced 2024-11-29 18:32:55 +08:00
Added RpfResourcePageFlags structure
This commit is contained in:
parent
da62abefcf
commit
1ac95eebf6
@ -2182,8 +2182,8 @@ namespace CodeWalker.GameFiles
|
||||
|
||||
[TypeConverter(typeof(ExpandableObjectConverter))] public class RpfResourceFileEntry : RpfFileEntry
|
||||
{
|
||||
public uint SystemFlags { get; set; }
|
||||
public uint GraphicsFlags { get; set; }
|
||||
public RpfResourcePageFlags SystemFlags { get; set; }
|
||||
public RpfResourcePageFlags GraphicsFlags { get; set; }
|
||||
|
||||
|
||||
public static int GetSizeFromFlags(uint flags)
|
||||
@ -2204,6 +2204,7 @@ namespace CodeWalker.GameFiles
|
||||
return (int)size;
|
||||
|
||||
|
||||
#region dexyfex testing
|
||||
//var type = flags >> 28;
|
||||
//var test = GetFlagsFromSize((int)size, type);
|
||||
//s0 = ((test >> 27) & 0x1) << 0; // 1 bit - 27 (*1)
|
||||
@ -2251,6 +2252,7 @@ namespace CodeWalker.GameFiles
|
||||
|
||||
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
|
||||
@ -2492,41 +2494,14 @@ namespace CodeWalker.GameFiles
|
||||
{
|
||||
get
|
||||
{
|
||||
var sv = (SystemFlags >> 28);
|
||||
switch(sv)
|
||||
{
|
||||
case 0: break; //ytd, ytyp, ...
|
||||
case 10:break;//ydr, ydd, yft
|
||||
case 4:break; //ypt
|
||||
case 2:break; //ycd
|
||||
case 1:break;//yed
|
||||
default:break;
|
||||
}
|
||||
|
||||
return GetSizeFromFlags(SystemFlags);
|
||||
return (int)SystemFlags.Size;
|
||||
}
|
||||
}
|
||||
public int GraphicsSize
|
||||
{
|
||||
get
|
||||
{
|
||||
var gv = (GraphicsFlags >> 28);
|
||||
switch (gv)
|
||||
{
|
||||
case 0: break; //empty? some vehicle addon yft
|
||||
case 1: break; //ynd
|
||||
case 2: break; //ytyp, ymap
|
||||
case 4: break; //yfd
|
||||
case 5: break; //ydd, ydr, yft
|
||||
case 9: break; //yed
|
||||
case 10: break; //ysc
|
||||
case 11: break; //ybn
|
||||
case 13: break; //ytd
|
||||
case 14: break; //ycd
|
||||
default: break;
|
||||
}
|
||||
|
||||
return GetSizeFromFlags(GraphicsFlags);
|
||||
return (int)GraphicsFlags.Size;
|
||||
}
|
||||
}
|
||||
|
||||
@ -2595,7 +2570,172 @@ namespace CodeWalker.GameFiles
|
||||
}
|
||||
}
|
||||
|
||||
[TypeConverter(typeof(ExpandableObjectConverter))] public struct RpfResourcePageFlags
|
||||
{
|
||||
public uint Value { get; set; }
|
||||
|
||||
public RpfResourcePage[] Pages
|
||||
{
|
||||
get
|
||||
{
|
||||
var count = Count;
|
||||
if (count == 0) return null;
|
||||
var pages = new RpfResourcePage[count];
|
||||
var counts = PageCounts;
|
||||
var sizes = BaseSizes;
|
||||
int n = 0;
|
||||
uint o = 0;
|
||||
for (int i = 0; i < counts.Length; i++)
|
||||
{
|
||||
var c = counts[i];
|
||||
var s = sizes[i];
|
||||
for (int p = 0; p < c; p++)
|
||||
{
|
||||
pages[n] = new RpfResourcePage() { Size = s, Offset = o };
|
||||
o += s;
|
||||
n++;
|
||||
}
|
||||
}
|
||||
return pages;
|
||||
}
|
||||
}
|
||||
|
||||
public uint TypeVal { get { return (Value >> 28) & 0xF; } }
|
||||
public uint BaseShift { get { return (Value & 0xF); } }
|
||||
public uint BaseSize { get { return (0x200u << (int)BaseShift); } }
|
||||
public uint[] BaseSizes
|
||||
{
|
||||
get
|
||||
{
|
||||
var baseSize = BaseSize;
|
||||
return new uint[]
|
||||
{
|
||||
baseSize << 8,
|
||||
baseSize << 7,
|
||||
baseSize << 6,
|
||||
baseSize << 5,
|
||||
baseSize << 4,
|
||||
baseSize << 3,
|
||||
baseSize << 2,
|
||||
baseSize << 1,
|
||||
baseSize << 0,
|
||||
};
|
||||
}
|
||||
}
|
||||
public uint[] PageCounts
|
||||
{
|
||||
get
|
||||
{
|
||||
return new uint[]
|
||||
{
|
||||
((Value >> 4) & 0x1),
|
||||
((Value >> 5) & 0x3),
|
||||
((Value >> 7) & 0xF),
|
||||
((Value >> 11) & 0x3F),
|
||||
((Value >> 17) & 0x7F),
|
||||
((Value >> 24) & 0x1),
|
||||
((Value >> 25) & 0x1),
|
||||
((Value >> 26) & 0x1),
|
||||
((Value >> 27) & 0x1),
|
||||
};
|
||||
}
|
||||
}
|
||||
public uint[] PageSizes
|
||||
{
|
||||
get
|
||||
{
|
||||
var counts = PageCounts;
|
||||
var baseSizes = BaseSizes;
|
||||
return new uint[]
|
||||
{
|
||||
baseSizes[0] * counts[0],
|
||||
baseSizes[1] * counts[1],
|
||||
baseSizes[2] * counts[2],
|
||||
baseSizes[3] * counts[3],
|
||||
baseSizes[4] * counts[4],
|
||||
baseSizes[5] * counts[5],
|
||||
baseSizes[6] * counts[6],
|
||||
baseSizes[7] * counts[7],
|
||||
baseSizes[8] * counts[8],
|
||||
};
|
||||
}
|
||||
}
|
||||
public uint Count
|
||||
{
|
||||
get
|
||||
{
|
||||
var c = PageCounts;
|
||||
return c[0] + c[1] + c[2] + c[3] + c[4] + c[5] + c[6] + c[7] + c[8];
|
||||
}
|
||||
}
|
||||
public uint Size
|
||||
{
|
||||
get
|
||||
{
|
||||
var flags = Value;
|
||||
var s0 = ((flags >> 27) & 0x1) << 0;
|
||||
var s1 = ((flags >> 26) & 0x1) << 1;
|
||||
var s2 = ((flags >> 25) & 0x1) << 2;
|
||||
var s3 = ((flags >> 24) & 0x1) << 3;
|
||||
var s4 = ((flags >> 17) & 0x7F) << 4;
|
||||
var s5 = ((flags >> 11) & 0x3F) << 5;
|
||||
var s6 = ((flags >> 7) & 0xF) << 6;
|
||||
var s7 = ((flags >> 5) & 0x3) << 7;
|
||||
var s8 = ((flags >> 4) & 0x1) << 8;
|
||||
var ss = ((flags >> 0) & 0xF);
|
||||
var baseSize = 0x200u << (int)ss;
|
||||
return baseSize * (s0 + s1 + s2 + s3 + s4 + s5 + s6 + s7 + s8);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
public RpfResourcePageFlags(uint v)
|
||||
{
|
||||
Value = v;
|
||||
}
|
||||
|
||||
public RpfResourcePageFlags(uint[] pageCounts, uint baseShift)
|
||||
{
|
||||
var v = baseShift & 0xF;
|
||||
v += (pageCounts[0] & 0x1) << 4;
|
||||
v += (pageCounts[1] & 0x3) << 5;
|
||||
v += (pageCounts[2] & 0xF) << 7;
|
||||
v += (pageCounts[3] & 0x3F) << 11;
|
||||
v += (pageCounts[4] & 0x7F) << 17;
|
||||
v += (pageCounts[5] & 0x1) << 24;
|
||||
v += (pageCounts[6] & 0x1) << 25;
|
||||
v += (pageCounts[7] & 0x1) << 26;
|
||||
v += (pageCounts[8] & 0x1) << 27;
|
||||
Value = v;
|
||||
}
|
||||
|
||||
|
||||
public static implicit operator uint(RpfResourcePageFlags f)
|
||||
{
|
||||
return f.Value; //implicit conversion
|
||||
}
|
||||
public static implicit operator RpfResourcePageFlags(uint v)
|
||||
{
|
||||
return new RpfResourcePageFlags(v);
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return "Size: " + Size.ToString() + ", Pages: " + Count.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
[TypeConverter(typeof(ExpandableObjectConverter))] public struct RpfResourcePage
|
||||
{
|
||||
public uint Size { get; set; }
|
||||
public uint Offset { get; set; }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return Size.ToString() + ": " + Offset.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
public interface PackedFile //interface for the different file types to use
|
||||
{
|
||||
|
Loading…
Reference in New Issue
Block a user