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 });
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); }
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 });
public IsoModeEvent(IsometricMode mode) => Mode = mode;
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(); }); }
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); } }
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); }