- Sashité for Developers
- Specifications
- PCN
- 1.0.0
- Examples
- Cross-Style Games
Cross-Style Games (PCN v1.0.0)
This page demonstrates cross-variant games where players use different rule systems (SNN styles) within a single PCN document.
- Positions: FEEN encodes the board and the style-turn pair (who moves and each side’s style).
- Moves: PAN tuples
["<PAN>", <seconds>](float ≥ 0.0). - Time control: optional; defined per player under
sides.{first|second}.periods.
Rule-agnostic contract: PAN actions are validated against the acting side’s style on that turn. Trait derivation: from FEEN + parity of
moves.length.
1) CHESS vs Makruk — No Time Control
Different styles per side; free-play (no periods).
{
"sides": {
"first": { "style": "CHESS", "name": "Western Champion" },
"second": { "style": "makruk", "name": "Thai Champion" }
},
"setup": "rnsmksnr/8/pppppppp/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+KBN+R / C/m",
"moves": [
["e2-e4", 0.0],
["d6-d5", 0.0]
],
"status": "in_progress"
}
Notes
setupFEEN encodes initial pieces andC/mto state that first plays CHESS, second plays makruk.- The validity of
"d6-d5"is checked per makruk rules on the second move.
2) CHESS vs Shōgi — Asymmetric Time Control
Per-player time control: chess side uses Fischer 3+2, shōgi side uses byōyomi (per-move cap).
{
"meta": {
"event": "Hybrid Match",
"started_at": "2025-01-27T15:00:00Z"
},
"sides": {
"first": {
"style": "CHESS",
"name": "Chess Pro",
"periods": [
{ "time": 180, "inc": 2 }
]
},
"second": {
"style": "shogi",
"name": "Shogi Pro",
"periods": [
{ "time": 30, "moves": 1 }
]
}
},
"setup": "+rnbq+kbn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+KBN+R / C/s",
"moves": [
["e2-e4", 3.8], // CHESS (bank + inc applies after move)
["P*e5", 2.4] // shogi drop, must satisfy per-move cap 30.0
],
"status": "in_progress"
}
Notes
- The second move uses a shōgi drop (
*), valid because the second side’s style isshogi. - Per-move period (
moves = 1) enforcesseconds ≤ timefor the shōgi side.
3) Mixed Quotas — CHESS vs Xiangqi (Canadian vs Bank)
First side (chess) plays Canadian quota; second side (xiangqi) plays a simple bank.
{
"sides": {
"first": {
"style": "CHESS",
"name": "Alice",
"periods": [
{ "time": 300, "moves": 25 }
]
},
"second": {
"style": "xiangqi",
"name": "Bob",
"periods": [
{ "time": 600 }
]
}
},
"setup": "+rnbq+kbn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+KBN+R / C/x",
"moves": [
["g1-f3", 4.0],
["h10-h9", 6.5]
]
}
Notes
- The xiangqi coordinate example (
h10-h9) here is purely illustrative—coordinate systems depend on your CELL integration for xiangqi boards. - The chess side’s quota (
moves ≥ 2) resets intrinsically if no next period exists.
4) Pass & Drops in Mixed Styles — No Time, Status Draw
Cross-style mechanics: pass move and drop, no time control, declared draw.
{
"sides": {
"first": { "style": "CHESS", "name": "A" },
"second": { "style": "shogi", "name": "B" }
},
"setup": "8/8/8/8/8/8/8/8 / C/s",
"moves": [
["...", 0.0], // pass: allowed by PAN, legality per style/engine policy
["P*f5", 0.0] // shogi drop
],
"status": "agreement"
}
Notes
...(pass) is a PAN action. Whether pass is legal depends on style policy (rule-agnostic PCN can still record it).- Status is explicitly declared as a draw by agreement (CGSN).
5) Cross-Style Handicap — Asymmetric Budgets
Different budget sizes and systems to create a timed handicap.
{
"sides": {
"first": {
"style": "CHESS",
"name": "Expert",
"periods": [
{ "time": 300 } // pure bank 5′
]
},
"second": {
"style": "makruk",
"name": "Beginner",
"periods": [
{ "time": 900 } // pure bank 15′
]
}
},
"setup": "rnsmksnr/8/pppppppp/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+KBN+R / C/m",
"moves": [
["e2-e4", 9.0],
["d6-d5", 21.0]
],
"status": "in_progress"
}
Implementation Tips
-
Trait derivation
side0 = FEEN.active(setup) active = (moves.length % 2 == 0) ? side0 : opposite(side0) -
Validation
- Parse PAN and validate the action against the acting side’s SNN style.
- Apply period transitions and increment timing per-side as defined in their
periods.
-
Time control
moves = null→ bank;incadded at end of move.moves = 1→ per-move cap; must satisfyseconds ≤ time.moves ≥ 2→ quota; when it hits 0: transition if next period exists, else reset in place.
For end-to-end scenarios, see Complete Game Records. For focused timing mechanisms, see Time Control Systems.
