pk3DS/pk3DS.Core/Structures/Gen7/ZoneData7.cs
Kurt e40d3ce554 Style updates
makes it easier to look at
still looks yuck ;)
2018-08-08 20:56:32 -07:00

69 lines
2.1 KiB
C#

using System;
namespace pk3DS.Core.Structures
{
public class ZoneData7
{
public const int SIZE = 0x54;
private readonly byte[] Data;
public int WorldIndex;
public int AreaIndex;
public string Name { get; private set; }
public string LocationName { get; private set; }
public ZoneData7(byte[] data)
{
Data = (byte[])(data ?? new byte[SIZE]).Clone();
}
public ZoneData7(byte[] data, int index)
{
Data = new byte[SIZE];
Array.Copy(data, index * SIZE, Data, 0, SIZE);
}
// ZoneData Attributes
public int ParentMap {
get => BitConverter.ToInt32(Data, 0x1C);
set => BitConverter.GetBytes(value).CopyTo(Data, 0x1C);
}
// Info Tracking
public void SetZoneName(string[] locationList, int index)
{
LocationName = locationList[ParentMap];
Name = $"{index:000} - {LocationName}";
}
public static ZoneData7[] GetArray(byte[] zoneData)
{
ZoneData7[] zd = new ZoneData7[zoneData.Length / SIZE];
for (int i = 0; i < zd.Length; i++)
zd[i] = new ZoneData7(zoneData, i);
return zd;
}
public static ZoneData7[] GetZoneData7Array(byte[] zoneData, byte[] worldData, string[] locationList, byte[][] worlds)
{
var zones = GetArray(zoneData);
for (int i = 0; i < zones.Length; i++)
{
zones[i].WorldIndex = BitConverter.ToUInt16(worldData, i * 0x2);
zones[i].SetZoneName(locationList, i);
var world = worlds[zones[i].WorldIndex];
var mappingOffset = BitConverter.ToInt32(world, 0x8);
for (var ofs = mappingOffset; ofs < world.Length; ofs += 4)
{
if (BitConverter.ToUInt16(world, ofs) != i)
continue;
zones[i].AreaIndex = BitConverter.ToUInt16(world, ofs + 2);
break;
}
}
return zones;
}
}
}