Actualizar README.md con secciones de demostración y arquitectura, y mejorar la interfaz de usuario en app.py para manejar bloques HTML. También se corrigen comentarios y traducciones en obr.py y test.py.
18f4e71
| import requests as request | |
| import os | |
| import urllib3 | |
| # Suppress warnings about insecure SSL connections | |
| urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning) | |
| ASSETS_NAMES = { | |
| "BOOK": "book.png", | |
| "CHEST": "chest.png", | |
| "SWORD": "sword.png", | |
| "TORCH": "torch.png", | |
| "ARCHER": "halfElfBard.png", | |
| "HUMAN": "human.png", | |
| "WOMAN": "woman.png", | |
| "CHILD": "child.png", | |
| "ORC": "halfOrcFighter2.png", | |
| "KNIGHT": "knight1.png", | |
| "DRAGON": "redDragon.png", | |
| "GOBLIN": "goblin.png", | |
| "GOLEM": "rockGolem.png", | |
| "FOREST": "forestMap.jpg", | |
| "VILLAGE": "villageMap.jpg", | |
| "LONELY_CABIN": "lonelyCabinMap.jpg", | |
| "BATTLE_ARENA": "battleArenaMap.jpg", | |
| "CABIN": "cabinMap.jpeg", | |
| } | |
| def execute_action(tab_id, action, params={}): | |
| """ | |
| Execute an action on a specific tab. | |
| Args: | |
| tab_id (str): The ID of the tab where the action will be executed. | |
| action (str): The action to perform (e.g., "createShape", "createText"). | |
| params (json): Parameters required for the action. | |
| Returns: | |
| dict: A dictionary containing the game state. | |
| """ | |
| payload = { | |
| "action": action, | |
| "args": params | |
| } | |
| url = f"{os.getenv('FRONTEND_SERVER')}/execute/{tab_id}" | |
| response = request.post( | |
| url, | |
| json=payload, | |
| headers={'Content-Type': 'application/json'}, | |
| verify=False | |
| ) | |
| if action != "getGameState" and response.status_code == 200 and response.json()["success"]: | |
| return execute_action(tab_id=tab_id, action="getGameState") | |
| else: | |
| return response.json() | |
| def create_token(name:str, type:str, x:int, y:int, size:int, tab_id:str)->dict: | |
| """ | |
| Create a token with specified properties, they can be items or characters. | |
| Args: | |
| name (str): Name of the token. | |
| type (str): Type of the token. It can be "BOOK" | "CHEST" | "SWORD" | "TORCH" | "ARCHER" | "HUMAN" | "ORC" | "KNIGHT" | "DRAGON" | "GOBLIN" | "GOLEM". | |
| x (int): X coordinate of the token in cells. | |
| y (int): Y coordinate of the token in cells. | |
| size (int): Width of the token in cells. | |
| tab_id (str): The ID of the tab where the token will be created. This is the most important parameter. | |
| Returns: | |
| dict: A dictionary containing the game state. | |
| """ | |
| asset_url = f"{os.getenv('ASSETS_URL')}/{ASSETS_NAMES[type.upper()]}" | |
| params = { | |
| "name": name, | |
| "imageUrl": asset_url, | |
| "x": x, | |
| "y": y, | |
| "size": size | |
| } | |
| return execute_action(tab_id=tab_id, action="createToken", params=params) | |
| def create_shape(width:int, height:int, x:int, y:int, shape_type:str, fill_color:str, stroke_color:str, tab_id:str) -> dict: | |
| """ | |
| Create a shape item with specified properties. | |
| Args: | |
| width (int): Width of the shape in cells. | |
| height (int): Height of the shape in cells. | |
| x (int): X coordinate of the shape in cells. | |
| y (int): Y coordinate of the shape in cells. | |
| shape_type (str): Type of the shape. It can be "RECTANGLE" | "CIRCLE" | "TRIANGLE" | "HEXAGON". | |
| fill_color (str): Fill color in hex format (e.g., "#ff0000"). | |
| stroke_color (str): Stroke color in hex format (e.g., "#ff0000"). | |
| tab_id (str): The ID of the tab where the shape will be created. This is the most important parameter. | |
| Returns: | |
| dict: A dictionary containing the game state. | |
| """ | |
| params = { | |
| "width": width, | |
| "height": height, | |
| "x": x, | |
| "y": y, | |
| "shapeType": shape_type.upper(), | |
| "strokeColor": stroke_color, | |
| "fillColor": fill_color | |
| } | |
| return execute_action(tab_id=tab_id, action="createShape", params=params) | |
| def game_state(tab_id:str) -> dict: | |
| """ | |
| Get the current game state. | |
| Args: | |
| tab_id (str): The ID of the tab to retrieve the game state for. | |
| Returns: | |
| dict: A dictionary containing the game state. | |
| """ | |
| return execute_action(tab_id=tab_id, action="getGameState") | |
| def move_item(tab_id:str, item_id:str, x:int, y:int) -> dict: | |
| """ | |
| Move an item to a new position. | |
| Args: | |
| tab_id (str): The ID of the tab where the item is located. | |
| item_id (str): The ID of the item to move. | |
| x (int): New X coordinate in cells. | |
| y (int): New Y coordinate in cells. | |
| Returns: | |
| dict: A dictionary confirming the moved item. | |
| """ | |
| params = { | |
| "id": item_id, | |
| "x": x, | |
| "y": y | |
| } | |
| return execute_action(tab_id=tab_id, action="moveItem", params=params) | |
| def delete_item(tab_id:str, item_id:str) -> dict: | |
| """ | |
| Delete an item from the game. | |
| Args: | |
| tab_id (str): The ID of the tab where the item is located. | |
| item_id (str): The ID of the item to delete. | |
| Returns: | |
| dict: A dictionary containing the game state. | |
| """ | |
| params = { | |
| "id": item_id | |
| } | |
| return execute_action(tab_id=tab_id, action="deleteItem", params=params) | |
| def fill_fog(tab_id:str) -> dict: | |
| """ | |
| Fill the entire map with fog of war. | |
| Args: | |
| tab_id (str): The ID of the tab where the fog will be applied. | |
| Returns: | |
| dict: A dictionary containing the game state. | |
| """ | |
| return execute_action(tab_id=tab_id, action="fillFog") | |
| def clear_fog(tab_id:str) -> dict: | |
| """ | |
| Clear the fog of war from the entire map. | |
| Args: | |
| tab_id (str): The ID of the tab where the fog will be cleared. | |
| Returns: | |
| dict: A dictionary containing the game state. | |
| """ | |
| return execute_action(tab_id=tab_id, action="removeFog") | |
| def add_token_light(tab_id:str, item_id:str, light_radius:int) -> dict: | |
| """ | |
| Add light to a token. This will allow to show it inside the fog of war. | |
| It can be used to add light to items like torches or characters. | |
| It will be attached so that the light moves with the token. | |
| Args: | |
| tab_id (str): The ID of the tab where the item is located. | |
| item_id (str): The ID of the item to add light to. | |
| light_radius (int): The radius of the light in cells. | |
| Returns: | |
| dict: A dictionary containing the game state. | |
| """ | |
| params = { | |
| "targetId": item_id, | |
| "radiusCells": light_radius | |
| } | |
| return execute_action(tab_id=tab_id, action="addLightSource", params=params) | |
| def animate_token_viewport(tab_id:str, item_id:str) -> dict: | |
| """ | |
| Animate the viewport to focus on a specific token. | |
| Args: | |
| tab_id (str): The ID of the tab where the item is located. | |
| item_id (str): The ID of the item to focus on. | |
| Returns: | |
| dict: A dictionary containing the game state. | |
| """ | |
| params = { | |
| "itemsId": item_id | |
| } | |
| return execute_action(tab_id=tab_id, action="animateViewport", params=params) | |
| def insert_map(tab_id:str, map_type:str) -> dict: | |
| """ | |
| Insert a map into the game. | |
| The available maps are: | |
| - FOREST: A forest with multiple paths and trees. | |
| - VILLAGE: A small village with 3 houses and a well in the middle. | |
| - LONELY_CABIN: A lonely cabin in the middle of a plain. | |
| - CABIN: The interior of a cabin. | |
| - BATTLE_ARENA: A roman battle arena with a central platform and walls around it. | |
| Args: | |
| tab_id (str): The ID of the tab where the map will be inserted. | |
| map_type (str): The type of the map to insert. It can be: "FOREST" | "VILLAGE" | "LONELY_CABIN" | "BATTLE_ARENA" | "CABIN". | |
| Returns: | |
| dict: A dictionary containing the game state. | |
| """ | |
| map_type = map_type.upper() | |
| asset_url = f"{os.getenv('ASSETS_URL')}/{ASSETS_NAMES[map_type]}" | |
| params = { | |
| "mapUrl": asset_url, | |
| } | |
| return execute_action(tab_id=tab_id, action="insertMap", params=params) | |
| def clean_map(tab_id:str) -> dict: | |
| """ | |
| Clean the map by removing all items and shapes. | |
| Args: | |
| tab_id (str): The ID of the tab where the map will be cleaned. | |
| Returns: | |
| dict: A dictionary confirming the map cleaning. | |
| """ | |
| return execute_action(tab_id=tab_id, action="emptyAll") |