https://github.com/echecsjs/direct-encounter
Direct encounter tiebreak for chess tournaments following FIDE rules. Zero dependencies.
https://github.com/echecsjs/direct-encounter
chess fide tiebreak typescript
Last synced: about 2 months ago
JSON representation
Direct encounter tiebreak for chess tournaments following FIDE rules. Zero dependencies.
- Host: GitHub
- URL: https://github.com/echecsjs/direct-encounter
- Owner: echecsjs
- License: mit
- Created: 2026-03-23T17:50:16.000Z (3 months ago)
- Default Branch: main
- Last Pushed: 2026-04-12T10:28:39.000Z (2 months ago)
- Last Synced: 2026-04-12T11:28:24.723Z (2 months ago)
- Topics: chess, fide, tiebreak, typescript
- Language: JavaScript
- Homepage: https://github.com/mormubis/direct-encounter#readme
- Size: 118 KB
- Stars: 1
- Watchers: 0
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
- Agents: AGENTS.md
Awesome Lists containing this project
README
# Direct Encounter
[](https://www.npmjs.com/package/@echecs/direct-encounter)
[](https://codecov.io/gh/echecsjs/direct-encounter)
[](LICENSE)
**Direct Encounter** is a TypeScript library implementing the Direct Encounter
tiebreak for chess tournaments, following the
[FIDE Tiebreak Regulations](https://handbook.fide.com/chapter/TieBreakRegulations032026)
(section 6). Zero runtime dependencies.
## Installation
```bash
npm install @echecs/direct-encounter
```
## Quick Start
```typescript
import { directEncounter } from '@echecs/direct-encounter';
import type { Game, GameKind, Player } from '@echecs/direct-encounter';
// Players A, B, C are tied on points
const players = [{ id: 'A' }, { id: 'B' }, { id: 'C' }];
// games[n] = round n+1; Game has no `round` field
const games: Game[][] = [
[{ black: 'B', result: 1, white: 'A' }], // round 1
[{ black: 'C', result: 0.5, white: 'A' }], // round 2
[{ black: 'C', result: 0, white: 'B' }], // round 3
];
const score = directEncounter('A', games, players);
// Returns A's score from games played against other tied players (B and C)
```
## API
### `directEncounter(playerId, games, players)`
**FIDE section 6** — Direct Encounter score. Returns the total points scored by
`playerId` in games played only against other players in the `players` array
(the tied group). The caller is responsible for passing the correct subset of
`players` — typically those who share the same tournament score as `playerId`.
Byes are excluded. Round is determined by array position: `games[0]` = round 1,
`games[1]` = round 2, etc. The `Game` type has no `round` field. The optional
`kind?: GameKind` field identifies unplayed rounds; byes are excluded from
Direct Encounter regardless.
```typescript
directEncounter(playerId: string, games: Game[][], players: Player[]): number
```
Also exported as `tiebreak` — an alias for `directEncounter`:
```typescript
import { tiebreak } from '@echecs/direct-encounter';
```
When all tied players have identical Direct Encounter scores (the common case in
Swiss), this tiebreak is inconclusive and the next tiebreak in the ordering
should be applied.
### Types
```typescript
import type { Game, GameKind, Player, Result } from '@echecs/direct-encounter';
```
| Type | Shape / Values |
| ---------- | -------------------------------------------------------------------------------------------- |
| `Player` | `{ id: string }` |
| `Result` | `0 \| 0.5 \| 1` |
| `Game` | `{ black: string; white: string; result: Result; kind?: GameKind }` |
| `GameKind` | `'forfeit-loss' \| 'forfeit-win' \| 'full-bye' \| 'half-bye' \| 'pairing-bye' \| 'zero-bye'` |
## Contributing
Contributions are welcome. Please open an issue at
[github.com/echecsjs/direct-encounter/issues](https://github.com/echecsjs/direct-encounter/issues).