1
0
Fork 0

rename module to taleweave, implement effect cooldowns
Run Docker Build / build (push) Failing after 8s Details
Run Python Build / build (push) Failing after 16s Details

This commit is contained in:
Sean Sube 2024-05-27 08:10:24 -05:00
parent 87ed47324c
commit a30e762498
Signed by: ssube
GPG Key ID: 3EED7B957D362AF1
59 changed files with 180 additions and 154 deletions

3
.gitignore vendored
View File

@ -1,8 +1,7 @@
adventure/custom_*
adventure/user_config.yaml
worlds/ worlds/
__pycache__/ __pycache__/
.env .env
venv/ venv/
client/node_modules/ client/node_modules/
client/out/ client/out/
taleweave/custom_*

View File

@ -32,22 +32,22 @@ package-upload:
twine upload dist/* twine upload dist/*
lint-check: lint-check:
black --check adventure/ black --check taleweave/
black --check tests/ black --check tests/
flake8 adventure flake8 taleweave
flake8 tests flake8 tests
isort --check-only --skip __init__.py --filter-files adventure isort --check-only --skip __init__.py --filter-files taleweave
isort --check-only --skip __init__.py --filter-files tests isort --check-only --skip __init__.py --filter-files tests
lint-fix: lint-fix:
black adventure/ black taleweave/
black tests/ black tests/
flake8 adventure flake8 taleweave
flake8 tests flake8 tests
isort --skip __init__.py --filter-files adventure isort --skip __init__.py --filter-files taleweave
isort --skip __init__.py --filter-files tests isort --skip __init__.py --filter-files tests
style: lint-fix style: lint-fix
typecheck: typecheck:
mypy adventure mypy taleweave

View File

@ -1,22 +1,22 @@
from logging import getLogger from logging import getLogger
from adventure.context import ( from taleweave.context import (
action_context, action_context,
broadcast, broadcast,
get_agent_for_character, get_agent_for_character,
get_character_agent_for_name, get_character_agent_for_name,
world_context, world_context,
) )
from adventure.errors import ActionError from taleweave.errors import ActionError
from adventure.utils.conversation import loop_conversation from taleweave.utils.conversation import loop_conversation
from adventure.utils.search import ( from taleweave.utils.search import (
find_character_in_room, find_character_in_room,
find_item_in_character, find_item_in_character,
find_item_in_room, find_item_in_room,
find_room, find_room,
) )
from adventure.utils.string import normalize_name from taleweave.utils.string import normalize_name
from adventure.utils.world import describe_entity from taleweave.utils.world import describe_entity
logger = getLogger(__name__) logger = getLogger(__name__)

View File

@ -3,22 +3,23 @@ from typing import Callable, List
from packit.agent import Agent, agent_easy_connect from packit.agent import Agent, agent_easy_connect
from adventure.context import ( from taleweave.context import (
action_context, action_context,
broadcast, broadcast,
get_agent_for_character, get_agent_for_character,
get_current_turn,
get_dungeon_master, get_dungeon_master,
get_game_systems, get_game_systems,
has_dungeon_master, has_dungeon_master,
set_dungeon_master, set_dungeon_master,
world_context, world_context,
) )
from adventure.errors import ActionError from taleweave.errors import ActionError
from adventure.generate import generate_item, generate_room, link_rooms from taleweave.generate import generate_item, generate_room, link_rooms
from adventure.utils.effect import apply_effects from taleweave.utils.effect import apply_effects, is_effect_ready
from adventure.utils.search import find_character_in_room from taleweave.utils.search import find_character_in_room
from adventure.utils.string import normalize_name from taleweave.utils.string import normalize_name
from adventure.utils.world import describe_character, describe_entity from taleweave.utils.world import describe_character, describe_entity
logger = getLogger(__name__) logger = getLogger(__name__)
@ -154,15 +155,22 @@ def action_use(item: str, target: str) -> str:
if not chosen_effect: if not chosen_effect:
raise ValueError(f"The {chosen_name} effect is not available to apply.") raise ValueError(f"The {chosen_name} effect is not available to apply.")
if chosen_effect.uses is None: current_turn = get_current_turn()
pass effect_ready = is_effect_ready(chosen_effect, current_turn)
elif chosen_effect.uses == 0:
if effect_ready == "cooldown":
raise ActionError(
f"The {chosen_name} effect of {item} is still cooling down and is not ready to use yet."
)
elif effect_ready == "exhausted":
raise ActionError( raise ActionError(
f"The {chosen_name} effect of {item} has no uses remaining." f"The {chosen_name} effect of {item} has no uses remaining."
) )
elif chosen_effect.uses > 0: elif chosen_effect.uses is not None:
chosen_effect.uses -= 1 chosen_effect.uses -= 1
chosen_effect.last_used = current_turn
try: try:
apply_effects(target_character, [chosen_effect]) apply_effects(target_character, [chosen_effect])
except Exception: except Exception:

View File

@ -1,8 +1,8 @@
from adventure.context import action_context, get_agent_for_character, get_current_turn from taleweave.context import action_context, get_agent_for_character, get_current_turn
from adventure.errors import ActionError from taleweave.errors import ActionError
from adventure.models.config import DEFAULT_CONFIG from taleweave.models.config import DEFAULT_CONFIG
from adventure.models.planning import CalendarEvent from taleweave.models.planning import CalendarEvent
from adventure.utils.planning import get_recent_notes from taleweave.utils.planning import get_recent_notes
character_config = DEFAULT_CONFIG.world.character character_config = DEFAULT_CONFIG.world.character

View File

@ -1,12 +1,12 @@
from adventure.context import action_context, get_system_data from taleweave.context import action_context, get_system_data
from adventure.systems.quest import ( from taleweave.systems.quest import (
QUEST_SYSTEM, QUEST_SYSTEM,
complete_quest, complete_quest,
get_active_quest, get_active_quest,
get_quests_for_character, get_quests_for_character,
set_active_quest, set_active_quest,
) )
from adventure.utils.search import find_character_in_room from taleweave.utils.search import find_character_in_room
def accept_quest(character: str, quest: str) -> str: def accept_quest(character: str, quest: str) -> str:

View File

@ -7,15 +7,15 @@ from typing import Dict
from discord import Client, Embed, File, Intents from discord import Client, Embed, File, Intents
from adventure.context import ( from taleweave.context import (
broadcast, broadcast,
get_character_agent_for_name, get_character_agent_for_name,
get_current_world, get_current_world,
set_character_agent, set_character_agent,
subscribe, subscribe,
) )
from adventure.models.config import DEFAULT_CONFIG, DiscordBotConfig from taleweave.models.config import DEFAULT_CONFIG, DiscordBotConfig
from adventure.models.event import ( from taleweave.models.event import (
ActionEvent, ActionEvent,
GameEvent, GameEvent,
GenerateEvent, GenerateEvent,
@ -26,14 +26,14 @@ from adventure.models.event import (
ResultEvent, ResultEvent,
StatusEvent, StatusEvent,
) )
from adventure.player import ( from taleweave.player import (
RemotePlayer, RemotePlayer,
get_player, get_player,
has_player, has_player,
remove_player, remove_player,
set_player, set_player,
) )
from adventure.render.comfy import render_event from taleweave.render.comfy import render_event
logger = getLogger(__name__) logger = getLogger(__name__)
client = None client = None

View File

@ -17,10 +17,10 @@ from typing import (
from packit.agent import Agent from packit.agent import Agent
from pyee.base import EventEmitter from pyee.base import EventEmitter
from adventure.game_system import GameSystem from taleweave.game_system import GameSystem
from adventure.models.entity import Character, Room, World from taleweave.models.entity import Character, Room, World
from adventure.models.event import GameEvent from taleweave.models.event import GameEvent
from adventure.utils.string import normalize_name from taleweave.utils.string import normalize_name
logger = getLogger(__name__) logger = getLogger(__name__)

View File

@ -3,7 +3,7 @@ from typing import Any, Callable, Protocol
from packit.agent import Agent from packit.agent import Agent
from adventure.models.entity import World, WorldEntity from taleweave.models.entity import World, WorldEntity
class FormatPerspective(Enum): class FormatPerspective(Enum):

View File

@ -7,20 +7,20 @@ from packit.loops import loop_retry
from packit.results import enum_result, int_result from packit.results import enum_result, int_result
from packit.utils import could_be_json from packit.utils import could_be_json
from adventure.context import broadcast, set_current_world, set_system_data from taleweave.context import broadcast, set_current_world, set_system_data
from adventure.game_system import GameSystem from taleweave.game_system import GameSystem
from adventure.models.config import DEFAULT_CONFIG, WorldConfig from taleweave.models.config import DEFAULT_CONFIG, WorldConfig
from adventure.models.effect import ( from taleweave.models.effect import (
EffectPattern, EffectPattern,
FloatEffectPattern, FloatEffectPattern,
IntEffectPattern, IntEffectPattern,
StringEffectPattern, StringEffectPattern,
) )
from adventure.models.entity import Character, Item, Portal, Room, World, WorldEntity from taleweave.models.entity import Character, Item, Portal, Room, World, WorldEntity
from adventure.models.event import GenerateEvent from taleweave.models.event import GenerateEvent
from adventure.utils import try_parse_float, try_parse_int from taleweave.utils import try_parse_float, try_parse_int
from adventure.utils.effect import resolve_int_range from taleweave.utils.effect import resolve_int_range
from adventure.utils.search import ( from taleweave.utils.search import (
list_characters, list_characters,
list_characters_in_room, list_characters_in_room,
list_items, list_items,
@ -28,7 +28,7 @@ from adventure.utils.search import (
list_items_in_room, list_items_in_room,
list_rooms, list_rooms,
) )
from adventure.utils.string import normalize_name from taleweave.utils.string import normalize_name
logger = getLogger(__name__) logger = getLogger(__name__)

View File

@ -9,7 +9,7 @@ from packit.agent import Agent, agent_easy_connect
from packit.memory import make_limited_memory from packit.memory import make_limited_memory
from packit.utils import logger_with_colors from packit.utils import logger_with_colors
from adventure.utils.file import load_yaml from taleweave.utils.file import load_yaml
# configure logging # configure logging
LOG_PATH = "logging.json" LOG_PATH = "logging.json"
@ -30,22 +30,22 @@ logger = logger_with_colors(__name__) # , level="DEBUG")
load_dotenv(environ.get("ADVENTURE_ENV", ".env"), override=True) load_dotenv(environ.get("ADVENTURE_ENV", ".env"), override=True)
if True: if True:
from adventure.context import ( from taleweave.context import (
get_system_data, get_system_data,
set_current_turn, set_current_turn,
set_dungeon_master, set_dungeon_master,
set_system_data, set_system_data,
subscribe, subscribe,
) )
from adventure.game_system import GameSystem from taleweave.game_system import GameSystem
from adventure.generate import generate_room, generate_world, link_rooms from taleweave.generate import generate_room, generate_world, link_rooms
from adventure.models.config import DEFAULT_CONFIG, Config from taleweave.models.config import DEFAULT_CONFIG, Config
from adventure.models.entity import World, WorldState from taleweave.models.entity import World, WorldState
from adventure.models.event import GenerateEvent from taleweave.models.event import GenerateEvent
from adventure.models.files import PromptFile, WorldPrompt from taleweave.models.files import PromptFile, WorldPrompt
from adventure.plugins import load_plugin from taleweave.plugins import load_plugin
from adventure.simulate import simulate_world from taleweave.simulate import simulate_world
from adventure.state import ( from taleweave.state import (
MEMORY_LIMIT, MEMORY_LIMIT,
create_agents, create_agents,
save_world, save_world,
@ -296,19 +296,19 @@ def main():
threads = [] threads = []
if args.render: if args.render:
from adventure.render.comfy import launch_render, render_generated from taleweave.render.comfy import launch_render, render_generated
threads.extend(launch_render(config.render)) threads.extend(launch_render(config.render))
if args.render_generated: if args.render_generated:
subscribe(GenerateEvent, render_generated) subscribe(GenerateEvent, render_generated)
if args.discord: if args.discord:
from adventure.bot.discord import launch_bot from taleweave.bot.discord import launch_bot
threads.extend(launch_bot(config.bot.discord)) threads.extend(launch_bot(config.bot.discord))
if args.server: if args.server:
from adventure.server.websocket import launch_server from taleweave.server.websocket import launch_server
threads.extend(launch_server(config.server.websocket)) threads.extend(launch_server(config.server.websocket))
@ -323,7 +323,7 @@ def main():
extra_actions = [] extra_actions = []
if args.optional_actions: if args.optional_actions:
logger.info("loading optional actions") logger.info("loading optional actions")
from adventure.actions.optional import init as init_optional_actions from taleweave.actions.optional import init as init_optional_actions
optional_actions = init_optional_actions() optional_actions = init_optional_actions()
logger.info( logger.info(
@ -350,7 +350,7 @@ def main():
# make sure the server system runs after any updates # make sure the server system runs after any updates
if args.server: if args.server:
from adventure.server.websocket import server_system from taleweave.server.websocket import server_system
extra_systems.append(GameSystem(name="server", simulate=server_system)) extra_systems.append(GameSystem(name="server", simulate=server_system))

View File

@ -53,6 +53,7 @@ class EffectPattern:
attributes: List[AttributeEffectPattern] = Field(default_factory=list) attributes: List[AttributeEffectPattern] = Field(default_factory=list)
cooldown: int | None = None cooldown: int | None = None
duration: int | IntRange | None = None duration: int | IntRange | None = None
last_used: int | None = None
uses: int | None = None uses: int | None = None
id: str = Field(default_factory=uuid) id: str = Field(default_factory=uuid)
type: Literal["effect_pattern"] = "effect_pattern" type: Literal["effect_pattern"] = "effect_pattern"

View File

@ -2,7 +2,7 @@ from typing import List
from pydantic import Field from pydantic import Field
from adventure.models.base import dataclass from taleweave.models.base import dataclass
@dataclass @dataclass

View File

@ -7,8 +7,8 @@ from typing import Any, Callable, Dict, List, Optional, Sequence
from langchain_core.messages import AIMessage, BaseMessage, HumanMessage from langchain_core.messages import AIMessage, BaseMessage, HumanMessage
from packit.agent import Agent from packit.agent import Agent
from adventure.context import action_context from taleweave.context import action_context
from adventure.models.event import PromptEvent from taleweave.models.event import PromptEvent
logger = getLogger(__name__) logger = getLogger(__name__)

View File

@ -16,10 +16,10 @@ from fnvhash import fnv1a_32
from jinja2 import Environment, FileSystemLoader, select_autoescape from jinja2 import Environment, FileSystemLoader, select_autoescape
from PIL import Image from PIL import Image
from adventure.context import broadcast from taleweave.context import broadcast
from adventure.models.config import DEFAULT_CONFIG, RenderConfig from taleweave.models.config import DEFAULT_CONFIG, RenderConfig
from adventure.models.entity import WorldEntity from taleweave.models.entity import WorldEntity
from adventure.models.event import ( from taleweave.models.event import (
ActionEvent, ActionEvent,
GameEvent, GameEvent,
GenerateEvent, GenerateEvent,
@ -28,7 +28,7 @@ from adventure.models.event import (
ResultEvent, ResultEvent,
StatusEvent, StatusEvent,
) )
from adventure.utils.random import resolve_int_range from taleweave.utils.random import resolve_int_range
from .prompt import prompt_from_entity, prompt_from_event from .prompt import prompt_from_entity, prompt_from_event

View File

@ -3,17 +3,17 @@ from logging import getLogger
from random import shuffle from random import shuffle
from typing import List from typing import List
from adventure.context import get_current_world, get_dungeon_master from taleweave.context import get_current_world, get_dungeon_master
from adventure.models.entity import Room, WorldEntity from taleweave.models.entity import Room, WorldEntity
from adventure.models.event import ( from taleweave.models.event import (
ActionEvent, ActionEvent,
GameEvent, GameEvent,
ReplyEvent, ReplyEvent,
ResultEvent, ResultEvent,
StatusEvent, StatusEvent,
) )
from adventure.utils.search import find_character_in_room, find_item_in_room, find_room from taleweave.utils.search import find_character_in_room, find_item_in_room, find_room
from adventure.utils.world import describe_entity from taleweave.utils.world import describe_entity
logger = getLogger(__name__) logger = getLogger(__name__)

View File

@ -12,23 +12,23 @@ import websockets
from PIL import Image from PIL import Image
from pydantic import RootModel from pydantic import RootModel
from adventure.context import ( from taleweave.context import (
broadcast, broadcast,
get_character_agent_for_name, get_character_agent_for_name,
get_current_world, get_current_world,
set_character_agent, set_character_agent,
subscribe, subscribe,
) )
from adventure.models.config import DEFAULT_CONFIG, WebsocketServerConfig from taleweave.models.config import DEFAULT_CONFIG, WebsocketServerConfig
from adventure.models.entity import Character, Item, Room, World from taleweave.models.entity import Character, Item, Room, World
from adventure.models.event import ( from taleweave.models.event import (
GameEvent, GameEvent,
PlayerEvent, PlayerEvent,
PlayerListEvent, PlayerListEvent,
PromptEvent, PromptEvent,
RenderEvent, RenderEvent,
) )
from adventure.player import ( from taleweave.player import (
RemotePlayer, RemotePlayer,
get_player, get_player,
has_player, has_player,
@ -36,9 +36,9 @@ from adventure.player import (
remove_player, remove_player,
set_player, set_player,
) )
from adventure.render.comfy import render_entity, render_event from taleweave.render.comfy import render_entity, render_event
from adventure.state import snapshot_world, world_json from taleweave.state import snapshot_world, world_json
from adventure.utils.search import find_character, find_item, find_portal, find_room from taleweave.utils.search import find_character, find_item, find_portal, find_room
logger = getLogger(__name__) logger = getLogger(__name__)

View File

@ -12,7 +12,7 @@ from packit.results import multi_function_or_str_result
from packit.toolbox import Toolbox from packit.toolbox import Toolbox
from packit.utils import could_be_json from packit.utils import could_be_json
from adventure.actions.base import ( from taleweave.actions.base import (
action_ask, action_ask,
action_give, action_give,
action_look, action_look,
@ -20,7 +20,7 @@ from adventure.actions.base import (
action_take, action_take,
action_tell, action_tell,
) )
from adventure.actions.planning import ( from taleweave.actions.planning import (
check_calendar, check_calendar,
erase_notes, erase_notes,
get_recent_notes, get_recent_notes,
@ -30,7 +30,7 @@ from adventure.actions.planning import (
summarize_notes, summarize_notes,
take_note, take_note,
) )
from adventure.context import ( from taleweave.context import (
broadcast, broadcast,
get_character_agent_for_name, get_character_agent_for_name,
get_character_for_agent, get_character_for_agent,
@ -42,15 +42,15 @@ from adventure.context import (
set_current_world, set_current_world,
set_game_systems, set_game_systems,
) )
from adventure.game_system import GameSystem from taleweave.game_system import GameSystem
from adventure.models.config import DEFAULT_CONFIG from taleweave.models.config import DEFAULT_CONFIG
from adventure.models.entity import Character, Room, World from taleweave.models.entity import Character, Room, World
from adventure.models.event import ActionEvent, ReplyEvent, ResultEvent from taleweave.models.event import ActionEvent, ReplyEvent, ResultEvent
from adventure.utils.conversation import make_keyword_condition, summarize_room from taleweave.utils.conversation import make_keyword_condition, summarize_room
from adventure.utils.effect import expire_effects from taleweave.utils.effect import expire_effects
from adventure.utils.planning import expire_events, get_upcoming_events from taleweave.utils.planning import expire_events, get_upcoming_events
from adventure.utils.search import find_room_with_character from taleweave.utils.search import find_room_with_character
from adventure.utils.world import describe_entity, format_attributes from taleweave.utils.world import describe_entity, format_attributes
logger = getLogger(__name__) logger = getLogger(__name__)

View File

@ -7,9 +7,9 @@ from langchain_core.messages import AIMessage, BaseMessage, HumanMessage, System
from packit.agent import Agent, agent_easy_connect from packit.agent import Agent, agent_easy_connect
from pydantic import RootModel from pydantic import RootModel
from adventure.context import get_all_character_agents, set_character_agent from taleweave.context import get_all_character_agents, set_character_agent
from adventure.models.entity import World from taleweave.models.entity import World
from adventure.player import LocalPlayer from taleweave.player import LocalPlayer
MEMORY_LIMIT = 25 # 10 MEMORY_LIMIT = 25 # 10

View File

@ -8,9 +8,9 @@ from pydantic import Field
from rule_engine import Rule from rule_engine import Rule
from yaml import Loader, load from yaml import Loader, load
from adventure.game_system import FormatPerspective, GameSystem from taleweave.game_system import FormatPerspective, GameSystem
from adventure.models.entity import Attributes, World, WorldEntity, dataclass from taleweave.models.entity import Attributes, World, WorldEntity, dataclass
from adventure.plugins import get_plugin_function from taleweave.plugins import get_plugin_function
logger = getLogger(__name__) logger = getLogger(__name__)

View File

@ -4,10 +4,10 @@ from typing import Dict, List, Literal, Optional
from packit.agent import Agent from packit.agent import Agent
from pydantic import Field from pydantic import Field
from adventure.context import get_system_data from taleweave.context import get_system_data
from adventure.game_system import GameSystem, SystemData from taleweave.game_system import GameSystem, SystemData
from adventure.models.base import Attributes, dataclass, uuid from taleweave.models.base import Attributes, dataclass, uuid
from adventure.models.entity import ( from taleweave.models.entity import (
Character, Character,
EntityReference, EntityReference,
Item, Item,
@ -15,13 +15,13 @@ from adventure.models.entity import (
World, World,
WorldEntity, WorldEntity,
) )
from adventure.systems.logic import match_logic from taleweave.systems.logic import match_logic
from adventure.utils.search import ( from taleweave.utils.search import (
find_entity_reference, find_entity_reference,
find_item_in_container, find_item_in_container,
find_item_in_room, find_item_in_room,
) )
from adventure.utils.systems import load_system_data, save_system_data from taleweave.utils.systems import load_system_data, save_system_data
logger = getLogger(__name__) logger = getLogger(__name__)

View File

@ -3,7 +3,7 @@ from .language_actions import action_read
from .magic_actions import action_cast from .magic_actions import action_cast
from .movement_actions import action_climb from .movement_actions import action_climb
from adventure.systems.logic import load_logic from taleweave.systems.logic import load_logic
LOGIC_FILES = [ LOGIC_FILES = [
"./adventure/systems/rpg/weather_logic.yaml", "./adventure/systems/rpg/weather_logic.yaml",

View File

@ -1,14 +1,14 @@
from random import randint from random import randint
from adventure.context import ( from taleweave.context import (
broadcast, broadcast,
get_dungeon_master, get_dungeon_master,
get_game_systems, get_game_systems,
world_context, world_context,
) )
from adventure.generate import generate_item from taleweave.generate import generate_item
from adventure.models.base import dataclass from taleweave.models.base import dataclass
from adventure.models.entity import Item from taleweave.models.entity import Item
@dataclass @dataclass

View File

@ -1,5 +1,5 @@
from adventure.context import action_context, broadcast from taleweave.context import action_context, broadcast
from adventure.utils.search import find_item_in_character from taleweave.utils.search import find_item_in_character
def action_read(item: str) -> str: def action_read(item: str) -> str:

View File

@ -1,7 +1,7 @@
from random import randint from random import randint
from adventure.context import action_context, broadcast, get_dungeon_master from taleweave.context import action_context, broadcast, get_dungeon_master
from adventure.utils.search import find_character_in_room from taleweave.utils.search import find_character_in_room
def action_cast(spell: str, target: str) -> str: def action_cast(spell: str, target: str) -> str:

View File

@ -1,7 +1,7 @@
from random import randint from random import randint
from adventure.context import action_context, broadcast, get_dungeon_master from taleweave.context import action_context, broadcast, get_dungeon_master
from adventure.utils.search import find_item_in_room from taleweave.utils.search import find_item_in_room
def action_climb(target: str) -> str: def action_climb(target: str) -> str:

View File

@ -2,7 +2,7 @@ from .hunger_actions import action_cook, action_eat
from .hygiene_actions import action_wash from .hygiene_actions import action_wash
from .sleeping_actions import action_sleep from .sleeping_actions import action_sleep
from adventure.systems.logic import load_logic from taleweave.systems.logic import load_logic
LOGIC_FILES = [ LOGIC_FILES = [
"./adventure/systems/sim/environment_logic.yaml", "./adventure/systems/sim/environment_logic.yaml",

View File

@ -1,11 +1,11 @@
from adventure.context import ( from taleweave.context import (
action_context, action_context,
broadcast, broadcast,
get_agent_for_character, get_agent_for_character,
get_dungeon_master, get_dungeon_master,
) )
from adventure.utils.search import find_character_in_room, find_item_in_room from taleweave.utils.search import find_character_in_room, find_item_in_room
from adventure.utils.world import describe_entity from taleweave.utils.world import describe_entity
def action_attack(target: str) -> str: def action_attack(target: str) -> str:

View File

@ -1,4 +1,4 @@
from adventure.models.entity import Attributes, Room from taleweave.models.entity import Attributes, Room
def hot_room(room: Room, attributes: Attributes): def hot_room(room: Room, attributes: Attributes):

View File

@ -1,5 +1,5 @@
from adventure.context import action_context from taleweave.context import action_context
from adventure.utils.search import find_item_in_character from taleweave.utils.search import find_item_in_character
def action_cook(item: str) -> str: def action_cook(item: str) -> str:

View File

@ -1,5 +1,5 @@
from adventure.context import action_context, get_dungeon_master from taleweave.context import action_context, get_dungeon_master
from adventure.utils.world import describe_entity from taleweave.utils.world import describe_entity
def action_wash(unused: bool) -> str: def action_wash(unused: bool) -> str:

View File

@ -1,5 +1,5 @@
from adventure.context import action_context, get_dungeon_master from taleweave.context import action_context, get_dungeon_master
from adventure.utils.world import describe_entity from taleweave.utils.world import describe_entity
def action_sleep(unused: bool) -> str: def action_sleep(unused: bool) -> str:

View File

@ -1,4 +1,4 @@
from adventure.models.base import Attributes, AttributeValue from taleweave.models.base import Attributes, AttributeValue
def add_value(value: AttributeValue, offset: int | float) -> AttributeValue: def add_value(value: AttributeValue, offset: int | float) -> AttributeValue:

View File

@ -8,10 +8,10 @@ from packit.conditions import condition_or, condition_threshold, make_flag_condi
from packit.results import multi_function_or_str_result from packit.results import multi_function_or_str_result
from packit.utils import could_be_json from packit.utils import could_be_json
from adventure.context import broadcast from taleweave.context import broadcast
from adventure.models.config import DEFAULT_CONFIG from taleweave.models.config import DEFAULT_CONFIG
from adventure.models.entity import Character, Room from taleweave.models.entity import Character, Room
from adventure.models.event import ReplyEvent from taleweave.models.event import ReplyEvent
from .string import and_list, normalize_name from .string import and_list, normalize_name

View File

@ -1,7 +1,7 @@
from logging import getLogger from logging import getLogger
from typing import List from typing import List, Literal
from adventure.models.effect import ( from taleweave.models.effect import (
BooleanEffectPattern, BooleanEffectPattern,
BooleanEffectResult, BooleanEffectResult,
EffectPattern, EffectPattern,
@ -13,8 +13,8 @@ from adventure.models.effect import (
StringEffectPattern, StringEffectPattern,
StringEffectResult, StringEffectResult,
) )
from adventure.models.entity import Attributes, Character from taleweave.models.entity import Attributes, Character
from adventure.utils.attribute import ( from taleweave.utils.attribute import (
add_value, add_value,
append_value, append_value,
multiply_value, multiply_value,
@ -282,3 +282,21 @@ def expire_effects(target: Character) -> None:
target.active_effects[:] = [ target.active_effects[:] = [
effect for effect in target.active_effects if is_active_effect(effect) effect for effect in target.active_effects if is_active_effect(effect)
] ]
def is_effect_ready(
effect: EffectPattern, current_turn: int
) -> Literal["ready", "cooldown", "exhausted"]:
"""
Determine if an effect is ready to be used.
"""
if effect.cooldown is not None and effect.last_used is not None:
if (effect.last_used + effect.cooldown) >= current_turn:
return "cooldown"
if effect.uses is not None:
if effect.uses <= 0:
return "exhausted"
return "ready"

View File

@ -1,4 +1,4 @@
from adventure.models.entity import Character from taleweave.models.entity import Character
def expire_events(character: Character, current_turn: int): def expire_events(character: Character, current_turn: int):

View File

@ -1,7 +1,7 @@
import random import random
from typing import List from typing import List
from adventure.models.base import FloatRange, IntRange from taleweave.models.base import FloatRange, IntRange
def resolve_float_range(range: float | FloatRange | None) -> float | None: def resolve_float_range(range: float | FloatRange | None) -> float | None:

View File

@ -1,6 +1,6 @@
from typing import Any, Generator from typing import Any, Generator
from adventure.models.entity import ( from taleweave.models.entity import (
Character, Character,
EntityReference, EntityReference,
Item, Item,

View File

@ -1,6 +1,6 @@
from pydantic import RootModel from pydantic import RootModel
from adventure.utils.file import load_yaml, save_yaml from taleweave.utils.file import load_yaml, save_yaml
def load_system_data(cls, file): def load_system_data(cls, file):

View File

@ -1,8 +1,8 @@
from logging import getLogger from logging import getLogger
from adventure.context import get_game_systems from taleweave.context import get_game_systems
from adventure.game_system import FormatPerspective from taleweave.game_system import FormatPerspective
from adventure.models.entity import Character, WorldEntity from taleweave.models.entity import Character, WorldEntity
logger = getLogger(__name__) logger = getLogger(__name__)