From 37bdd2bb8570d202bfb2118568392e0e78cc8396 Mon Sep 17 00:00:00 2001 From: "Trevor L. Davis" Date: Sun, 19 Apr 2026 18:03:15 -0700 Subject: [PATCH 1/3] refactor: Tweak test filenames --- tests/testthat/{test_cat_piece.R => test-cat_piece.R} | 0 tests/testthat/{test_game_bit_duo.R => test-game_bit_duo.R} | 0 tests/testthat/{test_game_bit_mono.R => test-game_bit_mono.R} | 0 tests/testthat/{test_html.R => test-html.R} | 0 tests/testthat/{test_range.R => test-range.R} | 0 tests/testthat/{test_zzz.R => test-zzz.R} | 0 6 files changed, 0 insertions(+), 0 deletions(-) rename tests/testthat/{test_cat_piece.R => test-cat_piece.R} (100%) rename tests/testthat/{test_game_bit_duo.R => test-game_bit_duo.R} (100%) rename tests/testthat/{test_game_bit_mono.R => test-game_bit_mono.R} (100%) rename tests/testthat/{test_html.R => test-html.R} (100%) rename tests/testthat/{test_range.R => test-range.R} (100%) rename tests/testthat/{test_zzz.R => test-zzz.R} (100%) diff --git a/tests/testthat/test_cat_piece.R b/tests/testthat/test-cat_piece.R similarity index 100% rename from tests/testthat/test_cat_piece.R rename to tests/testthat/test-cat_piece.R diff --git a/tests/testthat/test_game_bit_duo.R b/tests/testthat/test-game_bit_duo.R similarity index 100% rename from tests/testthat/test_game_bit_duo.R rename to tests/testthat/test-game_bit_duo.R diff --git a/tests/testthat/test_game_bit_mono.R b/tests/testthat/test-game_bit_mono.R similarity index 100% rename from tests/testthat/test_game_bit_mono.R rename to tests/testthat/test-game_bit_mono.R diff --git a/tests/testthat/test_html.R b/tests/testthat/test-html.R similarity index 100% rename from tests/testthat/test_html.R rename to tests/testthat/test-html.R diff --git a/tests/testthat/test_range.R b/tests/testthat/test-range.R similarity index 100% rename from tests/testthat/test_range.R rename to tests/testthat/test-range.R diff --git a/tests/testthat/test_zzz.R b/tests/testthat/test-zzz.R similarity index 100% rename from tests/testthat/test_zzz.R rename to tests/testthat/test-zzz.R From 175241668caa77677ab3cfa124fb172590e34303 Mon Sep 17 00:00:00 2001 From: "Trevor L. Davis" Date: Sun, 19 Apr 2026 18:08:06 -0700 Subject: [PATCH 2/3] feat: Add support for saucer faces and backs (#4) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * saucer faces use ◉ (fisheye, U+25C9) colored by suit * saucer backs use ◎ (bullseye, U+25CE) in black Co-Authored-By: Claude Sonnet 4.6 --- DESCRIPTION | 2 +- NEWS.md | 5 ++++- R/str_piece.R | 21 +++++++++++++++++++-- R/sysdata.rda | Bin 5008 -> 5014 bytes data-raw/sysdata.R | 2 +- tests/testthat/_snaps/cat_piece.md | 12 ++++++++++++ tests/testthat/test-cat_piece.R | 12 +++++++++++- 7 files changed, 48 insertions(+), 6 deletions(-) diff --git a/DESCRIPTION b/DESCRIPTION index 4b38265..c7ecd58 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -2,7 +2,7 @@ Encoding: UTF-8 Package: ppcli Type: Package Title: Plaintext Board Game Visualizations -Version: 0.3.0-1 +Version: 0.3.0-2 Authors@R: c(person("Trevor L.", "Davis", role=c("aut", "cre"), email="trevor.l.davis@gmail.com", comment = c(ORCID = "0000-0001-6341-4639"))) diff --git a/NEWS.md b/NEWS.md index d93f4a2..2cd1668 100644 --- a/NEWS.md +++ b/NEWS.md @@ -1,7 +1,10 @@ ppcli 0.3.0 (development) ========================= -* `cat_piece()` and `str_piece()` add support for "cubes" bit pieces (#4). +* `cat_piece()` and `str_piece()` adds support for the following game pieces (#4): + + + "cubes" bit pieces + + (piecepack) saucers ppcli 0.2.1 =========== diff --git a/R/str_piece.R b/R/str_piece.R index 232ae1b..20658b9 100644 --- a/R/str_piece.R +++ b/R/str_piece.R @@ -572,7 +572,10 @@ add_piece <- function( reorient = "none", style = get_style() ) { - if (piece_side %in% c("tile_back", "coin_face", "card_back", "board_face", "board_back")) { + if ( + piece_side %in% + c("tile_back", "coin_face", "card_back", "board_face", "board_back", "saucer_back") + ) { fg <- "black" } else { if (grepl("pyramid", piece_side)) { @@ -600,7 +603,9 @@ add_piece <- function( "pawn_face", "pawn_back", "board_face", - "board_back" + "board_back", + "saucer_face", + "saucer_back" )) ) { if (piece_side == "tile_face") { @@ -636,6 +641,8 @@ add_piece <- function( piece_side, coin_back = add_coin_back(cm, ss, x, y, angle, fg, style), coin_face = add_coin_face(cm, rs, x, y, angle, fg, style), + saucer_back = add_saucer_back(cm, x, y, fg), + saucer_face = add_saucer_face(cm, x, y, fg), die_face = add_die_face(cm, rs, x, y, angle, fg, cfg, style, suit), pawn_face = add_pawn_face(cm, ss, x, y, angle, fg, style), pawn_back = add_pawn_back(cm, ss, x, y, angle, fg, style), @@ -784,6 +791,16 @@ add_coin_face <- function(cm, rs, x, y, angle, fg, style) { cm$fg[y, x] <- fg cm } +add_saucer_back <- function(cm, x, y, fg) { + cm$char[y, x] <- "\u25ce" + cm$fg[y, x] <- fg + cm +} +add_saucer_face <- function(cm, x, y, fg) { + cm$char[y, x] <- "\u25c9" + cm$fg[y, x] <- fg + cm +} add_die_face <- function(cm, rs, x, y, angle, fg, cfg, style, suit) { enclosing_die <- style$rotate(style$combining$die[[cfg]][suit], angle) # nolint start diff --git a/R/sysdata.rda b/R/sysdata.rda index cfc54333d30912fdd42fad834b32ff3064bc37fa..e90277b3133e30af51dbdfa014fcc4c9926fff7c 100644 GIT binary patch delta 4797 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 delta 4817 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 Date: Mon, 20 Apr 2026 11:29:51 -0700 Subject: [PATCH 3/3] feat: Use Game Bit PUA combining saucer glyphs for directional support In Game Bit styles, saucer_face uses the suit symbol combined with the directional enclosing pawn saucer character (U+FCE51 and rotations), mirroring the coin/pawn approach. Plain Unicode keeps bullseye/fisheye. Adds rotation entries for U+FCE51 to sysdata.R. Co-Authored-By: Claude Sonnet 4.6 --- R/str_piece.R | 25 ++++++++++++++++++------- R/sysdata.rda | Bin 5014 -> 5035 bytes data-raw/sysdata.R | 5 +++++ tests/testthat/_snaps/game_bit_mono.md | 12 ++++++++++++ tests/testthat/test-cat_piece.R | 2 ++ tests/testthat/test-game_bit_mono.R | 13 +++++++++++++ 6 files changed, 50 insertions(+), 7 deletions(-) diff --git a/R/str_piece.R b/R/str_piece.R index 20658b9..b279311 100644 --- a/R/str_piece.R +++ b/R/str_piece.R @@ -194,7 +194,8 @@ get_style_combining <- function(style) { dice_numeral = die_suits ) - list(coin = coin, die = die, pawn = pawn) + saucer <- if (style == "unicode") NULL else "\U000FCE51" + list(coin = coin, die = die, pawn = pawn, saucer = saucer) } get_style_rs <- function(style, big = FALSE) { @@ -641,8 +642,8 @@ add_piece <- function( piece_side, coin_back = add_coin_back(cm, ss, x, y, angle, fg, style), coin_face = add_coin_face(cm, rs, x, y, angle, fg, style), - saucer_back = add_saucer_back(cm, x, y, fg), - saucer_face = add_saucer_face(cm, x, y, fg), + saucer_back = add_saucer_back(cm, x, y, angle, fg, style), + saucer_face = add_saucer_face(cm, ss, x, y, angle, fg, style), die_face = add_die_face(cm, rs, x, y, angle, fg, cfg, style, suit), pawn_face = add_pawn_face(cm, ss, x, y, angle, fg, style), pawn_back = add_pawn_back(cm, ss, x, y, angle, fg, style), @@ -791,13 +792,23 @@ add_coin_face <- function(cm, rs, x, y, angle, fg, style) { cm$fg[y, x] <- fg cm } -add_saucer_back <- function(cm, x, y, fg) { - cm$char[y, x] <- "\u25ce" +add_saucer_back <- function(cm, x, y, angle, fg, style) { + if (is.null(style$combining$saucer)) { + cm$char[y, x] <- "\u25ce" + } else { + enclosing_saucer <- style$rotate(style$combining$saucer, angle) + cm$char[y, x] <- paste0(style$space, enclosing_saucer) + } cm$fg[y, x] <- fg cm } -add_saucer_face <- function(cm, x, y, fg) { - cm$char[y, x] <- "\u25c9" +add_saucer_face <- function(cm, ss, x, y, angle, fg, style) { + if (is.null(style$combining$saucer)) { + cm$char[y, x] <- "\u25c9" + } else { + enclosing_saucer <- style$rotate(style$combining$saucer, angle) + cm$char[y, x] <- paste0(ss, enclosing_saucer) + } cm$fg[y, x] <- fg cm } diff --git a/R/sysdata.rda b/R/sysdata.rda index e90277b3133e30af51dbdfa014fcc4c9926fff7c..5505609b042327d7fe4661a9de90a872a2059b2b 100644 GIT binary patch literal 5035 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 V6~?&Q)fZ7j6qnx(+$sV9{sYST-eUj& literal 5014 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

V&i1z z*k