summaryrefslogtreecommitdiff
path: root/lib/chessh/ssh/client/game/renderer.ex
diff options
context:
space:
mode:
authorSimponic <loganhunt@simponic.xyz>2023-01-20 23:12:23 -0700
committerSimponic <loganhunt@simponic.xyz>2023-01-20 23:12:23 -0700
commit06f1ca76037397fb61c69319802ed029ac73e715 (patch)
tree37cdf1ebf5fcbaefda58d377bb6b4e3a8a11410b /lib/chessh/ssh/client/game/renderer.ex
parente0058fedfb191db8802a95548cbaf96b6fe58f80 (diff)
downloadchessh-06f1ca76037397fb61c69319802ed029ac73e715.tar.gz
chessh-06f1ca76037397fb61c69319802ed029ac73e715.zip
Add pagination menus
Diffstat (limited to 'lib/chessh/ssh/client/game/renderer.ex')
-rw-r--r--lib/chessh/ssh/client/game/renderer.ex103
1 files changed, 74 insertions, 29 deletions
diff --git a/lib/chessh/ssh/client/game/renderer.ex b/lib/chessh/ssh/client/game/renderer.ex
index d7c5b26..5b85a3b 100644
--- a/lib/chessh/ssh/client/game/renderer.ex
+++ b/lib/chessh/ssh/client/game/renderer.ex
@@ -2,7 +2,6 @@ defmodule Chessh.SSH.Client.Game.Renderer do
alias IO.ANSI
alias Chessh.{Utils, Player}
alias Chessh.SSH.Client.Game
- require Logger
@chess_board_height 8
@chess_board_width 8
@@ -64,36 +63,11 @@ defmodule Chessh.SSH.Client.Game.Renderer do
height: _height,
highlighted: highlighted,
flipped: flipped,
- game: %Chessh.Game{
- dark_player: %Player{username: dark_player},
- light_player: %Player{username: light_player},
- turn: turn,
- status: status,
- winner: winner
- }
+ game: %Chessh.Game{} = game
}) do
rendered = [
- Enum.join(
- [
- ANSI.clear_line(),
- ANSI.format_fragment([@light_piece_color, light_player]),
- "#{ANSI.default_color()} --vs-- ",
- ANSI.format_fragment([@dark_piece_color, dark_player]),
- ANSI.default_color(),
- case status do
- :continue ->
- ", #{ANSI.format_fragment([if(turn == :light, do: @light_piece_color, else: @dark_piece_color), if(turn == :dark, do: dark_player, else: light_player)])} to move"
-
- :draw ->
- "ended in a draw"
-
- :winner ->
- ", #{ANSI.format_fragment([if(winner == :light, do: @light_piece_color, else: @dark_piece_color), if(winner == :dark, do: dark_player, else: light_player)])} won!"
- end,
- ANSI.default_color()
- ],
- ""
- )
+ ANSI.clear_line(),
+ make_status_line(game, true)
| draw_board(
fen,
{@tile_width, @tile_height},
@@ -111,6 +85,77 @@ defmodule Chessh.SSH.Client.Game.Renderer do
)
end
+ def make_status_line(
+ %Chessh.Game{
+ light_player: light_player
+ } = game,
+ fancy
+ )
+ when is_nil(light_player),
+ do:
+ make_status_line(
+ %Chessh.Game{game | light_player: %Player{username: "(no opponent)"}},
+ fancy
+ )
+
+ def make_status_line(
+ %Chessh.Game{
+ dark_player: dark_player
+ } = game,
+ fancy
+ )
+ when is_nil(dark_player),
+ do:
+ make_status_line(
+ %Chessh.Game{game | dark_player: %Player{username: "(no opponent)"}},
+ fancy
+ )
+
+ def make_status_line(
+ %Chessh.Game{
+ id: game_id,
+ dark_player: %Player{username: dark_player},
+ light_player: %Player{username: light_player},
+ turn: turn,
+ status: status,
+ winner: winner,
+ moves: moves
+ },
+ fancy
+ ) do
+ Enum.join(
+ [
+ if(fancy,
+ do: ANSI.clear_line(),
+ else: ""
+ ),
+ "Game #{game_id} - ",
+ if(fancy,
+ do: ANSI.format_fragment([@light_piece_color, light_player]),
+ else: "#{light_player} (L)"
+ ),
+ "#{if fancy, do: ANSI.default_color(), else: ""} --vs-- ",
+ if(fancy,
+ do: ANSI.format_fragment([@dark_piece_color, dark_player]),
+ else: "#{dark_player} (D)"
+ ),
+ if(fancy, do: ANSI.default_color(), else: ""),
+ case status do
+ :continue ->
+ ", #{moves} moves, #{ANSI.format_fragment([if(fancy, do: if(turn == :light, do: @light_piece_color, else: @dark_piece_color), else: ""), if(turn == :dark, do: dark_player, else: light_player)])} to move"
+
+ :draw ->
+ "ended in a draw after #{moves} moves"
+
+ :winner ->
+ ", #{ANSI.format_fragment([if(fancy, do: if(winner == :light, do: @light_piece_color, else: @dark_piece_color), else: ""), if(winner == :dark, do: dark_player, else: light_player)])} won after #{moves} moves!"
+ end,
+ if(fancy, do: ANSI.default_color(), else: "")
+ ],
+ ""
+ )
+ end
+
defp draw_board(
fen,
{tile_width, tile_height} = tile_dims,