Days Without Strife — Planner Optimizer

Game
Starting resources
Tradeable into (Trade Goods convert 1-for-1 for scoring)
Cities

The name is the city's unique identifier — it labels the output plan and is what an agent's "forced city" refers to. Upgrades are the ones already installed at the start; the available choices follow the city's type. Adjacent cities lists neighbours by name (adjacency is symmetric); an Industrialist Governor grants free Infrastructure to its city and every adjacent one.

Agents

Pick a known agent; its governor behaviour is implicit and shown in the Effect column. The name identifies it and is what a forced city refers back to. All effects apply while the agent is Governor of a city (at most one city per turn).

Objective — scoring terms

Each term scores a resource (or renown) at the end of a turn. For a log term, write a JS expression that evals to a one-argument function, e.g. (x) => Math.log2(x + 1). It is called over amounts 0..max_resource in the browser to build the lookup table.

Resource constraints
Forced conversions

A conversion is not a choice for the optimizer — it always happens on the given turn, spending from amount of one resource and yielding to amount of another. The optimizer is forced to have the spent resource available at that turn. These appear in the solution and the CSV download.

Optional conversions

An optional conversion is a choice for the optimizer — it may apply the conversion (spending from amount of one resource to yield to amount of another on the given turn) or refrain entirely. Max count lets it apply the conversion up to that many times on the turn. The chosen counts appear in the solution and the CSV download.