diff --git a/src/Syroot.Worms.Test/Program.cs b/src/Syroot.Worms.Test/Program.cs
index 64df96a..294af48 100644
--- a/src/Syroot.Worms.Test/Program.cs
+++ b/src/Syroot.Worms.Test/Program.cs
@@ -19,8 +19,9 @@ namespace Syroot.Worms.Test
private static void Main(string[] args)
{
- TeamContainer teams = new TeamContainer(@"C:\Games\Worms World Party\User\Teams\Wg.wwp");
- teams.Save(@"D:\Pictures\test.wwp");
+ Image image = new Image(@"D:\Archive\Games\Worms\Worms Armageddon\3.7.2.1\custom.img");
+ image.Save(@"D:\Pictures\test.img");
+ image.Load(@"D:\Pictures\test.img");
Console.WriteLine("Done.");
Console.ReadLine();
diff --git a/src/Syroot.Worms/Bitmap.cs b/src/Syroot.Worms/Bitmap.cs
index 07359cc..3e2a22b 100644
--- a/src/Syroot.Worms/Bitmap.cs
+++ b/src/Syroot.Worms/Bitmap.cs
@@ -12,7 +12,7 @@ namespace Syroot.Worms
///
/// Gets or sets the number of bits required to describe a color per pixel.
///
- public int BitsPerPixel { get; set; }
+ public byte BitsPerPixel { get; set; }
///
/// Gets or sets the colors in the palette of the bitmap, if it has one.
diff --git a/src/Syroot.Worms/Core/ByteArrayExtensions.cs b/src/Syroot.Worms/Core/ByteArrayExtensions.cs
deleted file mode 100644
index a78348f..0000000
--- a/src/Syroot.Worms/Core/ByteArrayExtensions.cs
+++ /dev/null
@@ -1,34 +0,0 @@
-namespace Syroot.Worms.Core
-{
- ///
- /// Represents extension methods for array instances.
- ///
- internal static class ByteArrayExtensions
- {
- // ---- METHODS (INTERNAL) -------------------------------------------------------------------------------------
-
- ///
- /// Returns true if the current byte array instance holds the same values as the given one.
- ///
- /// The extended byte array instance.
- /// The byte array instance to compare with.
- /// true if both instances hold the same values, otherwise false.
- internal static bool Compare(this byte[] self, byte[] other)
- {
- if (self.Length != other.Length)
- {
- return false;
- }
-
- for (int i = 0; i < self.Length; i++)
- {
- if (self[i] != other[i])
- {
- return false;
- }
- }
-
- return true;
- }
- }
-}
diff --git a/src/Syroot.Worms/Core/Team17Compression.cs b/src/Syroot.Worms/Core/Team17Compression.cs
index b26dfed..db66aeb 100644
--- a/src/Syroot.Worms/Core/Team17Compression.cs
+++ b/src/Syroot.Worms/Core/Team17Compression.cs
@@ -1,3 +1,4 @@
+using System;
using System.IO;
namespace Syroot.Worms.Core
@@ -11,15 +12,25 @@ namespace Syroot.Worms.Core
{
// ---- METHODS (INTERNAL) -------------------------------------------------------------------------------------
+ ///
+ /// Returns the data available in in compressed format.
+ ///
+ /// The data to compress.
+ /// The compressed data.
+ internal static byte[] Compress(byte[] bytes)
+ {
+ throw new NotImplementedException("Compressing data has not been implemented yet.");
+ }
+
///
/// Decompresses the data available in the given into the provided
/// .
///
/// The to read the data from.
/// The byte array buffer to write the decompressed data to.
- internal static void Decompress(Stream stream, ref byte[] buffer)
+ internal static void Decompress(Stream stream, byte[] buffer)
{
- // TODO: This fails for compressed data in CD:\\Data\Mission\Training0-9.img.
+ // TODO: This fails for compressed data in CD:\Data\Mission\Training0-9.img.
int output = 0; // Offset of next write.
int cmd;
while ((cmd = stream.ReadByte()) != -1)
@@ -54,12 +65,12 @@ namespace Syroot.Worms.Core
return;
}
// Command: 3 bytes
- output = CopyData(output, arg2, arg3 + 18, ref buffer);
+ output = CopyData(output, arg2, arg3 + 18, buffer);
}
else
{
// Command: 2 bytes
- output = CopyData(output, arg2 + 1, arg1 + 2, ref buffer);
+ output = CopyData(output, arg2 + 1, arg1 + 2, buffer);
}
}
}
@@ -67,7 +78,7 @@ namespace Syroot.Worms.Core
// ---- METHODS (PRIVATE) --------------------------------------------------------------------------------------
- private static int CopyData(int offset, int compressedOffset, int count, ref byte[] buffer)
+ private static int CopyData(int offset, int compressedOffset, int count, byte[] buffer)
{
for (; count > 0; count--)
{
diff --git a/src/Syroot.Worms/Gen2/Armageddon/LandData.cs b/src/Syroot.Worms/Gen2/Armageddon/LandData.cs
index b800956..d39bf62 100644
--- a/src/Syroot.Worms/Gen2/Armageddon/LandData.cs
+++ b/src/Syroot.Worms/Gen2/Armageddon/LandData.cs
@@ -10,7 +10,7 @@ namespace Syroot.Worms.Gen2.Armageddon
/// Represents map configuration stored by the land generator in LAND.DAT files.
/// Used by WA and WWP. S. https://worms2d.info/Land_Data_file.
///
- public class LandData : ILoadableFile
+ public class LandData : ILoadableFile, ISaveableFile
{
// ---- CONSTANTS ----------------------------------------------------------------------------------------------
@@ -61,6 +61,11 @@ namespace Syroot.Worms.Gen2.Armageddon
///
public int WaterHeight { get; set; }
+ ///
+ /// Gets or sets an unknown value.
+ ///
+ public int Unknown { get; set; }
+
///
/// Gets or sets an array of coordinates at which objects can be placed.
///
@@ -106,20 +111,16 @@ namespace Syroot.Worms.Gen2.Armageddon
{
throw new InvalidDataException("Invalid LND file signature.");
}
- int fileLength = reader.ReadInt32();
+ int fileSize = reader.ReadInt32();
// Read the data.
Size = reader.ReadStruct();
TopBorder = reader.ReadBoolean(BinaryBooleanFormat.NonZeroDword);
WaterHeight = reader.ReadInt32();
+ Unknown = reader.ReadInt32();
// Read the possible object coordinate array.
- int unknown = reader.ReadInt32();
- ObjectLocations = new Vector2[reader.ReadInt32()];
- for (int i = 0; i < ObjectLocations.Length; i++)
- {
- ObjectLocations[i] = reader.ReadStruct();
- }
+ ObjectLocations = reader.ReadStructs(reader.ReadInt32());
// Read the image data.
Foreground = new Image(stream);
@@ -143,5 +144,52 @@ namespace Syroot.Worms.Gen2.Armageddon
Load(stream);
}
}
+
+ ///
+ /// Saves the data into the given .
+ ///
+ /// The to save the data to.
+ public void Save(Stream stream)
+ {
+ using (BinaryDataWriter writer = new BinaryDataWriter(stream, Encoding.ASCII))
+ {
+ // Write the header.
+ writer.Write(_signature);
+ Offset fileSizeOffset = writer.ReserveOffset();
+
+ // Write the data.
+ writer.Write(Size);
+ writer.Write(TopBorder, BinaryBooleanFormat.NonZeroDword);
+ writer.Write(WaterHeight);
+ writer.Write(Unknown);
+
+ // Write the possible object coordinate array.
+ writer.Write(ObjectLocations.Length);
+ writer.Write(ObjectLocations);
+
+ // Write the image data.
+ Foreground.Save(writer.BaseStream);
+ CollisionMask.Save(writer.BaseStream);
+ Background.Save(writer.BaseStream);
+
+ // Write the file paths.
+ writer.Write(LandTexturePath, BinaryStringFormat.ByteLengthPrefix);
+ writer.Write(WaterDirPath, BinaryStringFormat.ByteLengthPrefix);
+
+ fileSizeOffset.Satisfy();
+ }
+ }
+
+ ///
+ /// Saves the data in the given file.
+ ///
+ /// The name of the file to save the data in.
+ public void Save(string fileName)
+ {
+ using (FileStream stream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None))
+ {
+ Save(stream);
+ }
+ }
}
}
diff --git a/src/Syroot.Worms/Gen2/Armageddon/Mission.cs b/src/Syroot.Worms/Gen2/Armageddon/Mission.cs
deleted file mode 100644
index 05646fd..0000000
--- a/src/Syroot.Worms/Gen2/Armageddon/Mission.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Syroot.Worms.Gen2.Armageddon
-{
- class Mission
- {
- }
-}
diff --git a/src/Syroot.Worms/Gen2/Armageddon/MonoMap.cs b/src/Syroot.Worms/Gen2/Armageddon/MonoMap.cs
deleted file mode 100644
index 417c490..0000000
--- a/src/Syroot.Worms/Gen2/Armageddon/MonoMap.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Syroot.Worms.Gen2.Armageddon
-{
- class MonoMap
- {
- }
-}
diff --git a/src/Syroot.Worms/Gen2/Armageddon/Replay.cs b/src/Syroot.Worms/Gen2/Armageddon/Replay.cs
deleted file mode 100644
index 4b147d8..0000000
--- a/src/Syroot.Worms/Gen2/Armageddon/Replay.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Syroot.Worms.Gen2.Armageddon
-{
- class Replay
- {
- }
-}
diff --git a/src/Syroot.Worms/Gen2/Image.cs b/src/Syroot.Worms/Gen2/Image.cs
index 3481ea1..5c001fc 100644
--- a/src/Syroot.Worms/Gen2/Image.cs
+++ b/src/Syroot.Worms/Gen2/Image.cs
@@ -11,7 +11,7 @@ namespace Syroot.Worms.Gen2
/// Represents a (palettized) graphical image stored in an IMG file, possibly compressed.
/// Used by W2, WA and WWP. S. https://worms2d.info/Image_file.
///
- public class Image : Bitmap, ILoadableFile
+ public class Image : Bitmap, ILoadableFile, ISaveableFile
{
// ---- CONSTANTS ----------------------------------------------------------------------------------------------
@@ -47,11 +47,10 @@ namespace Syroot.Worms.Gen2
///
/// Initializes a new instance of the class, loading the data from the given
- /// .
+ /// . The data block can be aligned to a 4-bte boundary.
///
/// The to load the data from.
- /// true to start reading the image data at a 4-byte boundary. Used by WWP in
- /// LAND.DAT files.
+ /// true to align the data array by 4 bytes.
internal Image(Stream stream, bool alignData)
{
Load(stream);
@@ -63,7 +62,7 @@ namespace Syroot.Worms.Gen2
/// Gets an optional description of the image contents.
///
public string Description { get; private set; }
-
+
// ---- METHODS (PUBLIC) ---------------------------------------------------------------------------------------
///
@@ -72,6 +71,7 @@ namespace Syroot.Worms.Gen2
/// The to load the data from.
public void Load(Stream stream)
{
+ Load(stream, false);
}
///
@@ -86,9 +86,52 @@ namespace Syroot.Worms.Gen2
}
}
- // ---- METHODS (PRIVATE) --------------------------------------------------------------------------------------
+ ///
+ /// Saves the data into the given .
+ ///
+ /// The to save the data to.
+ public void Save(Stream stream)
+ {
+ Save(stream, false, false);
+ }
- private void Load(Stream stream, bool alignData)
+ ///
+ /// Saves the optionally compressed data into the given .
+ ///
+ /// The to save the data to.
+ /// true to compress image data.
+ public void Save(Stream stream, bool compress)
+ {
+ Save(stream, compress, false);
+ }
+
+ ///
+ /// Saves the data in the given file.
+ ///
+ /// The name of the file to save the data in.
+ public void Save(string fileName)
+ {
+ Save(fileName, false, false);
+ }
+
+ ///
+ /// Saves the optionally compressed data in the given file.
+ ///
+ /// The name of the file to save the data in.
+ /// true to compress image data.
+ public void Save(string fileName, bool compress)
+ {
+ Save(fileName, compress, false);
+ }
+
+ // ---- METHODS (INTERNAL) -------------------------------------------------------------------------------------
+
+ ///
+ /// Loads the data from the given . The data block can be aligned to a 4-bte boundary.
+ ///
+ /// The to load the data from.
+ /// true to align the data array by 4 bytes.
+ internal void Load(Stream stream, bool alignData)
{
using (BinaryDataReader reader = new BinaryDataReader(stream, Encoding.ASCII, true))
{
@@ -99,7 +142,7 @@ namespace Syroot.Worms.Gen2
}
int fileSize = reader.ReadInt32();
- // Read an optional string describing the image contents or the bits per pixel.
+ // Read an optional string describing the image contents and the bits per pixel.
BitsPerPixel = reader.ReadByte();
if (BitsPerPixel == 0)
{
@@ -111,6 +154,10 @@ namespace Syroot.Worms.Gen2
Description = (char)BitsPerPixel + reader.ReadString(BinaryStringFormat.ZeroTerminated);
BitsPerPixel = reader.ReadByte();
}
+ else
+ {
+ Description = null;
+ }
// Read image flags describing the format and availability of the following contents.
Flags flags = (Flags)reader.ReadByte();
@@ -126,18 +173,23 @@ namespace Syroot.Worms.Gen2
Palette[i] = new Color(reader.ReadByte(), reader.ReadByte(), reader.ReadByte());
}
}
+ else
+ {
+ Palette = null;
+ }
+ // Read the image size.
Size = new Vector2(reader.ReadInt16(), reader.ReadInt16());
+
+ // Read the data byte array, which might be compressed or aligned.
if (alignData)
{
reader.Align(4);
}
-
- // Read the bytes, which might be compressed.
byte[] data = new byte[Size.X * Size.Y * BitsPerPixel / 8];
if (flags.HasFlag(Flags.Compressed))
{
- Team17Compression.Decompress(reader.BaseStream, ref data);
+ Team17Compression.Decompress(reader.BaseStream, data);
}
else
{
@@ -148,11 +200,106 @@ namespace Syroot.Worms.Gen2
}
}
+ ///
+ /// Loads the data from the given file. The data block can be aligned to a 4-bte boundary.
+ ///
+ /// The name of the file to load the data from.
+ /// true to align the data array by 4 bytes.
+ internal void Load(string fileName, bool alignData)
+ {
+ using (FileStream stream = new FileStream(fileName, FileMode.Open, FileAccess.Read, FileShare.Read))
+ {
+ Load(stream);
+ }
+ }
+
+ ///
+ /// Saves the optionally compressed data into the given . The data block can be aligned
+ /// to a 4-bte boundary.
+ ///
+ /// The to save the data to.
+ /// true to compress image data.
+ /// true to align the data array by 4 bytes.
+ internal void Save(Stream stream, bool compress, bool alignData)
+ {
+ using (BinaryDataWriter writer = new BinaryDataWriter(stream, Encoding.ASCII))
+ {
+ // Write the header.
+ writer.Write(_signature);
+ Offset fileSizeOffset = writer.ReserveOffset();
+
+ // Write an optional string describing the image contents and the bits per pixel.
+ if (Description != null)
+ {
+ writer.Write(Description, BinaryStringFormat.ZeroTerminated);
+ }
+ writer.Write(BitsPerPixel);
+
+ // Write image flags describing the format and availability of the following contents.
+ Flags flags = Flags.None;
+ if (Palette != null)
+ {
+ flags |= Flags.Palettized;
+ }
+ if (compress)
+ {
+ flags |= Flags.Compressed;
+ }
+ writer.Write(flags, true);
+
+ // Write the image palette if available. The first color of the palette is implicitly black.
+ if (Palette != null)
+ {
+ writer.Write((short)(Palette.Length - 1));
+ for (int i = 1; i < Palette.Length; i++)
+ {
+ Color color = Palette[i];
+ writer.Write(color.R);
+ writer.Write(color.G);
+ writer.Write(color.B);
+ }
+ }
+
+ // Write the image size.
+ writer.Write((short)Size.X);
+ writer.Write((short)Size.Y);
+
+ // Write the data byte array, which might be compressed or aligned.
+ if (alignData)
+ {
+ writer.Align(4);
+ }
+ byte[] data = Data;
+ if (compress)
+ {
+ data = Team17Compression.Compress(data);
+ }
+ writer.Write(data);
+
+ fileSizeOffset.Satisfy();
+ }
+ }
+
+ ///
+ /// Saves the optionally compressed data in the given file. The data block can be aligned to a 4-byte boundary.
+ ///
+ /// The name of the file to save the data in.
+ /// true to compress image data.
+ /// true to align the data array by 4 bytes.
+ internal void Save(string fileName, bool compress, bool alignData)
+ {
+ using (FileStream stream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None))
+ {
+ Save(stream, compress, alignData);
+ }
+ }
+
// ---- ENUMERATIONS -------------------------------------------------------------------------------------------
[Flags]
- private enum Flags
+ private enum Flags : byte
{
+ None = 0,
Compressed = 1 << 6,
Palettized = 1 << 7
}
diff --git a/src/Syroot.Worms/Gen2/WorldParty/LandData.cs b/src/Syroot.Worms/Gen2/WorldParty/LandData.cs
index eb8b74b..3b378b1 100644
--- a/src/Syroot.Worms/Gen2/WorldParty/LandData.cs
+++ b/src/Syroot.Worms/Gen2/WorldParty/LandData.cs
@@ -1,3 +1,4 @@
+using System;
using System.IO;
using System.Text;
using Syroot.IO;
@@ -10,7 +11,7 @@ namespace Syroot.Worms.Gen2.WorldParty
/// Represents map configuration stored by the land generator in LAND.DAT files.
/// Used by WWP. S. https://worms2d.info/Land_Data_file.
///
- public class LandData : ILoadableFile
+ public class LandData : ILoadableFile, ISaveableFile
{
// ---- CONSTANTS ----------------------------------------------------------------------------------------------
@@ -114,11 +115,7 @@ namespace Syroot.Worms.Gen2.WorldParty
WaterHeight = reader.ReadInt32();
// Read the possible object coordinate array.
- ObjectLocations = new Vector2[reader.ReadInt32()];
- for (int i = 0; i < ObjectLocations.Length; i++)
- {
- ObjectLocations[i] = reader.ReadStruct();
- }
+ ObjectLocations = reader.ReadStructs(reader.ReadInt32());
// Read the image data.
Foreground = new Image(stream, true);
@@ -142,5 +139,51 @@ namespace Syroot.Worms.Gen2.WorldParty
Load(stream);
}
}
+
+ ///
+ /// Saves the data into the given .
+ ///
+ /// The to save the data to.
+ public void Save(Stream stream)
+ {
+ using (BinaryDataWriter writer = new BinaryDataWriter(stream, Encoding.ASCII))
+ {
+ // Write the header.
+ writer.Write(_signature);
+ Offset fileSizeOffset = writer.ReserveOffset();
+
+ // Write the data.
+ writer.Write(Size);
+ writer.Write(TopBorder, BinaryBooleanFormat.NonZeroDword);
+ writer.Write(WaterHeight);
+
+ // Write the possible object coordinate array.
+ writer.Write(ObjectLocations.Length);
+ writer.Write(ObjectLocations);
+
+ // Write the image data.
+ Foreground.Save(writer.BaseStream, false, true);
+ CollisionMask.Save(writer.BaseStream, false, true);
+ Background.Save(writer.BaseStream, false, true);
+
+ // Write the file paths.
+ writer.Write(LandTexturePath, BinaryStringFormat.ByteLengthPrefix);
+ writer.Write(WaterDirPath, BinaryStringFormat.ByteLengthPrefix);
+
+ fileSizeOffset.Satisfy();
+ }
+ }
+
+ ///
+ /// Saves the data in the given file.
+ ///
+ /// The name of the file to save the data in.
+ public void Save(string fileName)
+ {
+ using (FileStream stream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None))
+ {
+ Save(stream);
+ }
+ }
}
}
diff --git a/src/Syroot.Worms/Gen2/Worms2/LandData.cs b/src/Syroot.Worms/Gen2/Worms2/LandData.cs
index c72b6d3..783c931 100644
--- a/src/Syroot.Worms/Gen2/Worms2/LandData.cs
+++ b/src/Syroot.Worms/Gen2/Worms2/LandData.cs
@@ -10,7 +10,7 @@ namespace Syroot.Worms.Gen2.Worms2
/// Represents map configuration stored by the land generator in LAND.DAT files.
/// Used by W2. S. https://worms2d.info/Land_Data_file.
///
- public class LandData : ILoadableFile
+ public class LandData : ILoadableFile, ISaveableFile
{
// ---- CONSTANTS ----------------------------------------------------------------------------------------------
@@ -61,6 +61,11 @@ namespace Syroot.Worms.Gen2.Worms2
///
public Vector2[] ObjectLocations { get; set; }
+ ///
+ /// Gets or sets an unknown value, seeming to be 0 most of the time.
+ ///
+ public int Unknown { get; set; }
+
///
/// Gets or sets the visual foreground image.
///
@@ -113,12 +118,8 @@ namespace Syroot.Worms.Gen2.Worms2
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();
- }
- int unknown = reader.ReadInt32(); // Seems 0.
+ ObjectLocations = reader.ReadStructs(reader.ReadInt32());
+ Unknown = reader.ReadInt32();
// Read the image data.
Foreground = new Image(stream);
@@ -143,5 +144,52 @@ namespace Syroot.Worms.Gen2.Worms2
Load(stream);
}
}
+
+ ///
+ /// Saves the data into the given .
+ ///
+ /// The to save the data to.
+ public void Save(Stream stream)
+ {
+ using (BinaryDataWriter writer = new BinaryDataWriter(stream, Encoding.ASCII))
+ {
+ // Write the header.
+ writer.Write(_signature);
+ Offset fileSizeOffset = writer.ReserveOffset();
+
+ // Write the data.
+ writer.Write(Size);
+ writer.Write(TopBorder, BinaryBooleanFormat.NonZeroDword);
+
+ // Write the possible object coordinate array.
+ writer.Write(ObjectLocations.Length);
+ writer.Write(ObjectLocations);
+ writer.Write(Unknown);
+
+ // Write the image data.
+ Foreground.Save(writer.BaseStream);
+ CollisionMask.Save(writer.BaseStream);
+ Background.Save(writer.BaseStream);
+ UnknownImage.Save(writer.BaseStream);
+
+ // Write the file paths.
+ writer.Write(LandTexturePath, BinaryStringFormat.ByteLengthPrefix);
+ writer.Write(WaterDirPath, BinaryStringFormat.ByteLengthPrefix);
+
+ fileSizeOffset.Satisfy();
+ }
+ }
+
+ ///
+ /// Saves the data in the given file.
+ ///
+ /// The name of the file to save the data in.
+ public void Save(string fileName)
+ {
+ using (FileStream stream = new FileStream(fileName, FileMode.Create, FileAccess.Write, FileShare.None))
+ {
+ Save(stream);
+ }
+ }
}
}
diff --git a/src/Syroot.Worms/Gen2/Worms2/Mission.cs b/src/Syroot.Worms/Gen2/Worms2/Mission.cs
deleted file mode 100644
index 5edf405..0000000
--- a/src/Syroot.Worms/Gen2/Worms2/Mission.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Syroot.Worms.Gen2.Worms2
-{
- class Mission
- {
- }
-}
diff --git a/src/Syroot.Worms/Gen2/Worms2/MonoMap.cs b/src/Syroot.Worms/Gen2/Worms2/MonoMap.cs
deleted file mode 100644
index c0679a5..0000000
--- a/src/Syroot.Worms/Gen2/Worms2/MonoMap.cs
+++ /dev/null
@@ -1,10 +0,0 @@
-using System;
-using System.Collections.Generic;
-using System.Text;
-
-namespace Syroot.Worms.Gen2.Worms2
-{
- class MonoMap
- {
- }
-}