Oldworld

a classical chess engine for the UCI protocol

version 0.6.0

Oldworld is a lightweight UCI compliant chess engine built around a hand-crafted classical evaluation, written to play as closely as it can to an old school world champion from back in the day. It weighs pawn structure, space and restraint the way those players did, with no neural network and no weights file to ship alongside it.

Parts of this codebase were written with AI assistance. Oldworld is a fork of Berserk. Much of the work since the fork, including the classical evaluation, the pawn-structure layer, refactoring and tooling, was produced in collaboration with an AI assistant, directed and tested by the author. Every functional change was gated by a 48-game match before shipping, and the results are recorded, including the changes that failed and were reverted. This is disclosed so that testers and other developers can judge the project accurately.

Classical by design

The evaluation is entirely hand-written. NNUE was removed outright rather than left dormant, so there is no accumulator, no network file and nothing to download beside the executable. Every term is a term somebody chose and can explain.

Verified, not asserted

Four hand-written self-tests run inside every bench, cross-checking the structure layer, the board, the move generator and the static exchange evaluator. Perft and mate-in-one are hard invariants; no change ships if either moves.

Measured, and reverted

Every functional change plays a paired-opening match against the previous build and ships only if it wins. Ideas that lose are reverted and written down, the negative results are kept in the ledger alongside the wins.

Why classical

Nearly every strong engine today evaluates positions with a neural network. The networks are effective and they are not going away, but they are opaque: a number comes out and nobody, including the author, can say precisely why.

Oldworld goes the other way on purpose. Every term in the evaluation was chosen by a person, has a name, and can be explained. When it prefers a position, there is a reason written in the source that you can read. That choice costs some strength against the best networks, and it buys something back: an engine whose judgement is legible, and one that can be aimed at a particular kind of chess rather than simply at winning.

How it plays

The engine has a pawn-structure layer that most engines do not: it measures how locked a position is on a 0 to 64 scale, tracks which pawns are frozen against each other, and works out the squares each side needs for a freeing pawn break. Several parts of the engine read from it, and the result is a recognisable style.

It values space, but only when space is worth something

A flat bonus for territory scores badly, because in an open position space usually just means overextension. Oldworld scales the bonus by how locked the structure is, so it wants space when the opponent cannot free himself and shrugs at it otherwise.

It restrains breaks before they exist

Rather than meeting a pawn break when it comes, the engine counts the squares the opponent needs for that break and rewards covering them first. A break he cannot make is a plan he never gets.

It keeps tension rather than resolving it

While holding a modest advantage, move ordering examines tension-building pawn moves earlier and tension-releasing trades later. This changes only which moves it looks at first, never what is legal, but it steers the engine toward keeping the position pregnant.

It is patient in closed positions

When the structure is locked, pruning relaxes and quiet piece manoeuvres onto strong squares get searched more deeply. It thinks like a positional player where that is correct, and like a tactician everywhere else.

Strength

Being measured. A rating estimate is in progress: several hundred games against engines with published CCRL ratings, at a fixed time control on a single thread, anchored to those ratings. The result will be published here with the opponents, the time control and the error margin, so it can be checked.

Oldworld has not been submitted to CCRL or CEGT. Any figure posted here is an in-house estimate on one machine, not an official rating.

Download

Latest version: 0.6.0

Download Windows x64 · 425 KB
needs AVX2 (CPUs from roughly 2015)
Download for older CPUs Windows x64 · 423 KB
runs on much older hardware
Not sure which? Take the first. If it refuses to start, use the second. Both are the same engine, built for different processors.

Download the source code · 299 KB · complete source for the builds above

Installation

  1. Download the build and unzip it wherever you keep engines.
  2. In your chess GUI, add a new UCI engine and point it at oldworld.exe.
  3. Set Hash and Threads to suit your machine. Nothing else is required, there is no network file to fetch.

Windows x64. Builds target modern instruction sets; use the portable build if your CPU is older.

Configuration

Oldworld exposes the standard UCI options plus dials for time management, evaluation weights and search selectivity. Search and evaluation knobs are inert at their defaults, the engine plays identically until one is changed.

OptionTypeDefaultRangePurpose
Hashspin162–maxTransposition table size in MB.
Threadsspin11–2048Search threads (lazy SMP).
SyzygyPathstringn/an/aDirectory of Syzygy tablebase files.
MultiPVspin11–256Number of principal variations reported.
Pondercheckfalsen/aThink on the opponent's clock.
UCI_ShowWDLchecktruen/aReport win/draw/loss alongside the score.
UCI_Chess960checkfalsen/aFischer random castling rules.
MoveOverheadspin1000–10000Milliseconds reserved for GUI and IPC latency.
SlowMoverspin10010–100Percent of stock thinking time to use.
EvalScalespin10025–300Scales reported evaluation magnitude.
HCEWeightsstringn/an/aLoad evaluation weights at runtime, no rebuild.
StrictSearchcheckfalsen/aTighter pruning and extra late-move reduction.
Contemptspin0-100–100Draw aversion; scales with structural closedness.
RfpMarginspin11020–200Reverse futility pruning margin.
RazorMarginspin19060–300Razoring margin.
NmpMarginspin290150–700Null-move pruning margin.
FutilityBasespin950–200Futility pruning base margin.
FutilityMulspin5610–120Futility margin per depth.
HistPruneMulspin38001000–6000History-based pruning threshold.
LmrDivisorspin21351000–4000Late-move reduction divisor.
HistLmrMulspin82–24History influence on reductions.
TimeAllocPctspin575200–1500Share of the clock budgeted per move.
TmMaxPctspin5500500–9900Hard ceiling on one move's share of the clock.
TmMaxMulspin59281000–8000Ceiling as a multiple of the soft budget.
TmIncMovesspin501–50Future increments counted as available now.
BreakDenyMg / BreakDenyEgspin0-40–120Denying the opponent's pawn breaks.
BlockadeMg / BlockadeEgspin0-40–120Blockading enemy passed pawns.
SpaceClosedMgspin12-40–120Space bonus scaled by structural closedness.
SpaceAreaMg / SpaceAreaEgspin6 / 3-40–120Raw space-area bonus.

Changelog

0.6.0

Development history

Originality

Lineage

Oldworld is a disclosed fork of Berserk by Jay Honnold, under GPL-3. What is inherited is stated plainly rather than blurred: the transposition table and a handful of cold utility files remain upstream work.

The evaluation is a different matter: it was written from scratch after the neural network was removed, and exists in no parent engine. The search, board representation, move generator and static exchange evaluator have been reorganised, hardened and given their own self-tests, but they still rest on Berserk's foundations rather than replacing them.

Idea ports

Techniques circulate openly in computer chess. Where an idea came from another open engine, correction history, correction-scaled margins, TT-cutoff bonuses, the concept is credited in a comment at the site that uses it, and the implementation was written here.

Original work

The Structure Engine, Patient Search, Keep-the-Tension ordering and Squeeze Contempt exist in no parent or reference engine. So does the testing method: a paired-opening match gate that every functional change must win, and a self-test suite that runs inside every benchmark.

Negative results

Failures are recorded, not quietly dropped. A hand-crafted “Harmony” evaluation term measured 47.9% twice and was reverted. Two time-management re-fits lost roughly 45 Elo and were reverted. Both remain in the ledger, with the reasoning that explains why they failed.