示例#1
0
        public AsteroidField(StarSystem parent, Section section, FreelancerData data)
            : base(parent, section, data)
        {
            Cube             = new List <CubeAsteroid>();
            DynamicAsteroids = new List <DynamicAsteroids>();
            LootableZones    = new List <LootableZone>();

            foreach (Section s in ParseFile(data.Freelancer.DataPath + file))
            {
                switch (s.Name.ToLowerInvariant())
                {
                case "texturepanels":
                    TexturePanels = new TexturePanelsRef(s, data);
                    break;

                case "properties":
                    foreach (Entry e in s)
                    {
                        switch (e.Name.ToLowerInvariant())
                        {
                        case "flag":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            Properties.Add(e[0].ToString());
                            break;

                        default:
                            throw new Exception("Invalid Entry in " + s.Name + ": " + e.Name);
                        }
                    }
                    break;

                case "exclusion zones":
                    foreach (Entry e in s)
                    {
                        switch (e.Name.ToLowerInvariant())
                        {
                        case "exclusion":
                        case "exclude":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            ExclusionZones.Add(new ExclusionZone(parent, e[0].ToString()));
                            break;

                        case "fog_far":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ExclusionZones.Count == 0)
                            {
                                throw new Exception(e.Name + " before exclusion");
                            }
                            ExclusionZones[ExclusionZones.Count - 1].FogFar = e[0].ToSingle();
                            break;

                        case "zone_shell":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ExclusionZones.Count == 0)
                            {
                                throw new Exception(e.Name + " before exclusion");
                            }
                            break;

                        case "shell_scalar":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ExclusionZones.Count == 0)
                            {
                                throw new Exception(e.Name + " before exclusion");
                            }
                            ExclusionZones[ExclusionZones.Count - 1].ShellScalar = e[0].ToSingle();
                            break;

                        case "max_alpha":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ExclusionZones.Count == 0)
                            {
                                throw new Exception(e.Name + " before exclusion");
                            }
                            ExclusionZones[ExclusionZones.Count - 1].MaxAlpha = e[0].ToSingle();
                            break;

                        case "color":
                            if (e.Count != 3)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ExclusionZones.Count == 0)
                            {
                                throw new Exception(e.Name + " before exclusion");
                            }
                            ExclusionZones[ExclusionZones.Count - 1].Color = new Color4(e[0].ToInt32() / 255f, e[0].ToInt32() / 255f, e[0].ToInt32() / 255f, 1f);
                            break;

                        case "exclusion_tint":
                            if (e.Count != 3)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ExclusionZones.Count == 0)
                            {
                                throw new Exception(e.Name + " before exclusion");
                            }
                            ExclusionZones[ExclusionZones.Count - 1].Tint = new Color3f(e[0].ToInt32() / 255f, e[0].ToInt32() / 255f, e[0].ToInt32() / 255f);
                            break;

                        case "exclude_billboards":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ExclusionZones.Count == 0)
                            {
                                throw new Exception(e.Name + " before exclusion");
                            }
                            ExclusionZones[ExclusionZones.Count - 1].ExcludeBillboards = e[0].ToInt32();
                            break;

                        case "exclude_dynamic_asteroids":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ExclusionZones.Count == 0)
                            {
                                throw new Exception(e.Name + " before exclusion");
                            }
                            ExclusionZones[ExclusionZones.Count - 1].ExcludeDynamicAsteroids = e[0].ToInt32();
                            break;

                        case "empty_cube_frequency":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ExclusionZones.Count == 0)
                            {
                                throw new Exception(e.Name + " before exclusion");
                            }
                            ExclusionZones[ExclusionZones.Count - 1].EmptyCubeFrequency = e[0].ToSingle();
                            break;

                        case "billboard_count":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ExclusionZones.Count == 0)
                            {
                                throw new Exception(e.Name + " before exclusion");
                            }
                            ExclusionZones[ExclusionZones.Count - 1].BillboardCount = e[0].ToInt32();
                            break;

                        default:
                            FLLog.Warning("Ini", "Invalid Entry in " + s.Name + ": " + e.Name);
                            break;
                        }
                    }
                    break;

                case "field":
                    Field = new Field(s);
                    break;

                case "cube":
                    foreach (Entry e in s)
                    {
                        switch (e.Name.ToLowerInvariant())
                        {
                        case "xaxis_rotation":
                            Cube_RotationX = new Vector4(e[0].ToSingle(), e[1].ToSingle(), e[2].ToSingle(), e[3].ToSingle());
                            break;

                        case "yaxis_rotation":
                            Cube_RotationY = new Vector4(e[0].ToSingle(), e[1].ToSingle(), e[2].ToSingle(), e[3].ToSingle());
                            break;

                        case "zaxis_rotation":
                            Cube_RotationZ = new Vector4(e[0].ToSingle(), e[1].ToSingle(), e[2].ToSingle(), e[3].ToSingle());
                            break;

                        case "asteroid":
                            //if (e.Count < 7 || e.Count > 8) throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            Cube.Add(new CubeAsteroid(e));
                            break;
                        }
                    }
                    break;

                case "band":
                    Band = new Band(parent, s);
                    break;

                case "exclusionband":
                    ExclusionBand = new Band(parent, s);
                    break;

                case "asteroidbillboards":
                    AsteroidBillboards = new AsteroidBillboards(s);
                    break;

                case "dynamicasteroids":
                    DynamicAsteroids.Add(new DynamicAsteroids(s));
                    break;

                case "lootablezone":
                    LootableZones.Add(new LootableZone(s));
                    break;

                default:
                    throw new Exception("Invalid Section in " + file + ": " + s.Name);
                }
            }
        }
