internal void LoadModInfo(ModInfo mi)
		{
			Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
			string opath = Directory.GetCurrentDirectory();
			Directory.SetCurrentDirectory(path);
			//ReInit(true);

			//GetPrimaryModCount();
			if (mi.Name != GetPrimaryModName(mi.ModId)) throw new Exception("Mod " + mi.Name + " modified without reload");

			//uint result = 0;
			mi.ArchiveName = GetPrimaryModArchive(mi.ModId);

			mi.Checksum = (int)GetPrimaryModChecksum(mi.ModId);

			AddAllArchives(mi.ArchiveName);
			mi.Sides = new String[GetSideCount()];
			for (int x = 0; x < mi.Sides.Length; ++x) mi.Sides[x] = GetSideName(x);

			// weirdest stuff of all...
			while (ProcessUnitsNoChecksum() != 0) {}
			;
			mi.Units = new UnitInfo[GetUnitCount()];
			for (int x = 0; x < mi.Units.Length; ++x) mi.Units[x] = new UnitInfo(GetUnitName(x), GetFullUnitName(x));

			int opts = GetModOptionCount();
			for (int x = 0; x < opts; x++) {
				var o = new Option(x);
				mi.Options.Add(o);
			}

			Directory.SetCurrentDirectory(opath);
		}
		public Option LoadOption(int idx)
		{
			var o = new Option();

				o.Name = GetOptionName(idx);
				o.Key = GetOptionKey(idx);
				o.Description = GetOptionDesc(idx);
				o.OptionType = (Option.Type)GetOptionType(idx);
				o.strMaxLen = GetOptionStringMaxLen(idx);
				o.min = GetOptionNumberMin(idx);
				o.max = GetOptionNumberMax(idx);
				int listCount = GetOptionListCount(idx);
				for (int i = 0; i < listCount; i++) {
					var optl = LoadListOption(idx, i);
					o.ListOptions.Add(optl);
				}
				switch (o.OptionType)
				{
					case Option.Type.Bool:
						o.Default = GetOptionBoolDef(idx).ToString();
						break;
					case Option.Type.Number:
						o.Default = GetOptionNumberDef(idx).ToString();
						break;
					case Option.Type.String:
						o.Default = GetOptionStringDef(idx);
						break;
					case Option.Type.List:
						o.Default = GetOptionListDef(idx);
						break;
					default:
						return null;
				
				}
			return o;	
		}