Files
ClassicAssist.Avalonia/ClassicAssist.Shared/UO/Data/TileData.cs
T
Beyhan Oğur d5f52cc3d3 first commit
2026-09-03 04:45:36 +03:00

186 lines
6.3 KiB
C#

using System;
using System.IO;
using System.Text;
namespace ClassicAssist.UO.Data
{
public static class TileData
{
private static string _dataPath;
private static readonly Lazy<LandTile[]> _landTiles = new Lazy<LandTile[]>( LoadLandTiles );
private static readonly Lazy<StaticTile[]> _staticTiles = new Lazy<StaticTile[]>( LoadStaticTiles );
private static bool _oldFormat;
public static void Initialize( string dataPath )
{
_dataPath = dataPath;
}
private static StaticTile[] LoadStaticTiles()
{
string fileName = Path.Combine( _dataPath, "tiledata.mul" );
if ( !File.Exists( fileName ) )
{
throw new FileNotFoundException( "File not found.", fileName );
}
byte[] fileBytes = File.ReadAllBytes( fileName );
StaticTile[] staticTiles = new StaticTile[( fileBytes.Length - 428032 ) / 1188 * 32];
MemoryStream ms = new MemoryStream( fileBytes, false );
using ( BinaryReader reader = new BinaryReader( ms ) )
{
ms.Seek( 36, SeekOrigin.Begin );
string name = Encoding.ASCII.GetString( reader.ReadBytes( 20 ) ).TrimEnd( '\0' );
if ( name == "VOID!!!!!!" )
{
_oldFormat = true;
}
if ( _oldFormat )
{
const int offset = 428032;
ms.Seek( offset, SeekOrigin.Begin );
for ( int i = 0; i < 0x4000; ++i )
{
if ( ( i & 0x1F ) == 0 )
{
reader.ReadInt32(); // header
}
staticTiles[i].ID = (ushort) i;
staticTiles[i].Flags = (TileFlags) reader.ReadInt32();
staticTiles[i].Weight = reader.ReadByte();
staticTiles[i].Quality = reader.ReadByte();
reader.ReadInt16();
reader.ReadByte();
staticTiles[i].Quantity = reader.ReadByte();
reader.ReadInt16();
reader.ReadByte();
reader.ReadByte();
reader.ReadInt16();
staticTiles[i].Height = reader.ReadByte();
staticTiles[i].Name = Encoding.ASCII.GetString( reader.ReadBytes( 20 ) ).TrimEnd( '\0' );
}
}
else
{
const int offset = 493568;
ms.Seek( offset, SeekOrigin.Begin );
for ( int i = 0; i < 0x10000; ++i )
{
if ( ( i & 0x1F ) == 0 )
{
reader.ReadInt32(); // header
}
staticTiles[i].ID = (ushort) i;
staticTiles[i].Flags = (TileFlags) reader.ReadInt64();
staticTiles[i].Weight = reader.ReadByte();
staticTiles[i].Quality = reader.ReadByte();
reader.ReadInt16();
reader.ReadByte();
staticTiles[i].Quantity = reader.ReadByte();
reader.ReadInt32();
reader.ReadByte();
/*int value = */
reader.ReadByte();
staticTiles[i].Height = reader.ReadByte();
staticTiles[i].Name = Encoding.ASCII.GetString( reader.ReadBytes( 20 ) ).TrimEnd( '\0' );
}
}
}
ms.Close();
return staticTiles;
}
private static LandTile[] LoadLandTiles()
{
string fileName = Path.Combine( _dataPath, "tiledata.mul" );
if ( !File.Exists( fileName ) )
{
throw new FileNotFoundException( "File not found.", fileName );
}
byte[] fileBytes = File.ReadAllBytes( fileName );
LandTile[] landTiles = new LandTile[16384];
MemoryStream ms = new MemoryStream( fileBytes, false );
using ( BinaryReader bin = new BinaryReader( ms ) )
{
ms.Seek( 36, SeekOrigin.Begin );
string name = Encoding.ASCII.GetString( bin.ReadBytes( 20 ) ).TrimEnd( '\0' );
if ( name == "VOID!!!!!!" )
{
_oldFormat = true;
}
ms.Seek( 0, SeekOrigin.Begin );
if ( _oldFormat )
{
for ( int i = 0; i < 0x4000; ++i )
{
if ( i == 0 || i > 0 && ( i & 0x1f ) == 0 )
{
bin.ReadInt32(); // block header
}
landTiles[i].Flags = (TileFlags) bin.ReadInt32();
landTiles[i].ID = bin.ReadInt16();
landTiles[i].Name = Encoding.ASCII.GetString( bin.ReadBytes( 20 ) ).TrimEnd( '\0' );
}
}
else
{
for ( int i = 0; i < 0x4000; ++i )
{
if ( i == 1 || i > 0 && ( i & 0x1f ) == 0 )
{
bin.ReadInt32(); // block header
}
landTiles[i].Flags = (TileFlags) bin.ReadInt64();
landTiles[i].ID = bin.ReadInt16();
landTiles[i].Name = Encoding.ASCII.GetString( bin.ReadBytes( 20 ) ).TrimEnd( '\0' );
}
}
}
ms.Close();
return landTiles;
}
public static LandTile GetLandTile( int index )
{
return _landTiles.Value[index];
}
public static StaticTile GetStaticTile( int index )
{
try
{
return _staticTiles.Value[index];
}
catch ( IndexOutOfRangeException )
{
return _staticTiles.Value[0];
}
}
}
}