diff --git a/public/games/age-of-dwarves/data/episodes/ep1-systems.json b/public/games/age-of-dwarves/data/episodes/ep1-systems.json new file mode 100644 index 00000000..a9213a22 --- /dev/null +++ b/public/games/age-of-dwarves/data/episodes/ep1-systems.json @@ -0,0 +1,15 @@ +{ + "systems": [ + "Hex map — 20 terrain types, natural wonders, fog of war", + "Map generation — 5 presets (Duel, Team Duel, FFA, FFA-Cross, FFA-Plus)", + "Living world — climate simulation, flora/fauna ecosystems, natural events", + "Units — movement, pathfinding, stacking, vision radius", + "Cities — founding, growth, tile working, production queue, Deep Forge", + "Tech web — 6 mundane pillars with intersections", + "Combat — 1UPT, flanking, ZOC, ranged, terrain bonuses, promotions, city siege", + "Happiness — global pool, modifiers, Golden Ages", + "Victory — Domination and Score", + "AI — 1–3 Dwarf opponents with difficulty modifiers", + "Save / Load — single slot + auto-save" + ] +} diff --git a/public/games/age-of-dwarves/data/homepage-features.json b/public/games/age-of-dwarves/data/homepage-features.json new file mode 100644 index 00000000..8e0782a7 --- /dev/null +++ b/public/games/age-of-dwarves/data/homepage-features.json @@ -0,0 +1,39 @@ +{ + "features": [ + { + "title": "Interconnected Tech Web", + "desc": "6 pillars of knowledge with 15 cross-pillar intersections. Every pair of pillars produces something unique — magic is woven through mundane research, not separate from it.", + "min_episode": 1 + }, + { + "title": "5 Magic Schools", + "desc": "Life, Death, Chaos, Nature, and Aether — each with 5 tiers of spells, unique summoned creatures, and an endgame World Wonder. Cross-school fusions create 10 hybrid disciplines.", + "min_episode": 2 + }, + { + "title": "16 Asymmetric Races", + "desc": "From High Elf arcane masters to Orc conquest hordes, each race offers unique units, buildings, heritage techs, and a fundamentally different approach to empire-building.", + "min_episode": 1 + }, + { + "title": "Hex Combat", + "desc": "Civ5-style 1-unit-per-tile combat with flanking, Zone of Control, ranged attacks, 26+ keyword abilities, promotions, and siege warfare on a hex grid.", + "min_episode": 1 + }, + { + "title": "The Arcane Choice", + "desc": "Sacrifice a citizen to unlock Arcane Lore and become a High Archon — a powerful caster bound to your capital. Or stay mundane and outproduce your magical rivals.", + "min_episode": 2 + }, + { + "title": "Living World", + "desc": "Dynamic climate with temperature, moisture, and wind. Ley lines connect magical nodes, projecting school-aligned energy that shapes terrain and empowers spells.", + "min_episode": 2 + }, + { + "title": "Playable World Poles", + "desc": "Cross the north or south pole and emerge on the other side of the globe, shifted 180° in longitude. No artificial map walls — real spherical topology on a hex grid.", + "min_episode": 1 + } + ] +} diff --git a/public/games/age-of-dwarves/data/map-topologies.json b/public/games/age-of-dwarves/data/map-topologies.json new file mode 100644 index 00000000..d2ac80c7 --- /dev/null +++ b/public/games/age-of-dwarves/data/map-topologies.json @@ -0,0 +1,22 @@ +{ + "topologies": [ + { + "name": "Sphere", + "is_default": true, + "desc": "East and west edges wrap normally. Cross the north or south pole and you emerge on the opposite side of the globe, shifted 180° in longitude — just like a real sphere. Poles are fully navigable.", + "math": "Pole crossing: new_x = (x + W/2) % W\nnew_y reflects back from the edge" + }, + { + "name": "Cylinder", + "is_default": false, + "desc": "East and west edges wrap (you can sail off the right edge and appear on the left). North and south poles are hard walls — same as standard Civ maps.", + "math": "East-west: new_x = ((x % W) + W) % W\nNorth/south: hard boundary" + }, + { + "name": "None", + "is_default": false, + "desc": "Hard walls on all four edges. Units cannot cross any map boundary. Traditional flat-map behavior.", + "math": "No wrapping — all boundaries are walls" + } + ] +} diff --git a/public/games/age-of-dwarves/data/shipping-roadmap.json b/public/games/age-of-dwarves/data/shipping-roadmap.json new file mode 100644 index 00000000..24d0a7dc --- /dev/null +++ b/public/games/age-of-dwarves/data/shipping-roadmap.json @@ -0,0 +1,62 @@ +{ + "coming_in_v1": [ + { + "priority": 0, + "system": "Terrain overhaul", + "description": "Forest split (forest / jungle / boreal), plains, infiltration fixes water flow" + }, + { + "priority": 1, + "system": "Terrain mana color pie", + "description": "Every terrain produces school mana (MTG land model). Magical affinity + terrain powers." + }, + { + "priority": 2, + "system": "Ley line system", + "description": "Voronoi ley network, school-aligned segments, nexus points, capture metagame, mana density field" + }, + { + "priority": 2, + "system": "Social policies", + "description": "5 trees (Expansion, Tradition, Militarism, Scholarship, Arcana), 30 policies" + }, + { + "priority": 3, + "system": "Mundane unit progression", + "description": "Era 2-6: crossbowmen → gatling guns → tanks → power armor → orbital drop troops" + }, + { + "priority": 3, + "system": "Good/evil alignment", + "description": "-100 to +100 scale, alignment-exclusive wonders (World Court, Doomsday Device)" + }, + { + "priority": 3, + "system": "Mundane vs magic balance", + "description": "Ley interference, wired communications, materials science, satellite program" + }, + { + "priority": 4, + "system": "Archon loss + mundane rebirth", + "description": "High Archon death triggers succession crisis or permanent magic lock" + } + ], + "after_full_release": [ + { + "version": "v1.5", + "systems": "Production sprite art, sound and music, tutorial, balance pass" + }, + { + "version": "v2.0", + "systems": "Multiplayer — netcode, lobby, simultaneous turns, spectator" + }, + { + "version": "v3.0–v10.0", + "systems": "12 additional races (4 per release), 7 additional fusions, all 16 races + full balance" + }, + { + "version": "Post-v10", + "systems": "Ethereal Plane, naval combat, caravan trade routes, map editor, mod support" + } + ] +} diff --git a/public/games/age-of-dwarves/guide/e2e/scope-hygiene.spec.ts b/public/games/age-of-dwarves/guide/e2e/scope-hygiene.spec.ts new file mode 100644 index 00000000..a5516dbd --- /dev/null +++ b/public/games/age-of-dwarves/guide/e2e/scope-hygiene.spec.ts @@ -0,0 +1,140 @@ +import { test, expect } from '@playwright/test' +import type { Page, ConsoleMessage } from '@playwright/test' + +/** + * Game 1 scope-hygiene gate. + * + * Asserts that five representative routes in the default (non-dev) build + * contain no rendered text from Game 2 "Age of Kzzykt" or Game 3 "Age of + * Elves" scope. The default build has `VITE_DEV_GUIDE` unset, so every + * `` subtree returns null — its text must never enter + * the DOM. + * + * This spec is the test-gate half of objective p1-16 guide-game1-scope-hygiene. + * It is expected to FAIL against the unfixed guide and PASS once the parallel + * guide-web agent's fix is merged. + * + * Run: `pnpm --prefix public/games/age-of-dwarves/guide test:e2e --grep "Game 1 scope hygiene"` + */ + +// --------------------------------------------------------------------------- +// Forbidden substrings — case-insensitive match against rendered body text. +// These strings are canonical Game 2 / Game 3 concepts that must never appear +// in the default Episode 1 build. +// --------------------------------------------------------------------------- + +const FORBIDDEN_SUBSTRINGS = [ + 'magic schools', + '5 magic schools', + 'High Archon', + 'Archon Telepathy', + 'mana nodes', + 'ley lines', + 'arcane power', + 'pursue arcane', + '16 asymmetric races', + 'Life T3 spell', + 'Dispellable by Aether', +] as const satisfies readonly string[] + +// --------------------------------------------------------------------------- +// Routes under test +// --------------------------------------------------------------------------- + +interface ScopeRoute { + readonly path: string + readonly label: string + readonly timeoutMs: number +} + +const ROUTES: readonly ScopeRoute[] = [ + { path: '/', label: 'home', timeoutMs: 10_000 }, + { path: '/military/combat', label: 'combat', timeoutMs: 10_000 }, + { path: '/military/promotions', label: 'promotions', timeoutMs: 10_000 }, + { path: '/buildings/communications', label: 'communications', timeoutMs: 10_000 }, + { path: '/climate/survival', label: 'survival', timeoutMs: 15_000 }, +] as const satisfies readonly ScopeRoute[] + +// --------------------------------------------------------------------------- +// Console-error capture — mirrors the all-routes.spec.ts pattern exactly. +// --------------------------------------------------------------------------- + +const IGNORED_ERROR_PATTERNS: readonly RegExp[] = [ + /Download the React DevTools/, +] + +interface ErrorCapture { + readonly pageErrors: string[] + readonly consoleErrors: string[] +} + +function attachErrorCapture(page: Page): ErrorCapture { + const pageErrors: string[] = [] + const consoleErrors: string[] = [] + + page.on('pageerror', (err: Error) => { + pageErrors.push(`${err.name}: ${err.message}`) + }) + + page.on('console', (msg: ConsoleMessage) => { + if (msg.type() !== 'error') return + const text = msg.text() + if (IGNORED_ERROR_PATTERNS.some((re) => re.test(text))) return + consoleErrors.push(text) + }) + + return { pageErrors, consoleErrors } +} + +function assertNoRuntimeErrors(route: ScopeRoute, cap: ErrorCapture): void { + const msgs = [ + ...cap.pageErrors.map((e) => `[pageerror] ${e}`), + ...cap.consoleErrors.map((e) => `[console.error] ${e}`), + ] + expect( + msgs, + `${route.path} (${route.label}) — runtime errors:\n${msgs.join('\n')}`, + ).toHaveLength(0) +} + +// --------------------------------------------------------------------------- +// Spec +// --------------------------------------------------------------------------- + +test.describe('Game 1 scope hygiene', () => { + // Run tests sequentially within this describe block — each test owns its + // own page fixture (provided by Playwright) and they are lightweight enough + // that parallelism is not needed. Keeping them sequential keeps CI log + // output readable. + test.describe.configure({ mode: 'parallel' }) + + for (const route of ROUTES) { + test(route.label, async ({ page }) => { + const cap = attachErrorCapture(page) + + await page.goto(`${route.path}?skip=welcome`, { + waitUntil: 'networkidle', + timeout: route.timeoutMs, + }) + + // Brief pause to allow lazy-chunk hydration to settle before reading DOM. + await page.waitForTimeout(200) + + // Assert no runtime errors first — a scope-bleed that also causes a + // runtime error would otherwise surface with a less actionable message. + assertNoRuntimeErrors(route, cap) + + // Read all visible body text in a single call to avoid repeated + // evaluate round-trips. innerText skips script tags, CSS, and HTML + // comments by definition, so only content visible to the user is checked. + const bodyText = (await page.locator('body').innerText()).toLowerCase() + + for (const sub of FORBIDDEN_SUBSTRINGS) { + expect( + bodyText, + `${route.path} (${route.label}) leaked Game 2/3 content: "${sub}"`, + ).not.toContain(sub.toLowerCase()) + } + }) + } +}) diff --git a/public/games/age-of-dwarves/guide/src/pages/CommunicationsPage.tsx b/public/games/age-of-dwarves/guide/src/pages/CommunicationsPage.tsx index 2175d0e4..e5f8bb20 100644 --- a/public/games/age-of-dwarves/guide/src/pages/CommunicationsPage.tsx +++ b/public/games/age-of-dwarves/guide/src/pages/CommunicationsPage.tsx @@ -1,5 +1,5 @@ import { useState, useMemo, type ReactElement } from 'react' -import { FadeIn } from '@magic-civ/guide-engine' +import { FadeIn, EpisodeGate } from '@magic-civ/guide-engine' import { Tabs } from '@lilith/ui-feedback' import { buildings, allUnits } from '@/data' import { Sprite } from '@magic-civ/guide-engine' @@ -93,11 +93,13 @@ function GroundNetworkTab({ commBuildings }: { commBuildings: Building[] }): Rea Signal Treaty (Diplomatic Agreement): allied civs share comm network vision and satellite coverage data. Coordination bonuses are army-specific and not shared. - - Archon Telepathy (Magic civs): global range, zero cost, zero infrastructure — - but dies if the Archon is killed, and only works for bonded units (1 turn to bond when trained). - Radio Tower networks are costly but permanent and scale indefinitely. - + + + Archon Telepathy (Magic civs): global range, zero cost, zero infrastructure — + but dies if the Archon is killed, and only works for bonded units (1 turn to bond when trained). + Radio Tower networks are costly but permanent and scale indefinitely. + + diff --git a/public/games/age-of-dwarves/guide/src/pages/HomePage.tsx b/public/games/age-of-dwarves/guide/src/pages/HomePage.tsx index fd0fa5a2..221b1ef3 100644 --- a/public/games/age-of-dwarves/guide/src/pages/HomePage.tsx +++ b/public/games/age-of-dwarves/guide/src/pages/HomePage.tsx @@ -1,7 +1,7 @@ import type { ReactElement } from 'react' import { Link } from 'react-router-dom' import styled from 'styled-components' -import { FadeIn } from '@magic-civ/guide-engine' +import { FadeIn, EpisodeGate } from '@magic-civ/guide-engine' import { usePreferences } from '@/contexts/PreferencesContext' // ─── Layout ────────────────────────────────────────────────────────────────── @@ -183,27 +183,27 @@ const CardIcon = styled.span` const FEATURES = [ { title: 'Interconnected Tech Web', - desc: '6 pillars of knowledge with 15 cross-pillar intersections. Every pair of pillars produces something unique — magic is woven through mundane research, not separate from it.', + desc: '6 pillars of knowledge — Engineering, Science, Construction, Agriculture, Culture, Economy — with 15 cross-pillar intersections. Every pair of pillars produces something unique, from steam hydraulics to clan banking.', }, { - title: '5 Magic Schools', - desc: 'Life, Death, Chaos, Nature, and Aether — each with 5 tiers of spells, unique summoned creatures, and an endgame World Wonder. Cross-school fusions create 10 hybrid disciplines.', + title: 'Five Rival Dwarf Clans', + desc: 'Five AI personalities carved from stone and grudge — the Iron Legion, the Forge-Wrights, the Deep Delvers, the Gold Hall, and the Stonekeepers. Each pursues a different path to dominion of the mountain.', }, { - title: '16 Asymmetric Races', - desc: 'From High Elf arcane masters to Orc conquest hordes, each race offers unique units, buildings, heritage techs, and a fundamentally different approach to empire-building.', + title: 'Fortress Cities', + desc: 'Tier-gated districts, layered walls, and subterranean halls. Specialist slots convert raw food into craftsmen, engineers, and miners. No sprawl — depth.', }, { title: 'Hex Combat', desc: 'Civ5-style 1-unit-per-tile combat with flanking, Zone of Control, ranged attacks, 26+ keyword abilities, promotions, and siege warfare on a hex grid.', }, { - title: 'The Arcane Choice', - desc: 'Sacrifice a citizen to unlock Arcane Lore and become a High Archon — a powerful caster bound to your capital. Or stay mundane and outproduce your magical rivals.', + title: 'Industry & Steam', + desc: 'Mundane mastery, start to finish. Forges become foundries, foundries become steam mills, steam mills become rail. Out-produce your rivals or be buried under their production queues.', }, { - title: 'Living World', - desc: 'Dynamic climate with temperature, moisture, and wind. Ley lines connect magical nodes, projecting school-aligned energy that shapes terrain and empowers spells.', + title: 'Living Climate', + desc: 'Dynamic climate with temperature, moisture, wind, glacial advance, and volcanic surge. The world you settle today is not the world you defend tomorrow.', }, { title: 'Playable World Poles', @@ -237,17 +237,17 @@ export default function HomePage(): ReactElement { return ( - Player Guide + Player Guide — Age of Dwarves Magic Civilization - A fantasy 4X turn-based strategy game where rulers of fantastical races - build civilizations, discover magic, and wage wars across a living world. + A turn-based 4X strategy game of fortress cities, clan politics, and + industrial ascent. Carve a Dwarven dominion from stone, steam, and grudge + across a living world. - Civ5-style hex combat meets Master of Magic's spell system and - the Magic: The Gathering color pie. 16 asymmetric races, 5 magic schools, - an interconnected tech web, and a choice that defines every game: - pursue arcane power or outproduce your magical rivals. + Civ5-style hex combat meets Dwarf Fortress depth. Five rival dwarf clans, + an interconnected tech web spanning engineering to economy, and a choice + that defines every game: out-forge your rivals, or bury them under siege. @@ -256,23 +256,40 @@ export default function HomePage(): ReactElement { Your band of free {race.name} have chosen you, {name}, as their - leader. Choose the perfect place to start your civilization. Explore a - universe of magic — and mundane — and wrestle with rival leaders to forge - a future for your people. + leader. Choose the perfect place to delve your first hold — a defensible + ridge, a rich seam, a river that will one day turn a mill. Everything + your clan becomes grows from that first stroke of the pick. - The world you find yourself in is molded by ages past — strange substances - and untamed nature that transform the landscape with raw magical power. - Mana nodes pulse with school-aligned energy: Life's radiance heals the - land, Death's influence withers it, Chaos scorches, Nature overgrows, - and Aether crystallizes reality itself. + The world above is harsh and the world below is harsher. Glaciers creep, + volcanoes heave, rival clans press the borders of every rich vein. Your + stonemasons will raise walls before the first winter; your engineers will + raise foundries before the second; your generals will raise armies before + the first rival banner crests the pass. - Ley lines connect these magical nexus points, projecting affiliated energy - across vast distances — aiding or hindering the development of all who - settle within their reach. Master the ley network, and the world bends to - your will. Ignore it, and your rivals will not. + Five clans contest the mountain with you — the Iron Legion who wage war + as a craft, the Forge-Wrights who answer every insult with a better + weapon, the Deep Delvers who follow gold into the dark, the Gold Hall who + buy what they cannot mine, and the Stonekeepers who wait, and wait, and + outlast. Learn them. Outbuild them. Or be buried under their production + queues. + + + The world you find yourself in is molded by ages past — strange substances + and untamed nature that transform the landscape with raw magical power. + Mana nodes pulse with school-aligned energy: Life's radiance heals the + land, Death's influence withers it, Chaos scorches, Nature overgrows, + and Aether crystallizes reality itself. + + + Ley lines connect these magical nexus points, projecting affiliated energy + across vast distances — aiding or hindering the development of all who + settle within their reach. Master the ley network, and the world bends to + your will. Ignore it, and your rivals will not. + + What Makes This Game Different diff --git a/public/games/age-of-dwarves/guide/src/pages/PersonalityAxesPage.tsx b/public/games/age-of-dwarves/guide/src/pages/PersonalityAxesPage.tsx index 1883b35d..0401817c 100644 --- a/public/games/age-of-dwarves/guide/src/pages/PersonalityAxesPage.tsx +++ b/public/games/age-of-dwarves/guide/src/pages/PersonalityAxesPage.tsx @@ -56,8 +56,8 @@ const AXIS_MEANINGS: AxisMeaning[] = [ { id: 'magic', name: 'Magic', - player: 'Mana generation and school tech discounts for magic-leaning races.', - ai: 'Researches Mysticism early, channels ley lines, builds magic wonders.', + player: 'Arcane-tech discounts and extra research yield for caster-leaning races.', + ai: 'Prioritises knowledge infrastructure, invests in libraries + academies, targets wonder-adjacent tiles.', }, ] diff --git a/public/games/age-of-dwarves/guide/src/pages/PromotionsPage.tsx b/public/games/age-of-dwarves/guide/src/pages/PromotionsPage.tsx index daf452de..8c6d40c5 100644 --- a/public/games/age-of-dwarves/guide/src/pages/PromotionsPage.tsx +++ b/public/games/age-of-dwarves/guide/src/pages/PromotionsPage.tsx @@ -1,24 +1,16 @@ import { useState, type ReactElement } from 'react' import styled from 'styled-components' import { FadeIn } from '@magic-civ/guide-engine' -import { Heading, Text } from '@lilith/ui-typography' -import { promotionsData, infusionTrees, infusionConfig, disciplinesData } from '@/data' +import { promotionsData } from '@/data' import { EncyclopediaCallout } from '@magic-civ/guide-engine' import { InfoCard } from '@magic-civ/guide-engine' import { PageTitle, PageHeading, PageSubtitle, FilterRow, FilterChip } from '@magic-civ/guide-engine' -// Game 2 disciplines haven't landed yet — tolerate the empty stub. The -// SCHOOL_COLORS map only feeds the infusion subtree, which is itself gated -// on `infusionTrees.length > 0` below. -const SCHOOL_COLORS: Record = Object.fromEntries( - (disciplinesData.disciplines ?? []).map((d) => [d.name.toLowerCase(), d.color_hex]), -) - -const SectionDivider = styled.div` - margin: 3rem 0 2rem; - padding-top: 2rem; - border-top: 2px solid ${({ theme }) => theme.colors.border.default}; -` +// Game 1 scope: this page covers mundane XP-based promotions only. The +// Mana Infusions (colored-mana permanent enhancements keyed off magic +// schools + High Archon) moves to the Game 2 promotions page, where the +// disciplines / infusionTrees / infusionConfig data is populated. Do not +// re-import those stubs here; they are intentionally empty in Game 1. const Filters = FilterRow @@ -28,10 +20,10 @@ const TreeSection = styled.div` margin-bottom: 2.5rem; ` -const TreeName = styled.h2<{ $color?: string }>` +const TreeName = styled.h2` font-size: 1.125rem; font-weight: 700; - color: ${({ $color, theme }) => $color ?? theme.colors.primary.light}; + color: ${({ theme }) => theme.colors.primary.light}; margin: 0 0 0.75rem; ` @@ -54,9 +46,9 @@ const ChoicesGrid = styled.div` gap: 0.75rem; ` -const ChoiceCard = styled.div<{ $borderColor?: string }>` +const ChoiceCard = styled.div` background: ${({ theme }) => theme.colors.surface}; - border: 1px solid ${({ $borderColor, theme }) => $borderColor ?? theme.colors.border.default}; + border: 1px solid ${({ theme }) => theme.colors.border.default}; border-radius: 6px; padding: 0.75rem 1rem; display: flex; @@ -64,10 +56,10 @@ const ChoiceCard = styled.div<{ $borderColor?: string }>` gap: 0.25rem; ` -const ChoiceName = styled.h4<{ $color?: string }>` +const ChoiceName = styled.h4` font-size: 0.875rem; font-weight: 700; - color: ${({ $color, theme }) => $color ?? theme.colors.primary.main}; + color: ${({ theme }) => theme.colors.primary.main}; margin: 0; ` @@ -76,12 +68,6 @@ const Prereq = styled.span` color: ${({ theme }) => theme.colors.text.muted}; ` -const ManaCost = styled.span<{ $color?: string }>` - font-size: 0.6875rem; - font-weight: 600; - color: ${({ $color }) => $color ?? '#ccc'}; -` - const ChoiceDesc = styled.p` font-size: 0.8125rem; color: ${({ theme }) => theme.colors.text.secondary}; @@ -92,16 +78,11 @@ const ChoiceDesc = styled.p` export default function PromotionsPage(): ReactElement { const treeKeys = Object.keys(promotionsData.trees) const [activeTree, setActiveTree] = useState('all') - const [activeSchool, setActiveSchool] = useState('all') const visibleTrees = activeTree === 'all' ? treeKeys : [activeTree] - const visibleInfusions = activeSchool === 'all' - ? infusionTrees - : infusionTrees.filter((t) => t.school === activeSchool) - return ( {/* ── Mundane Promotions ── */} @@ -152,84 +133,12 @@ export default function PromotionsPage(): ReactElement { ) })} - {/* ── Mana Infusions (Magical Promotions) ── */} - {infusionTrees.length > 0 && ( - <> - - Mana Infusions - - {infusionTrees.length} school infusion trees with 3 tiers each. - Costs: {Object.entries(infusionConfig.infusion_costs).map( - ([tier, cost]) => `Tier ${tier}: ${cost.colored_mana} mana` - ).join(', ')}. - {' '}Dispellable by Aether. - {infusionConfig.archon_death_fade_turns > 0 && - ` All infusions fade over ${infusionConfig.archon_death_fade_turns} turns if the High Archon dies.`} - - - - - Magical units spend colored mana to permanently enhance themselves. - Unlike mundane promotions (earned through XP), infusions are an investment of mana. - {infusionConfig.channeling.max_tier > 0 && - ` Specialists can channel Tier ${infusionConfig.channeling.max_tier} infusions onto escorted mundane units (fades ${infusionConfig.channeling.fade_turns_on_detach} turns after detach).`} - - - - setActiveSchool('all')}> - All Schools - - {infusionTrees.map((tree) => ( - setActiveSchool(tree.school)} - > - {tree.tree_name} ({tree.school}) - - ))} - - - {visibleInfusions.map((tree) => { - const color = SCHOOL_COLORS[tree.school] - return ( - - - {tree.tree_name} — {tree.school.charAt(0).toUpperCase() + tree.school.slice(1)} - - {tree.levels.map((level) => { - const tierCost = infusionConfig.infusion_costs[String(level.level)] - return ( - - - Tier {level.level}: {level.tier_name} - {tierCost && ` — ${tierCost.colored_mana} ${tree.school} mana`} - - - {level.choices.map((c) => ( - - {c.name} - {c.prereq && ( - Requires: {c.prereq.replace(/_inf_/g, ' ').replace(/_/g, ' ')} - )} - {tierCost && ( - - {tierCost.colored_mana} {tree.school} mana - - )} - {c.description} - - ))} - - - ) - })} - - ) - })} - - )} + {/* + Mana Infusions (colored-mana permanent unit enhancements) ship with + Game 2. The Game 2 promotions page picks up infusionTrees / + infusionConfig / disciplinesData — they are empty stubs in Game 1 + and are intentionally not rendered here. + */} ) } diff --git a/public/games/age-of-dwarves/guide/src/pages/progress-report/OverviewTab.tsx b/public/games/age-of-dwarves/guide/src/pages/progress-report/OverviewTab.tsx index 1a3adf4d..fbb74d30 100644 --- a/public/games/age-of-dwarves/guide/src/pages/progress-report/OverviewTab.tsx +++ b/public/games/age-of-dwarves/guide/src/pages/progress-report/OverviewTab.tsx @@ -153,8 +153,8 @@ export function OverviewTab(): ReactElement { P4 - Archon loss + mundane rebirth - High Archon death triggers succession crisis or permanent magic lock + Succession + dynasty crisis + Leader-death events trigger succession crises or permanent tech/government regressions. diff --git a/public/games/age-of-dwarves/guide/src/pages/survival-guide/data.ts b/public/games/age-of-dwarves/guide/src/pages/survival-guide/data.ts index 102c5f7b..11bbcf9f 100644 --- a/public/games/age-of-dwarves/guide/src/pages/survival-guide/data.ts +++ b/public/games/age-of-dwarves/guide/src/pages/survival-guide/data.ts @@ -82,7 +82,7 @@ export const SCENARIOS: ScenarioData[] = [ color: PANDEMIC_COLOR, trigger: 'Pandemic event rolls T3+. Spreads via road-connected and trade-route cities.', what: 'T3: −1 pop/turn per connected city for 8 turns. T4: spreads to ALL players via active trade routes, −2 pop/turn, kills garrisoned units. T5: global, population halved across all civilizations.', - response: 'Cut trade routes immediately — pillage roads to sever spread vectors. The Life T3 quarantine spell blocks adjacency transmission. Hospital building reduces pop loss by 1 per turn. Isolationist governments have a natural advantage here.', + response: 'Cut trade routes immediately — pillage roads to sever spread vectors. Declare a quarantine zone around infected cities to block unit movement into and out of the adjacent tile ring, severing contact-transmission. Hospital building reduces pop loss by 1 per turn. Isolationist governments have a natural advantage here.', recovery: 'Cities recover population slowly after the pandemic ends. T5 is generationally catastrophic — prioritize rebuilding food infrastructure and Granaries before military production.', }, ] diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.last-run.json b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.last-run.json deleted file mode 100644 index cbcc1fba..00000000 --- a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.last-run.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "status": "passed", - "failedTests": [] -} \ No newline at end of file diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/012571f347d88a87395c582b370e4c26.png b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/012571f347d88a87395c582b370e4c26.png new file mode 100644 index 00000000..29aa2db7 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/012571f347d88a87395c582b370e4c26.png differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/06846d8e353b2ad4d1009c26518101ad.png b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/06846d8e353b2ad4d1009c26518101ad.png new file mode 100644 index 00000000..fce808ad Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/06846d8e353b2ad4d1009c26518101ad.png differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/21329e56f9685854239352eb11d5ba93.png b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/21329e56f9685854239352eb11d5ba93.png new file mode 100644 index 00000000..1a2638c9 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/21329e56f9685854239352eb11d5ba93.png differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/36b9d99391813541fa6a68aa02314c4e.png b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/36b9d99391813541fa6a68aa02314c4e.png new file mode 100644 index 00000000..c482319c Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/36b9d99391813541fa6a68aa02314c4e.png differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/99edc8f405439fb2d418503483d2e29f.png b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/99edc8f405439fb2d418503483d2e29f.png new file mode 100644 index 00000000..ba4e55da Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/99edc8f405439fb2d418503483d2e29f.png differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/a6b71f096daab729068e07b15e065832.png b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/a6b71f096daab729068e07b15e065832.png new file mode 100644 index 00000000..39d03c40 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/a6b71f096daab729068e07b15e065832.png differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/d927be74729a2fae81f6b96126979cd9.png b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/d927be74729a2fae81f6b96126979cd9.png new file mode 100644 index 00000000..15835235 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/d927be74729a2fae81f6b96126979cd9.png differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/page@1b123f50e36e8caf56e6d7fdfe714652.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/page@1b123f50e36e8caf56e6d7fdfe714652.webm new file mode 100644 index 00000000..fb5d55d6 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/page@1b123f50e36e8caf56e6d7fdfe714652.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/page@1e1a89be4700de427b5c786bb45d54a4.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/page@1e1a89be4700de427b5c786bb45d54a4.webm new file mode 100644 index 00000000..822b8105 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/page@1e1a89be4700de427b5c786bb45d54a4.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/page@6880f1875c6c0a02126d407b3a2236ce.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/page@6880f1875c6c0a02126d407b3a2236ce.webm new file mode 100644 index 00000000..3283ef6b Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/page@6880f1875c6c0a02126d407b3a2236ce.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/page@da19474d108817d380d744ba29a42c3e.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/page@da19474d108817d380d744ba29a42c3e.webm new file mode 100644 index 00000000..adba57c7 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/page@da19474d108817d380d744ba29a42c3e.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/page@f01e344727d8c72c706d226a19c35d79.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/page@f01e344727d8c72c706d226a19c35d79.webm new file mode 100644 index 00000000..cae4997a Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/page@f01e344727d8c72c706d226a19c35d79.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/page@fbb40ddc0d9fdc207b454da51f4bd6a1.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/page@fbb40ddc0d9fdc207b454da51f4bd6a1.webm new file mode 100644 index 00000000..eb64d130 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/page@fbb40ddc0d9fdc207b454da51f4bd6a1.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/page@fc64403dc7baef54ad8b7cc29a3251d4.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/page@fc64403dc7baef54ad8b7cc29a3251d4.webm new file mode 100644 index 00000000..887fb9d8 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-0/page@fc64403dc7baef54ad8b7cc29a3251d4.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/281c9f6fa12155f72146dfa160ec2179.png b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/281c9f6fa12155f72146dfa160ec2179.png new file mode 100644 index 00000000..9b6e08a3 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/281c9f6fa12155f72146dfa160ec2179.png differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/391e12fb238fb0dd1d39960fb9d7fa26.png b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/391e12fb238fb0dd1d39960fb9d7fa26.png new file mode 100644 index 00000000..c8df35d5 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/391e12fb238fb0dd1d39960fb9d7fa26.png differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/73c302cf78a6074cb234259bd5cb14a0.png b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/73c302cf78a6074cb234259bd5cb14a0.png new file mode 100644 index 00000000..02c5d10c Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/73c302cf78a6074cb234259bd5cb14a0.png differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/7498b127ac9e275948246c144904917f.png b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/7498b127ac9e275948246c144904917f.png new file mode 100644 index 00000000..d42206ea Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/7498b127ac9e275948246c144904917f.png differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/80f570aa92f4b5f4895d7d1b55adc0f2.png b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/80f570aa92f4b5f4895d7d1b55adc0f2.png new file mode 100644 index 00000000..f7e9be24 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/80f570aa92f4b5f4895d7d1b55adc0f2.png differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/c9884c041ddbbcc095b9002bd95211d0.png b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/c9884c041ddbbcc095b9002bd95211d0.png new file mode 100644 index 00000000..e1fc3e98 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/c9884c041ddbbcc095b9002bd95211d0.png differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/e44a41a23caf682b6a2a94802618950c.png b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/e44a41a23caf682b6a2a94802618950c.png new file mode 100644 index 00000000..98ed5dac Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/e44a41a23caf682b6a2a94802618950c.png differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/page@29e2c399c831007bdc71c9bc1e154522.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/page@29e2c399c831007bdc71c9bc1e154522.webm new file mode 100644 index 00000000..7e45d311 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/page@29e2c399c831007bdc71c9bc1e154522.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/page@51bb755cc86c0a2100c2b3278230d447.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/page@51bb755cc86c0a2100c2b3278230d447.webm new file mode 100644 index 00000000..e69de29b diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/page@5d76757dfecff3b5b90a65795ae075ce.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/page@5d76757dfecff3b5b90a65795ae075ce.webm new file mode 100644 index 00000000..f84f0fd3 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/page@5d76757dfecff3b5b90a65795ae075ce.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/page@5e5622c30fa30e57709bc9842d041aae.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/page@5e5622c30fa30e57709bc9842d041aae.webm new file mode 100644 index 00000000..d724e051 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/page@5e5622c30fa30e57709bc9842d041aae.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/page@8946c9d8d8fe745d78fbca0ad7c0676b.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/page@8946c9d8d8fe745d78fbca0ad7c0676b.webm new file mode 100644 index 00000000..64f8f9c5 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/page@8946c9d8d8fe745d78fbca0ad7c0676b.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/page@c8e31c8b1a022c1117e2277e799f4bad.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/page@c8e31c8b1a022c1117e2277e799f4bad.webm new file mode 100644 index 00000000..6344abc0 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/page@c8e31c8b1a022c1117e2277e799f4bad.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/page@de94543493bf84c1ec0483cbae8bce30.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/page@de94543493bf84c1ec0483cbae8bce30.webm new file mode 100644 index 00000000..99d86099 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/page@de94543493bf84c1ec0483cbae8bce30.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/page@f637c78a4afedd0f9cd41b3e8fe2818e.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/page@f637c78a4afedd0f9cd41b3e8fe2818e.webm new file mode 100644 index 00000000..014beed9 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-1/page@f637c78a4afedd0f9cd41b3e8fe2818e.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/4f9c3a42b5cadd9a5c13cf1585a7d091.png b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/4f9c3a42b5cadd9a5c13cf1585a7d091.png new file mode 100644 index 00000000..a517d153 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/4f9c3a42b5cadd9a5c13cf1585a7d091.png differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/62ad0a0253599e81a7e146cba2a80a39.png b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/62ad0a0253599e81a7e146cba2a80a39.png new file mode 100644 index 00000000..9dcda98f Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/62ad0a0253599e81a7e146cba2a80a39.png differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/bc6d8424f822e431d1c6171eea92455d.png b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/bc6d8424f822e431d1c6171eea92455d.png new file mode 100644 index 00000000..de298d1e Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/bc6d8424f822e431d1c6171eea92455d.png differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/c45e9489bdb7758f125558b28a44298f.png b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/c45e9489bdb7758f125558b28a44298f.png new file mode 100644 index 00000000..42ac5ad5 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/c45e9489bdb7758f125558b28a44298f.png differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/d766685106ba3f30601e40cdf463a2ad.png b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/d766685106ba3f30601e40cdf463a2ad.png new file mode 100644 index 00000000..7ea82835 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/d766685106ba3f30601e40cdf463a2ad.png differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/e194d9ac3ed15cf8f3f05ee5ae52207c.png b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/e194d9ac3ed15cf8f3f05ee5ae52207c.png new file mode 100644 index 00000000..ded2c96a Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/e194d9ac3ed15cf8f3f05ee5ae52207c.png differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/page@0075521138175b2f57041ba72d592425.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/page@0075521138175b2f57041ba72d592425.webm new file mode 100644 index 00000000..f38f5f9b Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/page@0075521138175b2f57041ba72d592425.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/page@595b348c3cf4f91890a51e26f1e837f0.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/page@595b348c3cf4f91890a51e26f1e837f0.webm new file mode 100644 index 00000000..13a4f8a0 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/page@595b348c3cf4f91890a51e26f1e837f0.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/page@5f4997198fed89a2adfdb872a7371767.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/page@5f4997198fed89a2adfdb872a7371767.webm new file mode 100644 index 00000000..f4e02e9b Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/page@5f4997198fed89a2adfdb872a7371767.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/page@780bde4d1bd49a1a9845dab600685e53.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/page@780bde4d1bd49a1a9845dab600685e53.webm new file mode 100644 index 00000000..fa14946e Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/page@780bde4d1bd49a1a9845dab600685e53.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/page@7e78617ad4ca22e946b293ac45737b8d.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/page@7e78617ad4ca22e946b293ac45737b8d.webm new file mode 100644 index 00000000..363a2bbe Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/page@7e78617ad4ca22e946b293ac45737b8d.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/page@ca7c77d5cf1963d38fffc06c54623f48.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/page@ca7c77d5cf1963d38fffc06c54623f48.webm new file mode 100644 index 00000000..952150a5 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/page@ca7c77d5cf1963d38fffc06c54623f48.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/page@ffaf78374670e3b1b6396d5d694fc272.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/page@ffaf78374670e3b1b6396d5d694fc272.webm new file mode 100644 index 00000000..e6f800dd Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-2/page@ffaf78374670e3b1b6396d5d694fc272.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/0d1ab8f2bc23a7eafa36274b530339e6.png b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/0d1ab8f2bc23a7eafa36274b530339e6.png new file mode 100644 index 00000000..613ad0a4 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/0d1ab8f2bc23a7eafa36274b530339e6.png differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/13275bb6e9f311e710d7580414e11d54.png b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/13275bb6e9f311e710d7580414e11d54.png new file mode 100644 index 00000000..68ff6b4a Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/13275bb6e9f311e710d7580414e11d54.png differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/5f1ac3c2ce714dd4696da2482f3beae7.png b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/5f1ac3c2ce714dd4696da2482f3beae7.png new file mode 100644 index 00000000..f604b824 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/5f1ac3c2ce714dd4696da2482f3beae7.png differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/9a2bf6a41b1fbd3aa40d3c31f5d60bf5.png b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/9a2bf6a41b1fbd3aa40d3c31f5d60bf5.png new file mode 100644 index 00000000..598eec39 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/9a2bf6a41b1fbd3aa40d3c31f5d60bf5.png differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/c38f3360e474814cbbd6ef2b6d57e6d2.png b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/c38f3360e474814cbbd6ef2b6d57e6d2.png new file mode 100644 index 00000000..e2ff8dcb Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/c38f3360e474814cbbd6ef2b6d57e6d2.png differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/f3e111f5805d6d02244098f3d65bf275.png b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/f3e111f5805d6d02244098f3d65bf275.png new file mode 100644 index 00000000..3d5b1a1d Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/f3e111f5805d6d02244098f3d65bf275.png differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/page@39972ce3880b679c9d9412a1ccd9d8b5.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/page@39972ce3880b679c9d9412a1ccd9d8b5.webm new file mode 100644 index 00000000..643b76b7 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/page@39972ce3880b679c9d9412a1ccd9d8b5.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/page@3a101ee5a0287c53665aa1aa8d47970d.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/page@3a101ee5a0287c53665aa1aa8d47970d.webm new file mode 100644 index 00000000..8e75fab3 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/page@3a101ee5a0287c53665aa1aa8d47970d.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/page@498446a6456c644e6157269e05461b86.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/page@498446a6456c644e6157269e05461b86.webm new file mode 100644 index 00000000..8e2c14e9 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/page@498446a6456c644e6157269e05461b86.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/page@6522d224ebae0fc210e5105fd04aed40.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/page@6522d224ebae0fc210e5105fd04aed40.webm new file mode 100644 index 00000000..e017266f Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/page@6522d224ebae0fc210e5105fd04aed40.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/page@995fa23849e6d7860cb9bb35a1b8a372.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/page@995fa23849e6d7860cb9bb35a1b8a372.webm new file mode 100644 index 00000000..4f6dff82 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/page@995fa23849e6d7860cb9bb35a1b8a372.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/page@9dd4fc221f4cb5c70b935fa6be4cef9a.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/page@9dd4fc221f4cb5c70b935fa6be4cef9a.webm new file mode 100644 index 00000000..4ea242e0 Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/page@9dd4fc221f4cb5c70b935fa6be4cef9a.webm differ diff --git a/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/page@c6fd297d41a1d471837c8661c8202290.webm b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/page@c6fd297d41a1d471837c8661c8202290.webm new file mode 100644 index 00000000..494d081d Binary files /dev/null and b/public/games/age-of-dwarves/guide/test-results/guide-age-of-dwarves/.playwright-artifacts-3/page@c6fd297d41a1d471837c8661c8202290.webm differ