diff --git a/DalamudMinesweeper.json b/DalamudMinesweeper.json index 86205fa..bfbd556 100644 --- a/DalamudMinesweeper.json +++ b/DalamudMinesweeper.json @@ -3,7 +3,7 @@ "Author": "hunter2_", "Name": "Minesweeper", "InternalName": "DalamudMinesweeper", - "AssemblyVersion": "0.0.0.12", + "AssemblyVersion": "0.0.0.13", "Description": "Logic puzzle in which you find and flag hidden mines. \nLeft click to uncover a square, right click to place a flag. \nClick a number that has the right amount of adjacent flags to reveal adjacent tiles. \nThe game ends when all mines are flagged and all safe squares have been uncovered. \nClick the smiley face to start a new game.", "ApplicableVersion": "any", "Tags": [ @@ -18,9 +18,9 @@ "LoadPriority": 0, "Punchline": "Classic puzzle game.", "AcceptsFeedback": true, - "DownloadLinkInstall": "https://github.com/hunter2actual/DalamudMinesweeper/releases/download/0.0.0.12/latest.zip", - "DownloadLinkUpdate": "https://github.com/hunter2actual/DalamudMinesweeper/releases/download/0.0.0.12/latest.zip", + "DownloadLinkInstall": "https://github.com/hunter2actual/DalamudMinesweeper/releases/download/0.0.0.13/latest.zip", + "DownloadLinkUpdate": "https://github.com/hunter2actual/DalamudMinesweeper/releases/download/0.0.0.13/latest.zip", "IconUrl": "https://raw.githubusercontent.com/hunter2actual/DalamudMinesweeper/master/images/icon.png", - "Changelog": "Draw background and border, add OpenMainUi button from Dalamud" + "Changelog": "Spritesheet rendering to prevent image bleed" } ] \ No newline at end of file diff --git a/DalamudMinesweeper/ClassicSprites.cs b/DalamudMinesweeper/ClassicSprites.cs deleted file mode 100644 index 206cdda..0000000 --- a/DalamudMinesweeper/ClassicSprites.cs +++ /dev/null @@ -1,82 +0,0 @@ -using Dalamud.Plugin; -using Dalamud.Interface.Internal; -using System.IO; -using System; - -namespace DalamudMinesweeper; - -public class ClassicSprites : IDisposable { - private DalamudPluginInterface _pluginInterface { get; set; } - - public ClassicSprites(DalamudPluginInterface pluginInterface) - { - _pluginInterface = pluginInterface; - Tile0 = LoadImage("0.png"); - Tile1 = LoadImage("1.png"); - Tile2 = LoadImage("2.png"); - Tile3 = LoadImage("3.png"); - Tile4 = LoadImage("4.png"); - Tile5 = LoadImage("5.png"); - Tile6 = LoadImage("6.png"); - Tile7 = LoadImage("7.png"); - Tile8 = LoadImage("8.png"); - TileFlag = LoadImage("Flag.png"); - TileHidden = LoadImage("Hidden.png"); - TileMine = LoadImage("Mine1.png"); - TileMineBoom = LoadImage("Mine2.png"); - - Smiley = LoadImage("Smiley.png"); - SmileyClicked = LoadImage("SmileyClicked.png"); - SmileyDead = LoadImage("SmileyDead.png"); - SmileyShades = LoadImage("SmileyShades.png"); - SmileySoy = LoadImage("SmileySoy.png"); - } - - public void Dispose() - { - Tile0.Dispose(); - Tile1.Dispose(); - Tile2.Dispose(); - Tile3.Dispose(); - Tile4.Dispose(); - Tile5.Dispose(); - Tile6.Dispose(); - Tile7.Dispose(); - Tile8.Dispose(); - TileFlag.Dispose(); - TileHidden.Dispose(); - TileMine.Dispose(); - TileMineBoom.Dispose(); - Smiley.Dispose(); - SmileyClicked.Dispose(); - SmileyDead.Dispose(); - SmileyShades.Dispose(); - SmileySoy.Dispose(); - } - - private IDalamudTextureWrap LoadImage(string path) - { - var fullPath = Path.Combine(_pluginInterface.AssemblyLocation.Directory?.FullName!, path); - return _pluginInterface.UiBuilder.LoadImage(fullPath); - } - - public IDalamudTextureWrap Tile0 { get; init; } - public IDalamudTextureWrap Tile1 { get; init; } - public IDalamudTextureWrap Tile2 { get; init; } - public IDalamudTextureWrap Tile3 { get; init; } - public IDalamudTextureWrap Tile4 { get; init; } - public IDalamudTextureWrap Tile5 { get; init; } - public IDalamudTextureWrap Tile6 { get; init; } - public IDalamudTextureWrap Tile7 { get; init; } - public IDalamudTextureWrap Tile8 { get; init; } - public IDalamudTextureWrap TileFlag { get; init; } - public IDalamudTextureWrap TileHidden { get; init; } - public IDalamudTextureWrap TileMine { get; init; } - public IDalamudTextureWrap TileMineBoom { get; init; } - - public IDalamudTextureWrap Smiley { get; init; } - public IDalamudTextureWrap SmileyClicked { get; init; } - public IDalamudTextureWrap SmileyDead { get; init; } - public IDalamudTextureWrap SmileyShades { get; init; } - public IDalamudTextureWrap SmileySoy { get; init; } -} \ No newline at end of file diff --git a/DalamudMinesweeper/ClassicSpritesSheet.cs b/DalamudMinesweeper/ClassicSpritesSheet.cs new file mode 100644 index 0000000..6527ca6 --- /dev/null +++ b/DalamudMinesweeper/ClassicSpritesSheet.cs @@ -0,0 +1,102 @@ +using Dalamud.Plugin; +using Dalamud.Interface.Internal; +using System.IO; +using System; +using ImGuiNET; +using System.Numerics; +using System.Collections.Generic; +using DalamudMinesweeper.Game; + +namespace DalamudMinesweeper; + +public class ClassicSprites : IDisposable { + private DalamudPluginInterface _pluginInterface { get; set; } + private IDalamudTextureWrap Sheet { get; init; } + private record SpriteData(Vector2 topLeftCoord, Vector2 sizePx); + private readonly Dictionary _spriteDict; + + public ClassicSprites(DalamudPluginInterface pluginInterface) + { + _pluginInterface = pluginInterface; + Sheet = LoadImage("spritesheet.png"); + + _spriteDict = new Dictionary + { + { "0", new SpriteData(new Vector2(40, 88), new Vector2(16, 16)) }, + { "1", new SpriteData(new Vector2(0, 88), new Vector2(16, 16)) }, + { "2", new SpriteData(new Vector2(0, 20), new Vector2(16, 16)) }, + { "3", new SpriteData(new Vector2(40, 0), new Vector2(16, 16)) }, + { "4", new SpriteData(new Vector2(40, 20), new Vector2(16, 16)) }, + { "5", new SpriteData(new Vector2(20, 0), new Vector2(16, 16)) }, + { "6", new SpriteData(new Vector2(60, 88), new Vector2(16, 16)) }, + { "7", new SpriteData(new Vector2(20, 88), new Vector2(16, 16)) }, + { "8", new SpriteData(new Vector2(20, 40), new Vector2(16, 16)) }, + { "Flag", new SpriteData(new Vector2(0, 40), new Vector2(16, 16)) }, + { "Hidden", new SpriteData(new Vector2(20, 20), new Vector2(16, 16)) }, + { "Mine1", new SpriteData(new Vector2(0, 0), new Vector2(16, 16)) }, + { "Mine2", new SpriteData(new Vector2(40, 40), new Vector2(16, 16)) }, + { "Smiley", new SpriteData(new Vector2(60, 0), new Vector2(24, 24)) }, + { "SmileyClicked", new SpriteData(new Vector2(0, 60), new Vector2(24, 24)) }, + { "SmileyDead", new SpriteData(new Vector2(28, 60), new Vector2(24, 24)) }, + { "SmileyShades", new SpriteData(new Vector2(60, 28), new Vector2(24, 24)) }, + { "SmileySoy", new SpriteData(new Vector2(60, 56), new Vector2(24, 24)) } + }; + } + + public Vector2 TileSize => _spriteDict["0"].sizePx; + public Vector2 SmileySize => _spriteDict["Smiley"].sizePx; + + public void DrawTile(ImDrawListPtr drawList, Cell cell, Vector2 cursorPos, int zoom = 1) + => Draw(drawList, _spriteDict[CellToSpriteName(cell)], cursorPos, zoom); + + public void DrawSmiley(ImDrawListPtr drawList, string smileyName, Vector2 cursorPos, int zoom = 1) + => Draw(drawList, _spriteDict[smileyName], cursorPos, zoom); + + private void Draw(ImDrawListPtr drawList, SpriteData sprite, Vector2 cursorPos, int zoom) + { + var uvMin = sprite.topLeftCoord / Sheet.Size; + var uvMax = (sprite.topLeftCoord + sprite.sizePx) / Sheet.Size; + + drawList.AddImage( + Sheet.ImGuiHandle, + cursorPos, + cursorPos + sprite.sizePx * zoom, + uvMin, + uvMax); + } + + private static string CellToSpriteName(Cell cell) + { + if (!cell.isRevealed) + { + if (cell.isFlagged) + { + return "Flag"; + } + return "Hidden"; + } + return cell.contents switch + { + CellContents.Clear => "0", + CellContents.Mine => "Mine1", + CellContents.ExplodedMine => "Mine2", + CellContents.Number => cell.numNeighbouringMines switch { + < 1 or > 8 => throw new("Invalid number of mines in cell " + cell.numNeighbouringMines), + _ => cell.numNeighbouringMines.ToString() + }, + _ => throw new("Unknown cell contents.") + }; + } + + public void Dispose() + { + Sheet.Dispose(); + } + + private IDalamudTextureWrap LoadImage(string path) + { + var fullPath = Path.Combine(_pluginInterface.AssemblyLocation.Directory?.FullName!, path); + return _pluginInterface.UiBuilder.LoadImage(fullPath); + } + +} \ No newline at end of file diff --git a/DalamudMinesweeper/Components/GameBoard.cs b/DalamudMinesweeper/Components/GameBoard.cs index ffd89e5..55283e6 100644 --- a/DalamudMinesweeper/Components/GameBoard.cs +++ b/DalamudMinesweeper/Components/GameBoard.cs @@ -27,12 +27,12 @@ public void Draw(Vector2 start) var mousePos = ImGui.GetMousePos(); var drawList = ImGui.GetWindowDrawList(); - var gridSquareSizePx = _classicSprites.Tile0.Width * _configuration.Zoom; + var gridSquareSizePx = (int) _classicSprites.TileSize.X * _configuration.Zoom; _gridSquareSizePxVec2.X = _gridSquareSizePxVec2.Y = gridSquareSizePx; for (int y = 0; y < Game.Height; y++) { for (int x = 0; x < Game.Width; x++) { - drawList.AddImage(GetCellImage(Game.GetCell(x, y)).ImGuiHandle, cursorPos, cursorPos + _gridSquareSizePxVec2); + _classicSprites.DrawTile(drawList, Game.GetCell(x, y), cursorPos, _configuration.Zoom); if (MouseInSquare(mousePos, cursorPos, gridSquareSizePx) && ImGui.IsWindowFocused()) { DrawHighlightSquare(drawList, cursorPos); @@ -52,35 +52,35 @@ public void Draw(Vector2 start) } } - private IDalamudTextureWrap GetCellImage(Cell cell) - { - if (!cell.isRevealed) - { - if (cell.isFlagged) - { - return _classicSprites.TileFlag; - } - return _classicSprites.TileHidden; - } - return cell.contents switch - { - CellContents.Clear => _classicSprites.Tile0, - CellContents.Mine => _classicSprites.TileMine, - CellContents.ExplodedMine => _classicSprites.TileMineBoom, - CellContents.Number => cell.numNeighbouringMines switch { - 1 => _classicSprites.Tile1, - 2 => _classicSprites.Tile2, - 3 => _classicSprites.Tile3, - 4 => _classicSprites.Tile4, - 5 => _classicSprites.Tile5, - 6 => _classicSprites.Tile6, - 7 => _classicSprites.Tile7, - 8 => _classicSprites.Tile8, - _ => throw new("Invalid number of mines in cell " + cell.numNeighbouringMines) - }, - _ => throw new("Unknown cell contents.") - }; - } + // private IDalamudTextureWrap GetCellImage(Cell cell) + // { + // if (!cell.isRevealed) + // { + // if (cell.isFlagged) + // { + // return _classicSprites.TileFlag; + // } + // return _classicSprites.TileHidden; + // } + // return cell.contents switch + // { + // CellContents.Clear => _classicSprites.Tile0, + // CellContents.Mine => _classicSprites.TileMine, + // CellContents.ExplodedMine => _classicSprites.TileMineBoom, + // CellContents.Number => cell.numNeighbouringMines switch { + // 1 => _classicSprites.Tile1, + // 2 => _classicSprites.Tile2, + // 3 => _classicSprites.Tile3, + // 4 => _classicSprites.Tile4, + // 5 => _classicSprites.Tile5, + // 6 => _classicSprites.Tile6, + // 7 => _classicSprites.Tile7, + // 8 => _classicSprites.Tile8, + // _ => throw new("Invalid number of mines in cell " + cell.numNeighbouringMines) + // }, + // _ => throw new("Unknown cell contents.") + // }; + // } private void DrawHighlightSquare(ImDrawListPtr drawList, Vector2 cursorPos) { diff --git a/DalamudMinesweeper/Components/Header.cs b/DalamudMinesweeper/Components/Header.cs index 5f2caa0..434f3df 100644 --- a/DalamudMinesweeper/Components/Header.cs +++ b/DalamudMinesweeper/Components/Header.cs @@ -27,18 +27,18 @@ public void Draw(Vector2 start, float headerWidth) var mousePos = ImGui.GetMousePos(); var drawList = ImGui.GetWindowDrawList(); - IDalamudTextureWrap smileyToDraw = _classicSprites.Smiley; - var smileySize = smileyToDraw.Size * _configuration.Zoom; + string smileyToDraw = "Smiley"; + var smileySize = _classicSprites.SmileySize * _configuration.Zoom; float leftPadding = (float) ((headerWidth - smileySize.X) * 0.5); var cursorPos = start + new Vector2(leftPadding, 0); if (Game.GameState == GameState.Victorious) { - smileyToDraw = _classicSprites.SmileyShades; + smileyToDraw = "SmileyShades"; } else if (Game.GameState == GameState.Boom) { - smileyToDraw = _classicSprites.SmileyDead; + smileyToDraw = "SmileyDead"; } if (MouseInSquare(mousePos, cursorPos, (int) smileySize.X) @@ -46,24 +46,23 @@ public void Draw(Vector2 start, float headerWidth) { if (ImGui.IsMouseClicked(ImGuiMouseButton.Left)) { - smileyToDraw = _classicSprites.SmileyClicked; + smileyToDraw = "SmileyClicked"; _smileyClicked = true; } else if (ImGui.IsMouseDown(ImGuiMouseButton.Left) && _smileyClicked) { - smileyToDraw = _classicSprites.SmileyClicked; + smileyToDraw = "SmileyClicked"; } else if (ImGui.IsMouseReleased(ImGuiMouseButton.Left) && _smileyClicked) { - smileyToDraw = _classicSprites.Smiley; + smileyToDraw = "Smiley"; _smileyClicked = false; _initialiseGame(); } } // TODO soyface when clicking on game - - drawList.AddImage(smileyToDraw.ImGuiHandle, cursorPos, cursorPos + smileySize); + _classicSprites.DrawSmiley(drawList, smileyToDraw, cursorPos, _configuration.Zoom); } private bool MouseInSquare(Vector2 mousePos, Vector2 cursorPos, int squareSize) diff --git a/DalamudMinesweeper/DalamudMinesweeper.csproj b/DalamudMinesweeper/DalamudMinesweeper.csproj index 111c674..76e1da6 100644 --- a/DalamudMinesweeper/DalamudMinesweeper.csproj +++ b/DalamudMinesweeper/DalamudMinesweeper.csproj @@ -5,7 +5,7 @@ - 0.0.0.12 + 0.0.0.13 A logic puzzle featuring hidden mines. https://github.com/hunter2actual/DalamudMinesweeper @@ -14,75 +14,7 @@ - - PreserveNewest - false - - - PreserveNewest - false - - - PreserveNewest - false - - - PreserveNewest - false - - - PreserveNewest - false - - - PreserveNewest - false - - - PreserveNewest - false - - - PreserveNewest - false - - - PreserveNewest - false - - - PreserveNewest - false - - - PreserveNewest - false - - - PreserveNewest - false - - - PreserveNewest - false - - - PreserveNewest - false - - - PreserveNewest - false - - - PreserveNewest - false - - - PreserveNewest - false - - + PreserveNewest false diff --git a/DalamudMinesweeper/Windows/MainWindow.cs b/DalamudMinesweeper/Windows/MainWindow.cs index 87fd743..223bbe4 100644 --- a/DalamudMinesweeper/Windows/MainWindow.cs +++ b/DalamudMinesweeper/Windows/MainWindow.cs @@ -61,9 +61,9 @@ public override void Draw() { // Calculate element sizes var windowPos = ImGui.GetWindowPos(); - var headerHeightPx = _classicSprites.Smiley.Height * _configuration.Zoom; + var headerHeightPx = _classicSprites.SmileySize.Y * _configuration.Zoom; - _gridSquareSizePx = _classicSprites.Tile0.Width * _configuration.Zoom; + _gridSquareSizePx = (int) _classicSprites.TileSize.X * _configuration.Zoom; _gridSquareSizePxVec2.X = _gridSquareSizePxVec2.Y = _gridSquareSizePx; _boardDimensions = new Vector2(_game.Width, _game.Height); var windowWidthPx = _gridSquareSizePx*_boardDimensions.X + 2*_borderWidthPx*_configuration.Zoom + 2*_dalamudWindowPaddingPx; diff --git a/Data/Classic/0.png b/Data/Classic/0.png deleted file mode 100644 index 956a7a3..0000000 Binary files a/Data/Classic/0.png and /dev/null differ diff --git a/Data/Classic/1.png b/Data/Classic/1.png deleted file mode 100644 index ee3d628..0000000 Binary files a/Data/Classic/1.png and /dev/null differ diff --git a/Data/Classic/2.png b/Data/Classic/2.png deleted file mode 100644 index d38feec..0000000 Binary files a/Data/Classic/2.png and /dev/null differ diff --git a/Data/Classic/3.png b/Data/Classic/3.png deleted file mode 100644 index a52e1c1..0000000 Binary files a/Data/Classic/3.png and /dev/null differ diff --git a/Data/Classic/4.png b/Data/Classic/4.png deleted file mode 100644 index 43035f2..0000000 Binary files a/Data/Classic/4.png and /dev/null differ diff --git a/Data/Classic/5.png b/Data/Classic/5.png deleted file mode 100644 index c32aa50..0000000 Binary files a/Data/Classic/5.png and /dev/null differ diff --git a/Data/Classic/6.png b/Data/Classic/6.png deleted file mode 100644 index 1157837..0000000 Binary files a/Data/Classic/6.png and /dev/null differ diff --git a/Data/Classic/7.png b/Data/Classic/7.png deleted file mode 100644 index 4c08b5a..0000000 Binary files a/Data/Classic/7.png and /dev/null differ diff --git a/Data/Classic/8.png b/Data/Classic/8.png deleted file mode 100644 index d791752..0000000 Binary files a/Data/Classic/8.png and /dev/null differ diff --git a/Data/Classic/Flag.png b/Data/Classic/Flag.png deleted file mode 100644 index 797d5da..0000000 Binary files a/Data/Classic/Flag.png and /dev/null differ diff --git a/Data/Classic/Hidden.png b/Data/Classic/Hidden.png deleted file mode 100644 index f70c802..0000000 Binary files a/Data/Classic/Hidden.png and /dev/null differ diff --git a/Data/Classic/Mine1.png b/Data/Classic/Mine1.png deleted file mode 100644 index 0201657..0000000 Binary files a/Data/Classic/Mine1.png and /dev/null differ diff --git a/Data/Classic/Mine2.png b/Data/Classic/Mine2.png deleted file mode 100644 index 7fca07d..0000000 Binary files a/Data/Classic/Mine2.png and /dev/null differ diff --git a/Data/Classic/Smiley.png b/Data/Classic/Smiley.png deleted file mode 100644 index 0b73e3a..0000000 Binary files a/Data/Classic/Smiley.png and /dev/null differ diff --git a/Data/Classic/SmileyClicked.png b/Data/Classic/SmileyClicked.png deleted file mode 100644 index 54d5959..0000000 Binary files a/Data/Classic/SmileyClicked.png and /dev/null differ diff --git a/Data/Classic/SmileyDead.png b/Data/Classic/SmileyDead.png deleted file mode 100644 index 11b5307..0000000 Binary files a/Data/Classic/SmileyDead.png and /dev/null differ diff --git a/Data/Classic/SmileyShades.png b/Data/Classic/SmileyShades.png deleted file mode 100644 index 96ede0c..0000000 Binary files a/Data/Classic/SmileyShades.png and /dev/null differ diff --git a/Data/Classic/SmileySoy.png b/Data/Classic/SmileySoy.png deleted file mode 100644 index 1962ac6..0000000 Binary files a/Data/Classic/SmileySoy.png and /dev/null differ diff --git a/Data/Classic/spritesheet.png b/Data/Classic/spritesheet.png new file mode 100644 index 0000000..5763ef6 Binary files /dev/null and b/Data/Classic/spritesheet.png differ diff --git a/README.md b/README.md index f605327..3d8f1dc 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,8 @@ Dalamud plugin for FFXIV - Determine font scaling, button size etc and use when drawing UI - UI elements for mine counter and clock - UI borders +- Active click logic - High scores screen -- UV Spritesheet incl 2x, 3x and 4x zoom - this will solve antialiasing issues. Include some transparency between images to prevent bleed +- Spritesheet zoom levels - [Stretch] Implement solver to reduce guessing - [Stretch] Skins diff --git a/images/screenshot.png b/images/screenshot.png index efebf39..647302c 100644 Binary files a/images/screenshot.png and b/images/screenshot.png differ