Added a special case to load for IntCollection. I don't really like this.
Added a special case to load for IntCollection. I don't really like this.

file:b/IntCollection.cs (new)
--- /dev/null
+++ b/IntCollection.cs
@@ -1,1 +1,91 @@
+//
+//  IntCollection.cs
+//
+//  Author:
+//       toadicus <>
+//
+//  Copyright (c) 2013 toadicus
+//
+//  This program is free software: you can redistribute it and/or modify
+//  it under the terms of the GNU General Public License as published by
+//  the Free Software Foundation, either version 3 of the License, or
+//  (at your option) any later version.
+//
+//  This program is distributed in the hope that it will be useful,
+//  but WITHOUT ANY WARRANTY; without even the implied warranty of
+//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+//  GNU General Public License for more details.
+//
+//  You should have received a copy of the GNU General Public License
+//  along with this program.  If not, see <http://www.gnu.org/licenses/>.
+using System;
 
+namespace VOID
+{
+	public class IntCollection : IVOID_SaveValue
+	{
+		public static implicit operator long(IntCollection c)
+		{
+			return c.collection;
+		}
+
+		protected long mask;
+
+		public long collection { get; protected set; }
+		public ushort maxCount { get; protected set; }
+		public ushort wordLength { get; protected set; }
+
+		public Type type { get { return typeof(long); } }
+		public object AsType { get { return this.collection; } }
+
+		public void SetValue(object v)
+		{
+			this.collection = (long)v;
+		}
+
+		public IntCollection (ushort wordLength = 4, long initialCollection = 0)
+		{
+			this.collection = initialCollection;
+			this.wordLength = wordLength;
+			this.maxCount = (ushort)((sizeof(long) * 8 - 1) / wordLength);
+			this.mask = ((1 << this.wordLength) - 1);
+		}
+
+		public ushort this[int idx]
+		{
+			get {
+				if (idx < 0) {
+					idx += this.maxCount;
+				}
+
+				if (idx >= maxCount || idx < 0) {
+					throw new IndexOutOfRangeException ();
+				}
+
+				idx *= wordLength;
+
+				return (ushort)((this.collection & (this.mask << idx)) >> idx);
+			}
+			set {
+				Console.WriteLine (value);
+				if (idx < 0) {
+					idx += this.maxCount;
+				}
+
+				if (idx >= maxCount || idx < 0) {
+					throw new IndexOutOfRangeException ();
+				}
+
+				idx *= wordLength;
+
+				long packvalue = value & this.mask;
+				Console.WriteLine (packvalue);
+
+				this.collection &= ~(this.mask << idx);
+				this.collection |= packvalue << idx;
+			}
+		}
+	}
+}
+
+

--- a/VOID.csproj
+++ b/VOID.csproj
@@ -58,6 +58,7 @@
     <Compile Include="VOID_DataLogger.cs" />
     <Compile Include="VOID_EditorCore.cs" />
     <Compile Include="VOID_EditorHUD.cs" />
+    <Compile Include="IntCollection.cs" />
   </ItemGroup>
   <ItemGroup>
     <Reference Include="Assembly-CSharp">

--- a/VOID_Module.cs
+++ b/VOID_Module.cs
@@ -131,15 +131,22 @@
 				object fieldValue = field.GetValue(this);
 
 				bool convertBack = false;
+				bool isIntCollection = false;
 				if (fieldValue is IVOID_SaveValue)
 				{
+					if (fieldValue is IntCollection) {
+						isIntCollection = true;
+					}
 					fieldValue = (fieldValue as IVOID_SaveValue).AsType;
 					convertBack = true;
 				}
 
 				fieldValue = config.GetValue(fieldName, fieldValue);
 
-				if (convertBack)
+				if (isIntCollection) {
+					fieldValue = new IntCollection (4, (long)fieldValue);
+				}
+				else if (convertBack)
 				{
 					Type type = typeof(VOID_SaveValue<>).MakeGenericType (fieldValue.GetType ());
 					IVOID_SaveValue convertValue = Activator.CreateInstance (type) as IVOID_SaveValue;