コード例 #1
0
ファイル: Autotiler.cs プロジェクト: david-reborn/Celeste
    private char GetTile(
        VirtualMap <char> mapData,
        int x,
        int y,
        Rectangle forceFill,
        char forceID,
        Autotiler.Behaviour behaviour)
    {
        if (forceFill.Contains(x, y))
        {
            return(forceID);
        }
        if (mapData == null)
        {
            return(!behaviour.EdgesExtend ? '0' : forceID);
        }
        if (x >= 0 && y >= 0 && x < mapData.Columns && y < mapData.Rows)
        {
            return(mapData[x, y]);
        }
        if (!behaviour.EdgesExtend)
        {
            return('0');
        }
        int index1 = Util.Clamp(x, 0, mapData.Columns - 1);
        int index2 = Util.Clamp(y, 0, mapData.Rows - 1);

        return(mapData[index1, index2]);
    }
コード例 #2
0
ファイル: Autotiler.cs プロジェクト: david-reborn/Celeste
    private bool CheckTile(
        Autotiler.TerrainType set,
        VirtualMap <char> mapData,
        int x,
        int y,
        Rectangle forceFill,
        Autotiler.Behaviour behaviour)
    {
        if (forceFill.Contains(x, y))
        {
            return(true);
        }
        if (mapData == null)
        {
            return(behaviour.EdgesExtend);
        }
        if (x < 0 || y < 0 || x >= mapData.Columns || y >= mapData.Rows)
        {
            if (!behaviour.EdgesExtend)
            {
                return(false);
            }
            char ch = mapData[Util.Clamp(x, 0, mapData.Columns - 1), Util.Clamp(y, 0, mapData.Rows - 1)];
            return(!this.IsEmpty(ch) && !set.Ignore(ch));
        }
        char ch1 = mapData[x, y];

        return(!this.IsEmpty(ch1) && !set.Ignore(ch1));
    }
コード例 #3
0
 public static Autotiler.Generated GenerateOverlay(this Autotiler tiler, VirtualMap <char> tileMap, int x, int y, VirtualMap <char> mapData)
 {
     Autotiler.Behaviour behaviour = new Autotiler.Behaviour {
         EdgesExtend             = true,
         EdgesIgnoreOutOfLevel   = true,
         PaddingIgnoreOutOfLevel = true
     };
     return(tiler.Generate(mapData, x, y, tileMap, behaviour));
 }
コード例 #4
0
        void Start()
        {
            Debug.Log("==读取GamePlay的Texture");
            Gfx.Game        = Atlas.FromAtlas(Path.Combine("Graphics", "Atlases", "Gameplay"), Atlas.AtlasDataFormat.Packer);
            foregroundTiles = new Tiles(Path.Combine(Util.GAME_PATH_CONTENT, Path.Combine("Graphics", "ForegroundTiles.xml")));
            backgroundTiles = new Tiles(Path.Combine(Util.GAME_PATH_CONTENT, Path.Combine("Graphics", "BackgroundTiles.xml")));
            AreaData.Load();
            Stage stage = new Stage(0, AreaMode.Normal);

            stage.Load();

            //生成地图数据
            Autotiler.Behaviour fgBehaviour = new Autotiler.Behaviour()
            {
                EdgesExtend             = true,
                EdgesIgnoreOutOfLevel   = false,
                PaddingIgnoreOutOfLevel = true
            };
            Autotiler.Behaviour bgBehaviour = new Autotiler.Behaviour()
            {
                EdgesExtend             = true,
                EdgesIgnoreOutOfLevel   = false,
                PaddingIgnoreOutOfLevel = false
            };
            VirtualMap <char> foregroundData = stage.ForegroundData;

            this.colliderGrid = new ColliderGrid(foregroundData.Columns, foregroundData.Rows, 8f, 8f);
            for (int x = 0; x < foregroundData.Columns; x += 50)
            {
                for (int y = 0; y < foregroundData.Rows; y += 50)
                {
                    if (foregroundData.AnyInSegmentAtTile(x, y))
                    {
                        int index1 = x;
                        for (int index2 = Math.Min(index1 + 50, foregroundData.Columns); index1 < index2; ++index1)
                        {
                            int index3 = y;
                            for (int index4 = Math.Min(index3 + 50, foregroundData.Rows); index3 < index4; ++index3)
                            {
                                if (foregroundData[index1, index3] != '0')
                                {
                                    this.colliderGrid[index1, index3] = true;
                                }
                                else
                                {
                                    this.colliderGrid[index1, index3] = false;
                                }
                            }
                        }
                    }
                }
            }
            //VirtualMap<char> backgroundData = stage.BackgroundData;
            foregroundTiles.GenerateTiles(this.fgTilemap, foregroundData, 0, 0, foregroundData.Columns, foregroundData.Rows, false, '0', fgBehaviour, colliderGrid);
            //bgTileDictionary.GenerateTiles(this.bgTilemap, backgroundData, 0, 0, backgroundData.Columns, backgroundData.Rows, false, '0', bgBehaviour);
        }
