{"id":1338,"date":"2026-07-12T20:09:02","date_gmt":"2026-07-13T00:09:02","guid":{"rendered":"https:\/\/jolivo.xenius.org\/?p=1338"},"modified":"2026-07-16T01:37:02","modified_gmt":"2026-07-16T05:37:02","slug":"catanalyzer-an-evaluation-tool-for-static-positions-on-settlers-of-catan","status":"publish","type":"post","link":"https:\/\/jolivo.xenius.org\/?p=1338","title":{"rendered":"Catanalyzer \u2014 An Evaluation Tool for Static Positions in &#8220;Settlers of Catan&#8221;"},"content":{"rendered":"<p>I&#8217;m an avid Settlers of Catan player. To track and develop my positions, I developed my own metrics (Cumulative Resources vs Purchasing Power),\u00a0 but they were really based on intuition since calculating these on the fly wasn&#8217;t really possible, not to mention I wasn&#8217;t completely sure my metrics actually any mathematical or game theoretical merit! So after some research into what professional Settlers players use, I vibe coded the Catanalyzer.<\/p>\n<p>The Catanalyzer tracks each player&#8217;s cumulative resource earnings turn by turn. Two purchasing-power metrics are computed from these snapshots to give different perspectives on a player&#8217;s economic position. Neither metric reflects actual in-game spending \u2014 resources are never deducted from the simulation. Instead, each metric answers a hypothetical question: &#8220;If this player spent all of their accumulated resources right now, what is the best possible outcome?&#8221;<\/p>\n<p>Both metrics use the same bank-trading model: a player may trade surplus resources for needed ones at a fixed exchange rate, adjusted downward if they control a port.<\/p>\n<p>I also added what the pros use: Pip Counting and RDI (resource diversity index).<\/p>\n<p>You can play with the Catanalyzer here: <a href=\"https:\/\/xenius.org\/Catanalyzer\/\">Catanalyzer<\/a><\/p>\n<p>Catanalyzer uses a client-side, browser-based Settlers of Catan board analyzer\/simulator. Everything runs in the browser \u2014 no backend.<\/p>\n<p>Core:<br \/>\nLanguage \u2502 TypeScript 5.6 (strict mode, ES2020 target)<br \/>\nUI framework \u2502 React 18.3 (function components + hooks, react-jsx transform)<br \/>\nBuild tool \/ dev server \u2502 Vite 5.4 with @vitejs\/plugin-react<br \/>\nModule system \u2502 Native ESM (&#8220;type&#8221;: &#8220;module&#8221;, bundler resolution)<\/p>\n<p><strong>Styling:<\/strong><\/p>\n<p>&#8211; Tailwind CSS 3.4 utility-first CSS<br \/>\n&#8211; PostCSS 8 + Autoprefixer (Tailwind&#8217;s build pipeline)<\/p>\n<p><strong>Key libraries:<\/strong><\/p>\n<p>&#8211; Recharts 3.9 \u2014 data visualization (resource charts, stacked-area, macro-score, 2D\/3D charts)<br \/>\n&#8211; react-grid-layout 1.5 \u2014 the draggable\/resizable modular dashboard (GridBoard), with react-draggable underneath<\/p>\n<p><strong>Project structure (src\/):<\/strong><\/p>\n<p>&#8211; Domain logic (framework-agnostic .ts): boardGenerator.ts, boardConstants.ts, hexMath.ts (utils), rdi.ts (an analytics\/metric module), types.ts<br \/>\n&#8211; Components (.tsx): hex board rendering (HexBoard, HexTile, and vertex\/edge\/port overlays), interactive editing (BoardEditor, PlacementToolbar), simulation (DiceRoller), and analytics panels (RDIPanel, ResourceDisplay, several chart components)<\/p>\n<p><strong>Build &amp; scripts:<\/strong><\/p>\n<p>&#8211; npm run dev (Vite dev server), npm run build (tsc &amp;&amp; vite build), npm run preview<br \/>\n&#8211; base: &#8216;.\/&#8217; in Vite config \u2192 emits relative asset URLs so the built dist\/ works from any hosting path (static deploy)<\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>I&#8217;m an avid Settlers of Catan player. To track and develop my positions, I developed my own metrics (Cumulative Resources vs Purchasing Power),\u00a0 but they were really based on intuition since calculating these on the fly wasn&#8217;t really possible, not to mention I wasn&#8217;t completely sure my metrics actually any mathematical or game theoretical merit! [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":1339,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[14,17,1],"tags":[],"class_list":["post-1338","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-rants","category-simulations","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/jolivo.xenius.org\/index.php?rest_route=\/wp\/v2\/posts\/1338","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/jolivo.xenius.org\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/jolivo.xenius.org\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/jolivo.xenius.org\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/jolivo.xenius.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1338"}],"version-history":[{"count":6,"href":"https:\/\/jolivo.xenius.org\/index.php?rest_route=\/wp\/v2\/posts\/1338\/revisions"}],"predecessor-version":[{"id":1357,"href":"https:\/\/jolivo.xenius.org\/index.php?rest_route=\/wp\/v2\/posts\/1338\/revisions\/1357"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/jolivo.xenius.org\/index.php?rest_route=\/wp\/v2\/media\/1339"}],"wp:attachment":[{"href":"https:\/\/jolivo.xenius.org\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1338"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/jolivo.xenius.org\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1338"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/jolivo.xenius.org\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1338"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}