SkillTreeSystem.py
Índice
- Descripción General
- Dependencias e Inyecciones
- Constantes y Variables Globales
- Clases y Estructuras de Datos
- Funciones del Módulo (API)
- Flujo de Desbloqueo y Construcción Visual
1. Descripción General
El SkillTreeSystem.py gestiona el árbol de habilidades (o talentos) del jugador. Permite gastar los lvlPoints (ganados al subir de nivel) en nodos que otorgan bonificaciones permanentes (salud, maná, atributos, etc.). Soporta ramificaciones, donde algunos nodos están bloqueados hasta que se completen los nodos previos ("raíces"). Presenta un menú interactivo en consola construido de forma visualmente jerárquica utilizando rich.tree.
2. Dependencias e Inyecciones
- Archivos Base: Requiere
./Data/DataSkillTree.jsonque define el grafo de habilidades, los costos y los requerimientos de ramificación. - Librerías TUI:
rich.treepara el renderizado jerárquico,rich.panelyrich.console. - Inyecciones Condicionales:
ModulesUtils.input_utils(para el menú interactivo segurointeractive_menu_select).
3. Constantes y Variables Globales
skill_tree_manager(SkillTreeManager): Instancia global pre-cargada. Expone el gestor como un Singleton de facto importable por cualquier otro script sin necesidad de volver a leer el archivo JSON desde cero.
4. Clases y Estructuras de Datos
SkillTreeNode
Representa un talento individual (un punto del grafo).
Atributos de Instancia
self.node_id(str): ID interno.self.name(str),self.desc(str): UI legible.self.base_cost(int): Costo enlvlPointsdel primer nivel.self.cost_increment(int): Cuánto encarece la habilidad por cada nivel extra comprado.self.max_level(int): Límite de veces que se puede comprar.self.requires(List[str]): IDs de nodos "padre" que deben poseerse para poder desbloquear este.self.effects(Dict): Diccionario de bonificaciones, ej:{"Health_max": 50, "AGI": 2}.
Métodos Principales
get_current_cost(self, current_level: int) -> int: Retorna la matemáticabase_cost + (current_level * cost_increment).
SkillTreeManager
El motor que maneja el árbol global.
Atributos de Instancia
self.nodes(Dict[str, SkillTreeNode]): Caché de todos los nodos parseados de JSON.
Métodos Principales
load_tree(self): Parsea el JSON y llena el diccionario denodes.build_rich_tree(self, player) -> Tree: Recrea visualmente el árbol. Identifica los nodos que no tienenrequires(Raíces). Luego itera recursivamente descubriendo a los "Hijos" que requieran al padre, decorándolos con colores semánticos (Verde si lo tienes, Amarillo si lo maxeaste, Rojo si no tienes puntos, Gris si está bloqueado).apply_node_effects(self, player, node: SkillTreeNode): Intérprete de mutación. Lee el diccionario deeffectsy los suma directamente a las estadísticas base del objetoplayer.open_menu(self, player): Bucle asíncrono. Muestra el árbol renderizado, filtra solo las opciones viables y delega la compra descontando loslvlPoints.
5. Funciones del Módulo (API)
El módulo exporta directamente su clase de forma global, por lo que las funciones a llamar siempre son:
- skill_tree_manager.open_menu(player)
6. Flujo de Desbloqueo y Construcción Visual
El sistema fue rediseñado de listas a diccionarios en los guardados (skills_purchased).
1. Al abrir el menú, si el jugador viene de una partida muy antigua donde skills_purchased era una lista, hace una migración automática (retrocompatibilidad a dict).
2. Se renderiza un árbol usando la librería rich. El árbol detecta dinámicamente las relaciones Padre-Hijo gracias a la propiedad requires.
3. El árbol comprueba silenciosamente y forza el desbloqueo a nivel 1 de los nodos raíz (para prevenir que los jugadores nuevos se bloqueen fuera del árbol).
4. El jugador selecciona un nodo de la lista, el sistema cobra los Puntos de Nivel y aplica los modificadores matemáticos (como "Salud +50") directamente y sin intermediarios al objeto Player, mutando sus variables pasivamente.