- Sashité for Developers
- Specifications
- PCN
- 1.0.0
- Examples
- Time Control
Time Control (PCN v1.0.0)
This page focuses on period-based timing. Time control in PCN is Match-wide — both players share the same period configuration.
All examples are shown in both TOML and JSON formats.
Quick Reference
| Property | Description |
|---|---|
duration_ms |
Time budget in milliseconds (required) |
increment_ms |
Fischer increment per ply in milliseconds |
plies |
Move quota for this period |
Time Control Modes
| Configuration | Mode | Behavior |
|---|---|---|
duration_ms only |
Fixed bank | Time depletes linearly |
duration_ms + increment_ms |
Fischer | Increment added after each ply |
duration_ms + plies = 1 |
Per-ply cap (byōyomi) | Each ply must complete within the time |
duration_ms + plies ≥ 2 |
Quota (Canadian) | Time covers N plies, then resets |
1. Bank Only — Pure Main Time
10 minutes per player, no increment.
TOML
[[periods]]
duration_ms = 600000
[setup]
feen = "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
[[plies]]
pmn = "e2-e4"
elapsed_ms = 18400
[[plies]]
pmn = "e7-e5"
elapsed_ms = 22100
JSON
{
"periods": [
{ "duration_ms": 600000 }
],
"setup": {
"feen": "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
},
"plies": [
{ "pmn": "e2-e4", "elapsed_ms": 18400 },
{ "pmn": "e7-e5", "elapsed_ms": 22100 }
]
}
2. Fischer — 5+3
5 minutes initial time with 3 seconds increment per move.
TOML
[[periods]]
duration_ms = 300000
increment_ms = 3000
[setup]
feen = "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
[[plies]]
pmn = "e2-e4"
elapsed_ms = 8000
[[plies]]
pmn = "e7-e5"
elapsed_ms = 12000
[[plies]]
pmn = "g1-f3"
elapsed_ms = 15000
[[plies]]
pmn = "b8-c6"
elapsed_ms = 5000
JSON
{
"periods": [
{ "duration_ms": 300000, "increment_ms": 3000 }
],
"setup": {
"feen": "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
},
"plies": [
{ "pmn": "e2-e4", "elapsed_ms": 8000 },
{ "pmn": "e7-e5", "elapsed_ms": 12000 },
{ "pmn": "g1-f3", "elapsed_ms": 15000 },
{ "pmn": "b8-c6", "elapsed_ms": 5000 }
]
}
Clock calculation (First Player):
- After ply 1: 300000 − 8000 + 3000 = 295000
- After ply 3: 295000 − 15000 + 3000 = 283000
3. Byōyomi — Main Time + Per-Ply Overtime
10 minutes main time, then 30 seconds per move.
TOML
[[periods]]
duration_ms = 600000
[[periods]]
duration_ms = 30000
plies = 1
[setup]
feen = "lnsgk^gsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGK^GSNL / S/s"
[[plies]]
pmn = "7g-7f"
elapsed_ms = 5200
[[plies]]
pmn = "3c-3d"
elapsed_ms = 8000
[[plies]]
pmn = "2g-2f"
elapsed_ms = 28400
[[plies]]
pmn = "8d-8e"
elapsed_ms = 4100
JSON
{
"periods": [
{ "duration_ms": 600000 },
{ "duration_ms": 30000, "plies": 1 }
],
"setup": {
"feen": "lnsgk^gsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGK^GSNL / S/s"
},
"plies": [
{ "pmn": "7g-7f", "elapsed_ms": 5200 },
{ "pmn": "3c-3d", "elapsed_ms": 8000 },
{ "pmn": "2g-2f", "elapsed_ms": 28400 },
{ "pmn": "8d-8e", "elapsed_ms": 4100 }
]
}
Behavior: Once main time is exhausted, each move must complete within 30 seconds.
4. Pure Byōyomi — No Main Time
30 seconds per move from the start.
TOML
[[periods]]
duration_ms = 30000
plies = 1
[setup]
feen = "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
[[plies]]
pmn = "e2-e4"
elapsed_ms = 15000
[[plies]]
pmn = "e7-e5"
elapsed_ms = 22000
JSON
{
"periods": [
{ "duration_ms": 30000, "plies": 1 }
],
"setup": {
"feen": "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
},
"plies": [
{ "pmn": "e2-e4", "elapsed_ms": 15000 },
{ "pmn": "e7-e5", "elapsed_ms": 22000 }
]
}
5. Canadian — 25 Moves in 5 Minutes
Quota-based time control that resets after each batch.
TOML
[[periods]]
duration_ms = 300000
plies = 25
[setup]
feen = "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
[[plies]]
pmn = "e2-e4"
elapsed_ms = 10000
[[plies]]
pmn = "e7-e5"
elapsed_ms = 12500
JSON
{
"periods": [
{ "duration_ms": 300000, "plies": 25 }
],
"setup": {
"feen": "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
},
"plies": [
{ "pmn": "e2-e4", "elapsed_ms": 10000 },
{ "pmn": "e7-e5", "elapsed_ms": 12500 }
]
}
Behavior: After 25 moves, the 5-minute budget resets for the next 25 moves.
6. Main Time + Canadian Overtime
1 hour main time, then 25 moves in 5 minutes.
TOML
[[periods]]
duration_ms = 3600000
[[periods]]
duration_ms = 300000
plies = 25
[setup]
feen = "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
[[plies]]
pmn = "d2-d4"
elapsed_ms = 27300
[[plies]]
pmn = "d7-d5"
elapsed_ms = 18000
JSON
{
"periods": [
{ "duration_ms": 3600000 },
{ "duration_ms": 300000, "plies": 25 }
],
"setup": {
"feen": "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
},
"plies": [
{ "pmn": "d2-d4", "elapsed_ms": 27300 },
{ "pmn": "d7-d5", "elapsed_ms": 18000 }
]
}
7. Classical — 40 Moves in 2 Hours + 30 Minutes
Tournament-style multi-stage time control.
TOML
[[periods]]
duration_ms = 7200000
plies = 40
[[periods]]
duration_ms = 1800000
[setup]
feen = "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
[[plies]]
pmn = "e2-e4"
elapsed_ms = 50000
[[plies]]
pmn = "c7-c5"
elapsed_ms = 35000
[[plies]]
pmn = "g1-f3"
elapsed_ms = 42200
JSON
{
"periods": [
{ "duration_ms": 7200000, "plies": 40 },
{ "duration_ms": 1800000 }
],
"setup": {
"feen": "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
},
"plies": [
{ "pmn": "e2-e4", "elapsed_ms": 50000 },
{ "pmn": "c7-c5", "elapsed_ms": 35000 },
{ "pmn": "g1-f3", "elapsed_ms": 42200 }
]
}
Behavior: After 40 moves, remaining time carries over and 30 minutes are added.
8. Rapid — 15+10
15 minutes with 10 seconds increment.
TOML
[[periods]]
duration_ms = 900000
increment_ms = 10000
[setup]
feen = "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
[[plies]]
pmn = "e2-e4"
elapsed_ms = 5000
[[plies]]
pmn = "e7-e5"
elapsed_ms = 8000
JSON
{
"periods": [
{ "duration_ms": 900000, "increment_ms": 10000 }
],
"setup": {
"feen": "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
},
"plies": [
{ "pmn": "e2-e4", "elapsed_ms": 5000 },
{ "pmn": "e7-e5", "elapsed_ms": 8000 }
]
}
9. Bullet — 1+0
1 minute, no increment.
TOML
[[periods]]
duration_ms = 60000
[setup]
feen = "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
[[plies]]
pmn = "e2-e4"
elapsed_ms = 1200
[[plies]]
pmn = "e7-e5"
elapsed_ms = 800
[[plies]]
pmn = "d2-d4"
elapsed_ms = 1500
[[plies]]
pmn = "e5+d4"
elapsed_ms = 900
JSON
{
"periods": [
{ "duration_ms": 60000 }
],
"setup": {
"feen": "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
},
"plies": [
{ "pmn": "e2-e4", "elapsed_ms": 1200 },
{ "pmn": "e7-e5", "elapsed_ms": 800 },
{ "pmn": "d2-d4", "elapsed_ms": 1500 },
{ "pmn": "e5+d4", "elapsed_ms": 900 }
]
}
10. No Time Control
Games without time limits simply omit the periods section.
TOML
[sides.first]
name = "Human"
[sides.second]
name = "Engine"
[setup]
feen = "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
[[plies]]
pmn = "e2-e4"
[[plies]]
pmn = "e7-e5"
JSON
{
"sides": {
"first": { "name": "Human" },
"second": { "name": "Engine" }
},
"setup": {
"feen": "+rnbq+k^bn+r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/+RNBQ+K^BN+R / C/c"
},
"plies": [
{ "pmn": "e2-e4" },
{ "pmn": "e7-e5" }
]
}
Implementation Notes
Clock Calculation
For Fischer time control, the clock after each ply is:
remaining = previous_remaining - elapsed_ms + increment_ms
Period Transitions
- Bank exhausted: When remaining time reaches zero, transition to the next period (if any).
- Quota completed: When the move count reaches the
pliesvalue, transition to the next period or reset the current one.
Time Forfeit Detection
A player forfeits on time when:
- In a bank period: remaining time goes negative with no next period.
- In a per-ply period:
elapsed_ms > duration_ms.
See Also
- Minimal Documents — Basic examples
- Game Outcomes — Time forfeit and other terminations
- Complete Game Records — Full-featured examples