示例#2
0
        public StarSystem(UniverseIni universe, Section section, FreelancerData data)
            : base(data)
        {
            if (universe == null)
            {
                throw new ArgumentNullException("universe");
            }
            if (section == null)
            {
                throw new ArgumentNullException("section");
            }
            string file = null;

            foreach (Entry e in section)
            {
                switch (e.Name.ToLowerInvariant())
                {
                case "nickname":
                    if (e.Count != 1)
                    {
                        throw new Exception("Invalid number of values in " + section.Name + " Entry " + e.Name + ": " + e.Count);
                    }
                    if (Nickname != null)
                    {
                        throw new Exception("Duplicate " + e.Name + " Entry in " + section.Name);
                    }
                    Nickname = e[0].ToString();
                    break;

                case "file":
                    if (e.Count != 1)
                    {
                        throw new Exception("Invalid number of values in " + section.Name + " Entry " + e.Name + ": " + e.Count);
                    }
                    if (file != null)
                    {
                        throw new Exception("Duplicate " + e.Name + " Entry in " + section.Name);
                    }
                    file = e[0].ToString();
                    break;

                case "pos":
                    if (e.Count != 2)
                    {
                        throw new Exception("Invalid number of values in " + section.Name + " Entry " + e.Name + ": " + e.Count);
                    }
                    if (Pos != null)
                    {
                        throw new Exception("Duplicate " + e.Name + " Entry in " + section.Name);
                    }
                    Pos = new Vector2(e[0].ToSingle(), e[1].ToSingle());
                    break;

                case "msg_id_prefix":
                    if (e.Count != 1)
                    {
                        throw new Exception("Invalid number of values in " + section.Name + " Entry " + e.Name + ": " + e.Count);
                    }
                    if (MsgIdPrefix != null)
                    {
                        throw new Exception("Duplicate " + e.Name + " Entry in " + section.Name);
                    }
                    MsgIdPrefix = e[0].ToString();
                    break;

                case "visit":
                    if (e.Count != 1)
                    {
                        throw new Exception("Invalid number of values in " + section.Name + " Entry " + e.Name + ": " + e.Count);
                    }
                    if (Visit != null)
                    {
                        throw new Exception("Duplicate " + e.Name + " Entry in " + section.Name);
                    }
                    Visit = e[0].ToInt32();
                    break;

                case "strid_name":
                    if (e.Count == 0)
                    {
                        break;
                    }
                    if (e.Count != 1)
                    {
                        throw new Exception("Invalid number of values in " + section.Name + " Entry " + e.Name + ": " + e.Count);
                    }
                    if (StridName != null)
                    {
                        throw new Exception("Duplicate " + e.Name + " Entry in " + section.Name);
                    }
                    StridName = GameData.Infocards.GetStringResource(e[0].ToInt32());
                    break;

                case "ids_info":
                    if (e.Count == 0)
                    {
                        break;
                    }
                    if (e.Count != 1)
                    {
                        throw new Exception("Invalid number of values in " + section.Name + " Entry " + e.Name + ": " + e.Count);
                    }
                    if (IdsInfo != null)
                    {
                        throw new Exception("Duplicate " + e.Name + " Entry in " + section.Name);
                    }
                    IdsInfo = GameData.Infocards.GetXmlResource(e[0].ToInt32());
                    break;

                case "navmapscale":
                    if (e.Count != 1)
                    {
                        throw new Exception("Invalid number of values in " + section.Name + " Entry " + e.Name + ": " + e.Count);
                    }
                    if (NavMapScale != null)
                    {
                        throw new Exception("Duplicate " + e.Name + " Entry in " + section.Name);
                    }
                    NavMapScale = e[0].ToSingle();
                    break;

                default:
                    throw new Exception("Invalid Entry in " + section.Name + ": " + e.Name);
                }
            }

            if (file == null)               //TODO: MultiUniverse
            {
                FLLog.Warning("Ini", "Unimplemented: Possible MultiUniverse system " + Nickname);
                return;
            }

            foreach (Section s in ParseFile(GameData.Freelancer.DataPath + "universe\\" + file))
            {
                switch (s.Name.ToLowerInvariant())
                {
                case "systeminfo":
                    foreach (Entry e in s)
                    {
                        switch (e.Name.ToLowerInvariant())
                        {
                        case "name":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (Name != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            Name = e[0].ToString();
                            break;

                        case "space_color":
                            if (e.Count != 3)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (SpaceColor != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            SpaceColor = new Color4(e[0].ToInt32() / 255f, e[1].ToInt32() / 255f, e[2].ToInt32() / 255f, 1f);
                            break;

                        case "local_faction":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (LocalFaction != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            LocalFaction = e[0].ToString();
                            break;

                        case "rpop_solar_detection":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (RpopSolarDetection != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            RpopSolarDetection = e[0].ToBoolean();
                            break;

                        case "space_farclip":
                            if (SpaceFarClip != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            SpaceFarClip = e[0].ToSingle();
                            break;

                        default:
                            throw new Exception("Invalid Entry in " + section.Name + ": " + e.Name);
                        }
                    }
                    break;

                case "music":
                    foreach (Entry e in s)
                    {
                        switch (e.Name.ToLowerInvariant())
                        {
                        case "space":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (MusicSpace != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            MusicSpace = e[0].ToString();
                            break;

                        case "danger":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (MusicDanger != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            MusicDanger = e[0].ToString();
                            break;

                        case "battle":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (MusicBattle != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            MusicBattle = e[0].ToString();
                            break;

                        default:
                            throw new Exception("Invalid Entry in " + section.Name + ": " + e.Name);
                        }
                    }
                    break;

                case "archetype":
                    foreach (Entry e in s)
                    {
                        switch (e.Name.ToLowerInvariant())
                        {
                        case "ship":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ArchetypeShip == null)
                            {
                                ArchetypeShip = new List <string>();
                            }
                            ArchetypeShip.Add(e[0].ToString());
                            break;

                        case "simple":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ArchetypeSimple == null)
                            {
                                ArchetypeSimple = new List <string>();
                            }
                            ArchetypeSimple.Add(e[0].ToString());
                            break;

                        case "solar":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ArchetypeSolar == null)
                            {
                                ArchetypeSolar = new List <Archetype>();
                            }
                            ArchetypeSolar.Add(GameData.Solar.FindSolar(e[0].ToString()));
                            break;

                        case "equipment":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ArchetypeEquipment == null)
                            {
                                ArchetypeEquipment = new List <string>();
                            }
                            ArchetypeEquipment.Add(e[0].ToString());
                            break;

                        case "snd":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ArchetypeSnd == null)
                            {
                                ArchetypeSnd = new List <string>();
                            }
                            ArchetypeSnd.Add(e[0].ToString());
                            break;

                        case "voice":
                            if (ArchetypeVoice == null)
                            {
                                ArchetypeVoice = new List <List <string> >();
                            }
                            ArchetypeVoice.Add(new List <string>());
                            foreach (IValue i in e)
                            {
                                ArchetypeVoice[ArchetypeVoice.Count - 1].Add(i.ToString());
                            }
                            break;

                        default:
                            throw new Exception("Invalid Entry in " + s.Name + ": " + e.Name);
                        }
                    }
                    break;

                case "dust":
                    foreach (Entry e in s)
                    {
                        switch (e.Name.ToLowerInvariant())
                        {
                        case "spacedust":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (Spacedust != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            Spacedust = e[0].ToString();
                            break;

                        default:
                            throw new Exception("Invalid Entry in " + s.Name + ": " + e.Name);
                        }
                    }
                    break;

                case "nebula":
                    if (Nebulae == null)
                    {
                        Nebulae = new List <Nebula>();
                    }
                    Nebulae.Add(new Nebula(this, s, GameData));
                    break;

                case "asteroids":
                    if (Asteroids == null)
                    {
                        Asteroids = new List <AsteroidField>();
                    }
                    Asteroids.Add(new AsteroidField(this, s, GameData));
                    break;

                case "ambient":
                    foreach (Entry e in s)
                    {
                        switch (e.Name.ToLowerInvariant())
                        {
                        case "color":
                            if (e.Count != 3)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (AmbientColor != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            AmbientColor = new Color4(e[0].ToInt32() / 255f, e[1].ToInt32() / 255f, e[2].ToInt32() / 255f, 1f);
                            break;

                        default:
                            throw new Exception("Invalid Entry in " + s.Name + ": " + e.Name);
                        }
                    }
                    break;

                case "lightsource":
                    if (LightSources == null)
                    {
                        LightSources = new List <LightSource>();
                    }
                    LightSources.Add(new LightSource(s, GameData));
                    break;

                case "object":
                    if (Objects == null)
                    {
                        Objects = new List <SystemObject>();
                    }
                    Objects.Add(new SystemObject(universe, this, s, GameData));
                    break;

                case "encounterparameters":
                    if (EncounterParameters == null)
                    {
                        EncounterParameters = new List <EncounterParameter>();
                    }
                    EncounterParameters.Add(new EncounterParameter(s));
                    break;

                case "texturepanels":
                    TexturePanels = new TexturePanelsRef(s, GameData);
                    break;

                case "background":
                    foreach (Entry e in s)
                    {
                        switch (e.Name.ToLowerInvariant())
                        {
                        case "basic_stars":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (BackgroundBasicStarsPath != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            BackgroundBasicStarsPath = VFS.GetPath(GameData.Freelancer.DataPath + e [0].ToString());
                            break;

                        case "complex_stars":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (BackgroundComplexStarsPath != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            BackgroundComplexStarsPath = VFS.GetPath(GameData.Freelancer.DataPath + e [0].ToString());
                            break;

                        case "nebulae":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            string temp = VFS.GetPath(GameData.Freelancer.DataPath + e[0].ToString(), false);
                            if (BackgroundNebulaePath != null && BackgroundNebulaePath != temp)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            BackgroundNebulaePath = temp;
                            break;

                        default:
                            throw new Exception("Invalid Entry in " + s.Name + ": " + e.Name);
                        }
                    }
                    break;

                case "zone":
                    if (Zones == null)
                    {
                        Zones = new List <Zone>();
                    }
                    Zones.Add(new Zone(s, GameData));
                    break;

                case "field":
                    Field = new Field(s);
                    break;

                case "asteroidbillboards":
                    AsteroidBillboards = new AsteroidBillboards(s);
                    break;

                default:
                    throw new Exception("Invalid Section in " + file + ": " + s.Name);
                }
            }
        }
示例#3
0
        public Nebula(StarSystem parent, Section section, FreelancerData data)
            : base(parent, section, data)
        {
            ExteriorShape = new List <string>();
            NebulaLights  = new List <NebulaLight>();


            foreach (Section s in ParseFile(data.Freelancer.DataPath + file))
            {
                switch (s.Name.ToLowerInvariant())
                {
                case "texturepanels":
                    TexturePanels = new TexturePanelsRef(s, data);
                    break;

                case "properties":
                    foreach (Entry e in s)
                    {
                        switch (e.Name.ToLowerInvariant())
                        {
                        case "flag":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            Properties.Add(e[0].ToString());
                            break;

                        default:
                            FLLog.Warning("Ini", "Invalid Entry in " + s.Name + ": " + e.Name);
                            break;
                        }
                    }
                    break;

                case "fog":
                    foreach (Entry e in s)
                    {
                        switch (e.Name.ToLowerInvariant())
                        {
                        case "fog_enabled":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (FogEnabled != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            FogEnabled = e[0].ToInt32();
                            break;

                        case "near":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (FogNear != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            FogNear = e[0].ToInt32();
                            break;

                        case "distance":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (FogDistance != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            FogDistance = e[0].ToInt32();
                            break;

                        case "color":
                            if (e.Count != 3)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (FogColor != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            FogColor = new Color4(e[0].ToInt32() / 255f, e[1].ToInt32() / 255f, e[2].ToInt32() / 255f, 1f);
                            break;

                        case "opacity":
                            FLLog.Warning("Nebula", "unimplemented fog opacity");
                            break;

                        case "max_alpha":
                            FLLog.Warning("Nebula", "unimplemented max alpha");
                            break;

                        default:
                            throw new Exception("Invalid Entry in " + s.Name + ": " + e.Name);
                        }
                    }
                    break;

                case "exclusion zones":
                    foreach (Entry e in s)
                    {
                        switch (e.Name.ToLowerInvariant())
                        {
                        case "exclusion":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            ExclusionZones.Add(new ExclusionZone(parent, e[0].ToString()));
                            break;

                        case "fog_far":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ExclusionZones.Count == 0)
                            {
                                throw new Exception(e.Name + " before exclusion");
                            }
                            ExclusionZones[ExclusionZones.Count - 1].FogFar = e[0].ToSingle();
                            break;

                        case "fog_near":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ExclusionZones.Count == 0)
                            {
                                throw new Exception(e.Name + " before exclusion");
                            }
                            ExclusionZones[ExclusionZones.Count - 1].FogNear = e[0].ToSingle();
                            break;

                        case "zone_shell":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ExclusionZones.Count == 0)
                            {
                                throw new Exception(e.Name + " before exclusion");
                            }
                            ExclusionZones[ExclusionZones.Count - 1].ZoneShellPath = e[0].ToString();
                            break;

                        case "shell_scalar":
                            //if (e.Count != 1) throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            if (e.Count != 1)
                            {
                                FLLog.Warning("Ini", "Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ExclusionZones.Count == 0)
                            {
                                throw new Exception(e.Name + " before exclusion");
                            }
                            ExclusionZones[ExclusionZones.Count - 1].ShellScalar = e[0].ToSingle();
                            break;

                        case "max_alpha":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ExclusionZones.Count == 0)
                            {
                                throw new Exception(e.Name + " before exclusion");
                            }
                            ExclusionZones[ExclusionZones.Count - 1].MaxAlpha = e[0].ToSingle();
                            break;

                        case "color":
                            if (e.Count != 3)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ExclusionZones.Count == 0)
                            {
                                throw new Exception(e.Name + " before exclusion");
                            }
                            ExclusionZones[ExclusionZones.Count - 1].Color = new Color4(e[0].ToInt32() / 255f, e[0].ToInt32() / 255f, e[0].ToInt32() / 255f, 1f);
                            break;

                        case "exclusion_tint":
                            if (e.Count != 3)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ExclusionZones.Count == 0)
                            {
                                throw new Exception(e.Name + " before exclusion");
                            }
                            ExclusionZones[ExclusionZones.Count - 1].Tint = new Color3f(e[0].ToInt32() / 255f, e[0].ToInt32() / 255f, e[0].ToInt32() / 255f);
                            break;

                        default:
                            throw new Exception("Invalid Entry in " + s.Name + ": " + e.Name);
                        }
                    }
                    break;

                case "exterior":
                    foreach (Entry e in s)
                    {
                        switch (e.Name.ToLowerInvariant())
                        {
                        case "shape":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            ExteriorShape.Add(e[0].ToString());
                            break;

                        case "shape_weights":
                            //if (e.Count != 4) throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            if (ExteriorShapeWeights != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            ExteriorShapeWeights = new List <int>();
                            foreach (IValue i in e)
                            {
                                ExteriorShapeWeights.Add(i.ToInt32());
                            }
                            break;

                        case "fill_shape":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ExteriorFillShape != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            ExteriorFillShape = e[0].ToString();
                            break;

                        case "plane_slices":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ExteriorPlaneSlices != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            ExteriorPlaneSlices = e[0].ToInt32();
                            break;

                        case "bit_radius":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ExteriorBitRadius != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            ExteriorBitRadius = e[0].ToInt32();
                            break;

                        case "bit_radius_random_variation":
                            if (e.Count != 1)
                            {
                                FLLog.Warning("Ini", "Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ExteriorBitRadiusRandomVariation != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            ExteriorBitRadiusRandomVariation = e[0].ToSingle();
                            break;

                        case "min_bits":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ExteriorMinBits != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            ExteriorMinBits = e[0].ToInt32();
                            break;

                        case "max_bits":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ExteriorMaxBits != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            ExteriorMaxBits = e[0].ToInt32();
                            break;

                        case "move_bit_percent":
                            if (e.Count != 1)
                            {
                                FLLog.Warning("Ini", "Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ExteriorMoveBitPercent != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            ExteriorMoveBitPercent = e[0].ToSingle();
                            break;

                        case "equator_bias":
                            if (e.Count != 1)
                            {
                                FLLog.Warning("Ini", "Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ExteriorEquatorBias != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            ExteriorEquatorBias = e[0].ToSingle();
                            break;

                        case "color":
                            if (e.Count != 3)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (ExteriorColor != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            ExteriorColor = new Color4(e[0].ToInt32() / 255f, e[1].ToInt32() / 255f, e[2].ToInt32() / 255f, 1f);
                            break;

                        default:
                            throw new Exception("Invalid Entry in " + s.Name + ": " + e.Name);
                        }
                    }
                    break;

                case "nebulalight":
                    NebulaLights.Add(new NebulaLight(s));
                    break;

                case "clouds":
                    if (CloudsMaxDistance != null)
                    {
                        FLLog.Warning("Ini", "Multiple [Clouds] in Nebula " + ZoneName);
                        break;
                    }
                    foreach (Entry e in s)
                    {
                        switch (e.Name.ToLowerInvariant())
                        {
                        case "max_distance":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (CloudsMaxDistance != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            CloudsMaxDistance = e[0].ToInt32();
                            break;

                        case "puff_count":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (CloudsPuffCount != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            CloudsPuffCount = e[0].ToInt32();
                            break;

                        case "puff_radius":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (CloudsPuffRadius != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            CloudsPuffRadius = e[0].ToInt32();
                            break;

                        case "puff_cloud_size":
                            FLLog.Warning("Nebula", "puff_cloud_size unimplemented");
                            break;

                        case "puff_colora":
                            if (e.Count != 3)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (CloudsPuffColorA != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            CloudsPuffColorA = new Color3f(e[0].ToInt32() / 255f, e[1].ToInt32() / 255f, e[2].ToInt32() / 255f);
                            break;

                        case "puff_colorb":
                            if (e.Count != 3)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (CloudsPuffColorB != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            CloudsPuffColorB = new Color3f(e[0].ToInt32() / 255f, e[1].ToInt32() / 255f, e[2].ToInt32() / 255f);
                            break;

                        case "puff_max_alpha":
                            if (e.Count != 1)
                            {
                                FLLog.Warning("Ini", "Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (CloudsPuffMaxAlpha != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            CloudsPuffMaxAlpha = e[0].ToSingle();
                            break;

                        case "puff_shape":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (CloudsPuffShape == null)
                            {
                                CloudsPuffShape = new List <string>();
                            }
                            CloudsPuffShape.Add(e[0].ToString());
                            break;

                        case "puff_weights":
                            if (e.Count != 4)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (CloudsPuffWeights != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            CloudsPuffWeights = new List <int>();
                            foreach (IValue i in e)
                            {
                                CloudsPuffWeights.Add(i.ToInt32());
                            }
                            break;

                        case "puff_drift":
                            if (e.Count != 1)
                            {
                                FLLog.Warning("Ini", "Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (CloudsPuffDrift != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            CloudsPuffDrift = e[0].ToSingle();
                            break;

                        case "near_fade_distance":
                            if (e.Count != 2)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (CloudsNearFadeDistance != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            CloudsNearFadeDistance = new Vector2(e[0].ToSingle(), e[1].ToSingle());
                            break;

                        case "lightning_intensity":
                            if (e.Count != 1)
                            {
                                FLLog.Warning("Ini", "Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (CloudsLightningIntensity != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            CloudsLightningIntensity = e[0].ToSingle();
                            break;

                        case "lightning_color":
                            if (e.Count != 3)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (CloudsLightningColor != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            CloudsLightningColor = new Color4(e[0].ToInt32() / 255f, e[1].ToInt32() / 255f, e[2].ToInt32() / 255f, 1f);
                            break;

                        case "lightning_gap":
                            if (e.Count != 1)
                            {
                                FLLog.Warning("Ini", "Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (CloudsLightningGap != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            CloudsLightningGap = e[0].ToSingle();
                            break;

                        case "lightning_duration":
                            if (e.Count != 1)
                            {
                                FLLog.Warning("Ini", "Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (CloudsLightningDuration != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            CloudsLightningDuration = e[0].ToSingle();
                            break;

                        case "disable_clouds":
                            FLLog.Warning("Nebula", "disable_clouds not implemented");
                            break;

                        case "zwrite_clouds":
                            FLLog.Warning("Nebula", "disable_clouds not implemented");
                            break;

                        default:
                            throw new Exception("Invalid Entry in " + s.Name + ": " + e.Name);
                        }
                    }
                    break;

                case "backgroundlightning":
                    foreach (Entry e in s)
                    {
                        switch (e.Name.ToLowerInvariant())
                        {
                        case "duration":
                            if (e.Count != 1)
                            {
                                FLLog.Warning("Ini", "Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (BackgroundLightningDuration != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            BackgroundLightningDuration = e[0].ToSingle();
                            break;

                        case "gap":
                            if (e.Count != 1)
                            {
                                FLLog.Warning("Ini", "Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (BackgroundLightningGap != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            BackgroundLightningGap = e[0].ToSingle();
                            break;

                        case "color":
                            if (e.Count != 3)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (BackgroundLightningColor != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            BackgroundLightningColor = BackgroundLightningColor = new Color4(e[0].ToInt32() / 255f, e[1].ToInt32() / 255f, e[2].ToInt32() / 255f, 1f);
                            break;

                        default:
                            throw new Exception("Invalid Entry in " + s.Name + ": " + e.Name);
                        }
                    }
                    break;

                case "dynamiclightning":
                    foreach (Entry e in s)
                    {
                        switch (e.Name.ToLowerInvariant())
                        {
                        case "gap":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (DynamicLightningGap != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            DynamicLightningGap = e[0].ToSingle();
                            break;

                        case "duration":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (DynamicLightningDuration != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            DynamicLightningDuration = e[0].ToSingle();
                            break;

                        case "color":
                            if (e.Count != 3)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (DynamicLightningColor != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            DynamicLightningColor = new Color4(e[0].ToInt32() / 255f, e[1].ToInt32() / 255f, e[2].ToInt32() / 255f, 1f);
                            break;

                        case "ambient_intensity":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (DynamicLightningAmbientIntensity != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            DynamicLightningAmbientIntensity = e[0].ToSingle();
                            break;

                        case "intensity_increase":
                            if (e.Count != 1)
                            {
                                throw new Exception("Invalid number of values in " + s.Name + " Entry " + e.Name + ": " + e.Count);
                            }
                            if (DynamicLightningIntensityIncrease != null)
                            {
                                throw new Exception("Duplicate " + e.Name + " Entry in " + s.Name);
                            }
                            DynamicLightningIntensityIncrease = e[0].ToInt32();
                            break;

                        default:
                            throw new Exception("Invalid Entry in " + s.Name + ": " + e.Name);
                        }
                    }
                    break;

                default:
                    throw new Exception("Invalid Section in " + file + ": " + s.Name);
                }
            }
        }