Exemple #1
0
        public ShroudRenderer(World world, ShroudRendererInfo info)
        {
            if (info.ShroudVariants.Length != info.FogVariants.Length)
                throw new ArgumentException("ShroudRenderer must define the same number of shroud and fog variants!", "info");

            if ((info.OverrideFullFog == null) ^ (info.OverrideFullShroud == null))
                throw new ArgumentException("ShroudRenderer cannot define overrides for only one of shroud or fog!", "info");

            if (info.ShroudVariants.Length > byte.MaxValue)
                throw new ArgumentException("ShroudRenderer cannot define this many shroud and fog variants.", "info");

            if (info.Index.Length >= byte.MaxValue)
                throw new ArgumentException("ShroudRenderer cannot define this many indexes for shroud directions.", "info");

            this.info = info;
            map = world.Map;

            tileInfos = new CellLayer<TileInfo>(map);

            // Load sprite variants
            var variantCount = info.ShroudVariants.Length;
            variantStride = (byte)(info.Index.Length + (info.OverrideFullShroud != null ? 1 : 0));
            shroudSprites = new Sprite[variantCount * variantStride];
            fogSprites = new Sprite[variantCount * variantStride];

            var sequenceProvider = map.Rules.Sequences;
            for (var j = 0; j < variantCount; j++)
            {
                var shroud = sequenceProvider.GetSequence(info.Sequence, info.ShroudVariants[j]);
                var fog = sequenceProvider.GetSequence(info.Sequence, info.FogVariants[j]);
                for (var i = 0; i < info.Index.Length; i++)
                {
                    shroudSprites[j * variantStride + i] = shroud.GetSprite(i);
                    fogSprites[j * variantStride + i] = fog.GetSprite(i);
                }

                if (info.OverrideFullShroud != null)
                {
                    var i = (j + 1) * variantStride - 1;
                    shroudSprites[i] = sequenceProvider.GetSequence(info.Sequence, info.OverrideFullShroud).GetSprite(0);
                    fogSprites[i] = sequenceProvider.GetSequence(info.Sequence, info.OverrideFullFog).GetSprite(0);
                }
            }

            // Mapping of shrouded directions -> sprite index
            edgesToSpriteIndexOffset = new byte[(byte)(info.UseExtendedIndex ? Edges.All : Edges.AllCorners) + 1];
            for (var i = 0; i < info.Index.Length; i++)
                edgesToSpriteIndexOffset[info.Index[i]] = (byte)i;

            if (info.OverrideFullShroud != null)
                edgesToSpriteIndexOffset[info.OverrideShroudIndex] = (byte)(variantStride - 1);

            notVisibleEdges = info.UseExtendedIndex ? Edges.AllSides : Edges.AllCorners;
        }
Exemple #2
0
        public ShroudRenderer(World world, ShroudRendererInfo info)
        {
            if (info.ShroudVariants.Length != info.FogVariants.Length)
            {
                throw new ArgumentException("ShroudRenderer must define the same number of shroud and fog variants!", "info");
            }

            if ((info.OverrideFullFog == null) ^ (info.OverrideFullShroud == null))
            {
                throw new ArgumentException("ShroudRenderer cannot define overrides for only one of shroud or fog!", "info");
            }

            if (info.ShroudVariants.Length > byte.MaxValue)
            {
                throw new ArgumentException("ShroudRenderer cannot define this many shroud and fog variants.", "info");
            }

            if (info.Index.Length >= byte.MaxValue)
            {
                throw new ArgumentException("ShroudRenderer cannot define this many indexes for shroud directions.", "info");
            }

            this.info = info;
            map       = world.Map;

            tileInfos = new CellLayer <TileInfo>(map);

            // Load sprite variants
            var variantCount = info.ShroudVariants.Length;

            variantStride = (byte)(info.Index.Length + (info.OverrideFullShroud != null ? 1 : 0));
            shroudSprites = new Sprite[variantCount * variantStride];
            fogSprites    = new Sprite[variantCount * variantStride];

            var sequenceProvider = map.Rules.Sequences;

            for (var j = 0; j < variantCount; j++)
            {
                var shroud = sequenceProvider.GetSequence(info.Sequence, info.ShroudVariants[j]);
                var fog    = sequenceProvider.GetSequence(info.Sequence, info.FogVariants[j]);
                for (var i = 0; i < info.Index.Length; i++)
                {
                    shroudSprites[j * variantStride + i] = shroud.GetSprite(i);
                    fogSprites[j * variantStride + i]    = fog.GetSprite(i);
                }

                if (info.OverrideFullShroud != null)
                {
                    var i = (j + 1) * variantStride - 1;
                    shroudSprites[i] = sequenceProvider.GetSequence(info.Sequence, info.OverrideFullShroud).GetSprite(0);
                    fogSprites[i]    = sequenceProvider.GetSequence(info.Sequence, info.OverrideFullFog).GetSprite(0);
                }
            }

            // Mapping of shrouded directions -> sprite index
            edgesToSpriteIndexOffset = new byte[(byte)(info.UseExtendedIndex ? Edges.All : Edges.AllCorners) + 1];
            for (var i = 0; i < info.Index.Length; i++)
            {
                edgesToSpriteIndexOffset[info.Index[i]] = (byte)i;
            }

            if (info.OverrideFullShroud != null)
            {
                edgesToSpriteIndexOffset[info.OverrideShroudIndex] = (byte)(variantStride - 1);
            }

            notVisibleEdges = info.UseExtendedIndex ? Edges.AllSides : Edges.AllCorners;
        }