From a30e76249803ffef7dd10d12ba5b0744e9a9a4ba Mon Sep 17 00:00:00 2001 From: Sean Sube Date: Mon, 27 May 2024 08:10:24 -0500 Subject: [PATCH] rename module to taleweave, implement effect cooldowns --- .gitignore | 3 +- Makefile | 14 ++++---- {adventure => taleweave}/__init__.py | 0 {adventure => taleweave}/actions/base.py | 12 +++---- {adventure => taleweave}/actions/optional.py | 30 ++++++++++------- {adventure => taleweave}/actions/planning.py | 10 +++--- {adventure => taleweave}/actions/quest.py | 6 ++-- {adventure => taleweave}/bot/discord.py | 10 +++--- {adventure => taleweave}/context.py | 8 ++--- {adventure => taleweave}/errors.py | 0 {adventure => taleweave}/game_system.py | 2 +- {adventure => taleweave}/generate.py | 20 ++++++------ {adventure => taleweave}/main.py | 32 +++++++++---------- {adventure => taleweave}/models/base.py | 0 {adventure => taleweave}/models/config.py | 0 {adventure => taleweave}/models/effect.py | 1 + {adventure => taleweave}/models/entity.py | 0 {adventure => taleweave}/models/event.py | 0 {adventure => taleweave}/models/files.py | 0 {adventure => taleweave}/models/planning.py | 2 +- {adventure => taleweave}/player.py | 4 +-- {adventure => taleweave}/plugins.py | 0 {adventure => taleweave}/prompts.yml | 0 {adventure => taleweave}/render/comfy.py | 10 +++--- {adventure => taleweave}/render/prompt.py | 10 +++--- {adventure => taleweave}/server/websocket.py | 16 +++++----- {adventure => taleweave}/simulate.py | 24 +++++++------- {adventure => taleweave}/state.py | 6 ++-- {adventure => taleweave}/systems/logic.py | 6 ++-- {adventure => taleweave}/systems/quest.py | 14 ++++---- .../systems/rpg/__init__.py | 2 +- .../systems/rpg/crafting_actions.py | 8 ++--- .../systems/rpg/language_actions.py | 4 +-- .../systems/rpg/magic_actions.py | 4 +-- .../systems/rpg/movement_actions.py | 4 +-- .../systems/rpg/weather_logic.yaml | 0 .../systems/sim/__init__.py | 2 +- .../systems/sim/combat_actions.py | 6 ++-- .../systems/sim/environment_logic.yaml | 0 .../systems/sim/environment_triggers.py | 2 +- .../systems/sim/hunger_actions.py | 4 +-- .../systems/sim/hunger_logic.yaml | 0 .../systems/sim/hygiene_actions.py | 4 +-- .../systems/sim/hygiene_logic.yaml | 0 .../systems/sim/mood_logic.yaml | 0 .../systems/sim/sleeping_actions.py | 4 +-- .../systems/sim/sleeping_logic.yaml | 0 .../templates/comfy.json.j2 | 0 {adventure => taleweave}/utils/__init__.py | 0 {adventure => taleweave}/utils/attribute.py | 2 +- .../utils/conversation.py | 8 ++--- {adventure => taleweave}/utils/effect.py | 26 ++++++++++++--- {adventure => taleweave}/utils/file.py | 0 {adventure => taleweave}/utils/planning.py | 2 +- {adventure => taleweave}/utils/random.py | 2 +- {adventure => taleweave}/utils/search.py | 2 +- {adventure => taleweave}/utils/string.py | 0 {adventure => taleweave}/utils/systems.py | 2 +- {adventure => taleweave}/utils/world.py | 6 ++-- 59 files changed, 180 insertions(+), 154 deletions(-) rename {adventure => taleweave}/__init__.py (100%) rename {adventure => taleweave}/actions/base.py (97%) rename {adventure => taleweave}/actions/optional.py (89%) rename {adventure => taleweave}/actions/planning.py (95%) rename {adventure => taleweave}/actions/quest.py (92%) rename {adventure => taleweave}/bot/discord.py (98%) rename {adventure => taleweave}/context.py (96%) rename {adventure => taleweave}/errors.py (100%) rename {adventure => taleweave}/game_system.py (97%) rename {adventure => taleweave}/generate.py (97%) rename {adventure => taleweave}/main.py (92%) rename {adventure => taleweave}/models/base.py (100%) rename {adventure => taleweave}/models/config.py (100%) rename {adventure => taleweave}/models/effect.py (98%) rename {adventure => taleweave}/models/entity.py (100%) rename {adventure => taleweave}/models/event.py (100%) rename {adventure => taleweave}/models/files.py (100%) rename {adventure => taleweave}/models/planning.py (88%) rename {adventure => taleweave}/player.py (98%) rename {adventure => taleweave}/plugins.py (100%) rename {adventure => taleweave}/prompts.yml (100%) rename {adventure => taleweave}/render/comfy.py (97%) rename {adventure => taleweave}/render/prompt.py (96%) rename {adventure => taleweave}/server/websocket.py (96%) rename {adventure => taleweave}/simulate.py (94%) rename {adventure => taleweave}/state.py (95%) rename {adventure => taleweave}/systems/logic.py (97%) rename {adventure => taleweave}/systems/quest.py (94%) rename {adventure => taleweave}/systems/rpg/__init__.py (91%) rename {adventure => taleweave}/systems/rpg/crafting_actions.py (93%) rename {adventure => taleweave}/systems/rpg/language_actions.py (83%) rename {adventure => taleweave}/systems/rpg/magic_actions.py (92%) rename {adventure => taleweave}/systems/rpg/movement_actions.py (92%) rename {adventure => taleweave}/systems/rpg/weather_logic.yaml (100%) rename {adventure => taleweave}/systems/sim/__init__.py (93%) rename {adventure => taleweave}/systems/sim/combat_actions.py (96%) rename {adventure => taleweave}/systems/sim/environment_logic.yaml (100%) rename {adventure => taleweave}/systems/sim/environment_triggers.py (89%) rename {adventure => taleweave}/systems/sim/hunger_actions.py (95%) rename {adventure => taleweave}/systems/sim/hunger_logic.yaml (100%) rename {adventure => taleweave}/systems/sim/hygiene_actions.py (88%) rename {adventure => taleweave}/systems/sim/hygiene_logic.yaml (100%) rename {adventure => taleweave}/systems/sim/mood_logic.yaml (100%) rename {adventure => taleweave}/systems/sim/sleeping_actions.py (83%) rename {adventure => taleweave}/systems/sim/sleeping_logic.yaml (100%) rename {adventure => taleweave}/templates/comfy.json.j2 (100%) rename {adventure => taleweave}/utils/__init__.py (100%) rename {adventure => taleweave}/utils/attribute.py (98%) rename {adventure => taleweave}/utils/conversation.py (96%) rename {adventure => taleweave}/utils/effect.py (92%) rename {adventure => taleweave}/utils/file.py (100%) rename {adventure => taleweave}/utils/planning.py (95%) rename {adventure => taleweave}/utils/random.py (94%) rename {adventure => taleweave}/utils/search.py (99%) rename {adventure => taleweave}/utils/string.py (100%) rename {adventure => taleweave}/utils/systems.py (84%) rename {adventure => taleweave}/utils/world.py (90%) diff --git a/.gitignore b/.gitignore index ec021af..82d783a 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,7 @@ -adventure/custom_* -adventure/user_config.yaml worlds/ __pycache__/ .env venv/ client/node_modules/ client/out/ +taleweave/custom_* diff --git a/Makefile b/Makefile index c7bd002..2c4aa43 100644 --- a/Makefile +++ b/Makefile @@ -32,22 +32,22 @@ package-upload: twine upload dist/* lint-check: - black --check adventure/ + black --check taleweave/ black --check tests/ - flake8 adventure + flake8 taleweave 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 lint-fix: - black adventure/ + black taleweave/ black tests/ - flake8 adventure + flake8 taleweave flake8 tests - isort --skip __init__.py --filter-files adventure + isort --skip __init__.py --filter-files taleweave isort --skip __init__.py --filter-files tests style: lint-fix typecheck: - mypy adventure + mypy taleweave diff --git a/adventure/__init__.py b/taleweave/__init__.py similarity index 100% rename from adventure/__init__.py rename to taleweave/__init__.py diff --git a/adventure/actions/base.py b/taleweave/actions/base.py similarity index 97% rename from adventure/actions/base.py rename to taleweave/actions/base.py index 60cc473..51d9574 100644 --- a/adventure/actions/base.py +++ b/taleweave/actions/base.py @@ -1,22 +1,22 @@ from logging import getLogger -from adventure.context import ( +from taleweave.context import ( action_context, broadcast, get_agent_for_character, get_character_agent_for_name, world_context, ) -from adventure.errors import ActionError -from adventure.utils.conversation import loop_conversation -from adventure.utils.search import ( +from taleweave.errors import ActionError +from taleweave.utils.conversation import loop_conversation +from taleweave.utils.search import ( find_character_in_room, find_item_in_character, find_item_in_room, find_room, ) -from adventure.utils.string import normalize_name -from adventure.utils.world import describe_entity +from taleweave.utils.string import normalize_name +from taleweave.utils.world import describe_entity logger = getLogger(__name__) diff --git a/adventure/actions/optional.py b/taleweave/actions/optional.py similarity index 89% rename from adventure/actions/optional.py rename to taleweave/actions/optional.py index 0163f99..63987d6 100644 --- a/adventure/actions/optional.py +++ b/taleweave/actions/optional.py @@ -3,22 +3,23 @@ from typing import Callable, List from packit.agent import Agent, agent_easy_connect -from adventure.context import ( +from taleweave.context import ( action_context, broadcast, get_agent_for_character, + get_current_turn, get_dungeon_master, get_game_systems, has_dungeon_master, set_dungeon_master, world_context, ) -from adventure.errors import ActionError -from adventure.generate import generate_item, generate_room, link_rooms -from adventure.utils.effect import apply_effects -from adventure.utils.search import find_character_in_room -from adventure.utils.string import normalize_name -from adventure.utils.world import describe_character, describe_entity +from taleweave.errors import ActionError +from taleweave.generate import generate_item, generate_room, link_rooms +from taleweave.utils.effect import apply_effects, is_effect_ready +from taleweave.utils.search import find_character_in_room +from taleweave.utils.string import normalize_name +from taleweave.utils.world import describe_character, describe_entity logger = getLogger(__name__) @@ -154,15 +155,22 @@ def action_use(item: str, target: str) -> str: if not chosen_effect: raise ValueError(f"The {chosen_name} effect is not available to apply.") - if chosen_effect.uses is None: - pass - elif chosen_effect.uses == 0: + current_turn = get_current_turn() + effect_ready = is_effect_ready(chosen_effect, current_turn) + + 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( 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.last_used = current_turn + try: apply_effects(target_character, [chosen_effect]) except Exception: diff --git a/adventure/actions/planning.py b/taleweave/actions/planning.py similarity index 95% rename from adventure/actions/planning.py rename to taleweave/actions/planning.py index 805bd17..6e56d42 100644 --- a/adventure/actions/planning.py +++ b/taleweave/actions/planning.py @@ -1,8 +1,8 @@ -from adventure.context import action_context, get_agent_for_character, get_current_turn -from adventure.errors import ActionError -from adventure.models.config import DEFAULT_CONFIG -from adventure.models.planning import CalendarEvent -from adventure.utils.planning import get_recent_notes +from taleweave.context import action_context, get_agent_for_character, get_current_turn +from taleweave.errors import ActionError +from taleweave.models.config import DEFAULT_CONFIG +from taleweave.models.planning import CalendarEvent +from taleweave.utils.planning import get_recent_notes character_config = DEFAULT_CONFIG.world.character diff --git a/adventure/actions/quest.py b/taleweave/actions/quest.py similarity index 92% rename from adventure/actions/quest.py rename to taleweave/actions/quest.py index 499b34d..7f9422a 100644 --- a/adventure/actions/quest.py +++ b/taleweave/actions/quest.py @@ -1,12 +1,12 @@ -from adventure.context import action_context, get_system_data -from adventure.systems.quest import ( +from taleweave.context import action_context, get_system_data +from taleweave.systems.quest import ( QUEST_SYSTEM, complete_quest, get_active_quest, get_quests_for_character, 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: diff --git a/adventure/bot/discord.py b/taleweave/bot/discord.py similarity index 98% rename from adventure/bot/discord.py rename to taleweave/bot/discord.py index 49b990c..7d81d08 100644 --- a/adventure/bot/discord.py +++ b/taleweave/bot/discord.py @@ -7,15 +7,15 @@ from typing import Dict from discord import Client, Embed, File, Intents -from adventure.context import ( +from taleweave.context import ( broadcast, get_character_agent_for_name, get_current_world, set_character_agent, subscribe, ) -from adventure.models.config import DEFAULT_CONFIG, DiscordBotConfig -from adventure.models.event import ( +from taleweave.models.config import DEFAULT_CONFIG, DiscordBotConfig +from taleweave.models.event import ( ActionEvent, GameEvent, GenerateEvent, @@ -26,14 +26,14 @@ from adventure.models.event import ( ResultEvent, StatusEvent, ) -from adventure.player import ( +from taleweave.player import ( RemotePlayer, get_player, has_player, remove_player, set_player, ) -from adventure.render.comfy import render_event +from taleweave.render.comfy import render_event logger = getLogger(__name__) client = None diff --git a/adventure/context.py b/taleweave/context.py similarity index 96% rename from adventure/context.py rename to taleweave/context.py index 96cf509..75ee0ba 100644 --- a/adventure/context.py +++ b/taleweave/context.py @@ -17,10 +17,10 @@ from typing import ( from packit.agent import Agent from pyee.base import EventEmitter -from adventure.game_system import GameSystem -from adventure.models.entity import Character, Room, World -from adventure.models.event import GameEvent -from adventure.utils.string import normalize_name +from taleweave.game_system import GameSystem +from taleweave.models.entity import Character, Room, World +from taleweave.models.event import GameEvent +from taleweave.utils.string import normalize_name logger = getLogger(__name__) diff --git a/adventure/errors.py b/taleweave/errors.py similarity index 100% rename from adventure/errors.py rename to taleweave/errors.py diff --git a/adventure/game_system.py b/taleweave/game_system.py similarity index 97% rename from adventure/game_system.py rename to taleweave/game_system.py index 3d34b79..ab9dcfd 100644 --- a/adventure/game_system.py +++ b/taleweave/game_system.py @@ -3,7 +3,7 @@ from typing import Any, Callable, Protocol from packit.agent import Agent -from adventure.models.entity import World, WorldEntity +from taleweave.models.entity import World, WorldEntity class FormatPerspective(Enum): diff --git a/adventure/generate.py b/taleweave/generate.py similarity index 97% rename from adventure/generate.py rename to taleweave/generate.py index 21771fe..9ef111a 100644 --- a/adventure/generate.py +++ b/taleweave/generate.py @@ -7,20 +7,20 @@ from packit.loops import loop_retry from packit.results import enum_result, int_result from packit.utils import could_be_json -from adventure.context import broadcast, set_current_world, set_system_data -from adventure.game_system import GameSystem -from adventure.models.config import DEFAULT_CONFIG, WorldConfig -from adventure.models.effect import ( +from taleweave.context import broadcast, set_current_world, set_system_data +from taleweave.game_system import GameSystem +from taleweave.models.config import DEFAULT_CONFIG, WorldConfig +from taleweave.models.effect import ( EffectPattern, FloatEffectPattern, IntEffectPattern, StringEffectPattern, ) -from adventure.models.entity import Character, Item, Portal, Room, World, WorldEntity -from adventure.models.event import GenerateEvent -from adventure.utils import try_parse_float, try_parse_int -from adventure.utils.effect import resolve_int_range -from adventure.utils.search import ( +from taleweave.models.entity import Character, Item, Portal, Room, World, WorldEntity +from taleweave.models.event import GenerateEvent +from taleweave.utils import try_parse_float, try_parse_int +from taleweave.utils.effect import resolve_int_range +from taleweave.utils.search import ( list_characters, list_characters_in_room, list_items, @@ -28,7 +28,7 @@ from adventure.utils.search import ( list_items_in_room, list_rooms, ) -from adventure.utils.string import normalize_name +from taleweave.utils.string import normalize_name logger = getLogger(__name__) diff --git a/adventure/main.py b/taleweave/main.py similarity index 92% rename from adventure/main.py rename to taleweave/main.py index 953c96c..fe9722d 100644 --- a/adventure/main.py +++ b/taleweave/main.py @@ -9,7 +9,7 @@ from packit.agent import Agent, agent_easy_connect from packit.memory import make_limited_memory from packit.utils import logger_with_colors -from adventure.utils.file import load_yaml +from taleweave.utils.file import load_yaml # configure logging LOG_PATH = "logging.json" @@ -30,22 +30,22 @@ logger = logger_with_colors(__name__) # , level="DEBUG") load_dotenv(environ.get("ADVENTURE_ENV", ".env"), override=True) if True: - from adventure.context import ( + from taleweave.context import ( get_system_data, set_current_turn, set_dungeon_master, set_system_data, subscribe, ) - from adventure.game_system import GameSystem - from adventure.generate import generate_room, generate_world, link_rooms - from adventure.models.config import DEFAULT_CONFIG, Config - from adventure.models.entity import World, WorldState - from adventure.models.event import GenerateEvent - from adventure.models.files import PromptFile, WorldPrompt - from adventure.plugins import load_plugin - from adventure.simulate import simulate_world - from adventure.state import ( + from taleweave.game_system import GameSystem + from taleweave.generate import generate_room, generate_world, link_rooms + from taleweave.models.config import DEFAULT_CONFIG, Config + from taleweave.models.entity import World, WorldState + from taleweave.models.event import GenerateEvent + from taleweave.models.files import PromptFile, WorldPrompt + from taleweave.plugins import load_plugin + from taleweave.simulate import simulate_world + from taleweave.state import ( MEMORY_LIMIT, create_agents, save_world, @@ -296,19 +296,19 @@ def main(): threads = [] 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)) if args.render_generated: subscribe(GenerateEvent, render_generated) if args.discord: - from adventure.bot.discord import launch_bot + from taleweave.bot.discord import launch_bot threads.extend(launch_bot(config.bot.discord)) if args.server: - from adventure.server.websocket import launch_server + from taleweave.server.websocket import launch_server threads.extend(launch_server(config.server.websocket)) @@ -323,7 +323,7 @@ def main(): extra_actions = [] if args.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() logger.info( @@ -350,7 +350,7 @@ def main(): # make sure the server system runs after any updates 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)) diff --git a/adventure/models/base.py b/taleweave/models/base.py similarity index 100% rename from adventure/models/base.py rename to taleweave/models/base.py diff --git a/adventure/models/config.py b/taleweave/models/config.py similarity index 100% rename from adventure/models/config.py rename to taleweave/models/config.py diff --git a/adventure/models/effect.py b/taleweave/models/effect.py similarity index 98% rename from adventure/models/effect.py rename to taleweave/models/effect.py index cb0e479..8177a95 100644 --- a/adventure/models/effect.py +++ b/taleweave/models/effect.py @@ -53,6 +53,7 @@ class EffectPattern: attributes: List[AttributeEffectPattern] = Field(default_factory=list) cooldown: int | None = None duration: int | IntRange | None = None + last_used: int | None = None uses: int | None = None id: str = Field(default_factory=uuid) type: Literal["effect_pattern"] = "effect_pattern" diff --git a/adventure/models/entity.py b/taleweave/models/entity.py similarity index 100% rename from adventure/models/entity.py rename to taleweave/models/entity.py diff --git a/adventure/models/event.py b/taleweave/models/event.py similarity index 100% rename from adventure/models/event.py rename to taleweave/models/event.py diff --git a/adventure/models/files.py b/taleweave/models/files.py similarity index 100% rename from adventure/models/files.py rename to taleweave/models/files.py diff --git a/adventure/models/planning.py b/taleweave/models/planning.py similarity index 88% rename from adventure/models/planning.py rename to taleweave/models/planning.py index 3dd3020..28a7e71 100644 --- a/adventure/models/planning.py +++ b/taleweave/models/planning.py @@ -2,7 +2,7 @@ from typing import List from pydantic import Field -from adventure.models.base import dataclass +from taleweave.models.base import dataclass @dataclass diff --git a/adventure/player.py b/taleweave/player.py similarity index 98% rename from adventure/player.py rename to taleweave/player.py index 6147b47..519fad8 100644 --- a/adventure/player.py +++ b/taleweave/player.py @@ -7,8 +7,8 @@ from typing import Any, Callable, Dict, List, Optional, Sequence from langchain_core.messages import AIMessage, BaseMessage, HumanMessage from packit.agent import Agent -from adventure.context import action_context -from adventure.models.event import PromptEvent +from taleweave.context import action_context +from taleweave.models.event import PromptEvent logger = getLogger(__name__) diff --git a/adventure/plugins.py b/taleweave/plugins.py similarity index 100% rename from adventure/plugins.py rename to taleweave/plugins.py diff --git a/adventure/prompts.yml b/taleweave/prompts.yml similarity index 100% rename from adventure/prompts.yml rename to taleweave/prompts.yml diff --git a/adventure/render/comfy.py b/taleweave/render/comfy.py similarity index 97% rename from adventure/render/comfy.py rename to taleweave/render/comfy.py index 30a7817..93c25b5 100644 --- a/adventure/render/comfy.py +++ b/taleweave/render/comfy.py @@ -16,10 +16,10 @@ from fnvhash import fnv1a_32 from jinja2 import Environment, FileSystemLoader, select_autoescape from PIL import Image -from adventure.context import broadcast -from adventure.models.config import DEFAULT_CONFIG, RenderConfig -from adventure.models.entity import WorldEntity -from adventure.models.event import ( +from taleweave.context import broadcast +from taleweave.models.config import DEFAULT_CONFIG, RenderConfig +from taleweave.models.entity import WorldEntity +from taleweave.models.event import ( ActionEvent, GameEvent, GenerateEvent, @@ -28,7 +28,7 @@ from adventure.models.event import ( ResultEvent, 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 diff --git a/adventure/render/prompt.py b/taleweave/render/prompt.py similarity index 96% rename from adventure/render/prompt.py rename to taleweave/render/prompt.py index 678fb98..924abdf 100644 --- a/adventure/render/prompt.py +++ b/taleweave/render/prompt.py @@ -3,17 +3,17 @@ from logging import getLogger from random import shuffle from typing import List -from adventure.context import get_current_world, get_dungeon_master -from adventure.models.entity import Room, WorldEntity -from adventure.models.event import ( +from taleweave.context import get_current_world, get_dungeon_master +from taleweave.models.entity import Room, WorldEntity +from taleweave.models.event import ( ActionEvent, GameEvent, ReplyEvent, ResultEvent, StatusEvent, ) -from adventure.utils.search import find_character_in_room, find_item_in_room, find_room -from adventure.utils.world import describe_entity +from taleweave.utils.search import find_character_in_room, find_item_in_room, find_room +from taleweave.utils.world import describe_entity logger = getLogger(__name__) diff --git a/adventure/server/websocket.py b/taleweave/server/websocket.py similarity index 96% rename from adventure/server/websocket.py rename to taleweave/server/websocket.py index 436a6b6..2e3afd4 100644 --- a/adventure/server/websocket.py +++ b/taleweave/server/websocket.py @@ -12,23 +12,23 @@ import websockets from PIL import Image from pydantic import RootModel -from adventure.context import ( +from taleweave.context import ( broadcast, get_character_agent_for_name, get_current_world, set_character_agent, subscribe, ) -from adventure.models.config import DEFAULT_CONFIG, WebsocketServerConfig -from adventure.models.entity import Character, Item, Room, World -from adventure.models.event import ( +from taleweave.models.config import DEFAULT_CONFIG, WebsocketServerConfig +from taleweave.models.entity import Character, Item, Room, World +from taleweave.models.event import ( GameEvent, PlayerEvent, PlayerListEvent, PromptEvent, RenderEvent, ) -from adventure.player import ( +from taleweave.player import ( RemotePlayer, get_player, has_player, @@ -36,9 +36,9 @@ from adventure.player import ( remove_player, set_player, ) -from adventure.render.comfy import render_entity, render_event -from adventure.state import snapshot_world, world_json -from adventure.utils.search import find_character, find_item, find_portal, find_room +from taleweave.render.comfy import render_entity, render_event +from taleweave.state import snapshot_world, world_json +from taleweave.utils.search import find_character, find_item, find_portal, find_room logger = getLogger(__name__) diff --git a/adventure/simulate.py b/taleweave/simulate.py similarity index 94% rename from adventure/simulate.py rename to taleweave/simulate.py index 883c3ef..08e404b 100644 --- a/adventure/simulate.py +++ b/taleweave/simulate.py @@ -12,7 +12,7 @@ from packit.results import multi_function_or_str_result from packit.toolbox import Toolbox from packit.utils import could_be_json -from adventure.actions.base import ( +from taleweave.actions.base import ( action_ask, action_give, action_look, @@ -20,7 +20,7 @@ from adventure.actions.base import ( action_take, action_tell, ) -from adventure.actions.planning import ( +from taleweave.actions.planning import ( check_calendar, erase_notes, get_recent_notes, @@ -30,7 +30,7 @@ from adventure.actions.planning import ( summarize_notes, take_note, ) -from adventure.context import ( +from taleweave.context import ( broadcast, get_character_agent_for_name, get_character_for_agent, @@ -42,15 +42,15 @@ from adventure.context import ( set_current_world, set_game_systems, ) -from adventure.game_system import GameSystem -from adventure.models.config import DEFAULT_CONFIG -from adventure.models.entity import Character, Room, World -from adventure.models.event import ActionEvent, ReplyEvent, ResultEvent -from adventure.utils.conversation import make_keyword_condition, summarize_room -from adventure.utils.effect import expire_effects -from adventure.utils.planning import expire_events, get_upcoming_events -from adventure.utils.search import find_room_with_character -from adventure.utils.world import describe_entity, format_attributes +from taleweave.game_system import GameSystem +from taleweave.models.config import DEFAULT_CONFIG +from taleweave.models.entity import Character, Room, World +from taleweave.models.event import ActionEvent, ReplyEvent, ResultEvent +from taleweave.utils.conversation import make_keyword_condition, summarize_room +from taleweave.utils.effect import expire_effects +from taleweave.utils.planning import expire_events, get_upcoming_events +from taleweave.utils.search import find_room_with_character +from taleweave.utils.world import describe_entity, format_attributes logger = getLogger(__name__) diff --git a/adventure/state.py b/taleweave/state.py similarity index 95% rename from adventure/state.py rename to taleweave/state.py index 5b4e7b0..04826bd 100644 --- a/adventure/state.py +++ b/taleweave/state.py @@ -7,9 +7,9 @@ from langchain_core.messages import AIMessage, BaseMessage, HumanMessage, System from packit.agent import Agent, agent_easy_connect from pydantic import RootModel -from adventure.context import get_all_character_agents, set_character_agent -from adventure.models.entity import World -from adventure.player import LocalPlayer +from taleweave.context import get_all_character_agents, set_character_agent +from taleweave.models.entity import World +from taleweave.player import LocalPlayer MEMORY_LIMIT = 25 # 10 diff --git a/adventure/systems/logic.py b/taleweave/systems/logic.py similarity index 97% rename from adventure/systems/logic.py rename to taleweave/systems/logic.py index 70478f6..27e388b 100644 --- a/adventure/systems/logic.py +++ b/taleweave/systems/logic.py @@ -8,9 +8,9 @@ from pydantic import Field from rule_engine import Rule from yaml import Loader, load -from adventure.game_system import FormatPerspective, GameSystem -from adventure.models.entity import Attributes, World, WorldEntity, dataclass -from adventure.plugins import get_plugin_function +from taleweave.game_system import FormatPerspective, GameSystem +from taleweave.models.entity import Attributes, World, WorldEntity, dataclass +from taleweave.plugins import get_plugin_function logger = getLogger(__name__) diff --git a/adventure/systems/quest.py b/taleweave/systems/quest.py similarity index 94% rename from adventure/systems/quest.py rename to taleweave/systems/quest.py index 1c532d8..0f1e126 100644 --- a/adventure/systems/quest.py +++ b/taleweave/systems/quest.py @@ -4,10 +4,10 @@ from typing import Dict, List, Literal, Optional from packit.agent import Agent from pydantic import Field -from adventure.context import get_system_data -from adventure.game_system import GameSystem, SystemData -from adventure.models.base import Attributes, dataclass, uuid -from adventure.models.entity import ( +from taleweave.context import get_system_data +from taleweave.game_system import GameSystem, SystemData +from taleweave.models.base import Attributes, dataclass, uuid +from taleweave.models.entity import ( Character, EntityReference, Item, @@ -15,13 +15,13 @@ from adventure.models.entity import ( World, WorldEntity, ) -from adventure.systems.logic import match_logic -from adventure.utils.search import ( +from taleweave.systems.logic import match_logic +from taleweave.utils.search import ( find_entity_reference, find_item_in_container, 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__) diff --git a/adventure/systems/rpg/__init__.py b/taleweave/systems/rpg/__init__.py similarity index 91% rename from adventure/systems/rpg/__init__.py rename to taleweave/systems/rpg/__init__.py index d64a1ed..a742737 100644 --- a/adventure/systems/rpg/__init__.py +++ b/taleweave/systems/rpg/__init__.py @@ -3,7 +3,7 @@ from .language_actions import action_read from .magic_actions import action_cast from .movement_actions import action_climb -from adventure.systems.logic import load_logic +from taleweave.systems.logic import load_logic LOGIC_FILES = [ "./adventure/systems/rpg/weather_logic.yaml", diff --git a/adventure/systems/rpg/crafting_actions.py b/taleweave/systems/rpg/crafting_actions.py similarity index 93% rename from adventure/systems/rpg/crafting_actions.py rename to taleweave/systems/rpg/crafting_actions.py index ed12d4b..6edd9a4 100644 --- a/adventure/systems/rpg/crafting_actions.py +++ b/taleweave/systems/rpg/crafting_actions.py @@ -1,14 +1,14 @@ from random import randint -from adventure.context import ( +from taleweave.context import ( broadcast, get_dungeon_master, get_game_systems, world_context, ) -from adventure.generate import generate_item -from adventure.models.base import dataclass -from adventure.models.entity import Item +from taleweave.generate import generate_item +from taleweave.models.base import dataclass +from taleweave.models.entity import Item @dataclass diff --git a/adventure/systems/rpg/language_actions.py b/taleweave/systems/rpg/language_actions.py similarity index 83% rename from adventure/systems/rpg/language_actions.py rename to taleweave/systems/rpg/language_actions.py index 721e4e5..520276d 100644 --- a/adventure/systems/rpg/language_actions.py +++ b/taleweave/systems/rpg/language_actions.py @@ -1,5 +1,5 @@ -from adventure.context import action_context, broadcast -from adventure.utils.search import find_item_in_character +from taleweave.context import action_context, broadcast +from taleweave.utils.search import find_item_in_character def action_read(item: str) -> str: diff --git a/adventure/systems/rpg/magic_actions.py b/taleweave/systems/rpg/magic_actions.py similarity index 92% rename from adventure/systems/rpg/magic_actions.py rename to taleweave/systems/rpg/magic_actions.py index c591a09..962e92e 100644 --- a/adventure/systems/rpg/magic_actions.py +++ b/taleweave/systems/rpg/magic_actions.py @@ -1,7 +1,7 @@ from random import randint -from adventure.context import action_context, broadcast, get_dungeon_master -from adventure.utils.search import find_character_in_room +from taleweave.context import action_context, broadcast, get_dungeon_master +from taleweave.utils.search import find_character_in_room def action_cast(spell: str, target: str) -> str: diff --git a/adventure/systems/rpg/movement_actions.py b/taleweave/systems/rpg/movement_actions.py similarity index 92% rename from adventure/systems/rpg/movement_actions.py rename to taleweave/systems/rpg/movement_actions.py index 7e16b97..8512df8 100644 --- a/adventure/systems/rpg/movement_actions.py +++ b/taleweave/systems/rpg/movement_actions.py @@ -1,7 +1,7 @@ from random import randint -from adventure.context import action_context, broadcast, get_dungeon_master -from adventure.utils.search import find_item_in_room +from taleweave.context import action_context, broadcast, get_dungeon_master +from taleweave.utils.search import find_item_in_room def action_climb(target: str) -> str: diff --git a/adventure/systems/rpg/weather_logic.yaml b/taleweave/systems/rpg/weather_logic.yaml similarity index 100% rename from adventure/systems/rpg/weather_logic.yaml rename to taleweave/systems/rpg/weather_logic.yaml diff --git a/adventure/systems/sim/__init__.py b/taleweave/systems/sim/__init__.py similarity index 93% rename from adventure/systems/sim/__init__.py rename to taleweave/systems/sim/__init__.py index 8f1ef7e..fbb2a5d 100644 --- a/adventure/systems/sim/__init__.py +++ b/taleweave/systems/sim/__init__.py @@ -2,7 +2,7 @@ from .hunger_actions import action_cook, action_eat from .hygiene_actions import action_wash from .sleeping_actions import action_sleep -from adventure.systems.logic import load_logic +from taleweave.systems.logic import load_logic LOGIC_FILES = [ "./adventure/systems/sim/environment_logic.yaml", diff --git a/adventure/systems/sim/combat_actions.py b/taleweave/systems/sim/combat_actions.py similarity index 96% rename from adventure/systems/sim/combat_actions.py rename to taleweave/systems/sim/combat_actions.py index caf51c8..01d8bc5 100644 --- a/adventure/systems/sim/combat_actions.py +++ b/taleweave/systems/sim/combat_actions.py @@ -1,11 +1,11 @@ -from adventure.context import ( +from taleweave.context import ( action_context, broadcast, get_agent_for_character, get_dungeon_master, ) -from adventure.utils.search import find_character_in_room, find_item_in_room -from adventure.utils.world import describe_entity +from taleweave.utils.search import find_character_in_room, find_item_in_room +from taleweave.utils.world import describe_entity def action_attack(target: str) -> str: diff --git a/adventure/systems/sim/environment_logic.yaml b/taleweave/systems/sim/environment_logic.yaml similarity index 100% rename from adventure/systems/sim/environment_logic.yaml rename to taleweave/systems/sim/environment_logic.yaml diff --git a/adventure/systems/sim/environment_triggers.py b/taleweave/systems/sim/environment_triggers.py similarity index 89% rename from adventure/systems/sim/environment_triggers.py rename to taleweave/systems/sim/environment_triggers.py index b61d0b9..bbc19c8 100644 --- a/adventure/systems/sim/environment_triggers.py +++ b/taleweave/systems/sim/environment_triggers.py @@ -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): diff --git a/adventure/systems/sim/hunger_actions.py b/taleweave/systems/sim/hunger_actions.py similarity index 95% rename from adventure/systems/sim/hunger_actions.py rename to taleweave/systems/sim/hunger_actions.py index 6b87a91..b9eeaaa 100644 --- a/adventure/systems/sim/hunger_actions.py +++ b/taleweave/systems/sim/hunger_actions.py @@ -1,5 +1,5 @@ -from adventure.context import action_context -from adventure.utils.search import find_item_in_character +from taleweave.context import action_context +from taleweave.utils.search import find_item_in_character def action_cook(item: str) -> str: diff --git a/adventure/systems/sim/hunger_logic.yaml b/taleweave/systems/sim/hunger_logic.yaml similarity index 100% rename from adventure/systems/sim/hunger_logic.yaml rename to taleweave/systems/sim/hunger_logic.yaml diff --git a/adventure/systems/sim/hygiene_actions.py b/taleweave/systems/sim/hygiene_actions.py similarity index 88% rename from adventure/systems/sim/hygiene_actions.py rename to taleweave/systems/sim/hygiene_actions.py index d906f8d..eae946c 100644 --- a/adventure/systems/sim/hygiene_actions.py +++ b/taleweave/systems/sim/hygiene_actions.py @@ -1,5 +1,5 @@ -from adventure.context import action_context, get_dungeon_master -from adventure.utils.world import describe_entity +from taleweave.context import action_context, get_dungeon_master +from taleweave.utils.world import describe_entity def action_wash(unused: bool) -> str: diff --git a/adventure/systems/sim/hygiene_logic.yaml b/taleweave/systems/sim/hygiene_logic.yaml similarity index 100% rename from adventure/systems/sim/hygiene_logic.yaml rename to taleweave/systems/sim/hygiene_logic.yaml diff --git a/adventure/systems/sim/mood_logic.yaml b/taleweave/systems/sim/mood_logic.yaml similarity index 100% rename from adventure/systems/sim/mood_logic.yaml rename to taleweave/systems/sim/mood_logic.yaml diff --git a/adventure/systems/sim/sleeping_actions.py b/taleweave/systems/sim/sleeping_actions.py similarity index 83% rename from adventure/systems/sim/sleeping_actions.py rename to taleweave/systems/sim/sleeping_actions.py index 9cf37a1..a1f4a14 100644 --- a/adventure/systems/sim/sleeping_actions.py +++ b/taleweave/systems/sim/sleeping_actions.py @@ -1,5 +1,5 @@ -from adventure.context import action_context, get_dungeon_master -from adventure.utils.world import describe_entity +from taleweave.context import action_context, get_dungeon_master +from taleweave.utils.world import describe_entity def action_sleep(unused: bool) -> str: diff --git a/adventure/systems/sim/sleeping_logic.yaml b/taleweave/systems/sim/sleeping_logic.yaml similarity index 100% rename from adventure/systems/sim/sleeping_logic.yaml rename to taleweave/systems/sim/sleeping_logic.yaml diff --git a/adventure/templates/comfy.json.j2 b/taleweave/templates/comfy.json.j2 similarity index 100% rename from adventure/templates/comfy.json.j2 rename to taleweave/templates/comfy.json.j2 diff --git a/adventure/utils/__init__.py b/taleweave/utils/__init__.py similarity index 100% rename from adventure/utils/__init__.py rename to taleweave/utils/__init__.py diff --git a/adventure/utils/attribute.py b/taleweave/utils/attribute.py similarity index 98% rename from adventure/utils/attribute.py rename to taleweave/utils/attribute.py index 7bc11d6..62a7afa 100644 --- a/adventure/utils/attribute.py +++ b/taleweave/utils/attribute.py @@ -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: diff --git a/adventure/utils/conversation.py b/taleweave/utils/conversation.py similarity index 96% rename from adventure/utils/conversation.py rename to taleweave/utils/conversation.py index 73eb1f3..9b0e6bc 100644 --- a/adventure/utils/conversation.py +++ b/taleweave/utils/conversation.py @@ -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.utils import could_be_json -from adventure.context import broadcast -from adventure.models.config import DEFAULT_CONFIG -from adventure.models.entity import Character, Room -from adventure.models.event import ReplyEvent +from taleweave.context import broadcast +from taleweave.models.config import DEFAULT_CONFIG +from taleweave.models.entity import Character, Room +from taleweave.models.event import ReplyEvent from .string import and_list, normalize_name diff --git a/adventure/utils/effect.py b/taleweave/utils/effect.py similarity index 92% rename from adventure/utils/effect.py rename to taleweave/utils/effect.py index db16a62..b4e5846 100644 --- a/adventure/utils/effect.py +++ b/taleweave/utils/effect.py @@ -1,7 +1,7 @@ from logging import getLogger -from typing import List +from typing import List, Literal -from adventure.models.effect import ( +from taleweave.models.effect import ( BooleanEffectPattern, BooleanEffectResult, EffectPattern, @@ -13,8 +13,8 @@ from adventure.models.effect import ( StringEffectPattern, StringEffectResult, ) -from adventure.models.entity import Attributes, Character -from adventure.utils.attribute import ( +from taleweave.models.entity import Attributes, Character +from taleweave.utils.attribute import ( add_value, append_value, multiply_value, @@ -282,3 +282,21 @@ def expire_effects(target: Character) -> None: target.active_effects[:] = [ 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" diff --git a/adventure/utils/file.py b/taleweave/utils/file.py similarity index 100% rename from adventure/utils/file.py rename to taleweave/utils/file.py diff --git a/adventure/utils/planning.py b/taleweave/utils/planning.py similarity index 95% rename from adventure/utils/planning.py rename to taleweave/utils/planning.py index 06b8345..f2ad36e 100644 --- a/adventure/utils/planning.py +++ b/taleweave/utils/planning.py @@ -1,4 +1,4 @@ -from adventure.models.entity import Character +from taleweave.models.entity import Character def expire_events(character: Character, current_turn: int): diff --git a/adventure/utils/random.py b/taleweave/utils/random.py similarity index 94% rename from adventure/utils/random.py rename to taleweave/utils/random.py index 7ee924e..d807ecd 100644 --- a/adventure/utils/random.py +++ b/taleweave/utils/random.py @@ -1,7 +1,7 @@ import random 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: diff --git a/adventure/utils/search.py b/taleweave/utils/search.py similarity index 99% rename from adventure/utils/search.py rename to taleweave/utils/search.py index a7f2c90..1b85e5e 100644 --- a/adventure/utils/search.py +++ b/taleweave/utils/search.py @@ -1,6 +1,6 @@ from typing import Any, Generator -from adventure.models.entity import ( +from taleweave.models.entity import ( Character, EntityReference, Item, diff --git a/adventure/utils/string.py b/taleweave/utils/string.py similarity index 100% rename from adventure/utils/string.py rename to taleweave/utils/string.py diff --git a/adventure/utils/systems.py b/taleweave/utils/systems.py similarity index 84% rename from adventure/utils/systems.py rename to taleweave/utils/systems.py index 7274e02..1b006d8 100644 --- a/adventure/utils/systems.py +++ b/taleweave/utils/systems.py @@ -1,6 +1,6 @@ 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): diff --git a/adventure/utils/world.py b/taleweave/utils/world.py similarity index 90% rename from adventure/utils/world.py rename to taleweave/utils/world.py index 2b6921c..bf63b32 100644 --- a/adventure/utils/world.py +++ b/taleweave/utils/world.py @@ -1,8 +1,8 @@ from logging import getLogger -from adventure.context import get_game_systems -from adventure.game_system import FormatPerspective -from adventure.models.entity import Character, WorldEntity +from taleweave.context import get_game_systems +from taleweave.game_system import FormatPerspective +from taleweave.models.entity import Character, WorldEntity logger = getLogger(__name__)