mirror of
https://gitlab.com/Syroot/Worms.git
synced 2025-03-13 13:50:14 +03:00
148 lines
5.2 KiB
C#
148 lines
5.2 KiB
C#
using System.IO;
|
|
using System.Text;
|
|
using Syroot.IO;
|
|
using Syroot.Maths;
|
|
using Syroot.Worms.Core;
|
|
|
|
namespace Syroot.Worms.Gen2.Worms2
|
|
{
|
|
/// <summary>
|
|
/// Represents map configuration stored by the land generator in LAND.DAT files.
|
|
/// Used by W2. S. https://worms2d.info/Land_Data_file.
|
|
/// </summary>
|
|
public class LandData : ILoadableFile
|
|
{
|
|
// ---- CONSTANTS ----------------------------------------------------------------------------------------------
|
|
|
|
private const int _signature = 0x1A444E4C; // "LND", 0x1A
|
|
|
|
// ---- CONSTRUCTORS & DESTRUCTOR ------------------------------------------------------------------------------
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="LandData"/> class.
|
|
/// </summary>
|
|
public LandData()
|
|
{
|
|
}
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="LandData"/> class, loading the data from the given
|
|
/// <see cref="Stream"/>.
|
|
/// </summary>
|
|
/// <param name="stream">The <see cref="Stream"/> to load the data from.</param>
|
|
public LandData(Stream stream)
|
|
{
|
|
Load(stream);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Initializes a new instance of the <see cref="LandData"/> class, loading the data from the given file.
|
|
/// </summary>
|
|
/// <param name="fileName">The name of the file to load the data from.</param>
|
|
public LandData(string fileName)
|
|
{
|
|
Load(fileName);
|
|
}
|
|
|
|
// ---- PROPERTIES ---------------------------------------------------------------------------------------------
|
|
|
|
/// <summary>
|
|
/// Gets or sets the size of the landscape in pixels.
|
|
/// </summary>
|
|
public Vector2 Size { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether an indestructible top border will be enabled.
|
|
/// </summary>
|
|
public bool TopBorder { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets an array of coordinates at which objects can be placed.
|
|
/// </summary>
|
|
public Vector2[] ObjectLocations { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the visual foreground image.
|
|
/// </summary>
|
|
public Image Foreground { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the collision mask of the landscape.
|
|
/// </summary>
|
|
public Image CollisionMask { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the visual background image.
|
|
/// </summary>
|
|
public Image Background { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets an image of unknown use.
|
|
/// </summary>
|
|
public Image UnknownImage { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the path to the land image file.
|
|
/// </summary>
|
|
public string LandTexturePath { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets the path to the Water.dir file.
|
|
/// </summary>
|
|
public string WaterDirPath { get; set; }
|
|
|
|
// ---- METHODS (PUBLIC) ---------------------------------------------------------------------------------------
|
|
|
|
/// <summary>
|
|
/// Loads the data from the given <see cref="Stream"/>.
|
|
/// </summary>
|
|
/// <param name="stream">The <see cref="Stream"/> to load the data from.</param>
|
|
public void Load(Stream stream)
|
|
{
|
|
using (BinaryDataReader reader = new BinaryDataReader(stream, Encoding.ASCII, true))
|
|
{
|
|
// Read the header.
|
|
if (reader.ReadInt32() != _signature)
|
|
{
|
|
throw new InvalidDataException("Invalid LND file signature.");
|
|
}
|
|
int fileLength = reader.ReadInt32();
|
|
|
|
// Read the data.
|
|
Size = reader.ReadStruct<Vector2>();
|
|
TopBorder = reader.ReadBoolean(BinaryBooleanFormat.NonZeroDword);
|
|
|
|
// Read the possible object coordinate array.
|
|
ObjectLocations = new Vector2[reader.ReadInt32()];
|
|
for (int i = 0; i < ObjectLocations.Length; i++)
|
|
{
|
|
ObjectLocations[i] = reader.ReadStruct<Vector2>();
|
|
}
|
|
int unknown = reader.ReadInt32(); // Seems 0.
|
|
|
|
// Read the image data.
|
|
Foreground = new Image(stream);
|
|
CollisionMask = new Image(stream);
|
|
Background = new Image(stream);
|
|
UnknownImage = new Image(stream);
|
|
|
|
// Read the file paths.
|
|
LandTexturePath = reader.ReadString(BinaryStringFormat.ByteLengthPrefix);
|
|
WaterDirPath = reader.ReadString(BinaryStringFormat.ByteLengthPrefix);
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Loads the data from the given file.
|
|
/// </summary>
|
|
/// <param name="fileName">The name of the file to load the data from.</param>
|
|
public void Load(string fileName)
|
|
{
|
|
using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
|
|
{
|
|
Load(stream);
|
|
}
|
|
}
|
|
}
|
|
}
|