Add uci menu and fix previous game viewer wrap around move index

This commit is contained in:
Elizabeth Hunt 2023-03-15 14:05:47 -06:00
parent 763529e6c3
commit 21090101aa
Signed by: simponic
GPG Key ID: 52B3774857EB24B1
2 changed files with 52 additions and 13 deletions

View File

@ -56,11 +56,29 @@ export const ManPages = () => {
<ul>
<li>Ctrl + b / Escape to return to the main menu.</li>
<li>Ctrl + c / Ctrl + d to exit CheSSH at any point.</li>
<li>Arrow keys / hjkl keybinds to move around the board.</li>
<li>
Select a piece with "enter", and move it to a square by pressing
Arrow keys / vim (hjkl) keybinds to move around the board and
menus.
</li>
<li>Select menu options with "enter".</li>
<li>
Select a game piece "enter", and move it to a square by pressing
"enter" again.
</li>
<li>
In the "Previous Games" viewer, use h/l or left/right to view the
previous/next move.
</li>
<li>In a game board use "f" to flip the board.</li>
<li>
In the "Previous Games" viewer, use "m" to show the game's move
history in UCI notation (which you may convert to PGN{" "}
<a href="https://www.dcode.fr/uci-chess-notation" target="_blank">
here
</a>
).
</li>
</ul>
</div>
</div>

View File

@ -13,7 +13,8 @@ defmodule Chessh.SSH.Client.PreviousGame do
binbo_pid: nil,
game: %Game{},
client_pid: nil,
flipped: false
flipped: false,
viewing_uci: false
end
use Chessh.SSH.Client.Screen
@ -59,6 +60,7 @@ defmodule Chessh.SSH.Client.PreviousGame do
%State{
move_idx: move_idx,
flipped: flipped,
viewing_uci: viewing_uci,
game: %Game{
moves: num_moves
}
@ -67,10 +69,10 @@ defmodule Chessh.SSH.Client.PreviousGame do
new_move_idx =
case action do
:left ->
Utils.wrap_around(move_idx, -1, num_moves)
Utils.wrap_around(move_idx, -1, num_moves + 1)
:right ->
Utils.wrap_around(move_idx, 1, num_moves)
Utils.wrap_around(move_idx, 1, num_moves + 1)
_ ->
move_idx
@ -79,7 +81,8 @@ defmodule Chessh.SSH.Client.PreviousGame do
new_state = %State{
state
| move_idx: new_move_idx,
flipped: if(action == "f", do: !flipped, else: flipped)
flipped: if(action == "f", do: !flipped, else: flipped),
viewing_uci: if(action == "m", do: !viewing_uci, else: viewing_uci)
}
render(new_state)
@ -92,15 +95,33 @@ defmodule Chessh.SSH.Client.PreviousGame do
client_pid: client_pid,
move_fens: move_fens,
move_idx: move_idx,
game: %Game{id: game_id, moves: total_moves}
game: %Game{id: game_id, moves: total_moves, game_moves: game_moves},
viewing_uci: viewing_uci
} = state
) do
lines =
case viewing_uci do
false ->
{:ok, fen} = Map.fetch(move_fens, "#{move_idx}")
lines =
["Game #{game_id} | Move #{move_idx} / #{total_moves}"] ++
Renderer.draw_board(fen, flipped) ++
["<- previous | next ->"]
[
"Game #{game_id} | Move #{move_idx} / #{total_moves}",
"| <- previous move | next move ->",
"| press 'm' to view move history",
"==="
] ++
Renderer.draw_board(fen, flipped)
true ->
[
Utils.clear_codes(),
"UCI Notation For Game #{game_id}",
"- Press 'm' to go back to the board",
"- Use https://dcode.fr/uci-chess-notation to convert to PGN",
"",
game_moves
]
end
send(
client_pid,
@ -111,7 +132,7 @@ defmodule Chessh.SSH.Client.PreviousGame do
fn {i, line} ->
[ANSI.cursor(i, 0), ANSI.clear_line(), line]
end
)}
) ++ [ANSI.home()]}
)
state