using Microsoft.Xna.Framework; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; namespace OpenVIII.Core.World { /// /// wm2field.tbl = World Map to Field table = helper class that determines the X Y and Z position and also fieldId to warp from field. This file /// does not contain the X Y and Z coordinates for world map! /// class wm2field { [StructLayout(LayoutKind.Sequential, Pack =1, Size =24)] public struct warpEntry { public short fieldX; public short fieldY; public ushort fieldZ; public ushort fieldId; public byte unk1; public byte unk2; public byte unk3; public byte unk4; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public byte[] padd; } public warpEntry[] warpEntries; public wm2field(byte[] buffer) { int structSize = Marshal.SizeOf(typeof(warpEntry)); warpEntries = new warpEntry[buffer.Length / structSize]; for (int i = 0; i < warpEntries.Length; i++) warpEntries[i] = Extended.ByteArrayToStructure(buffer.Skip(i * structSize).Take(structSize).ToArray()); } public Vector3 GetFieldPosition(int entryId) => new Vector3( warpEntries[entryId].fieldX, warpEntries[entryId].fieldY, warpEntries[entryId].fieldZ); public int GetFieldId(int entryId) => warpEntries[entryId].fieldId; } }