From 30a2a13d20a2a84ae2f4f5dd7700d8cf8c8da555 Mon Sep 17 00:00:00 2001 From: Jonathan van Rij Date: Tue, 30 Dec 2025 14:34:34 +0100 Subject: [PATCH] adding data --- .claude/settings.local.json | 12 + CLAUDE.md | 18 + README.md | 7 + docs.md | 713 +++++++++++++++++++++++++++++++ processed.md | 14 + python/scraper.py | 256 +++++++++++ scraped_data/anno-117-tools.json | 67 +++ scraping.md | 367 ++++++++++++++++ 8 files changed, 1454 insertions(+) create mode 100644 .claude/settings.local.json create mode 100644 CLAUDE.md create mode 100644 docs.md create mode 100644 processed.md create mode 100644 python/scraper.py create mode 100644 scraped_data/anno-117-tools.json create mode 100644 scraping.md diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..6c8506b --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,12 @@ +{ + "permissions": { + "allow": [ + "Bash(mv:*)", + "Bash(python3:*)", + "Bash(pip3 install:*)", + "Bash(source:*)", + "Bash(pip install:*)", + "Bash(python python/scraper.py:*)" + ] + } +} diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..240bac3 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,18 @@ +# CLAUDE.md + +This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository. + +## Project Purpose + +This project aims to create comprehensive API-like documentation of all game elements in Anno 117: Pax Romana. The documentation (docs.md) should catalog buildings, resources, production chains, population tiers, and other game mechanics in a structured, queryable format. + +## Project Status + +This is a new project. The documentation structure and format are yet to be established. + +## Goals + +- Document all game elements (buildings, goods, production chains, population needs, etc.) +- Provide structured data that can be queried and referenced +- Create relationships between game elements (e.g., which buildings produce which goods) +- Track game version compatibility as the game evolves diff --git a/README.md b/README.md index e69de29..25628a8 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,7 @@ +# Anno 117: Pax Romana documentation + +## Run scraper + +```bash +source venv/bin/activate && python python/scraper.py +``` \ No newline at end of file diff --git a/docs.md b/docs.md new file mode 100644 index 0000000..de08c86 --- /dev/null +++ b/docs.md @@ -0,0 +1,713 @@ +# Anno 117: Pax Romana — Sandbox Mode Data Reference (API-Style) + +> **Version:** 0.2 (compiled from provided research files; not yet a full extracted DB) +> **Focus:** Sandbox / Endless Mode mechanics (no controls/UI bindings) +> **Data Sources:** research_1.txt [oai_citation:0‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64), research_2.txt [oai_citation:1‡research_2.txt](sediment://file_000000005adc71f685d34607bf4d3973), research_3.txt [oai_citation:2‡research_3.txt](sediment://file_00000000e73871f6bf8844e9c7de47e3) +> +> **Scope Warning (important):** +> This document only includes **entities and numeric stats explicitly present** in the supplied research files. +> Where a field is unknown, it is marked `Unknown` (not guessed). + +--- + +## Table of Contents + +- [Schemas](#schemas) + - [Schema: Building](#schema-building) + - [Schema: Good](#schema-good) + - [Schema: PopulationTier](#schema-populationtier) + - [Schema: ProductionChain](#schema-productionchain) + - [Schema: Specialist](#schema-specialist) + - [Schema: ShipHull](#schema-shiphull) + - [Schema: ShipModule](#schema-shipmodule) +- [Entities](#entities) + - [Population Tiers](#population-tiers) + - [Goods](#goods) + - [Buildings](#buildings) + - [Production Chains](#production-chains) + - [Trade & Logistics](#trade--logistics) + - [Ships & Naval](#ships--naval) + - [Specialists](#specialists) + - [Economy & Diagnostics](#economy--diagnostics) + - [Monuments](#monuments) +- [Troubleshooting Playbooks](#troubleshooting-playbooks) +- [Glossary](#glossary) + +--- + +## Schemas + +### Schema: Building + +**Entity Type:** `Building` + +| Field | Type | Notes | +|------|------|------| +| id | string | stable anchor id | +| name | string | display name | +| category | string | Production / Service / Safety / Monument / etc. | +| description | string | 1–2 lines max | +| requiredPopulationTier | string | link to tier | +| buildCost | object | `{ gold?, goods[] }` | +| constructionTime | string | usually instant per research | +| maintenance | object | `{ goldPerMin?, workforce[] }` | +| workforce | array | `[{ tier, count }]` | +| placementConstraints | array | coast/marsh/forest/fields/etc | +| roadRequired | boolean | | +| warehouseRequired | boolean | implies “in range of Warehouse/Trading Post” | +| inputGoods | array | links to goods | +| outputGoods | array | links to goods | +| cycleTimeSeconds | number | production cycle time | +| areaEffects | array | `{ type, value, target, radius? }` | +| productionChain | array | links to chain(s) | +| unlockCondition | string | tier, research, count, etc | +| usagePatterns | string | short | +| commonPitfalls | string | short | + +--- + +### Schema: Good + +**Entity Type:** `Good` + +| Field | Type | Notes | +|------|------|------| +| id | string | stable anchor id | +| name | string | | +| category | string | Food / Construction / Intermediate / etc | +| usedFor | array | Construction, Consumption, Input, Trade | +| providesAttributes | array | `{ attribute, value, consumer? }` | +| producedBy | array | building links | +| consumedBy | array | building/tier links | + +--- + +### Schema: PopulationTier + +**Entity Type:** `PopulationTier` + +| Field | Type | +|------|------| +| id | string | +| name | string | +| region | string | +| workforceFraction | number | +| needsCategories | array | +| notes | string | +| commonPitfalls | string | + +--- + +### Schema: ProductionChain + +**Entity Type:** `ProductionChain` + +| Field | Type | +|------|------| +| id | string | +| name | string | +| steps | array | `{ building, in[], out[], cycleSeconds }` | +| recommendedRatios | array | `{ building, count }` | +| bottlenecks | array | goods/buildings | +| notes | string | + +--- + +### Schema: Specialist + +**Entity Type:** `Specialist` + +| Field | Type | +|------|------| +| id | string | +| name | string | +| rarity | string | +| category | string | +| slotType | string | +| scope | string | +| effects | array | `{ type, target, value, scope }` | +| improvesBuildings | array | building links | +| stackRules | string | +| usagePatterns | string | +| commonPitfalls | string | + +--- + +### Schema: ShipHull + +**Entity Type:** `ShipHull` + +| Field | Type | +|------|------| +| id | string | +| name | string | +| sizeClass | string | +| moduleSlots | number | +| notes | string | + +--- + +### Schema: ShipModule + +**Entity Type:** `ShipModule` + +| Field | Type | +|------|------| +| id | string | +| name | string | +| effect | string | +| tradeoffs | string | +| notes | string | + +--- + +## Entities + +## Population Tiers + +### Tier I — Liberti (Latium) / Waders (Albion) {#tier-i} + +- **Entity Type:** PopulationTier +- **workforceFraction:** `0.50` [oai_citation:3‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **needsCategories:** Food, Public Service, Fashion [oai_citation:4‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **notes:** Avoid upgrading all Tier I housing at once; you can lose Tier I workers needed for basic chains. [oai_citation:5‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **commonPitfalls:** “Everything upgraded” ⇒ fisheries/farms/sawmills understaffed. + +### Tier II — Plebeians (Latium) / Mercators or Smiths (Albion) {#tier-ii} + +- **Entity Type:** PopulationTier +- **workforceFraction:** `0.30` [oai_citation:6‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **notes:** Tier II introduces major upkeep spikes (mills/bakeries/bricks, etc.). [oai_citation:7‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **commonPitfalls:** Overbuilding production buildings drains gold via maintenance. [oai_citation:8‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) + +### Tier III — Equites (Latium) / Higher Albion tiers {#tier-iii} + +- **Entity Type:** PopulationTier +- **workforceFraction:** `0.20` [oai_citation:9‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **notes:** Higher complexity; shortages cascade across chains. [oai_citation:10‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) + +### Tier IV — Patricians (Latium) {#tier-iv} + +- **Entity Type:** PopulationTier +- **workforceFraction:** `0.00` (reported “no workforce”) [oai_citation:11‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **notes:** Very high needs; unlock monuments like Amphitheatre. [oai_citation:12‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) + +--- + +## Goods + +### Sardines {#good-sardines} + +- **Entity Type:** Good +- **category:** Food +- **usedFor:** Consumption (Tier I Food need) +- **providesAttributes:** +1 Population, +1 Income (per house when fulfilling Food need) [oai_citation:13‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **producedBy:** [Fishing Hut](#building-fishing-hut) +- **consumedBy:** [Tier I](#tier-i) + +### Porridge {#good-porridge} + +- **Entity Type:** Good +- **category:** Food +- **usedFor:** Consumption (Tier I Food need) +- **providesAttributes:** +2 Population (per house when fulfilling Food need) [oai_citation:14‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **producedBy:** [Porridge Stand](#building-porridge-stand) +- **consumedBy:** [Tier I](#tier-i) + +### Oats {#good-oats} + +- **Entity Type:** Good +- **category:** Agricultural +- **usedFor:** Input (Porridge) +- **producedBy:** [Oat Farm](#building-oat-farm) +- **consumedBy:** [Porridge Stand](#building-porridge-stand) + +### Hemp {#good-hemp} + +- **Entity Type:** Good +- **category:** Agricultural +- **usedFor:** Input (Tunics) +- **producedBy:** [Hemp Farm](#building-hemp-farm) +- **consumedBy:** [Spinner](#building-spinner) + +### Tunics {#good-tunics} + +- **Entity Type:** Good +- **category:** Clothing / Fashion +- **usedFor:** Consumption (Tier I Fashion need) +- **providesAttributes:** +2 Population (reported) [oai_citation:15‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **producedBy:** [Spinner](#building-spinner) +- **consumedBy:** [Tier I](#tier-i) + +### Timber (Planks) {#good-timber} + +- **Entity Type:** Good +- **category:** Construction Material +- **usedFor:** Construction, Inputs +- **producedBy:** [Sawmill](#building-sawmill) +- **consumedBy:** Many (construction costs reference Timber widely) [oai_citation:16‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) + +--- + +## Buildings + +### Woodcutter Hut {#building-woodcutter-hut} + +- **Entity Type:** Building +- **category:** Production / Raw Materials +- **description:** Produces Logs from forest density. +- **requiredPopulationTier:** [Tier I](#tier-i) +- **buildCost:** `{ goods: [{ good: "Timber", amount: 2 }] }` [oai_citation:17‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **constructionTime:** Instant (reported general rule) [oai_citation:18‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **maintenance:** `{ goldPerMin: -5, workforce: [{ tier: "Tier I", count: 2 }] }` (approx.) [oai_citation:19‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **workforce:** `[{ tier: Tier I, count: 2 }]` [oai_citation:20‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **placementConstraints:** Forest overlap required; low density reduces productivity. [oai_citation:21‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **roadRequired:** true [oai_citation:22‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **warehouseRequired:** true [oai_citation:23‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **inputGoods:** none +- **outputGoods:** `Unknown (Logs)` (named in text; Good entry not separately defined) +- **cycleTimeSeconds:** 30 [oai_citation:24‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **productionChain:** [Chain: Timber](#chain-timber) +- **unlockCondition:** Tier I [oai_citation:25‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **usagePatterns:** Place deep in dense forest, keep a warehouse in range. +- **commonPitfalls:** Sparse forest ⇒ “mystery” timber shortages downstream. + +--- + +### Sawmill {#building-sawmill} + +- **Entity Type:** Building +- **category:** Production / Construction Materials +- **description:** Converts Logs → Timber planks. +- **requiredPopulationTier:** [Tier I](#tier-i) +- **buildCost:** `{ goods: [{ good: "Timber", amount: 2 }] }` [oai_citation:26‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **constructionTime:** Instant [oai_citation:27‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **maintenance:** `{ goldPerMin: -5, workforce: [{ tier: "Tier I", count: 2 }] }` (approx.) [oai_citation:28‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **workforce:** `[{ tier: Tier I, count: 2 }]` [oai_citation:29‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **placementConstraints:** None special (but requires logistics) +- **roadRequired:** true [oai_citation:30‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **warehouseRequired:** true [oai_citation:31‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **inputGoods:** `Unknown (Logs)` +- **outputGoods:** [Timber](#good-timber) +- **cycleTimeSeconds:** 30 [oai_citation:32‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **productionChain:** [Chain: Timber](#chain-timber) +- **unlockCondition:** Tier I +- **usagePatterns:** Pair 1:1 with Woodcutters (matching cycle times). +- **commonPitfalls:** Too many sawmills ⇒ upkeep drain without benefit. + +--- + +### Fishing Hut (Latium) {#building-fishing-hut} + +- **Entity Type:** Building +- **category:** Production / Food (Fishery) +- **description:** Coastal fishery producing Sardines. +- **requiredPopulationTier:** [Tier I](#tier-i) +- **buildCost:** `{ goods: [{ good: "Timber", amount: 2 }] }` [oai_citation:33‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **constructionTime:** Instant [oai_citation:34‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **maintenance:** `{ goldPerMin: -6, workforce: [{ tier: "Tier I", count: 4 }] }` [oai_citation:35‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **workforce:** `[{ tier: Tier I, count: 4 }]` [oai_citation:36‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **placementConstraints:** Coast / Harbor Area required. [oai_citation:37‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **roadRequired:** true [oai_citation:38‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **warehouseRequired:** true [oai_citation:39‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **inputGoods:** none +- **outputGoods:** [Sardines](#good-sardines) +- **cycleTimeSeconds:** 60 [oai_citation:40‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **productionChain:** [Chain: Tier I Food](#chain-tier-i-food) +- **unlockCondition:** Tier I [oai_citation:41‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **usagePatterns:** Cluster fisheries for specialist + area-effect stacking. +- **commonPitfalls:** Overbuilt fisheries ⇒ gold bleed; also “need flicker” if storage/transport dips. + +--- + +### Cockle Picker (Albion) {#building-cockle-picker} + +- **Entity Type:** Building +- **category:** Production / Food (Fishery analogue) +- **description:** Coastal gatherer producing Cockles for Waders. +- **requiredPopulationTier:** [Tier I](#tier-i) +- **buildCost:** `Unknown` (research says “similar to Fishing Hut”, but not hard numbers) [oai_citation:42‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **maintenance:** `Unknown` +- **workforce:** `Unknown` +- **placementConstraints:** Coast (Albion) [oai_citation:43‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **cycleTimeSeconds:** `Unknown (reported ~60s but not asserted)` +- **usagePatterns:** Albion starter food option. +- **commonPitfalls:** Confusing coast vs marsh producers in Albion. [oai_citation:44‡research_3.txt](sediment://file_00000000e73871f6bf8844e9c7de47e3) + +--- + +### Eel Grabber (Albion) {#building-eel-grabber} + +- **Entity Type:** Building +- **category:** Production / Food (Marsh fishery) +- **description:** Marshland fish producer (Eels). +- **requiredPopulationTier:** [Tier I](#tier-i) +- **buildCost:** Unknown +- **maintenance:** Unknown +- **workforce:** Unknown +- **placementConstraints:** Marshland placement required (Albion-specific). [oai_citation:45‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **cycleTimeSeconds:** `Unknown (likely 60s per research wording; not asserted as fact)` [oai_citation:46‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **usagePatterns:** Place in marsh; pair with coastal cockles early. +- **commonPitfalls:** Trying to place on coast; marsh-only building. [oai_citation:47‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) + +--- + +### Oat Farm {#building-oat-farm} + +- **Entity Type:** Building +- **category:** Production / Agriculture +- **description:** Produces Oats; uses field modules; aqueduct optional. +- **requiredPopulationTier:** [Tier I](#tier-i) +- **buildCost:** `{ goods: [{ good: "Timber", amount: 3 }] }` [oai_citation:48‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **constructionTime:** Instant [oai_citation:49‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **maintenance:** `{ goldPerMin: -4, workforce: [{ tier: "Tier I", count: 3 }] }` [oai_citation:50‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **workforce:** `[{ tier: Tier I, count: 3 }]` [oai_citation:51‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **placementConstraints:** Requires fields; requires relevant fertility (oat/grain). [oai_citation:52‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **roadRequired:** true [oai_citation:53‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **warehouseRequired:** true [oai_citation:54‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **inputGoods:** none +- **outputGoods:** [Oats](#good-oats) +- **cycleTimeSeconds:** 60 [oai_citation:55‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **productionChain:** [Chain: Porridge](#chain-porridge) +- **unlockCondition:** Tier I +- **usagePatterns:** Keep fields compact; warehouse nearby; consider aqueduct support. +- **commonPitfalls:** Insufficient fields/fertility ⇒ low output; long travel distance ⇒ apparent underproduction. + +--- + +### Porridge Stand {#building-porridge-stand} + +- **Entity Type:** Building +- **category:** Production / Food +- **description:** Converts Oats → Porridge. +- **requiredPopulationTier:** [Tier I](#tier-i) +- **buildCost:** `{ goods: [{ good: "Timber", amount: 2 }] }` [oai_citation:56‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **constructionTime:** Instant [oai_citation:57‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **maintenance:** `{ goldPerMin: -8, workforce: [{ tier: "Tier I", count: 2 }] }` [oai_citation:58‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **workforce:** `[{ tier: Tier I, count: 2 }]` [oai_citation:59‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **placementConstraints:** Needs road/warehouse. +- **roadRequired:** true [oai_citation:60‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **warehouseRequired:** true [oai_citation:61‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **inputGoods:** [Oats](#good-oats) +- **outputGoods:** [Porridge](#good-porridge) +- **cycleTimeSeconds:** 60 [oai_citation:62‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **productionChain:** [Chain: Porridge](#chain-porridge) +- **unlockCondition:** Tier I +- **usagePatterns:** Pair 1:1 with Oat Farms for balanced flow (both 60s). +- **commonPitfalls:** Oats delivered too slowly ⇒ porridge “flicker” and population drops. + +--- + +### Hemp Farm {#building-hemp-farm} + +- **Entity Type:** Building +- **category:** Production / Agriculture +- **description:** Produces Hemp for Tunics; uses fields; aqueduct optional. +- **requiredPopulationTier:** [Tier I](#tier-i) +- **buildCost:** `{ goods: [{ good: "Timber", amount: 2 }] }` [oai_citation:63‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **maintenance:** `{ goldPerMin: -4, workforce: [{ tier: "Tier I", count: 3 }] }` [oai_citation:64‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **placementConstraints:** Fields + correct fertility. [oai_citation:65‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **roadRequired:** true [oai_citation:66‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **warehouseRequired:** true [oai_citation:67‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **outputGoods:** [Hemp](#good-hemp) +- **cycleTimeSeconds:** 60 [oai_citation:68‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **productionChain:** [Chain: Tunics](#chain-tunics) +- **usagePatterns:** Keep close to Spinner; reduce hauling delays. +- **commonPitfalls:** Too few fields or long hauling times ⇒ spinner starvation. + +--- + +### Spinner {#building-spinner} + +- **Entity Type:** Building +- **category:** Production / Clothing +- **description:** Converts Hemp → Tunics; provides local income area effect. +- **requiredPopulationTier:** [Tier I](#tier-i) +- **buildCost:** `{ goods: [{ good: "Timber", amount: 2 }] }` [oai_citation:69‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **maintenance:** `{ goldPerMin: -8, workforce: [{ tier: "Tier I", count: 3 }] }` [oai_citation:70‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **inputGoods:** [Hemp](#good-hemp) +- **outputGoods:** [Tunics](#good-tunics) +- **cycleTimeSeconds:** 30 [oai_citation:71‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **areaEffects:** `[{ type: "IncomeAreaEffect", value: +1, target: "Nearby buildings (incl residences)", radius: "Unknown" }]` [oai_citation:72‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **productionChain:** [Chain: Tunics](#chain-tunics) +- **usagePatterns:** Place near residences to maximize income area effect. +- **commonPitfalls:** Spinner output can be fine while income effect is wasted if placed far from housing. + +--- + +### Bakery {#building-bakery} + +- **Entity Type:** Building +- **category:** Production / Food (Tier II) +- **description:** Produces Bread (Tier II staple); high upkeep. +- **requiredPopulationTier:** [Tier II](#tier-ii) +- **buildCost:** `Unknown in supplied snippets` (but bakery upkeep is explicitly given) [oai_citation:73‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **maintenance:** `{ goldPerMin: -14, workforce: [{ tier: "Tier II", count: 3 }] }` [oai_citation:74‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **inputGoods:** `Unknown (Flour + Charcoal implied by chain text)` [oai_citation:75‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **outputGoods:** `Unknown (Bread)` [oai_citation:76‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **cycleTimeSeconds:** 60 (from bread chain summary) [oai_citation:77‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **usagePatterns:** Only scale to actual consumption; bakeries are a common cashflow killer. +- **commonPitfalls:** Overbuilding bakeries ⇒ negative income swings; missing charcoal ⇒ “mystery” bread shortages. [oai_citation:78‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) + +--- + +## Production Chains + +### Chain: Timber {#chain-timber} + +- **Entity Type:** ProductionChain +- **steps:** + - `{ building: [Woodcutter Hut](#building-woodcutter-hut), in: [], out: ["Logs"], cycleSeconds: 30 }` [oai_citation:79‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) + - `{ building: [Sawmill](#building-sawmill), in: ["Logs"], out: [Timber](#good-timber), cycleSeconds: 30 }` [oai_citation:80‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **recommendedRatios:** Woodcutter 1 : Sawmill 1 (matching 30s cycles) [oai_citation:81‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **bottlenecks:** Forest density (Woodcutter placement) [oai_citation:82‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) + +### Chain: Tier I Food {#chain-tier-i-food} + +- **Entity Type:** ProductionChain +- **steps:** + - `{ building: [Fishing Hut](#building-fishing-hut), in: [], out: [Sardines](#good-sardines), cycleSeconds: 60 }` [oai_citation:83‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) + - `{ building: [Oat Farm](#building-oat-farm), in: [], out: [Oats](#good-oats), cycleSeconds: 60 }` [oai_citation:84‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) + - `{ building: [Porridge Stand](#building-porridge-stand), in: [Oats](#good-oats), out: [Porridge](#good-porridge), cycleSeconds: 60 }` [oai_citation:85‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **notes:** Many Tier I settlements produce both Sardines and Porridge to maximize population. [oai_citation:86‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) + +### Chain: Porridge {#chain-porridge} + +- **Entity Type:** ProductionChain +- **steps:** + - Oat Farm (60s) → Oats [oai_citation:87‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) + - Porridge Stand (60s) + Oats → Porridge [oai_citation:88‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **recommendedRatios:** Oat Farm 1 : Porridge Stand 1 (both 60s) +- **bottlenecks:** Field layout, fertility, hauling distance. [oai_citation:89‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) + +### Chain: Tunics {#chain-tunics} + +- **Entity Type:** ProductionChain +- **steps:** + - Hemp Farm (60s) → Hemp [oai_citation:90‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) + - Spinner (30s) + Hemp → Tunics [oai_citation:91‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **recommendedRatios:** `Unknown` (cycle mismatch suggests multiple spinners can consume one farm; exact throughput not given in files) +- **notes:** Spinner provides an income area effect (+1) near buildings. [oai_citation:92‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) + +### Chain: Bread (summary) {#chain-bread} + +- **Entity Type:** ProductionChain +- **steps (summary only):** + - Wheat Farm (60s) → Grain + - Grain Mill (30s) → Flour + - Bakery (60s) + (requires Charcoal) → Bread [oai_citation:93‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **recommendedRatios:** 2 Wheat : 1 Mill : 2 Bakeries [oai_citation:94‡research_3.txt](sediment://file_00000000e73871f6bf8844e9c7de47e3) +- **bottlenecks:** Charcoal availability; bakery upkeep. [oai_citation:95‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) [oai_citation:96‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) + +--- + +## Trade & Logistics + +### Entity: TradeRoute {#entity-traderoute} + +- **Entity Type:** SystemEntity +- **description:** Automated ship loop moving goods between islands. +- **configuration:** + - Select ship + - Enable Trade Route + - Assign goods per cargo slot + - Assign islands for load/unload +- **rules:** + - Route loops indefinitely + - Used to supply production chains across islands +- **usagePatterns:** Specialize islands (agricultural vs industrial) and route goods accordingly. [oai_citation:97‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **commonPitfalls:** Under-shipping (not enough cargo throughput) ⇒ need flicker and income oscillation. + +### Entity: DiplomaticTrade {#entity-diplomatictrade} + +- **Entity Type:** SystemEntity +- **description:** Passive buy/sell orders at Trading Post with AI via treaties. +- **configuration:** Set fixed buy/sell orders, price, quantity. [oai_citation:98‡research_2.txt](sediment://file_000000005adc71f685d34607bf4d3973) +- **usagePatterns:** Monetize surplus production; import hard-to-get goods. [oai_citation:99‡research_2.txt](sediment://file_000000005adc71f685d34607bf4d3973) + +--- + +## Ships & Naval + +### Shipyard (system) {#system-shipyard} + +- **Entity Type:** SystemEntity +- **description:** Ships are constructed in a Shipyard; construction consumes resources and time. +- **rule:** Insufficient workforce slows ship construction. [oai_citation:100‡research_2.txt](sediment://file_000000005adc71f685d34607bf4d3973) + +### Hulls {#naval-hulls} + +#### Penteconter {#hull-penteconter} +- **Entity Type:** ShipHull +- **sizeClass:** Small +- **moduleSlots:** 2 [oai_citation:101‡research_2.txt](sediment://file_000000005adc71f685d34607bf4d3973) +- **notes:** Fewer slots; cheaper; likely faster acceleration. + +#### Trireme {#hull-trireme} +- **Entity Type:** ShipHull +- **sizeClass:** Medium +- **moduleSlots:** 3 [oai_citation:102‡research_2.txt](sediment://file_000000005adc71f685d34607bf4d3973) + +#### Quinquireme {#hull-quinquireme} +- **Entity Type:** ShipHull +- **sizeClass:** Large +- **moduleSlots:** 4 [oai_citation:103‡research_2.txt](sediment://file_000000005adc71f685d34607bf4d3973) +- **notes:** More capacity and HP; slower acceleration. [oai_citation:104‡research_2.txt](sediment://file_000000005adc71f685d34607bf4d3973) + +### Modules {#naval-modules} + +#### Mast {#module-mast} +- **Entity Type:** ShipModule +- **effect:** +long-distance speed (wind) [oai_citation:105‡research_2.txt](sediment://file_000000005adc71f685d34607bf4d3973) + +#### Rows (Oars) {#module-rows} +- **Entity Type:** ShipModule +- **effect:** +base speed, acceleration, maneuver [oai_citation:106‡research_2.txt](sediment://file_000000005adc71f685d34607bf4d3973) +- **tradeoffs:** Consumes more crew than sails. [oai_citation:107‡research_2.txt](sediment://file_000000005adc71f685d34607bf4d3973) + +#### Reinforced Hull {#module-reinforced-hull} +- **Entity Type:** ShipModule +- **effect:** +health/durability [oai_citation:108‡research_2.txt](sediment://file_000000005adc71f685d34607bf4d3973) + +#### Archer Tower {#module-archer-tower} +- **Entity Type:** ShipModule +- **effect:** short-range multi-arrow attack (all-around) [oai_citation:109‡research_2.txt](sediment://file_000000005adc71f685d34607bf4d3973) +- **tradeoffs:** Requires more soldiers/crew. [oai_citation:110‡research_2.txt](sediment://file_000000005adc71f685d34607bf4d3973) + +#### Scorpio {#module-scorpio} +- **Entity Type:** ShipModule +- **effect:** side-mounted high-damage spears (medium range) [oai_citation:111‡research_2.txt](sediment://file_000000005adc71f685d34607bf4d3973) + +#### Onager {#module-onager} +- **Entity Type:** ShipModule +- **effect:** forward catapult (long range, high damage, low accuracy) [oai_citation:112‡research_2.txt](sediment://file_000000005adc71f685d34607bf4d3973) + +### Ship Design Slots {#naval-design-slots} + +- **rule:** Save up to 2 custom designs per hull per shipyard (6 total). [oai_citation:113‡research_2.txt](sediment://file_000000005adc71f685d34607bf4d3973) +- **rule:** Ships cannot be refitted after building (per research text). [oai_citation:114‡research_2.txt](sediment://file_000000005adc71f685d34607bf4d3973) + +--- + +## Specialists + +### Specialist System (general) {#system-specialists} + +- **Entity Type:** SystemEntity +- **description:** Specialists slot into certain buildings and modify stats (productivity, workforce, upkeep, etc.). +- **known effect examples:** +25% productivity, −25% workforce needed (examples referenced) [oai_citation:115‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **sources:** Obtained via quests, events, or trade. [oai_citation:116‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) + +### Uiscarix, Hygiean Fishmonger {#specialist-uiscarix-hygiean-fishmonger} + +- **Entity Type:** Specialist +- **rarity:** Epic (from user screenshot) +- **category:** Finance (from user screenshot) +- **slotType:** Specialist (from user screenshot) +- **scope:** Fisheries in range (from user screenshot) +- **effects:** + +| Effect Type | Target | Value | Scope | +|------------|--------|-------|-------| +| Income Area Effect | Fisheries | +1.5 | Radius-based | + +- **improvesBuildings:** + - [Eel Grabber](#building-eel-grabber) + - [Oyster Bed](#building-oyster-bed) *(not defined in supplied files; placeholder)* + - [Cockle Picker](#building-cockle-picker) + - [Scomber's Shack](#building-scombers-shack) *(placeholder)* + - [Fishing Hut](#building-fishing-hut) + - [Sturgeon Hatchery](#building-sturgeon-hatchery) *(placeholder)* + +- **stackRules:** Unknown (not present in supplied files) +- **usagePatterns:** Slot into a coastal hub building covering many fisheries. +- **commonPitfalls:** Misplaced radius ⇒ zero value; does not fix overproduction warnings. + +--- + +## Economy & Diagnostics + +### Maintenance Model {#system-maintenance} + +- **rule:** Nearly every building has ongoing gold + workforce maintenance. [oai_citation:117‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **example:** Fishing Hut costs −6 gold/min and uses 4 Tier I workers. [oai_citation:118‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **example:** Bakery costs −14 gold/min and uses 3 Tier II workers. [oai_citation:119‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **rule:** Deleting buildings stops upkeep and frees workforce. [oai_citation:120‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) + +### Area Effects {#system-area-effects} + +- **rule:** Buildings can give positive/negative proximity modifiers (shown by green/red arrows on placement). [oai_citation:121‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **example:** Spinner gives income boost near buildings. [oai_citation:122‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **example:** Polluters (e.g., Charcoal Burner) decrease happiness/health (mentioned). [oai_citation:123‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) + +### Statistics Screen {#system-statistics-screen} + +- **rule:** Use statistics to compare production vs consumption; overproduction flagged (e.g., “too much Sheep”). [oai_citation:124‡research_2.txt](sediment://file_000000005adc71f685d34607bf4d3973) +- **diagnostic:** + - Green bar high ⇒ overproduction ⇒ export/demolish/disable + - White bar high ⇒ shortage ⇒ add buildings or fix logistics [oai_citation:125‡research_2.txt](sediment://file_000000005adc71f685d34607bf4d3973) + +--- + +## Monuments + +### Amphitheatre {#monument-amphitheatre} + +- **Entity Type:** Building (Monument) +- **unique:** One per island (reported) [oai_citation:126‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **unlockCondition:** Patricians exist (Tier IV) [oai_citation:127‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **construction:** 4 stages; large time + resources; later stages require expensive materials (marble/glass/iron mentioned) [oai_citation:128‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **effects (complete):** +3 Population, +3 Happiness, +7 Prestige (large radius) [oai_citation:129‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **events:** Hosts events (local games / grand games / naumachia) consuming goods/workforce for city buffs. [oai_citation:130‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +- **commonPitfalls:** Starting monument too early can bankrupt you (maintenance + diverted materials). + +--- + +## Troubleshooting Playbooks + +### Playbook: “My income is bouncing up and down” {#playbook-income-bouncing} + +1. **Check upkeep spikes:** did you place a high-upkeep building (e.g., Bakery)? [oai_citation:131‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +2. **Check need flicker:** are food/clothing stocks dipping to zero intermittently? (storage/transport) [oai_citation:132‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +3. **Check workforce:** red hammer / missing tier workers after upgrades. [oai_citation:133‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +4. **Open Statistics Screen:** verify production vs consumption bars. [oai_citation:134‡research_2.txt](sediment://file_000000005adc71f685d34607bf4d3973) +5. **Fix by priority:** Tier I Food → Tier I Fashion → Tier II staple chains. + +### Playbook: “Game says I have too much Sheep” {#playbook-too-much-sheep} + +1. Confirm overproduction in Statistics Screen. [oai_citation:135‡research_2.txt](sediment://file_000000005adc71f685d34607bf4d3973) +2. Add/scale downstream processor (Felter) if present in your build. +3. Export surplus via trade routes or diplomatic orders. [oai_citation:136‡research_2.txt](sediment://file_000000005adc71f685d34607bf4d3973) +4. Demolish/disable extra farms to stop upkeep drain. [oai_citation:137‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) + +### Playbook: “Why are my houses not upgrading?” {#playbook-houses-not-upgrading} + +1. Ensure at least one need per category is met. [oai_citation:138‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +2. Ensure service buildings’ area coverage includes houses (roads/range). [oai_citation:139‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) +3. Ensure storage has the goods (not just “producing”, but delivered). [oai_citation:140‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) + +--- + +## Glossary + +- **Need Flicker:** A need repeatedly turning on/off because storage hits zero intermittently. +- **Area Effect:** Radius-based modifier from a building or specialist (income, happiness, safety). +- **Upkeep:** Ongoing gold loss and workforce reservation for a building. +- **Throughput:** Effective goods per time, impacted by cycle time and logistics. +- **Warehouse Cloud:** Shared island storage accessible via connected warehouses/trading post. [oai_citation:141‡research_1.txt](sediment://file_00000000bf1071f69301ec14cba01a64) + +--- + +## Placeholders (defined for linking; no data in supplied files) + +### Oyster Bed {#building-oyster-bed} +- **Entity Type:** Building +- **status:** Placeholder (no stats in supplied research files) + +### Scomber's Shack {#building-scombers-shack} +- **Entity Type:** Building +- **status:** Placeholder (no stats in supplied research files) + +### Sturgeon Hatchery {#building-sturgeon-hatchery} +- **Entity Type:** Building +- **status:** Placeholder (no stats in supplied research files) \ No newline at end of file diff --git a/processed.md b/processed.md new file mode 100644 index 0000000..dc4d99f --- /dev/null +++ b/processed.md @@ -0,0 +1,14 @@ +# Processed Scraped Files + +This file tracks which JSON files from `scraped_data/` have been incorporated into `docs.md`. + +When Claude processes a JSON file and adds its data to docs.md, mark it here. + +## Processed Files + + + +## Pending Files +- [ ] anno-117-tools_produktionsketten.json + +- [ ] anno-117-tools.json diff --git a/python/scraper.py b/python/scraper.py new file mode 100644 index 0000000..d5a6b2e --- /dev/null +++ b/python/scraper.py @@ -0,0 +1,256 @@ +#!/usr/bin/env python3 +""" +Anno 117 Web Scraper + +Scrapes pages listed in scraping.md, extracts game data, +discovers new pages, and updates the scraping list. +""" + +import re +import json +from pathlib import Path +from urllib.parse import urljoin, urlparse + +import requests +from bs4 import BeautifulSoup + +# Project paths +PROJECT_ROOT = Path(__file__).parent.parent +SCRAPING_MD = PROJECT_ROOT / "scraping.md" +PROCESSED_MD = PROJECT_ROOT / "processed.md" +OUTPUT_DIR = PROJECT_ROOT / "scraped_data" + + +def read_scraping_md() -> tuple[list[str], list[str], str]: + """ + Read scraping.md and return (unchecked_urls, checked_urls, full_content). + """ + content = SCRAPING_MD.read_text(encoding="utf-8") + + unchecked = re.findall(r"^- \[ \] (https?://[^\s]+)", content, re.MULTILINE) + checked = re.findall(r"^- \[x\] (https?://[^\s]+)", content, re.MULTILINE) + + return unchecked, checked, content + + +def mark_url_as_done(url: str) -> None: + """Mark a URL as scraped in scraping.md.""" + content = SCRAPING_MD.read_text(encoding="utf-8") + + # Use regex to match the exact URL (followed by newline or end of string) + # This prevents partial URL matches + escaped_url = re.escape(url) + pattern = rf"^- \[ \] {escaped_url}$" + replacement = f"- [x] {url}" + + content = re.sub(pattern, replacement, content, flags=re.MULTILINE) + SCRAPING_MD.write_text(content, encoding="utf-8") + print(f"Marked as done: {url}") + + +def add_new_urls(new_urls: list[str]) -> None: + """Add newly discovered URLs to scraping.md if not already present.""" + unchecked, checked, content = read_scraping_md() + existing = set(unchecked + checked) + + urls_to_add = [url for url in new_urls if url not in existing] + + if urls_to_add: + # Append new URLs at the end + additions = "\n".join(f"- [ ] {url}" for url in urls_to_add) + content = content.rstrip() + "\n" + additions + "\n" + SCRAPING_MD.write_text(content, encoding="utf-8") + print(f"Added {len(urls_to_add)} new URLs to scraping.md") + for url in urls_to_add: + print(f" + {url}") + + +def extract_links(soup: BeautifulSoup, base_url: str) -> list[str]: + """Extract relevant anno.land links from the page.""" + links = [] + base_domain = urlparse(base_url).netloc + + for a in soup.find_all("a", href=True): + href = a["href"] + full_url = urljoin(base_url, href) + parsed = urlparse(full_url) + + # Only keep links from the same domain and relevant paths + if parsed.netloc == base_domain: + # Filter for Anno 117 related content + if any(keyword in parsed.path for keyword in [ + "anno-117", "goods", "buildings", "specialists", + "skills", "guides", "tools", "datenbank" + ]): + # Clean the URL (remove fragments and query params for deduplication) + clean_url = f"{parsed.scheme}://{parsed.netloc}{parsed.path}" + if clean_url.endswith("/"): + clean_url = clean_url.rstrip("/") + "/" + else: + clean_url = clean_url + "/" if not parsed.path.endswith((".html", ".php")) else clean_url + + if clean_url not in links: + links.append(clean_url) + + return links + + +def scrape_page(url: str) -> dict: + """ + Scrape a single page and extract relevant content. + Returns a dict with the scraped data. + """ + print(f"Scraping: {url}") + + headers = { + "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36" + } + + response = requests.get(url, headers=headers, timeout=30) + response.raise_for_status() + + soup = BeautifulSoup(response.text, "html.parser") + + # Extract page title + title = soup.find("title") + title_text = title.get_text(strip=True) if title else "Unknown" + + # Extract main content (adjust selectors based on site structure) + main_content = soup.find("main") or soup.find("article") or soup.find("div", class_="content") + + # Extract all text content + if main_content: + text_content = main_content.get_text(separator="\n", strip=True) + else: + # Fallback to body + body = soup.find("body") + text_content = body.get_text(separator="\n", strip=True) if body else "" + + # Extract tables (common for game data) + tables = [] + for table in soup.find_all("table"): + table_data = [] + for row in table.find_all("tr"): + cells = [cell.get_text(strip=True) for cell in row.find_all(["td", "th"])] + if cells: + table_data.append(cells) + if table_data: + tables.append(table_data) + + # Extract images (for item/building icons) + images = [] + for img in soup.find_all("img"): + src = img.get("src", "") + alt = img.get("alt", "") + if src and any(keyword in src.lower() for keyword in ["icon", "item", "building", "good"]): + images.append({"src": urljoin(url, src), "alt": alt}) + + # Extract discovered links + discovered_links = extract_links(soup, url) + + # Extract all images (not just filtered ones) + all_images = [] + for img in soup.find_all("img"): + src = img.get("src", "") + alt = img.get("alt", "") + if src: + all_images.append({"src": urljoin(url, src), "alt": alt}) + + return { + "url": url, + "title": title_text, + "text_content": text_content, # Full content for Claude to process + "tables": tables, + "images": images, # Filtered icons + "all_images": all_images, # All images on page + "discovered_links": discovered_links, + "full_html_length": len(response.text) + } + + +def save_scraped_data(data: dict, url: str) -> Path: + """Save scraped data to a JSON file.""" + OUTPUT_DIR.mkdir(exist_ok=True) + + # Create filename from URL + parsed = urlparse(url) + path_parts = [p for p in parsed.path.split("/") if p] + filename = "_".join(path_parts) if path_parts else "index" + filename = re.sub(r"[^\w\-]", "_", filename) + + output_file = OUTPUT_DIR / f"{filename}.json" + + with open(output_file, "w", encoding="utf-8") as f: + json.dump(data, f, indent=2, ensure_ascii=False) + + print(f"Saved to: {output_file}") + return output_file + + +def add_pending_file(json_filename: str) -> None: + """Add a JSON file to the pending section of processed.md.""" + content = PROCESSED_MD.read_text(encoding="utf-8") + + # Check if file is already listed + if json_filename in content: + return + + # Add to pending section + pending_marker = "## Pending Files" + if pending_marker in content: + content = content.replace( + pending_marker, + f"{pending_marker}\n- [ ] {json_filename}" + ) + PROCESSED_MD.write_text(content, encoding="utf-8") + print(f"Added to processed.md pending: {json_filename}") + + +def main(): + """Main entry point - scrape one unchecked page.""" + unchecked, checked, _ = read_scraping_md() + + if not unchecked: + print("No unchecked URLs found in scraping.md") + return + + print(f"Found {len(unchecked)} unchecked URLs") + print(f"Already scraped: {len(checked)} URLs") + + # Take the first unchecked URL + url = unchecked[0] + + try: + # Scrape the page + data = scrape_page(url) + + # Save the data + output_file = save_scraped_data(data, url) + + # Track in processed.md as pending + add_pending_file(output_file.name) + + # Print summary + print(f"\n--- Summary ---") + print(f"Title: {data['title']}") + print(f"Content length: {len(data['text_content'])} chars") + print(f"Tables found: {len(data['tables'])}") + print(f"Images found: {len(data['images'])}") + print(f"Links discovered: {len(data['discovered_links'])}") + + # Add discovered links to scraping.md + if data["discovered_links"]: + add_new_urls(data["discovered_links"]) + + # Mark this URL as done + mark_url_as_done(url) + + print(f"\nSuccessfully scraped: {url}") + + except requests.RequestException as e: + print(f"Error scraping {url}: {e}") + raise + + +if __name__ == "__main__": + main() diff --git a/scraped_data/anno-117-tools.json b/scraped_data/anno-117-tools.json new file mode 100644 index 0000000..e2099d1 --- /dev/null +++ b/scraped_data/anno-117-tools.json @@ -0,0 +1,67 @@ +{ + "url": "https://anno.land/anno-117-tools/", + "title": "🛠️ Anno 117 Tools & Planer | ANNOLAND", + "text_content": "Tools & Planer\nfür Anno 117\nKleine Helfer für Anno 117\nAuf dieser Seite findest du eine Reihe nützlicher Tools, die dir das Spielen von Anno 117 (hoffentlich) erleichtern. Vom Warenrechner über Baulayouts bis zum Skillbaum-Planer ist alles dabei. Etwas funktioniert nicht richtig? Dann\nschreib mir\nbitte.\nFolge Annoland\nYouTube\nTikTok\nWarenrechner\nEine Übersicht der Produktionsketten für alle Regionen in Anno 117, inklusive der richtigen Anzahl jedes Gebäudes, damit die Warenkette effizient läuft.\nSkillbaum Planer\nMit diesem praktischen Tool kannst du deine Anno 117 Forschung inkl. der exakten Reihenfolge planen, speichern und mit anderen teilen.\nBaulayouts (WIP)\nPlatzsparend bauen gehört zu den größten Herausforderungen in Anno 117, wenn du Wert auf eine effiziente Nutzung deiner Inselfläche legst.\nStadtplaner (WIP)\nDu willst wissen, für welche wichtigen Gebäude du in deiner Stadt genügend Platz benötigst? Dieser Planer hilft dir, bestens auf alles vorbereitet zu sein.\nSchönbau Galerie (WIP)\nDu legst wenig Wert auf Effizienz und möchtest vor allem, dass deine Stadt in Anno 117 hübsch aussieht? Dann findest du hier Inspiration für den Schönbau.", + "tables": [], + "images": [], + "all_images": [ + { + "src": "https://anno.land/wp-content/uploads/Annoland-BG-04.webp", + "alt": "Anno 117 Tools & Planer Intro Banner" + }, + { + "src": "https://anno.land/wp-content/uploads/Warenrechner-Thumb.webp", + "alt": "Warenrechner Thumbnail" + }, + { + "src": "https://anno.land/wp-content/uploads/Anno-117-Skilltree-Planer-Thumb.webp", + "alt": "Skillbaum Planer Thumbnail" + }, + { + "src": "https://anno.land/wp-content/uploads/Anno-117-Baulayouts-Thumb-2.webp", + "alt": "Baulayouts (WIP) Thumbnail" + }, + { + "src": "https://anno.land/wp-content/uploads/Tool-Stadtplaner.webp", + "alt": "Stadtplaner (WIP) Thumbnail" + }, + { + "src": "https://anno.land/wp-content/uploads/Anno-117-Schoenbau-Thumb.webp", + "alt": "Schönbau Galerie (WIP) Thumbnail" + }, + { + "src": "https://anno.land/wp-content/uploads/Annoland-BG-04.webp", + "alt": "Anno 117 Tools & Planer Outro Banner" + }, + { + "src": "https://anno.land/wp-content/uploads/sprache-de.webp", + "alt": "de_DE" + }, + { + "src": "https://anno.land/wp-content/uploads/sprache-en.webp", + "alt": "en_US" + } + ], + "discovered_links": [ + "https://anno.land/anno-117-tools/", + "https://anno.land/anno-117-tools/produktionsketten/", + "https://anno.land/anno-117-tools/skillbaum-planer/", + "https://anno.land/anno-117-tools/stadtplaner/", + "https://anno.land/anno-117-tools/baulayouts/", + "https://anno.land/anno-117-tools/schoenbau/", + "https://anno.land/anno-117-guides/", + "https://anno.land/anno-117-guides/tipps-tricks/", + "https://anno.land/anno-117-guides/gold-verdienen/", + "https://anno.land/anno-117-guides/beduerfnisse-guide/", + "https://anno.land/anno-117-guides/zwischenfaelle-managen/", + "https://anno.land/anno-117-datenbanken/", + "https://anno.land/anno-117-specialists/", + "https://anno.land/anno-117-datenbanken/kapitaen-item-datenbank/", + "https://anno.land/anno-117-goods/", + "https://anno.land/anno-117-buildings/", + "https://anno.land/anno-117-skills/", + "https://anno.land/anno-117-guides/links-mods/", + "https://anno.land/en/anno-117-tools/" + ], + "full_html_length": 32392 +} \ No newline at end of file diff --git a/scraping.md b/scraping.md new file mode 100644 index 0000000..024cc59 --- /dev/null +++ b/scraping.md @@ -0,0 +1,367 @@ +# Scrape sources + +Make sure to check for javascript/ajax calls that retrieve more data. + +Use Playwright MCP to retrieve data and url's when you cannot do it with code. + +If the pages that you scrape are not english, translate the content to english. + +Make sure the game entities/elements are always references to in their english names. + +If you find more soruces, add them to the list in this file. + +Check off pages when they are scraped. + +Scrape the following pages, and their child pages: +- [x] https://anno.land/anno-117-tools/ +- [x] https://anno.land/anno-117-tools/produktionsketten/ +- [ ] https://anno.land/anno-117-tools/skillbaum-planer/?set=AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +- [ ] https://anno.land/anno-117-guides/ +- [ ] https://anno.land/anno-117-guides/tipps-tricks/ +- [ ] https://anno.land/anno-117-guides/gold-verdienen-finanzen-guide/ +- [ ] https://anno.land/anno-117-guides/beduerfnisse-guide/ +- [ ] https://anno.land/anno-117-guides/zwischenfaelle-managen/ +- [ ] https://anno.land/anno-117-datenbanken/ +- [ ] https://anno.land/anno-117-specialists/ +- [ ] https://anno.land/anno-117-datenbanken/kapitaen-item-datenbank/ +- [ ] https://anno.land/anno-117-goods/ +- [ ] https://anno.land/anno-117-buildings/ +- [ ] https://anno.land/anno-117-skills/ +- [ ] https://anno.land/anno-117-tools/skillbaum-planer/ +- [ ] https://anno.land/anno-117-tools/stadtplaner/ +- [ ] https://anno.land/anno-117-tools/baulayouts/ +- [ ] https://anno.land/anno-117-tools/schoenbau/ +- [ ] https://anno.land/anno-117-guides/gold-verdienen/ +- [ ] https://anno.land/anno-117-guides/links-mods/ +- [ ] https://anno.land/en/anno-117-tools/ +- [ ] https://anno.land/anno-117-buildings/sardinenhuette-latium/ +- [ ] https://anno.land/anno-117-goods/sardinen/ +- [ ] https://anno.land/anno-117-buildings/haferhof-latium/ +- [ ] https://anno.land/anno-117-goods/hafer/ +- [ ] https://anno.land/anno-117-buildings/garkueche-latium/ +- [ ] https://anno.land/anno-117-goods/haferbrei/ +- [ ] https://anno.land/anno-117-buildings/markt-latium/ +- [ ] https://anno.land/anno-117-buildings/taberna-latium/ +- [ ] https://anno.land/anno-117-buildings/hanfhof-latium/ +- [ ] https://anno.land/anno-117-goods/hanf/ +- [ ] https://anno.land/anno-117-buildings/spinnerei-latium/ +- [ ] https://anno.land/anno-117-goods/tuniken/ +- [ ] https://anno.land/anno-117-buildings/schafshof-latium/ +- [ ] https://anno.land/anno-117-goods/schafe/ +- [ ] https://anno.land/anno-117-buildings/pileusfilzer-latium/ +- [ ] https://anno.land/anno-117-goods/pilei/ +- [ ] https://anno.land/anno-117-buildings/weizenhof-latium/ +- [ ] https://anno.land/anno-117-goods/weizen/ +- [ ] https://anno.land/anno-117-buildings/kornmuehle-latium/ +- [ ] https://anno.land/anno-117-goods/mehl/ +- [ ] https://anno.land/anno-117-buildings/baeckerei-latium/ +- [ ] https://anno.land/anno-117-goods/brot/ +- [ ] https://anno.land/anno-117-buildings/makrelenhuette-latium/ +- [ ] https://anno.land/anno-117-goods/makrelen/ +- [ ] https://anno.land/anno-117-buildings/salzgaerten-latium/ +- [ ] https://anno.land/anno-117-goods/salz/ +- [ ] https://anno.land/anno-117-buildings/garumsaucier-latium/ +- [ ] https://anno.land/anno-117-goods/garum/ +- [ ] https://anno.land/anno-117-buildings/heiligtum-latium/ +- [ ] https://anno.land/anno-117-buildings/grammaticus-latium/ +- [ ] https://anno.land/anno-117-buildings/schweinehof-latium/ +- [ ] https://anno.land/anno-117-goods/schweine/ +- [ ] https://anno.land/anno-117-buildings/gerberei-latium/ +- [ ] https://anno.land/anno-117-goods/leder/ +- [ ] https://anno.land/anno-117-buildings/sandalenmacher-latium/ +- [ ] https://anno.land/anno-117-goods/sandalen/ +- [ ] https://anno.land/anno-117-buildings/lavendulahof-latium/ +- [ ] https://anno.land/anno-117-goods/lavendula/ +- [ ] https://anno.land/anno-117-buildings/suelzsieder-latium/ +- [ ] https://anno.land/anno-117-goods/schmalz/ +- [ ] https://anno.land/anno-117-buildings/seifensieder-latium/ +- [ ] https://anno.land/anno-117-goods/seife/ +- [ ] https://anno.land/anno-117-buildings/lehmgrube-latium/ +- [ ] https://anno.land/anno-117-goods/lehm/ +- [ ] https://anno.land/anno-117-buildings/harzzapfer-latium/ +- [ ] https://anno.land/anno-117-goods/harz/ +- [ ] https://anno.land/anno-117-buildings/toepfer-latium/ +- [ ] https://anno.land/anno-117-goods/amphoren/ +- [ ] https://anno.land/anno-117-buildings/olivenzuechter-latium/ +- [ ] https://anno.land/anno-117-goods/oliven/ +- [ ] https://anno.land/anno-117-buildings/olivenpresse-latium/ +- [ ] https://anno.land/anno-117-goods/olivenoel/ +- [ ] https://anno.land/anno-117-buildings/weingut-latium/ +- [ ] https://anno.land/anno-117-goods/weintrauben/ +- [ ] https://anno.land/anno-117-buildings/bienenstock-latium/ +- [ ] https://anno.land/anno-117-goods/honigwaben/ +- [ ] https://anno.land/anno-117-buildings/winzer-latium/ +- [ ] https://anno.land/anno-117-goods/wein/ +- [ ] https://anno.land/anno-117-buildings/sammelbecken-latium/ +- [ ] https://anno.land/anno-117-buildings/aquaedukt-latium/ +- [ ] https://anno.land/anno-117-buildings/zisterne-latium/ +- [ ] https://anno.land/anno-117-buildings/theater-latium/ +- [ ] https://anno.land/anno-117-buildings/aleatorium-latium/ +- [ ] https://anno.land/anno-117-buildings/flachshof-latium/ +- [ ] https://anno.land/anno-117-goods/flachs/ +- [ ] https://anno.land/anno-117-buildings/weber-latium/ +- [ ] https://anno.land/anno-117-goods/stoffe/ +- [ ] https://anno.land/anno-117-buildings/schneckenzucht-latium/ +- [ ] https://anno.land/anno-117-goods/purpurschnecken/ +- [ ] https://anno.land/anno-117-buildings/faerberwerkstatt-latium/ +- [ ] https://anno.land/anno-117-goods/tyrischer-purpur/ +- [ ] https://anno.land/anno-117-buildings/webstuhl-latium/ +- [ ] https://anno.land/anno-117-goods/togen/ +- [ ] https://anno.land/anno-117-buildings/sandarakbaumschule-latium/ +- [ ] https://anno.land/anno-117-goods/sandarakholz/ +- [ ] https://anno.land/anno-117-buildings/tabulus-latium/ +- [ ] https://anno.land/anno-117-goods/schrifttafeln/ +- [ ] https://anno.land/anno-117-buildings/mineralsteinbruch-latium/ +- [ ] https://anno.land/anno-117-goods/mineralien/ +- [ ] https://anno.land/anno-117-buildings/mineralienmalmer-latium/ +- [ ] https://anno.land/anno-117-goods/farbstoffe/ +- [ ] https://anno.land/anno-117-buildings/sandraffinerie-latium/ +- [ ] https://anno.land/anno-117-goods/quarzsand/ +- [ ] https://anno.land/anno-117-buildings/glasschmelzer-latium/ +- [ ] https://anno.land/anno-117-goods/glas/ +- [ ] https://anno.land/anno-117-buildings/glasblaeser-latium/ +- [ ] https://anno.land/anno-117-goods/feines-glas/ +- [ ] https://anno.land/anno-117-buildings/forum-latium/ +- [ ] https://anno.land/anno-117-buildings/baeder-latium/ +- [ ] https://anno.land/anno-117-buildings/amphitheater-latium/ +- [ ] https://anno.land/anno-117-buildings/austernfarm-latium/ +- [ ] https://anno.land/anno-117-goods/austern/ +- [ ] https://anno.land/anno-117-buildings/stoerzucht-latium/ +- [ ] https://anno.land/anno-117-goods/stoere/ +- [ ] https://anno.land/anno-117-buildings/fischweider-latium/ +- [ ] https://anno.land/anno-117-goods/kaviar/ +- [ ] https://anno.land/anno-117-buildings/meeresgourmet-latium/ +- [ ] https://anno.land/anno-117-goods/austern-mit-kaviar/ +- [ ] https://anno.land/anno-117-buildings/tempel-latium/ +- [ ] https://anno.land/anno-117-buildings/bibliothek-latium/ +- [ ] https://anno.land/anno-117-buildings/goldwaescher-latium/ +- [ ] https://anno.land/anno-117-goods/golderz/ +- [ ] https://anno.land/anno-117-buildings/goldschmied-latium/ +- [ ] https://anno.land/anno-117-goods/gold/ +- [ ] https://anno.land/anno-117-buildings/juwelier-latium/ +- [ ] https://anno.land/anno-117-goods/halsketten/ +- [ ] https://anno.land/anno-117-buildings/polsterer-latium/ +- [ ] https://anno.land/anno-117-goods/polster/ +- [ ] https://anno.land/anno-117-buildings/liegenbauer-latium/ +- [ ] https://anno.land/anno-117-goods/liegen/ +- [ ] https://anno.land/anno-117-buildings/saitenmacher-latium/ +- [ ] https://anno.land/anno-117-goods/saiten/ +- [ ] https://anno.land/anno-117-buildings/vergolder-latium/ +- [ ] https://anno.land/anno-117-goods/verziertes-holz/ +- [ ] https://anno.land/anno-117-buildings/lyramacher-latium/ +- [ ] https://anno.land/anno-117-goods/lyren/ +- [ ] https://anno.land/anno-117-buildings/herzmuschelfarm-albion/ +- [ ] https://anno.land/anno-117-goods/herzmuscheln/ +- [ ] https://anno.land/anno-117-buildings/aalfaenger-albion/ +- [ ] https://anno.land/anno-117-goods/aale/ +- [ ] https://anno.land/anno-117-buildings/markt-albion/ +- [ ] https://anno.land/anno-117-buildings/saengerstube-albion/ +- [ ] https://anno.land/anno-117-buildings/schilfsammler-albion/ +- [ ] https://anno.land/anno-117-goods/schilf/ +- [ ] https://anno.land/anno-117-buildings/schuhweber-albion/ +- [ ] https://anno.land/anno-117-goods/schilfschuhe/ +- [ ] https://anno.land/anno-117-buildings/hanfhof-albion/ +- [ ] https://anno.land/anno-117-buildings/spinnerei-albion/ +- [ ] https://anno.land/anno-117-buildings/ochsenhof-albion/ +- [ ] https://anno.land/anno-117-goods/ochsen/ +- [ ] https://anno.land/anno-117-buildings/kaeserei-albion/ +- [ ] https://anno.land/anno-117-goods/kaese/ +- [ ] https://anno.land/anno-117-buildings/gerstenhof-albion/ +- [ ] https://anno.land/anno-117-goods/gerste/ +- [ ] https://anno.land/anno-117-buildings/maelzerei-albion/ +- [ ] https://anno.land/anno-117-goods/malz/ +- [ ] https://anno.land/anno-117-buildings/brauerei-albion/ +- [ ] https://anno.land/anno-117-goods/bier/ +- [ ] https://anno.land/anno-117-buildings/wettkampfwiese-albion/ +- [ ] https://anno.land/anno-117-buildings/fanum-albion/ +- [ ] https://anno.land/anno-117-buildings/schafshof-albion/ +- [ ] https://anno.land/anno-117-buildings/faerberwaupflanze-albion/ +- [ ] https://anno.land/anno-117-goods/faerberpflanzen/ +- [ ] https://anno.land/anno-117-buildings/hosenmacher-albion/ +- [ ] https://anno.land/anno-117-goods/hosen/ +- [ ] https://anno.land/anno-117-buildings/kupfermine-albion/ +- [ ] https://anno.land/anno-117-goods/kupfererz/ +- [ ] https://anno.land/anno-117-buildings/drahtzwirbler-albion/ +- [ ] https://anno.land/anno-117-goods/torques/ +- [ ] https://anno.land/anno-117-buildings/zinnmine-albion/ +- [ ] https://anno.land/anno-117-goods/zinnerz/ +- [ ] https://anno.land/anno-117-buildings/horner-albion/ +- [ ] https://anno.land/anno-117-goods/trinkhoerner/ +- [ ] https://anno.land/anno-117-buildings/bronzeschmelzer-albion/ +- [ ] https://anno.land/anno-117-goods/bronze/ +- [ ] https://anno.land/anno-117-buildings/schildschlaeger-albion/ +- [ ] https://anno.land/anno-117-goods/clanschilde/ +- [ ] https://anno.land/anno-117-buildings/salzkrautsammler-albion/ +- [ ] https://anno.land/anno-117-goods/salzkraut/ +- [ ] https://anno.land/anno-117-buildings/erdofen-albion/ +- [ ] https://anno.land/anno-117-goods/rinderbraten/ +- [ ] https://anno.land/anno-117-buildings/weingut-albion/ +- [ ] https://anno.land/anno-117-buildings/bienenstock-albion/ +- [ ] https://anno.land/anno-117-buildings/winzer-albion/ +- [ ] https://anno.land/anno-117-buildings/aeltestenrat-albion/ +- [ ] https://anno.land/anno-117-buildings/theater-albion/ +- [ ] https://anno.land/anno-117-buildings/gruenhaende-albion/ +- [ ] https://anno.land/anno-117-goods/keltischgruen/ +- [ ] https://anno.land/anno-117-buildings/birrusnaeher-albion/ +- [ ] https://anno.land/anno-117-goods/umhaenge/ +- [ ] https://anno.land/anno-117-buildings/biberfaenger-albion/ +- [ ] https://anno.land/anno-117-goods/biber/ +- [ ] https://anno.land/anno-117-buildings/salzkrautbrenner-albion/ +- [ ] https://anno.land/anno-117-goods/salzlake/ +- [ ] https://anno.land/anno-117-buildings/bieberhutmacher-albion/ +- [ ] https://anno.land/anno-117-goods/fellmuetzen/ +- [ ] https://anno.land/anno-117-buildings/pferdefaenger-albion/ +- [ ] https://anno.land/anno-117-goods/ponys/ +- [ ] https://anno.land/anno-117-buildings/gestellbauer-albion/ +- [ ] https://anno.land/anno-117-goods/holz/ +- [ ] https://anno.land/anno-117-goods/unterbau/ +- [ ] https://anno.land/anno-117-buildings/wagenbauer-albion/ +- [ ] https://anno.land/anno-117-goods/streitwagen/ +- [ ] https://anno.land/anno-117-buildings/huegelgrab-albion/ +- [ ] https://anno.land/anno-117-buildings/heiliger-hain-albion/ +- [ ] https://anno.land/anno-117-buildings/weizenhof-albion/ +- [ ] https://anno.land/anno-117-buildings/eselsmuehle-albion/ +- [ ] https://anno.land/anno-117-buildings/baeckerei-albion/ +- [ ] https://anno.land/anno-117-buildings/schweinehof-albion/ +- [ ] https://anno.land/anno-117-buildings/kraeutergarten-albion/ +- [ ] https://anno.land/anno-117-goods/kraeuter/ +- [ ] https://anno.land/anno-117-buildings/salsicium-albion/ +- [ ] https://anno.land/anno-117-goods/wuerste/ +- [ ] https://anno.land/anno-117-buildings/grammaticus-albion/ +- [ ] https://anno.land/anno-117-buildings/silbermine-albion/ +- [ ] https://anno.land/anno-117-goods/silbererz/ +- [ ] https://anno.land/anno-117-buildings/silberschmiede-albion/ +- [ ] https://anno.land/anno-117-goods/silber/ +- [ ] https://anno.land/anno-117-buildings/fibularium-albion/ +- [ ] https://anno.land/anno-117-goods/fibeln/ +- [ ] https://anno.land/anno-117-buildings/suelzsieder-albion/ +- [ ] https://anno.land/anno-117-buildings/schlammtrockner-albion/ +- [ ] https://anno.land/anno-117-goods/schlamm/ +- [ ] https://anno.land/anno-117-buildings/toepfer-albion/ +- [ ] https://anno.land/anno-117-buildings/harzzapfer-albion/ +- [ ] https://anno.land/anno-117-buildings/vogelfaenger-albion/ +- [ ] https://anno.land/anno-117-goods/kleine-voegel/ +- [ ] https://anno.land/anno-117-buildings/zungenzieher-albion/ +- [ ] https://anno.land/anno-117-goods/vogelzungen/ +- [ ] https://anno.land/anno-117-buildings/delicium-albion/ +- [ ] https://anno.land/anno-117-goods/vogelzungen-in-aspik/ +- [ ] https://anno.land/anno-117-buildings/aleatorium-albion/ +- [ ] https://anno.land/anno-117-buildings/pferdezuechter-albion/ +- [ ] https://anno.land/anno-117-goods/pferde/ +- [ ] https://anno.land/anno-117-buildings/haarnetzweber-albion/ +- [ ] https://anno.land/anno-117-goods/haarnetz/ +- [ ] https://anno.land/anno-117-buildings/perueckenknuepfer-albion/ +- [ ] https://anno.land/anno-117-goods/peruecken/ +- [ ] https://anno.land/anno-117-buildings/flachshof-albion/ +- [ ] https://anno.land/anno-117-buildings/kammmuschelzuechter-albion/ +- [ ] https://anno.land/anno-117-goods/kammmuschelschalen/ +- [ ] https://anno.land/anno-117-buildings/narcissium-albion/ +- [ ] https://anno.land/anno-117-goods/handspiegel/ +- [ ] https://anno.land/anno-117-buildings/tempel-albion/ +- [ ] https://anno.land/anno-117-buildings/baeder-albion/ +- [ ] https://anno.land/anno-117-buildings/sammelbecken-albion/ +- [ ] https://anno.land/anno-117-buildings/aquaedukt-albion/ +- [ ] https://anno.land/anno-117-buildings/zisterne-albion/ +- [ ] https://anno.land/anno-117-buildings/holzfaeller-latium/ +- [ ] https://anno.land/anno-117-buildings/saegewerk-latium/ +- [ ] https://anno.land/anno-117-goods/bretter/ +- [ ] https://anno.land/anno-117-buildings/ziegelei-latium/ +- [ ] https://anno.land/anno-117-goods/ziegel/ +- [ ] https://anno.land/anno-117-buildings/kalksteinbruch-latium/ +- [ ] https://anno.land/anno-117-goods/kalkstein/ +- [ ] https://anno.land/anno-117-buildings/betonmischer-latium/ +- [ ] https://anno.land/anno-117-goods/beton/ +- [ ] https://anno.land/anno-117-buildings/marmorsteinbruch-latium/ +- [ ] https://anno.land/anno-117-goods/rohmarmor/ +- [ ] https://anno.land/anno-117-buildings/marmor-steinmetz-latium/ +- [ ] https://anno.land/anno-117-goods/marmor/ +- [ ] https://anno.land/anno-117-buildings/mosaikmacher-latium/ +- [ ] https://anno.land/anno-117-goods/mosaike/ +- [ ] https://anno.land/anno-117-buildings/holzfaeller-albion/ +- [ ] https://anno.land/anno-117-buildings/saegewerk-albion/ +- [ ] https://anno.land/anno-117-buildings/lehmwerkhof-albion/ +- [ ] https://anno.land/anno-117-goods/flechtwerk/ +- [ ] https://anno.land/anno-117-buildings/ziegelei-albion/ +- [ ] https://anno.land/anno-117-buildings/kalksteinbruch-albion/ +- [ ] https://anno.land/anno-117-buildings/sandraffinerie-albion/ +- [ ] https://anno.land/anno-117-buildings/betonmischer-albion/ +- [ ] https://anno.land/anno-117-buildings/granitsteinbruch-albion/ +- [ ] https://anno.land/anno-117-goods/granitbloecke/ +- [ ] https://anno.land/anno-117-buildings/granitschneider-albion/ +- [ ] https://anno.land/anno-117-goods/granit/ +- [ ] https://anno.land/anno-117-buildings/koehler-albion/ +- [ ] https://anno.land/anno-117-goods/kohle/ +- [ ] https://anno.land/anno-117-buildings/koehler-latium/ +- [ ] https://anno.land/anno-117-buildings/liberti-latium/ +- [ ] https://anno.land/anno-117-buildings/kontor-latium/ +- [ ] https://anno.land/anno-117-buildings/lagerhaus-latium/ +- [ ] https://anno.land/anno-117-buildings/schiffswerft-latium/ +- [ ] https://anno.land/anno-117-buildings/anlegestelle-latium/ +- [ ] https://anno.land/anno-117-buildings/depot-latium/ +- [ ] https://anno.land/anno-117-buildings/reparaturkran-latium/ +- [ ] https://anno.land/anno-117-buildings/seilmacher-latium/ +- [ ] https://anno.land/anno-117-goods/seile/ +- [ ] https://anno.land/anno-117-buildings/segelmacher-latium/ +- [ ] https://anno.land/anno-117-goods/segel/ +- [ ] https://anno.land/anno-117-buildings/kaserne-latium/ +- [ ] https://anno.land/anno-117-buildings/belagerungswerkstatt-latium/ +- [ ] https://anno.land/anno-117-buildings/campus-equitum-latium/ +- [ ] https://anno.land/anno-117-buildings/eisenmine-latium/ +- [ ] https://anno.land/anno-117-goods/eisenerz/ +- [ ] https://anno.land/anno-117-buildings/ofen-latium/ +- [ ] https://anno.land/anno-117-goods/eisen/ +- [ ] https://anno.land/anno-117-buildings/waffenschmied-latium/ +- [ ] https://anno.land/anno-117-goods/waffen/ +- [ ] https://anno.land/anno-117-buildings/pferdezuechter-latium/ +- [ ] https://anno.land/anno-117-buildings/ruestungsschmied-latium/ +- [ ] https://anno.land/anno-117-goods/ruestung/ +- [ ] https://anno.land/anno-117-buildings/vigiles-latium/ +- [ ] https://anno.land/anno-117-buildings/custodia-latium/ +- [ ] https://anno.land/anno-117-buildings/medici-latium/ +- [ ] https://anno.land/anno-117-buildings/brunnen-latium/ +- [ ] https://anno.land/anno-117-buildings/wachturm-latium/ +- [ ] https://anno.land/anno-117-buildings/latrine-latium/ +- [ ] https://anno.land/anno-117-buildings/villa-des-praetors-latium/ +- [ ] https://anno.land/anno-117-buildings/officium-latium/ +- [ ] https://anno.land/anno-117-buildings/schrein-von-ceres-latium/ +- [ ] https://anno.land/anno-117-buildings/schrein-von-epona-latium/ +- [ ] https://anno.land/anno-117-buildings/schrein-von-cernunnos-latium/ +- [ ] https://anno.land/anno-117-buildings/schrein-von-mars-latium/ +- [ ] https://anno.land/anno-117-buildings/schrein-von-merkur-lugus-latium/ +- [ ] https://anno.land/anno-117-buildings/schrein-von-minerva-latium/ +- [ ] https://anno.land/anno-117-buildings/schrein-von-neptun-latium/ +- [ ] https://anno.land/anno-117-buildings/schrein-von-epona-albion/ +- [ ] https://anno.land/anno-117-buildings/schrein-von-ceres-albion/ +- [ ] https://anno.land/anno-117-buildings/schrein-von-cernunnos-albion/ +- [ ] https://anno.land/anno-117-buildings/schrein-von-mars-albion/ +- [ ] https://anno.land/anno-117-buildings/schrein-von-merkur-lugus-albion/ +- [ ] https://anno.land/anno-117-buildings/schrein-von-minerva-albion/ +- [ ] https://anno.land/anno-117-buildings/schrein-von-neptun-albion/ +- [ ] https://anno.land/anno-117-buildings/wanderer-albion/ +- [ ] https://anno.land/anno-117-buildings/kontor-albion/ +- [ ] https://anno.land/anno-117-buildings/lagerhaus-albion/ +- [ ] https://anno.land/anno-117-buildings/schleusentor-albion/ +- [ ] https://anno.land/anno-117-buildings/entwaesserungskanal-albion/ +- [ ] https://anno.land/anno-117-buildings/schiffswerft-albion/ +- [ ] https://anno.land/anno-117-buildings/depot-albion/ +- [ ] https://anno.land/anno-117-buildings/handelskai-albion/ +- [ ] https://anno.land/anno-117-buildings/reparaturkran-albion/ +- [ ] https://anno.land/anno-117-buildings/segelmacher-albion/ +- [ ] https://anno.land/anno-117-buildings/seilmacher-albion/ +- [ ] https://anno.land/anno-117-buildings/kaserne-albion/ +- [ ] https://anno.land/anno-117-buildings/campus-equitum-albion/ +- [ ] https://anno.land/anno-117-buildings/belagerungswerkstatt-albion/ +- [ ] https://anno.land/anno-117-buildings/eisenmine-albion/ +- [ ] https://anno.land/anno-117-buildings/ofen-albion/ +- [ ] https://anno.land/anno-117-buildings/waffenschmied-albion/ +- [ ] https://anno.land/anno-117-buildings/gerberei-albion/ +- [ ] https://anno.land/anno-117-buildings/ruestungsschmied-albion/ +- [ ] https://anno.land/anno-117-buildings/villa-des-praetors-albion/ +- [ ] https://anno.land/anno-117-buildings/officium-albion/ +- [ ] https://anno.land/anno-117-buildings/medici-albion/ +- [ ] https://anno.land/anno-117-buildings/custodes-albion/ +- [ ] https://anno.land/anno-117-buildings/vigiles-albion/ +- [ ] https://anno.land/anno-117-buildings/latrine-albion/ +- [ ] https://anno.land/anno-117-buildings/wachturm-albion/ +- [ ] https://anno.land/anno-117-buildings/brunnen-albion/ +- [ ] https://anno.land/en/anno-117-tools/produktionsketten/