コード例 #5
0
ファイル: Autotiler.cs プロジェクト: david-reborn/Celeste
 public Autotiler.Generated GenerateMap(VirtualMap <char> mapData, bool paddingIgnoreOutOfLevel)
 {
     Autotiler.Behaviour behaviour = new Autotiler.Behaviour()
     {
         EdgesExtend             = true,
         EdgesIgnoreOutOfLevel   = false,
         PaddingIgnoreOutOfLevel = paddingIgnoreOutOfLevel
     };
     return(this.Generate(mapData, 0, 0, mapData.Columns, mapData.Rows, false, '0', behaviour));
 }
コード例 #6
0
        private static void LevelLoader_LoadingThread(On.Celeste.LevelLoader.orig_LoadingThread orig, LevelLoader self)
        {
            orig(self);
            MapData mapData = self.Level.Session.MapData;

            var controllers = from level in mapData.Levels
                              from entity in level.Entities
                              where entity.Name == "FancyTileEntities/TileSeedController"
                              select new { entity, level };

            Rectangle       mapTileBounds = mapData.TileBounds;
            SolidTiles      fgTiles       = self.Level.SolidTiles;
            BackgroundTiles bgTiles       = self.Level.BgTiles;

            Regex regex = new Regex("\\r\\n|\\n\\r|\\n|\\r");

            Autotiler.Behaviour behaviour = new Autotiler.Behaviour {
                EdgesExtend             = true,
                EdgesIgnoreOutOfLevel   = false,
                PaddingIgnoreOutOfLevel = true
            };

            foreach (var controller in controllers)
            {
                EntityData data  = controller.entity;
                LevelData  level = controller.level;

                int randomSeed = data.Int("randomSeed", 42);

                Rectangle bounds     = level.TileBounds;
                Rectangle tileBounds = self.Level.Session.MapData.TileBounds;

                if (data.Bool("fg", true))
                {
                    VirtualMap <char> map = new VirtualMap <char>(bounds.Width, bounds.Height, '0');

                    string[] array = regex.Split(level.Solids);
                    for (int y = 0; y < array.Length; y++)
                    {
                        for (int x = 0; x < array[y].Length; x++)
                        {
                            map[x, y] = array[y][x];
                        }
                    }

                    Calc.PushRandom(randomSeed);
                    Autotiler.Generated gen = Extensions.GenerateOverlay(GFX.FGAutotiler, map, bounds.X - tileBounds.Left, bounds.Y - tileBounds.Top, self.Level.SolidsData, behaviour);
                    Calc.PopRandom();

                    int left = bounds.Left;
                    int top  = bounds.Top;
                    for (int y = top; y < top + array.Length; y++)
                    {
                        for (int x = left; x < left + array[y - top].Length; x++)
                        {
                            fgTiles.Tiles.Tiles[x - mapTileBounds.Left, y - mapTileBounds.Top] = gen.TileGrid.Tiles[x - left, y - top];
                        }
                    }
                }

                if (data.Bool("bg", true))
                {
                    VirtualMap <char> map = new VirtualMap <char>(bounds.Width, bounds.Height, '0');

                    string[] array = regex.Split(level.Bg);
                    for (int y = 0; y < array.Length; y++)
                    {
                        for (int x = 0; x < array[y].Length; x++)
                        {
                            map[x, y] = array[y][x];
                        }
                    }

                    Calc.PushRandom(randomSeed);
                    Autotiler.Generated gen = Extensions.GenerateOverlay(GFX.BGAutotiler, map, bounds.X - tileBounds.Left, bounds.Y - tileBounds.Top, self.Level.BgData, behaviour);
                    Calc.PopRandom();

                    int left = bounds.Left;
                    int top  = bounds.Top;
                    for (int y = top; y < top + array.Length; y++)
                    {
                        for (int x = left; x < left + array[y - top].Length; x++)
                        {
                            bgTiles.Tiles.Tiles[x - mapTileBounds.Left, y - mapTileBounds.Top] = gen.TileGrid.Tiles[x - left, y - top];
                        }
                    }
                }
            }
        }
