예제 #1
0
파일: TileMap.cs 프로젝트: Metibor/ualbion
        public void Set(int index, int x, int y, byte floorSubImage, byte ceilingSubImage, byte wallSubImage, int frame)
        {
            bool isAnimated = Floors.IsAnimated(floorSubImage) || Floors.IsAnimated(ceilingSubImage) || Walls.IsAnimated(wallSubImage);

            if (isAnimated)
            {
                AnimatedTiles.Add(index);
            }
            else
            {
                AnimatedTiles.Remove(index);
            }

            unsafe
            {
                fixed(Tile *tile = &Tiles[index])
                {
                    tile->TilePosition = new Vector2(x, y);
                    tile->Floor        = (byte)Floors.GetSubImageAtTime(floorSubImage, frame);
                    tile->Ceiling      = (byte)Floors.GetSubImageAtTime(ceilingSubImage, frame);
                    tile->Wall         = (byte)Walls.GetSubImageAtTime(wallSubImage, frame);
                    tile->Flags        = 0; // TileFlags.UsePalette;
                    var subImage = Walls.GetSubImageDetails(tile->Wall);

                    tile->WallSize = subImage.TexSize;
                }
            }
        }
예제 #2
0
        public FancyFallingBlock(EntityData data, Vector2 offset)
            : base(data.Position + offset, '3', data.Width, data.Height, data.Bool("finalBoss", false), data.Bool("behind", false), data.Bool("climbFall", true))
        {
            baseData = new DynData <FallingBlock>(this);
            Remove(baseData.Get <TileGrid>("tiles"));
            Remove(Get <TileInterceptor>());
            badLightOcclude = Get <LightOcclude>();

            int newSeed = Calc.Random.Next();

            Calc.PushRandom(newSeed);
            tileMap = GenerateTileMap(data.Attr("tileData", ""));
            Autotiler.Generated generated = GFX.FGAutotiler.GenerateMap(tileMap, default(Autotiler.Behaviour));
            baseData["tiles"] = generated.TileGrid;
            Add(baseData.Get <TileGrid>("tiles"));
            Add(animatedTiles = generated.SpriteOverlay);
            Calc.PopRandom();

            if (data.Bool("finalBoss", false))
            {
                VirtualMap <char> tileMapHighlighted = GenerateTileMap(data.Attr("tileDataHighlight", ""));
                Calc.PushRandom(newSeed);
                TileGrid highlight = GFX.FGAutotiler.GenerateMap(tileMapHighlighted, default(Autotiler.Behaviour)).TileGrid;
                highlight.Alpha       = 0f;
                baseData["highlight"] = highlight;
                Add(baseData.Get <TileGrid>("highlight"));
                Calc.PopRandom();
            }

            ColliderList colliders = GenerateBetterColliderGrid(tileMap, 8, 8);

            AddLightOcclude(this, colliders);
            Collider = colliders;
            Add(new TileInterceptor(baseData.Get <TileGrid>("tiles"), false));
        }
예제 #3
0
 public patch_BackgroundTiles(Vector2 position, VirtualMap <char> data)
 {
     Position = position;
     Tag      = Tags.Global;
     Autotiler.Generated generated = GFX.BGAutotiler.GenerateMap(data, paddingIgnoreOutOfLevel: false);
     Tiles = generated.TileGrid;
     Tiles.VisualExtend = 1;
     Add(Tiles);
     Add(AnimatedTiles = generated.SpriteOverlay);
     Depth             = Depths.BGTerrain;
 }
        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
            });
        }
예제 #5
0
    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
        });
    }