- 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 and symmetric — both players share the same period configuration. PCN does not model per-player time budgets.
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 (counted in plies, i.e. half-moves) |
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 |
Ply vs Move: In PCN,
pliescounts half-moves (one player’s action). One full chess move = 2 plies. Traditional time control descriptions like “40 moves in 2 hours” therefore correspond toplies: 80.
1. Bank Only — Pure Main Time
10 minutes total, no increment. Both players share this budget.
TOML
[[periods]]
duration_ms = 600000
[setup]
feen = "-rnbqk^bn-r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/-RNBQK^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": "-rnbqk^bn-r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/-RNBQK^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 ply.
TOML
[[periods]]
duration_ms = 300000
increment_ms = 3000
[setup]
feen = "-rnbqk^bn-r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/-RNBQK^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": "-rnbqk^bn-r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/-RNBQK^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’s plies: indices 0 and 2):
- After ply 0: 300000 − 8000 + 3000 = 295000 ms remaining
- After ply 2: 295000 − 15000 + 3000 = 283000 ms remaining
3. Byōyomi — Main Time + Per-Ply Overtime
10 minutes main time, then 30 seconds per ply.
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 the main time bank is exhausted, each individual ply must complete within 30 seconds. Unused time within a ply does not carry over.
4. Pure Byōyomi — No Main Time
30 seconds per ply from the start.
TOML
[[periods]]
duration_ms = 30000
plies = 1
[setup]
feen = "-rnbqk^bn-r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/-RNBQK^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": "-rnbqk^bn-r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/-RNBQK^BN-R / C/c"
},
"plies": [
{ "pmn": "e2-e4", "elapsed_ms": 15000 },
{ "pmn": "e7-e5", "elapsed_ms": 22000 }
]
}
5. Canadian — 25 Plies in 5 Minutes
Quota-based time control: 5 minutes covers 25 plies, then the budget resets.
TOML
[[periods]]
duration_ms = 300000
plies = 25
[setup]
feen = "-rnbqk^bn-r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/-RNBQK^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": "-rnbqk^bn-r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/-RNBQK^BN-R / C/c"
},
"plies": [
{ "pmn": "e2-e4", "elapsed_ms": 10000 },
{ "pmn": "e7-e5", "elapsed_ms": 12500 }
]
}
Behavior: After 25 plies (counting each player’s plies independently), the 5-minute budget resets for the next 25 plies.
6. Main Time + Canadian Overtime
1 hour main time, then 25 plies in 5 minutes.
TOML
[[periods]]
duration_ms = 3600000
[[periods]]
duration_ms = 300000
plies = 25
[setup]
feen = "-rnbqk^bn-r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/-RNBQK^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": "-rnbqk^bn-r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/-RNBQK^BN-R / C/c"
},
"plies": [
{ "pmn": "d2-d4", "elapsed_ms": 27300 },
{ "pmn": "d7-d5", "elapsed_ms": 18000 }
]
}
7. Classical — 80 Plies in 2 Hours + 30 Minutes
Tournament-style multi-stage time control. The traditional description “40 moves in 2 hours” corresponds to plies: 80 in PCN (1 move = 2 plies).
TOML
[[periods]]
duration_ms = 7200000
plies = 80
[[periods]]
duration_ms = 1800000
[setup]
feen = "-rnbqk^bn-r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/-RNBQK^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": 80 },
{ "duration_ms": 1800000 }
],
"setup": {
"feen": "-rnbqk^bn-r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/-RNBQK^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 80 plies, the remaining time from Period 1 carries over and 30 minutes from Period 2 are added.
8. Rapid — 15+10
15 minutes with 10 seconds increment per ply.
TOML
[[periods]]
duration_ms = 900000
increment_ms = 10000
[setup]
feen = "-rnbqk^bn-r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/-RNBQK^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": "-rnbqk^bn-r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/-RNBQK^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 = "-rnbqk^bn-r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/-RNBQK^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": "-rnbqk^bn-r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/-RNBQK^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 = "-rnbqk^bn-r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/-RNBQK^BN-R / C/c"
[[plies]]
pmn = "e2-e4"
[[plies]]
pmn = "e7-e5"
JSON
{
"sides": {
"first": { "name": "Human" },
"second": { "name": "Engine" }
},
"setup": {
"feen": "-rnbqk^bn-r/+p+p+p+p+p+p+p+p/8/8/8/8/+P+P+P+P+P+P+P+P/-RNBQK^BN-R / C/c"
},
"plies": [
{ "pmn": "e2-e4" },
{ "pmn": "e7-e5" }
]
}
Implementation Notes
Clock Calculation
For Fischer time control, the remaining budget after each ply is:
remaining = previous_remaining - elapsed_ms + increment_ms
Ply vs Move Counting
PCN counts time in plies (half-moves). When mapping conventional time control descriptions:
| Convention | Meaning | PCN plies value |
|---|---|---|
| “40 moves” | 40 full moves | 80 |
| “25 moves” | 25 full moves | 50 |
| “1 move” (byōyomi) | 1 half-move | 1 |
Period Transitions
- Bank exhausted: When remaining time reaches zero, transition to the next Period (if any).
- Quota completed: When the ply 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 available.
- In a per-ply period (
plies: 1):elapsed_ms > duration_msfor that ply.
See Also
- Minimal Documents — Basic examples
- Game Outcomes — Time forfeit and other terminations
- Complete Game Records — Full-featured examples