コード例 #7
0
 private static bool Autotiler_CheckTile(On.Celeste.Autotiler.orig_CheckTile orig, Autotiler self, object set, VirtualMap <char> mapData, int x, int y, Rectangle forceFill, Autotiler.Behaviour behaviour)
 {
     if (usingCustomAutotiler)
     {
         Point origin = startPoint_CustomAutotiler;
         char  c      = forceData_CustomAutotiler[x - origin.X, y - origin.Y];
         if (IsEmpty(c))
         {
             forceFill = Rectangle.Empty;
         }
         else if ((bool)m_TerrainType_Ignore.Invoke(set, new object[] { c }))
         {
             // Hack to make sure `ignores` attributes are respected
             return(false);
         }
     }
     return(orig(self, set, mapData, x, y, forceFill, behaviour));
 }
コード例 #8
0
        private static Autotiler.Generated Generate(this Autotiler tiler, VirtualMap <char> mapData, int startX, int startY, VirtualMap <char> forceData, Autotiler.Behaviour behaviour)
        {
            usingCustomAutotiler       = true;
            forceData_CustomAutotiler  = forceData;
            startPoint_CustomAutotiler = new Point(startX, startY);

            TileGrid      tileGrid      = new TileGrid(8, 8, forceData.Columns, forceData.Rows);
            AnimatedTiles animatedTiles = new AnimatedTiles(forceData.Columns, forceData.Rows, GFX.AnimatedTilesBank);
            Rectangle     empty         = new Rectangle(startX, startY, forceData.Columns, forceData.Rows);

            for (int i = startX; i < startX + forceData.Columns; i += 50)
            {
                for (int j = startY; j < startY + forceData.Rows; j += 50)
                {
                    if (!mapData.AnyInSegmentAtTile(i, j))
                    {
                        j = j / 50 * 50;
                    }
                    else
                    {
                        int k   = i;
                        int num = Math.Min(i + 50, startX + forceData.Columns);
                        while (k < num)
                        {
                            int l    = j;
                            int num2 = Math.Min(j + 50, startY + forceData.Rows);
                            while (l < num2)
                            {
                                object tiles = m_TileHandler.Invoke(tiler, new object[] { mapData, k, l, empty, forceData[k - startX, l - startY], behaviour });
                                if (tiles != null)
                                {
                                    (Calc.Random as PositionRandom)?.SetPosition(k - startX, l - startY); // Positional Randomization for TileSeedController
                                    tileGrid.Tiles[k - startX, l - startY] = Calc.Random.Choose(f_Tiles_Textures.GetValue(tiles));
                                    if (f_Tiles_HasOverlays.GetValue(tiles))
                                    {
                                        animatedTiles.Set(k - startX, l - startY, Calc.Random.Choose(f_Tiles_OverlapSprites.GetValue(tiles)), 1f, 1f);
                                    }
                                }
                                l++;
                            }
                            k++;
                        }
                    }
                }
            }
            usingCustomAutotiler = false;
            return(new Autotiler.Generated {
                TileGrid = tileGrid,
                SpriteOverlay = animatedTiles
            });
        }
コード例 #9
0
 public static Autotiler.Generated GenerateOverlay(this Autotiler tiler, VirtualMap <char> tileMap, int x, int y, VirtualMap <char> mapData, Autotiler.Behaviour behaviour)
 {
     return(tiler.Generate(mapData, x, y, tileMap, behaviour));
 }
