Files
catan/catan/data.py
dan 46a07f548b
Some checks failed
ci / tests (push) Has been cancelled
Add microservices, web UI, and replay tooling
2025-12-25 03:28:40 +03:00

126 lines
2.5 KiB
Python

from __future__ import annotations
from dataclasses import dataclass
from enum import Enum
from typing import Dict, List, Tuple
class Resource(Enum):
BRICK = "brick"
LUMBER = "lumber"
WOOL = "wool"
GRAIN = "grain"
ORE = "ore"
DESERT = "desert"
class DevelopmentCard(Enum):
KNIGHT = "knight"
ROAD_BUILDING = "road_building"
YEAR_OF_PLENTY = "year_of_plenty"
MONOPOLY = "monopoly"
VICTORY_POINT = "victory_point"
class BuildingType(Enum):
SETTLEMENT = "settlement"
CITY = "city"
RESOURCE_TOKENS: List[Resource] = [
Resource.BRICK,
Resource.BRICK,
Resource.BRICK,
Resource.LUMBER,
Resource.LUMBER,
Resource.LUMBER,
Resource.LUMBER,
Resource.WOOL,
Resource.WOOL,
Resource.WOOL,
Resource.WOOL,
Resource.GRAIN,
Resource.GRAIN,
Resource.GRAIN,
Resource.GRAIN,
Resource.ORE,
Resource.ORE,
Resource.ORE,
Resource.DESERT,
]
NUMBER_TOKENS: List[int] = [
2,
3,
3,
4,
4,
5,
5,
6,
6,
8,
8,
9,
9,
10,
10,
11,
11,
12,
]
DEV_CARD_DISTRIBUTION: Dict[DevelopmentCard, int] = {
DevelopmentCard.KNIGHT: 14,
DevelopmentCard.ROAD_BUILDING: 2,
DevelopmentCard.YEAR_OF_PLENTY: 2,
DevelopmentCard.MONOPOLY: 2,
DevelopmentCard.VICTORY_POINT: 5,
}
BUILD_COSTS: Dict[str, Dict[Resource, int]] = {
"road": {Resource.BRICK: 1, Resource.LUMBER: 1},
"settlement": {
Resource.BRICK: 1,
Resource.LUMBER: 1,
Resource.WOOL: 1,
Resource.GRAIN: 1,
},
"city": {Resource.GRAIN: 2, Resource.ORE: 3},
"development": {Resource.WOOL: 1, Resource.GRAIN: 1, Resource.ORE: 1},
}
SETTLEMENT_LIMIT = 5
CITY_LIMIT = 4
ROAD_LIMIT = 15
VICTORY_POINTS_TO_WIN = 10
class PortKind(Enum):
THREE_FOR_ONE = "three_for_one"
TWO_FOR_ONE = "two_for_one"
@dataclass(frozen=True)
class Port:
ratio: int
resource: Resource | None
kind: PortKind
PORT_SEQUENCE: List[Port] = [
Port(3, None, PortKind.THREE_FOR_ONE),
Port(2, Resource.BRICK, PortKind.TWO_FOR_ONE),
Port(3, None, PortKind.THREE_FOR_ONE),
Port(2, Resource.WOOL, PortKind.TWO_FOR_ONE),
Port(3, None, PortKind.THREE_FOR_ONE),
Port(2, Resource.GRAIN, PortKind.TWO_FOR_ONE),
Port(2, Resource.LUMBER, PortKind.TWO_FOR_ONE),
Port(3, None, PortKind.THREE_FOR_ONE),
Port(2, Resource.ORE, PortKind.TWO_FOR_ONE),
]
CornerCoord = Tuple[int, int, int]
EdgeID = frozenset[CornerCoord]