Esempio n. 1
0
        public List <int>[] Build(LabyrinthData labyrinth, AssetInfo info, IsometricMode mode, IAssetManager assets)
        {
            if (labyrinth == null)
            {
                throw new ArgumentNullException(nameof(labyrinth));
            }
            _labId = labyrinth.Id;
            _mode  = mode;

            _layout.Load(labyrinth, info, _mode, BuildProperties(), _paletteId, assets);
            int rows = (_layout.TileCount + _tilesPerRow - 1) / _tilesPerRow;

            if (Framebuffer != null)
            {
                Framebuffer.Width  = (uint)(_width * _tilesPerRow);
                Framebuffer.Height = (uint)(_height * rows);
            }

            Update();

            return(mode switch
            {
                IsometricMode.Floors => _layout.FloorFrames,
                IsometricMode.Ceilings => _layout.CeilingFrames,
                IsometricMode.Walls => _layout.WallFrames,
                IsometricMode.Contents => _layout.ContentsFrames,
                _ => null
            });
Esempio n. 2
0
        public void Load(LabyrinthId labyrinthId, IsometricMode mode, TilemapRequest request, int?paletteId)
        {
            var assets        = Resolve <IAssetManager>();
            var labyrinthData = assets.LoadLabyrinthData(labyrinthId);
            var info          = assets.GetAssetInfo(labyrinthId);

            if (labyrinthData == null || info == null)
            {
                return;
            }

            Load(labyrinthData, info, mode, request, paletteId, assets);
        }
Esempio n. 3
0
    public List <int>[] Build(LabyrinthData labyrinth, AssetInfo info, IsometricMode mode, IAssetManager assets)
    {
        if (labyrinth == null)
        {
            throw new ArgumentNullException(nameof(labyrinth));
        }
        _labId = labyrinth.Id;
        _mode  = mode;

        _layout.Load(labyrinth, info, _mode, BuildProperties(), _paletteId, assets);
        ResizeFramebuffer();
        Update();

        return(mode switch
        {
            IsometricMode.Floors => _layout.FloorFrames,
            IsometricMode.Ceilings => _layout.CeilingFrames,
            IsometricMode.Walls => _layout.WallFrames,
            IsometricMode.Contents => _layout.ContentsFrames,
            _ => null
        });
Esempio n. 4
0
 public IsoModeEvent(IsometricMode mode) => Mode = mode;
Esempio n. 5
0
    public IsometricBuilder(IFramebufferHolder framebuffer, int width, int height, int diamondHeight, int tilesPerRow)
    {
        Framebuffer  = framebuffer ?? throw new ArgumentNullException(nameof(framebuffer));
        _labId       = Base.Labyrinth.Test1;
        _layout      = AttachChild(new IsometricLayout());
        _width       = width;
        _height      = height;
        _pitch       = ApiUtil.RadToDeg(MathF.Asin((float)diamondHeight / _width));
        _tilesPerRow = tilesPerRow;

        On <IsoLabEvent>(e => { _labId = e.Id; RecreateLayout(); });
        On <IsoModeEvent>(e => { _mode = e.Mode; RecreateLayout(); });
        On <IsoYawEvent>(e => { _yaw += e.Delta; Update(); });
        On <IsoPitchEvent>(e => { _pitch += e.Delta; Update(); });
        On <IsoRowWidthEvent>(e =>
        {
            _tilesPerRow += e.Delta;
            if (_tilesPerRow < 1)
            {
                _tilesPerRow = 1;
            }
            Update();
        });
        On <IsoWidthEvent>(e =>
        {
            _width += e.Delta;
            if (_width < 1)
            {
                _width = 1;
            }
            Update();
        });
        On <IsoHeightEvent>(e =>
        {
            _height += e.Delta;
            if (_height < 1)
            {
                _height = 1;
            }
            Update();
        });
        On <IsoPaletteEvent>(e =>
        {
            _paletteId = (_paletteId ?? 0) + e.Delta;
            if (_paletteId <= 0)
            {
                _paletteId = null;
            }
            Info($"PalId: {_paletteId}");
            RecreateLayout();
        });
        On <IsoLabDeltaEvent>(e =>
        {
            var newId = _labId.Id + e.Delta;
            if (newId < 0)
            {
                return;
            }

            _labId = new LabyrinthId(AssetType.Labyrinth, newId);
            Info($"LabId: {_labId} ({_labId.Id})");
            RecreateLayout();
        });
    }
Esempio n. 6
0
        public void Load(LabyrinthData labyrinthData, AssetInfo info, IsometricMode mode, TilemapRequest request, int?paletteNumber, IAssetManager assets)
        {
            if (labyrinthData == null)
            {
                throw new ArgumentNullException(nameof(labyrinthData));
            }
            if (info == null)
            {
                throw new ArgumentNullException(nameof(info));
            }
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }
            if (assets == null)
            {
                throw new ArgumentNullException(nameof(assets));
            }

            RemoveAllChildren();

            bool floors   = mode is IsometricMode.Floors or IsometricMode.All;
            bool ceilings = mode is IsometricMode.Ceilings or IsometricMode.All;
            bool walls    = mode is IsometricMode.Walls or IsometricMode.All;
            bool contents = mode is IsometricMode.Contents or IsometricMode.All;

            paletteNumber ??= info.Get(AssetProperty.PaletteId, 0);
            var paletteId = new PaletteId(AssetType.Palette, paletteNumber.Value);
            var palette   = assets.LoadPalette(paletteId);

            if (palette == null)
            {
                Error($"Could not load palette {paletteNumber}");
                palette = assets.LoadPalette(Base.Palette.Common);
            }
            else
            {
                Raise(new LoadPaletteEvent(paletteId));
            }

            var etmManager = Resolve <IEtmManager>();

            request.Pipeline   = DungeonTilemapPipeline.NoCulling;
            request.DayPalette = palette;
            _tilemap           = etmManager.CreateTilemap(request /*labyrinthData.Id, 0, request, palette, null, DungeonTilemapPipeline.NoCulling */);

            // Layout:
            // [Empty] [First frame of all floors] [First frame of all ceilings] [First frame of all walls] [Additional floor frames] [Additional ceiling frames] [Additional wall frames]

            int totalTiles = 1;

            if (floors || ceilings)
            {
                for (int i = 0; i < labyrinthData.FloorAndCeilings.Count; i++)
                {
                    var floorInfo = labyrinthData.FloorAndCeilings[i];
                    var floor     = floorInfo == null ? null : assets.LoadTexture(floorInfo.SpriteId);
                    _tilemap.DefineFloor(i + 1, floor);
                    if (floors)
                    {
                        totalTiles += _tilemap.DayFloors.GetFrameCountForLogicalId(i + 1);
                    }
                    if (ceilings)
                    {
                        totalTiles += _tilemap.DayFloors.GetFrameCountForLogicalId(i + 1);
                    }
                }
            }

            if (walls)
            {
                for (int i = 0; i < labyrinthData.Walls.Count; i++)
                {
                    var  wallInfo      = labyrinthData.Walls[i];
                    bool isAlphaTested = wallInfo != null && (wallInfo.Properties & Wall.WallFlags.AlphaTested) != 0;
                    var  wall          = wallInfo == null ? null : assets.LoadTexture(wallInfo.SpriteId);
                    _tilemap.DefineWall(i + 1, wall, 0, 0, wallInfo?.TransparentColour ?? 0, isAlphaTested);

                    foreach (var overlayInfo in wallInfo?.Overlays ?? Array.Empty <Overlay>())
                    {
                        if (overlayInfo.SpriteId.IsNone)
                        {
                            continue;
                        }

                        var overlay = assets.LoadTexture(overlayInfo.SpriteId);
                        _tilemap.DefineWall(i + 1,
                                            overlay,
                                            overlayInfo.XOffset, overlayInfo.YOffset,
                                            wallInfo?.TransparentColour ?? 0, isAlphaTested);
                    }

                    totalTiles += _tilemap.DayWalls.GetFrameCountForLogicalId(i + 1);
                }
            }

            if (contents)
            {
                var transparent = new SimpleTexture <byte>(AssetId.None, "Transparent", 1, 1, new byte[] { 0 })
                                  .AddRegion(Vector2.Zero, Vector2.One, 0);

                for (byte i = 1; i <= labyrinthData.ObjectGroups.Count; i++)
                {
                    _tilemap.DefineWall(i, transparent, 0, 0, 0, true);
                }

                totalTiles += labyrinthData.ObjectGroups.Count;
            }

            _wallCount = labyrinthData.Walls.Count;
            _floors    = new byte[totalTiles];
            _ceilings  = new byte[totalTiles];
            _contents  = new byte[totalTiles];
            var frames = new int[totalTiles];

            int index = 1;

            // Add initial frames
            if (floors)
            {
                FloorFrames    = new List <int> [labyrinthData.FloorAndCeilings.Count + 1];
                FloorFrames[0] = new List <int> {
                    0
                };
                for (byte i = 1; i <= labyrinthData.FloorAndCeilings.Count; i++)
                {
                    _floors[index] = i;
                    FloorFrames[i] = new List <int> {
                        index
                    };
                    index++;
                }
            }

            if (ceilings)
            {
                CeilingFrames    = new List <int> [labyrinthData.FloorAndCeilings.Count + 1];
                CeilingFrames[0] = new List <int> {
                    0
                };
                for (byte i = 1; i <= labyrinthData.FloorAndCeilings.Count; i++)
                {
                    _ceilings[index] = i;
                    CeilingFrames[i] = new List <int> {
                        index
                    };
                    index++;
                }
            }

            if (walls)
            {
                WallFrames    = new List <int> [labyrinthData.Walls.Count + 1];
                WallFrames[0] = new List <int> {
                    0
                };
                for (byte i = 1; i <= labyrinthData.Walls.Count; i++)
                {
                    _contents[index] = (byte)(i + 100);
                    WallFrames[i]    = new List <int> {
                        index
                    };
                    index++;
                }
            }

            if (contents)
            {
                ContentsFrames    = new List <int> [labyrinthData.ObjectGroups.Count + 1];
                ContentsFrames[0] = new List <int> {
                    0
                };
                for (byte i = 1; i <= labyrinthData.ObjectGroups.Count; i++)
                {
                    _contents[index]  = i;
                    ContentsFrames[i] = new List <int> {
                        index
                    };
                    index++;
                }
            }

            // Add animation frames
            if (floors)
            {
                for (byte i = 1; i <= labyrinthData.FloorAndCeilings.Count; i++)
                {
                    int frameCount = _tilemap.DayFloors.GetFrameCountForLogicalId(i);
                    for (int j = 1; j < frameCount; j++)
                    {
                        _floors[index] = i;
                        FloorFrames[i].Add(index);
                        frames[index++] = j;
                    }
                }
            }

            if (ceilings)
            {
                for (byte i = 1; i <= labyrinthData.FloorAndCeilings.Count; i++)
                {
                    int frameCount = _tilemap.DayFloors.GetFrameCountForLogicalId(i);
                    for (int j = 1; j < frameCount; j++)
                    {
                        _ceilings[index] = i;
                        CeilingFrames[i].Add(index);
                        frames[index++] = j;
                    }
                }
            }

            if (walls)
            {
                for (byte i = 1; i <= labyrinthData.Walls.Count; i++)
                {
                    int frameCount = _tilemap.DayWalls.GetFrameCountForLogicalId(i);
                    for (int j = 1; j < frameCount; j++)
                    {
                        _contents[index] = (byte)(i + 100);
                        WallFrames[i].Add(index);
                        frames[index++] = j;
                    }
                }
            }

            _tilemap.TileCount = totalTiles;
            for (int i = 0; i < totalTiles; i++)
            {
                SetTile(i, i, frames[i]);
            }

            for (int i = 0; i < totalTiles; i++)
            {
                AddSprites(labyrinthData, i, request);
            }
        }
Esempio n. 7
0
    public static List <TiledProperty> BuildIsoTileProperties(LabyrinthData labyrinth, int index, IsometricMode isoMode)
    {
        var properties = new List <TiledProperty>();

        if (index == 0) // First tile always blank
        {
            return(properties);
        }

        if (isoMode is IsometricMode.Floors or IsometricMode.Ceilings)
        {
            var floor = labyrinth.FloorAndCeilings[index - 1];
            if (floor == null)
            {
                return(properties);
            }
            properties.Add(new(Prop.Flags, floor.Properties.ToString()));
            properties.Add(new(Prop.Unk1, floor.Unk1));
            properties.Add(new(Prop.Unk2, floor.Unk2));
            properties.Add(new(Prop.Unk3, floor.Unk3));
            properties.Add(new(Prop.Unk5, floor.Unk5));
            properties.Add(new(Prop.Unk8, floor.Unk8));
        }

        if (isoMode == IsometricMode.Walls)
        {
            var wall = labyrinth.Walls[index - 1];
            if (wall == null)
            {
                return(properties);
            }
            properties.Add(new(Prop.AutoGfx, wall.AutoGfxType));
            properties.Add(new(Prop.Collision, wall.Collision));
            properties.Add(new(Prop.Flags, wall.Properties.ToString()));
            properties.Add(new(Prop.Unk9, wall.Unk9));
        }

        if (isoMode == IsometricMode.Contents)
        {
            var group = labyrinth.ObjectGroups[index - 1];
            properties.Add(new(Prop.AutoGfx, group.AutoGraphicsId));
            var objects = group.SubObjects
                          .Where(x => x != null)
                          .Select(x => x.ObjectInfoNumber >= labyrinth.Objects.Count ? null : labyrinth.Objects[x.ObjectInfoNumber])
                          .Where(x => x != null)
                          .ToList();

            properties.Add(new(Prop.Collision, string.Join("; ", objects.Select(x => x.Collision))));
            properties.Add(new(Prop.Flags, string.Join("; ", objects.Select(x => x.Properties))));
            properties.Add(new(Prop.Unk7, string.Join("; ", objects.Select(x => x.Unk7))));
        }

        return(properties);
    }