コード例 #10
0
ファイル: Tiles.cs プロジェクト: david-reborn/Celeste
        private Autotiler.Tiles TileHandler(VirtualMap <char> mapData, int x, int y, Rectangle forceFill, char forceID, Autotiler.Behaviour behaviour)
        {
            char tile = this.GetTile(mapData, x, y, forceFill, forceID, behaviour);

            if (this.IsEmpty(tile))
            {
                return(null);
            }
            Autotiler.TerrainType set = this.lookup[tile];
            bool flag1 = true;
            int  num   = 0;

            for (int index1 = -1; index1 < 2; ++index1)
            {
                for (int index2 = -1; index2 < 2; ++index2)
                {
                    bool flag2 = this.CheckTile(set, mapData, x + index2, y + index1, forceFill, behaviour);
                    if (!flag2 && behaviour.EdgesIgnoreOutOfLevel && !this.CheckForSameLevel(x, y, x + index2, y + index1))
                    {
                        flag2 = true;
                    }
                    this.adjacent[num++] = flag2 ? (byte)1 : (byte)0;
                    if (!flag2)
                    {
                        flag1 = false;
                    }
                }
            }
            if (flag1)
            {
                if ((behaviour.PaddingIgnoreOutOfLevel ? ((!this.CheckTile(set, mapData, x - 2, y, forceFill, behaviour) && this.CheckForSameLevel(x, y, x - 2, y)) || (!this.CheckTile(set, mapData, x + 2, y, forceFill, behaviour) && this.CheckForSameLevel(x, y, x + 2, y)) || (!this.CheckTile(set, mapData, x, y - 2, forceFill, behaviour) && this.CheckForSameLevel(x, y, x, y - 2)) || (!this.CheckTile(set, mapData, x, y + 2, forceFill, behaviour) && this.CheckForSameLevel(x, y, x, y + 2))) : (!this.CheckTile(set, mapData, x - 2, y, forceFill, behaviour) || !this.CheckTile(set, mapData, x + 2, y, forceFill, behaviour)) || (!this.CheckTile(set, mapData, x, y - 2, forceFill, behaviour)) || (!this.CheckTile(set, mapData, x, y + 2, forceFill, behaviour))))
                {
                    return(this.lookup[tile].Padded);
                }
                else
                {
                    return(this.lookup[tile].Center);
                }
            }
            //return  ? this.lookup[tile].Padded : this.lookup[tile].Center;
            for (int p = 0; p < set.Masked.Count; p++)
            {
                Autotiler.Masked masked = set.Masked[p];
                bool             flag2  = true;
                for (int index = 0; index < 9 & flag2; ++index)
                {
                    if (masked.Mask[index] != (byte)2 && (int)masked.Mask[index] != (int)this.adjacent[index])
                    {
                        flag2 = false;
                    }
                }
                if (flag2)
                {
                    return(masked.Tiles);
                }
            }
            return(null);
        }
コード例 #11
0
ファイル: Tiles.cs プロジェクト: david-reborn/Celeste
        public void GenerateTiles(Tilemap tilemap, VirtualMap <char> foregroundData, int startX, int startY, int tilesX, int tilesY, bool forceSolid, char forceID, Autotiler.Behaviour behaviour, ColliderGrid colliderGrid)
        {
            Rectangle forceFill = Rectangle.Empty;

            if (forceSolid)
            {
                forceFill = new Rectangle(startX, startY, tilesX, tilesY);
            }
            if (foregroundData != null)
            {
                for (int x1 = startX; x1 < startX + tilesX; x1 += 50)
                {
                    for (int y1 = startY; y1 < startY + tilesY; y1 += 50)
                    {
                        if (!foregroundData.AnyInSegmentAtTile(x1, y1))
                        {
                            y1 = y1 / 50 * 50;
                        }
                        else
                        {
                            int x2 = x1;
                            for (int index1 = Math.Min(x1 + 50, startX + tilesX); x2 < index1; ++x2)
                            {
                                int y2 = y1;
                                for (int index2 = Math.Min(y1 + 50, startY + tilesY); y2 < index2; ++y2)
                                {
                                    Autotiler.Tiles tiles = this.TileHandler(foregroundData, x2, y2, forceFill, forceID, behaviour);
                                    if (tiles != null)
                                    {
                                        SolidTile tile = ScriptableObject.CreateInstance <SolidTile>();
                                        tile.SetTile(tiles);
                                        tile.colliderType = colliderGrid[x2 - startX, y2 - startY]? Tile.ColliderType.Grid:Tile.ColliderType.None;
                                        tilemap.SetTile(new Vector3Int(x2 - startX, -(y2 - startY), 0), tile);
                                        //this.tilemap.SetTile(new Vector3Int(0, 0, 0), tile);
                                        //return;
                                    }
                                    //if (tiles != null)
                                    //{
                                    //    tileGrid.Tiles[x2 - startX, y2 - startY] = RandomUtil.Random.Choose<MTexture>(tiles.Textures);
                                    //    //if (tiles.HasOverlays)
                                    //    //    animatedTiles.Set(x2 - startX, y2 - startY, RandomUtil.Random.Choose<string>(tiles.OverlapSprites), 1f, 1f);
                                    //}
                                }
                            }
                        }
                    }
                }
            }
            else
            {
                for (int x = startX; x < startX + tilesX; ++x)
                {
                    for (int y = startY; y < startY + tilesY; ++y)
                    {
                        Autotiler.Tiles tiles = this.TileHandler((VirtualMap <char>)null, x, y, forceFill, forceID, behaviour);
                        if (tiles != null)
                        {
                            SolidTile tile = ScriptableObject.CreateInstance <SolidTile>();
                            tile.SetTile(tiles);
                            tile.colliderType = colliderGrid[x - startX, y - startY] ? Tile.ColliderType.Grid : Tile.ColliderType.None;
                            tilemap.SetTile(new Vector3Int(x - startX, -(y - startY), 0), tile);
                            //this.tilemap.SetTile(new Vector3Int(0, 0, 0), tile);
                            //return;
                        }
                        //if (tiles != null)
                        //{
                        //    tileGrid.Tiles[x - startX, y - startY] = RandomUtil.Random.Choose<MTexture>(tiles.Textures);
                        //    if (tiles.HasOverlays)
                        //        animatedTiles.Set(x - startX, y - startY, RandomUtil.Random.Choose<string>(tiles.OverlapSprites), 1f, 1f);
                        //}
                    }
                }
            }
        }
