public static string dumpParams(List <LuaParam> lParams)
        {
            if (lParams == null)
            {
                return("Param list was null?");
            }

            string dumpString = "";

            for (int i = 0; i < lParams.Count; i++)
            {
                switch (lParams[i].typeID)
                {
                case 0x0:     //Int32
                    dumpString += String.Format("0x{0:X}", (int)lParams[i].value);
                    break;

                case 0x1:     //Int32
                    dumpString += String.Format("0x{0:X}", (uint)lParams[i].value);
                    break;

                case 0x2:     //Null Termed String
                    dumpString += String.Format("\"{0}\"", (string)lParams[i].value);
                    break;

                case 0x3:     //Boolean True
                    dumpString += "true";
                    break;

                case 0x4:     //Boolean False
                    dumpString += "false";
                    break;

                case 0x5:     //NULL???
                    dumpString += "nil";
                    break;

                case 0x6:     //Actor (By Id)
                    dumpString += String.Format("0x{0:X}", (uint)lParams[i].value);
                    break;

                case 0x7:     //Weird one used for inventory
                    Type7Param type7Param = ((Type7Param)lParams[i].value);
                    dumpString += String.Format("Type7 Param: (0x{0:X}, 0x{1:X}, 0x{2:X}, 0x{3:X})", type7Param.actorId, type7Param.unknown, type7Param.slot, type7Param.inventoryType);
                    break;

                case 0xC:     //Byte
                    dumpString += String.Format("0x{0:X}", (byte)lParams[i].value);
                    break;

                case 0x9:     //Long (+ 8 bytes ignored)
                    Type9Param type9Param = ((Type9Param)lParams[i].value);
                    dumpString += String.Format("Type9 Param: (0x{0:X}, 0x{1:X})", type9Param.item1, type9Param.item2);
                    break;

                case 0x1B:     //Short?
                    dumpString += String.Format("0x{0:X}", (ushort)lParams[i].value);
                    break;

                case 0xF:     //End
                    break;
                }

                if (i != lParams.Count - 1)
                {
                    dumpString += ", ";
                }
            }

            return(dumpString);
        }
        public static List <LuaParam> readLuaParams(BinaryReader reader)
        {
            List <LuaParam> luaParams = new List <LuaParam>();

            bool isDone = false;

            while (true)
            {
                byte   code   = reader.ReadByte();
                object value  = null;
                bool   wasNil = false;

                switch (code)
                {
                case 0x0:     //Int32
                    value = Utils.swapEndian(reader.ReadInt32());
                    break;

                case 0x1:     //Int32
                    value = Utils.swapEndian(reader.ReadUInt32());
                    break;

                case 0x2:     //Null Termed String
                    List <byte> list = new List <byte>();
                    while (true)
                    {
                        byte readByte = reader.ReadByte();
                        if (readByte == 0)
                        {
                            break;
                        }
                        list.Add(readByte);
                    }
                    value = Encoding.ASCII.GetString(list.ToArray());
                    break;

                case 0x3:     //Boolean True
                    value = true;
                    break;

                case 0x4:     //Boolean False
                    value = false;
                    break;

                case 0x5:     //Nil
                    wasNil = true;
                    break;

                case 0x6:     //Actor (By Id)
                    value = Utils.swapEndian(reader.ReadUInt32());
                    break;

                case 0x7:     //Weird one used for inventory
                    uint type7ActorId       = Utils.swapEndian(reader.ReadUInt32());
                    byte type7Unknown       = reader.ReadByte();
                    byte type7Slot          = reader.ReadByte();
                    byte type7InventoryType = reader.ReadByte();
                    value = new Type7Param(type7ActorId, type7Unknown, type7Slot, type7InventoryType);
                    break;

                case 0x9:     //Two Longs (only storing first one)
                    value = new Type9Param(Utils.swapEndian(reader.ReadUInt64()), Utils.swapEndian(reader.ReadUInt64()));
                    break;

                case 0xC:     //Byte
                    value = reader.ReadByte();
                    break;

                case 0x1B:     //Short?
                    value = reader.ReadUInt16();
                    break;

                case 0xF:     //End
                    isDone = true;
                    continue;
                }

                if (isDone)
                {
                    break;
                }

                if (value != null)
                {
                    luaParams.Add(new LuaParam(code, value));
                }
                else if (wasNil)
                {
                    luaParams.Add(new LuaParam(code, value));
                }
            }

            return(luaParams);
        }