1
0
Fork 0
taleweave-ai/adventure/models/entity.py

68 lines
1.7 KiB
Python

from typing import Callable, Dict, List, Literal
from pydantic import Field
from .base import BaseModel, dataclass, uuid
Actions = Dict[str, Callable]
AttributeValue = bool | int | str
Attributes = Dict[str, AttributeValue]
@dataclass
class Item(BaseModel):
name: str
description: str
actions: Actions = Field(default_factory=dict)
attributes: Attributes = Field(default_factory=dict)
items: List["Item"] = Field(default_factory=list)
id: str = Field(default_factory=uuid)
type: Literal["item"] = "item"
@dataclass
class Actor(BaseModel):
name: str
backstory: str
description: str
actions: Actions = Field(default_factory=dict)
attributes: Attributes = Field(default_factory=dict)
items: List[Item] = Field(default_factory=list)
id: str = Field(default_factory=uuid)
type: Literal["actor"] = "actor"
@dataclass
class Room(BaseModel):
name: str
description: str
actors: List[Actor] = Field(default_factory=list)
actions: Actions = Field(default_factory=dict)
attributes: Attributes = Field(default_factory=dict)
items: List[Item] = Field(default_factory=list)
portals: Dict[str, str] = Field(default_factory=dict)
id: str = Field(default_factory=uuid)
type: Literal["room"] = "room"
@dataclass
class World(BaseModel):
name: str
order: List[str]
rooms: List[Room]
theme: str
id: str = Field(default_factory=uuid)
type: Literal["world"] = "world"
@dataclass
class WorldState(BaseModel):
memory: Dict[str, List[str | Dict[str, str]]]
step: int
world: World
id: str = Field(default_factory=uuid)
type: Literal["world_state"] = "world_state"
WorldEntity = Room | Actor | Item