Example #1
0
    public Tileset(string Resourcepath)
    {
        BaseDir = ResourceManager.Instance.GetDirectoryName(Resourcepath);
        List TilesL = Util.Load(Resourcepath, "supertux-tiles");

        Properties TilesP = new Properties(TilesL);
        foreach(List list in TilesP.GetList("tile")) {
            try {
                Tile Tile = new Tile();
                ParseTile(Tile, list);
                while(Tiles.Count <= Tile.Id)
                    Tiles.Add(null);
                Tiles[Tile.Id] = Tile;
            } catch(Exception e) {
                Console.WriteLine("Couldn't parse a Tile: " + e.Message);
                Console.WriteLine(e.StackTrace);
            }
        }

        foreach(List list in TilesP.GetList("tiles")) {
            try {
                ParseTiles(list);
            } catch(Exception e) {
                Console.WriteLine("Couldn't parse a tiles: " + e.Message);
                Console.WriteLine(e.StackTrace);
            }
        }
    }
Example #2
0
    /// <summary>Loads the tiles from <paramref name="Resourcepath"/>.</summary>
    /// <param name="Resourcepath">A path relative to the data folder of SuperTux.</param>
    public Tileset(string Resourcepath)
    {
        baseDir = ResourceManager.Instance.GetDirectoryName(Resourcepath);
        List TilesL = Util.Load(Resourcepath, "supertux-tiles");

        Properties TilesP = new Properties(TilesL);
        foreach(List list in TilesP.GetList("tile")) {
            try {
                Tile tile = new Tile();
                ParseTile(tile, list);
                while(tiles.Count <= tile.Id)
                    tiles.Add(null);
                tiles[tile.Id] = tile;
            } catch(Exception e) {
                Console.WriteLine("Couldn't parse a Tile: " + e.Message);
                Console.WriteLine(e.StackTrace);
            }
        }

        foreach(List list in TilesP.GetList("tiles")) {
            try {
                ParseTiles(list);
            } catch(Exception e) {
                Console.WriteLine("Couldn't parse a tiles: " + e.Message);
                Console.WriteLine(e.StackTrace);
            }
        }

        // construct a tilegroup with all tiles
        Tilegroup allGroup = new Tilegroup();
            allGroup.Name = "All";
            foreach(Tile tile in tiles) {
                if(tile != null)
                    allGroup.Tiles.Add(tile.Id);
            }
            tilegroups.Add(allGroup.Name, allGroup);

        LispSerializer serializer = new LispSerializer(typeof(Tilegroup));
        foreach(List list in TilesP.GetList("tilegroup")) {
            try {
                Tilegroup group = (Tilegroup) serializer.Read(list);
                for(int i = 0; i < group.Tiles.Count; ) {
                    if(!IsValid(group.Tiles[i])) {
                        Console.WriteLine("Tilegroup " + group.Name + " contains invalid TileID " + group.Tiles[i]);
                        group.Tiles.RemoveAt(i);
                        continue;
                    }
                    ++i;
                }
                tilegroups.Add(group.Name, group);
            } catch(Exception e) {
                Console.WriteLine("Couldn't parse tilegroup: " + e.Message);
                Console.WriteLine(e.StackTrace);
            }
        }
    }
Example #3
0
    public void CustomLispRead(Properties props)
    {
        foreach(Type type in this.GetType().Assembly.GetTypes()) {
            SupertuxObjectAttribute objectAttribute
            = (SupertuxObjectAttribute) Attribute.GetCustomAttribute(type, typeof(SupertuxObjectAttribute));
            if(objectAttribute == null)
                continue;

            LispSerializer serializer = new LispSerializer(type);
            foreach(List list in props.GetList(objectAttribute.Name)) {
                IGameObject Object = (IGameObject) serializer.Read(list);
                GameObjects.Add(Object);
            }
        }
    }
        public object Read(List list)
        {
            object result = CreateObject(type);

            Properties props = new Properties(list);
            // iterate over all fields and properties
            foreach(FieldOrProperty field in FieldOrProperty.GetFieldsAndProperties(type)) {
                LispChildAttribute ChildAttrib = (LispChildAttribute)
                    field.GetCustomAttribute(typeof(LispChildAttribute));
                if(ChildAttrib != null) {
                    string Name = ChildAttrib.Name;
                    if(field.Type == typeof(int)) {
                        int val = 0;
                        if(!props.Get(Name, ref val)) {
                            if(!ChildAttrib.Optional)
                                Console.WriteLine("Field '" + Name + "' not in lisp");
                        } else {
                            field.SetValue(result, val);
                        }
                    } else if(field.Type == typeof(string)) {
                        string val = null;
                        if(!props.Get(Name, ref val)) {
                            if(!ChildAttrib.Optional)
                                Console.WriteLine("Field '" + Name + "' not in lisp");
                        } else {
                            field.SetValue(result, val);
                        }
                    } else if(field.Type == typeof(float)) {
                        float val = 0;
                        if(!props.Get(Name, ref val)) {
                            if(!ChildAttrib.Optional)
                                Console.WriteLine("Field '" + Name + "' not in lisp");
                        } else {
                            field.SetValue(result, val);
                        }
                    } else if (field.Type.IsEnum) {
                        Enum val = null;
                        if (!props.Get(Name, ref val, field.Type)) {
                            if (!ChildAttrib.Optional)
                                Console.WriteLine("Field '" + Name + "' not in lisp");
                        } else {
                            field.SetValue(result, val);
                        }
                    } else if(field.Type == typeof(bool)) {
                        bool val = false;
                        if(!props.Get(Name, ref val)) {
                            if(!ChildAttrib.Optional)
                                Console.WriteLine("Field '" + Name + "' not in lisp");
                        } else {
                            field.SetValue(result, val);
                        }
                    } else if(field.Type == typeof(List<int>)) {
                        List<int> val = new List<int>();
                        if(!props.GetIntList(Name, val)) {
                            if(!ChildAttrib.Optional)
                                Console.WriteLine("Field '" + Name + "' not in lisp");
                        } else {
                            field.SetValue(result, val);
                        }
                    } else {
                        ILispSerializer serializer = LispSerializer.GetSerializer(field.Type);
                        if(serializer == null)
                            throw new LispException("Type " + field.Type + " not supported for serialization");

                        List val = null;
                        if(!props.Get(Name, ref val)) {
                            if(!ChildAttrib.Optional)
                                Console.WriteLine("Field '" + Name + "' not in lisp");
                        } else {
                            object oval = serializer.Read(val);
                            field.SetValue(result, oval);
                        }
                    }
                }

                foreach(LispChildsAttribute childsAttrib in
                        field.GetCustomAttributes(typeof(LispChildsAttribute))) {
                    object objectList = field.GetValue(result);
                    Type ListType = field.Type;
                    MethodInfo AddMethod = ListType.GetMethod(
                            "Add", new Type[] { childsAttrib.ListType }, null);
                    if(AddMethod == null)
                        throw new LispException("No Add method found for field " + field.Name);

                    ILispSerializer serializer = LispSerializer.GetSerializer(childsAttrib.Type);
                    if(serializer == null)
                        serializer = LispSerializer.CreateRootSerializer(childsAttrib.Type);

                    foreach(List childList in props.GetList(childsAttrib.Name)) {
                        object child = serializer.Read(childList);
                        AddMethod.Invoke(objectList, new object[] { child } );
                    }
                }
            }

            if(result is ICustomLispSerializer) {
                ICustomLispSerializer custom = (ICustomLispSerializer) result;
                custom.CustomLispRead(props);
                custom.FinishRead();
            }

            return result;
        }