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/
__pycache__/
.env
venv/
client/node_modules/
client/out/
taleweave/custom_*

View File

@ -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

View File

@ -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__)

View File

@ -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:

View File

@ -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

View File

@ -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:

View File

@ -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

View File

@ -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__)

View File

@ -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):

View File

@ -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__)

View File

@ -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))

View File

@ -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"

View File

@ -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

View File

@ -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__)

View File

@ -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

View File

@ -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__)

View File

@ -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__)

View File

@ -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__)

View File

@ -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

View File

@ -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__)

View File

@ -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__)

View File

@ -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",

View File

@ -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

View File

@ -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:

View File

@ -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:

View File

@ -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:

View File

@ -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",

View File

@ -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:

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):

View File

@ -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:

View File

@ -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:

View File

@ -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:

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:

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.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

View File

@ -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"

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):

View File

@ -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:

View File

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

View File

@ -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):

View File

@ -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__)