From f2f8af3aec304da6cb6e687480715dd1d5beada9 Mon Sep 17 00:00:00 2001 From: KuMiShi Date: Fri, 30 Jan 2026 16:31:38 +0100 Subject: [PATCH] Clean-up and README --- .gitignore | 2 +- README.md | 38 +++++++++++++++--------- entities/entity.py | 4 +-- entities/npc.py | 1 + entities/player.py | 1 + events/event.py | 2 +- events/turn.py | 2 +- dice.py => utils/dice.py | 0 game.py => utils/game.py | 4 ++- {items => utils}/item.py | 5 ++-- serializable.py => utils/serializable.py | 1 + 11 files changed, 38 insertions(+), 22 deletions(-) rename dice.py => utils/dice.py (100%) rename game.py => utils/game.py (99%) rename {items => utils}/item.py (78%) rename serializable.py => utils/serializable.py (99%) diff --git a/.gitignore b/.gitignore index ad1ef2b..e61085c 100644 --- a/.gitignore +++ b/.gitignore @@ -2,7 +2,7 @@ .venv/ .python-version __pycache__/ -uv.lock +*.lock # Save/Load files for testing *.json \ No newline at end of file diff --git a/README.md b/README.md index 3eec51e..e5b554d 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,15 @@ # Wyvern&Castle -Projet de NLP 2025-2026. Modèle MCP de D&D. +Ceci est un projet de **modèle MCP** ([Model Context Protocol](https://modelcontextprotocol.io/docs/getting-started/intro)) pour le cours de **Natural Language Programming** de l'année 2025-2026. + +L'objectif du projet a été de concevoir une **version simplifié du jeu Donjon & Dragon** avec un LLM capable de générer des parties et des scénarios qui n'ont de limite que votre imagination (et celles du LLM aussi!). +Le projet contient un serveur (`server.py`) qui intéragit avec notre API de jeu (`game.py`). -# Initialisation du jeu +## Initialisation du projet +Pour lancer une partie de notre jeu, nous vous conseillons d'installer **[Claude Desktop](https://claude.com/fr-fr/download)** (disponible sur Windows +et Mac) qui va servir de LLM. Nous n'avons pas essayé mais il serait aussi possible d'utiliser la **version Desktop de ChatGPT** -Pour lancer la partie il faut tout d'abord installer [Claude Desktop](https://claude.com/fr-fr/download) (disponible sur Windows -et Mac). - -## Installer l'utilitaire python UV : +1. Installer l'utilitaire python UV : ```bash # Mac/Linux curl -LsSf https://astral.sh/uv/install.sh | sh @@ -15,14 +17,14 @@ curl -LsSf https://astral.sh/uv/install.sh | sh powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" ``` -## Initialiser le dossier pour l'installation +2. Initialiser le dossier pour l'installation Creer un dossier et cloner le projet : ```bash -uv init wyvern-castle -cd wyvern-castle +mkdir wyvern_castle +cd wyvern_castle git clone "https://gitea.galaxynoliro.fr/KuMiShi/Wyvern-Castle.git" ``` -## Creation de l'environnement virtuel +3. Creation de l'environnement virtuel ```bash uv venv ``` @@ -35,18 +37,24 @@ Windows .\.venv\Scripts\activate ``` -## Installation du client mcp +4. Installation des dependances/requirements ```bash -uv add mcp[cli] httpx +# Synchronise l'environnement virtuel du dossier avec les dependances du projet +uv pip sync pyproject.toml + +# Si cela ne fonctionne pas correctement, vous pouvez le générer un fichier de dependances avec la commande suivante à partir du .toml: +uv pip compile --upgrade pyproject.toml -o uv.lock +# Puis synchroniser à nouveau (avec le nouveau fichier cette fois) +uv pip sync uv.lock ``` -## Changement de la config de Claude Desktop +5. Changement de la config de Claude Desktop Modifier le fichier `claude_desktop_config.json` ```json { "mcpServers": { - "weather": { + "wyvern_castle": { "command": "uv", "args": [ "--directory", @@ -59,3 +67,5 @@ Modifier le fichier `claude_desktop_config.json` } ``` +## Utilisation +Le projet est assez simple d'utilisation car une fois le serveur lancé, il vous suffit d'écrire des prompts à l'aide de votre application Desktop de LLM. Il est aussi possible d'avoir accès à une aide de génération de prompt intégrée. diff --git a/entities/entity.py b/entities/entity.py index c0a4370..a141e2e 100644 --- a/entities/entity.py +++ b/entities/entity.py @@ -1,6 +1,6 @@ # Game imports -from serializable import Serializable -from items.item import Item +from utils.serializable import Serializable +from utils.item import Item # Native imports import uuid diff --git a/entities/npc.py b/entities/npc.py index f3ac6b1..c57cf7c 100644 --- a/entities/npc.py +++ b/entities/npc.py @@ -1,3 +1,4 @@ +# Game imports from entities.entity import Entity class NPC(Entity): diff --git a/entities/player.py b/entities/player.py index fe2ca25..6b865fa 100644 --- a/entities/player.py +++ b/entities/player.py @@ -1,3 +1,4 @@ +# Game imports from entities.entity import Entity class Player(Entity): diff --git a/events/event.py b/events/event.py index ea1fe69..60e2259 100644 --- a/events/event.py +++ b/events/event.py @@ -1,5 +1,5 @@ # Game imports -from serializable import Serializable +from utils.serializable import Serializable from entities.entity import Entity from turn import Turn, TurnAction diff --git a/events/turn.py b/events/turn.py index 91235f2..b6e1568 100644 --- a/events/turn.py +++ b/events/turn.py @@ -1,5 +1,5 @@ # Game import -from serializable import Serializable +from utils.serializable import Serializable # Native imports from enum import Enum diff --git a/dice.py b/utils/dice.py similarity index 100% rename from dice.py rename to utils/dice.py diff --git a/game.py b/utils/game.py similarity index 99% rename from game.py rename to utils/game.py index 10e2f08..f5bb12d 100644 --- a/game.py +++ b/utils/game.py @@ -1,11 +1,13 @@ +# Game imports from serializable import Serializable from dice import Dice from events.event import Event from entities.player import Player from entities.npc import NPC -from items.item import Item +from utils.item import Item from events.turn import TurnAction +# Native imports from enum import IntEnum class Stat(IntEnum): diff --git a/items/item.py b/utils/item.py similarity index 78% rename from items/item.py rename to utils/item.py index d9c6fb2..630d8d0 100644 --- a/items/item.py +++ b/utils/item.py @@ -1,10 +1,11 @@ -from typing import Dict +# Game imports from serializable import Serializable +# Native imports import uuid class Item(Serializable): - def __init__(self,name:str, description:str, stat_modifier:Dict[str, int]): + def __init__(self,name:str, description:str, stat_modifier:dict[str, int]): super().__init__() self.id = str(uuid.uuid4()) self.name = name diff --git a/serializable.py b/utils/serializable.py similarity index 99% rename from serializable.py rename to utils/serializable.py index e39d462..b1451d2 100644 --- a/serializable.py +++ b/utils/serializable.py @@ -1,3 +1,4 @@ +# Native imports import json from typing import Any, Dict, List, Type, TypeVar