1
0
mirror of https://github.com/maaslalani/gambit.git synced 2024-11-24 08:22:12 +02:00
This commit is contained in:
Maas Lalani 2021-12-24 17:31:25 -05:00
parent 20709692d9
commit 1593d5a867
No known key found for this signature in database
GPG Key ID: 5A6ED5CBF1A0A000
6 changed files with 40 additions and 11 deletions

View File

@ -4,11 +4,18 @@ import (
"strings"
"github.com/maaslalani/gambit/board"
"github.com/maaslalani/gambit/position"
)
const (
// cellHeight represents how many rows are in a cell
cellHeight = 2
cellWidth = 4
// cellWidth represents how many columns are in a cell
cellWidth = 4
// marginLeft and marginTop represent how much to offset the
// chess board from the top left of the terminal to account for
// padding and rank labels
marginLeft = 3
marginTop = 1
@ -16,10 +23,13 @@ const (
Horizontal = "─"
)
func Cell(x, y int) (int, int) {
// Cell returns the square that was clicked based on mouse
// coordinates adjusting for margins and cell dimensions.
func Cell(x, y int) string {
col := (x - marginLeft) / cellWidth
row := board.LastRow - (y-marginTop)/cellHeight
return col, row
return position.ToSquare(row, col)
}
// withMarginLeft returns a string with a prepended left margin
@ -34,18 +44,22 @@ func Build(left, middle, right string) string {
return withMarginLeft(border)
}
// Top returns a built border with the top row
func Top() string {
return Build("┌", "┬", "┐")
}
// Middle returns a built border with the middle row
func Middle() string {
return Build("├", "┼", "┤")
}
// Bottom returns a built border with the bottom row
func Bottom() string {
return Build("└", "┴", "┘")
}
// BottomLabels returns the labels for the files
func BottomLabels() string {
return withMarginLeft(" A B C D E F G H\n")
}

View File

@ -84,11 +84,11 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
return m, nil
}
col, row := border.Cell(msg.X, msg.Y)
selected := border.Cell(msg.X, msg.Y)
if m.selected != "" {
from := m.selected
to := fmt.Sprintf("%s", position.ToSquare(row, col))
to := selected
for _, move := range m.moves {
if move.String() == from+to {
@ -113,7 +113,7 @@ func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
}
}
} else {
m.selected = fmt.Sprintf("%s", position.ToSquare(row, col))
m.selected = selected
m.pieceMoves = []dt.Move{}
for _, move := range m.moves {
if strings.HasPrefix(move.String(), m.selected) {

View File

@ -1,5 +1,7 @@
package pieces
// Display maps pieces in FEN representation to their ASCII
// representation for the user.
var Display = map[string]string{
"": " ",
"B": "♗",

View File

@ -7,6 +7,7 @@ import (
"github.com/maaslalani/gambit/board"
)
// colToFile returns the File given a column
func colToFile(col int) string {
if col < board.FirstCol {
col = board.FirstCol
@ -16,6 +17,7 @@ func colToFile(col int) string {
return fmt.Sprintf("%c", col+'a')
}
// rowToRank returns a Rank given a row
func rowToRank(row int) int {
if row < board.FirstRow {
row = board.FirstRow
@ -25,6 +27,10 @@ func rowToRank(row int) int {
return row + 1
}
// ToSquare returns the square position of a given row and
// column for display or checking legal moves.
//
// For example, ToSquare(0, 0) returns a1.
func ToSquare(row, col int) string {
return colToFile(col) + strconv.Itoa(rowToRank(row))
}

View File

@ -6,6 +6,7 @@ import (
"github.com/maaslalani/gambit/board"
)
// fileToCol returns column number for a given file rune
func fileToCol(file rune) int {
col := int(file - 'a')
if col < board.FirstCol {
@ -16,6 +17,7 @@ func fileToCol(file rune) int {
return col
}
// rankToRow returns a row number for a given rank
func rankToRow(rank int) int {
row := rank - 1
if row < board.FirstRow {
@ -26,6 +28,11 @@ func rankToRow(rank int) int {
return row
}
// ToPosition takes a square string and returns the
// corresponding row and column for compatibility with the grid
// (8x8 matrix).
//
// For example: "a1" returns (0, 0) and "h8" returns (7, 7).
func ToPosition(square string) (int, int) {
col := fileToCol(rune(square[0]))
row, _ := strconv.Atoi(string(square[1]))

View File

@ -2,11 +2,11 @@ package style
import . "github.com/charmbracelet/lipgloss"
func foreground(color string) Style {
func fg(color string) Style {
return NewStyle().Foreground(Color(color))
}
var Cyan = foreground("5")
var Faint = foreground("8")
var Red = foreground("1")
var Selected = foreground("6")
var Cyan = fg("5")
var Faint = fg("8")
var Red = fg("1")
var Selected = fg("6")