コード例 #12
0
ファイル: Autotiler.cs プロジェクト: david-reborn/Celeste
    private Autotiler.Generated Generate(
        VirtualMap <char> mapData,
        int startX,
        int startY,
        int tilesX,
        int tilesY,
        bool forceSolid,
        char forceID,
        Autotiler.Behaviour behaviour)
    {
        TileGrid      tileGrid      = new TileGrid(8, 8, tilesX, tilesY);
        AnimatedTiles animatedTiles = new AnimatedTiles(tilesX, tilesY, Gfx.AnimatedTilesBank);
        Rectangle     forceFill     = Rectangle.Empty;

        if (forceSolid)
        {
            forceFill = new Rectangle(startX, startY, tilesX, tilesY);
        }
        if (mapData != null)
        {
            for (int x1 = startX; x1 < startX + tilesX; x1 += 50)
            {
                for (int y1 = startY; y1 < startY + tilesY; y1 += 50)
                {
                    if (!mapData.AnyInSegmentAtTile(x1, y1))
                    {
                        y1 = y1 / 50 * 50;
                    }
                    else
                    {
                        int x2 = x1;
                        for (int index1 = Math.Min(x1 + 50, startX + tilesX); x2 < index1; ++x2)
                        {
                            int y2 = y1;
                            for (int index2 = Math.Min(y1 + 50, startY + tilesY); y2 < index2; ++y2)
                            {
                                Autotiler.Tiles tiles = this.TileHandler(mapData, x2, y2, forceFill, forceID, behaviour);
                                if (tiles != null)
                                {
                                    tileGrid.Tiles[x2 - startX, y2 - startY] = RandomUtil.Random.Choose <MTexture>(tiles.Textures);
                                    if (tiles.HasOverlays)
                                    {
                                        animatedTiles.Set(x2 - startX, y2 - startY, RandomUtil.Random.Choose <string>(tiles.OverlapSprites), 1f, 1f);
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        else
        {
            for (int x = startX; x < startX + tilesX; ++x)
            {
                for (int y = startY; y < startY + tilesY; ++y)
                {
                    Autotiler.Tiles tiles = this.TileHandler((VirtualMap <char>)null, x, y, forceFill, forceID, behaviour);
                    if (tiles != null)
                    {
                        tileGrid.Tiles[x - startX, y - startY] = RandomUtil.Random.Choose <MTexture>(tiles.Textures);
                        if (tiles.HasOverlays)
                        {
                            animatedTiles.Set(x - startX, y - startY, RandomUtil.Random.Choose <string>(tiles.OverlapSprites), 1f, 1f);
                        }
                    }
                }
            }
        }
        return(new Autotiler.Generated()
        {
            TileGrid = tileGrid,
            SpriteOverlay = animatedTiles
        });
    }