RPGNodes es un addon que simplifica la lógica para construir juegos RPG usando nodos personalizados.
RPGNodes proporciona una solución genérica para la lógica típica encontrada en los RPGs. Por ejemplo:
RPGCharacterpuede representar la lógica de un personaje – añadiendo experiencia, salud, energía o maná.RPGItemoRPGWeightItemrepresenta un ítem con atributos comunes (item_name, description, amount, buy_price, sell_price, etc.).RGPWeightInventoryalmacena y gestiona ítems que tienen peso, lo que significa que cada ítem puede tener un peso diferente.
El proyecto está listo para producción con gestión de inventarios completa, sistemas de personajes y cobertura de pruebas robusta. Las pruebas unitarias están escritas con GUT.
RPGCharacter: ¡Listo para producción – probado con tests unitarios (GUT) y mejorado con soporte de serialización!
RPGDialog: Usable – probado en una escena dentro del proyecto.
RPGWeightItem: Listo para producción y probado junto con RPGWeightInventory usando tests unitarios (GUT).
RPGWeightInventory: Listo para producción y probado con tests unitarios (GUT).
RPGSlotInventory: ¡Listo para producción – sistema completo de inventario en cuadrícula con pruebas exhaustivas (GUT)!
RPGStats: ¡Listo para producción – sistema completo de gestión de estadísticas de personaje con sistema de asignación y pruebas extensas (GUT)!
RPGSlotItem Clase funcional para inventarios basados en ranuras.
RPGActor Clase base abstracta para entidades tipo actor.
RPGEnemy Implementación específica para personajes enemigos.
Recomendamos descargar la última versión desde GitHub: https://github.com/TheVulcoreTeam/RPGNodes/releases
Clona el repositorio y ábrelo con Godot 4.5.x. Si quieres usarlo realmente, es mejor descargar la versión lanzada desde GitHub.
Usar el plugin requiere los siguientes pasos:
- Descarga la versión: https://github.com/TheVulcoreTeam/RPGNodes/releases
- Copia la carpeta
rpg_nodesy colócala dentro del directorioaddonsde tu proyecto. Si no tienes una carpetaaddonsen la raíz de tu proyecto, crea una. - Abre el editor de Godot y activa el plugin en Proyecto → Ajustes del Proyecto → Plugins
Esta versión principal transforma RPGNodes de un kit de herramientas prometedor a un framework RPG listo para producción:
- Sistemas Doble de Inventario Completos: Elige entre inventarios basados en peso o estilo Diablo basados en ranuras
- Sistema de Estadísticas Listo para Producción: Gestión completa de estadísticas de personaje con asignación de puntos
- Arquitectura Mejorada: Mejor herencia con clases base apropiadas (RPGActor, RPGNode)
- Pruebas Exhaustivas: Cobertura extensiva de pruebas unitarias para todas las nuevas características
- Soporte de Serialización: Funcionalidad guardar/cargar para sistemas críticos
RPGNodes ahora ofrece dos soluciones completas de inventario:
- Ideal para: Juegos realistas con límites de capacidad de carga
- Características: Los ítems tienen peso, gestión de capacidad de peso total
- Casos de uso: Juegos de supervivencia, RPGs realistas, juegos de gestión de recursos
- Ideal para: RPGs clásicos con inventarios basados en cuadrícula
- Características: Diseño en cuadrícula (ancho × alto), los ítems ocupan múltiples ranuras, posicionamiento automático
- Casos de uso: Juegos estilo Diablo, RPGs tácticos, juegos con gestión visual de inventario
Ambos sistemas están completamente probados y listos para producción. Elige según los requisitos de diseño de tu juego.
A continuación hay una breve descripción de cada nodo personalizado. Si tienes preguntas sobre cómo funciona un método en particular, abre un issue en GitHub o lee el código fuente de ese nodo. Todos los métodos están en Inglés, y los comentarios también están escritos en Inglés.
Una clase de actor RPG extendida que representa un personaje jugable con sistemas de nivel, energía y resistencia.
level_max: int- Nivel máximo alcanzable (por defecto: 30)energy: int- Puntos actuales de energía/maná (por defecto: 20)energy_max: int- Capacidad máxima de energía (por defecto: 20)stamina: float- Puntos actuales de resistencia (por defecto: 20.0)stamina_max: float- Capacidad máxima de resistencia (por defecto: 20.0)stamina_regen_per_second: float- Tasa de regeneración de resistencia por segundo (por defecto: 2.0)base_attack: int- Valor base de ataque (por defecto: 1)experience_base: float- Constante base para la progresión de experiencia (por defecto: 100.0)experience_factor: float- Factor para ajustar la curva de nivel (por defecto: 1.5)
level_increased(new_level)- Emitida cuando el personaje sube de nivelexperience_gained(amount)- Emitida cuando se gana experienciaenergy_replenished(amount)- Emitida cuando la energía se restauraenergy_used(amount)- Emitida cuando la energía se consumeenergy_reached_full()- Emitida cuando la energía alcanza el máximoenergy_depleted()- Emitida cuando la energía llega a cerostamina_replenished(amount)- Emitida cuando la resistencia se restaurastamina_used(amount)- Emitida cuando la resistencia se consumestamina_reached_full()- Emitida cuando la resistencia alcanza el máximostamina_depleted()- Emitida cuando la resistencia se agota por completo
revive(custom_hp, revive_with_max_hp)- Revive al personaje cuando está muertoget_exp_for_level(level)- Calcula la experiencia requerida para un nivel específicoget_total_exp_to_current_level()- Obtiene la experiencia total acumulada hasta el nivel actualget_exp_to_next_level()- Obtiene la experiencia necesaria para el siguiente niveladd_experience(amount)- Añade experiencia y maneja las subidas de nivelget_level_progress()- Devuelve el porcentaje de progreso hacia el siguiente nivel (0.0-1.0)reset_level_stats()- Reinicia el nivel y la experiencia a valores iniciales
Un sistema de diálogo para gestionar conversaciones con NPCs, soportando nombres de personajes, mensajes y avatares.
text: NodePath- Ruta al RichTextLabel para el texto del diálogotitle_name: NodePath- Ruta al RichTextLabel para el nombre del personajeavatar: NodePath- Ruta al TextureRect para el avatar del personajedialogue: Array- Array que almacena las secciones del diálogotimer- Referencia al Timer para los tiempos del diálogonext_pressed: bool- Bandera para el estado del botón siguiente
character_name_changed(old_name, new_name)- Emitida cuando cambia el nombre del personajeavatar_changed(old_image, new_image)- Emitida cuando cambia el avatardialog_started()- Emitida cuando comienza el diálogosection_ended(idx)- Emitida cuando termina una sección del diálogodialog_ended()- Emitida cuando concluye todo el diálogodialog_cleaned- Emitida cuando se limpia el diálogo
add_section(character_name, message, avatar_image)- Añade una nueva sección de diálogonext_dialog()- Avanza al siguiente diálogo o inicia la secuenciareset_index()- Reinicia el índice del diálogo para empezar desde el principioclear_dialog()- Limpia todas las secciones del diálogo
Clase base de recurso para representar ítems en el sistema RPG con propiedades básicas.
item_name: String- Nombre del ítemdescription: String- Texto de descripción del ítembuy_price: int- Precio de compra del ítem (por defecto: 2)sell_price: int- Precio de venta del ítem (por defecto: 1)
item_name_changed(old_name, new_name)- Emitida cuando se modifica el nombre del ítemdescription_changed(old_description, new_description)- Emitida cuando cambia la descripciónbuy_price_changed(old_value, new_value)- Emitida cuando se actualiza el precio de comprasell_price_changed(old_value, new_value)- Emitida cuando se actualiza el precio de venta
Sistema de inventario basado en peso que gestiona ítems con restricciones de carga.
max_weight: int- Capacidad máxima de peso (por defecto: 100)_weight_inventory: Array[RPGWeightItem]- Array de ítems en el inventario_weight: int- Peso total actual del inventario
weight_filled()- Emitida cuando el inventario alcanza el peso máximoweight_changed(old_weight, new_value)- Emitida cuando cambia el peso total
add_item(item)- Añade un ítem al inventario si el peso lo permiteget_item(uuid)- Recupera un ítem por su UUID, devuelve null si no se encuentraremove_item(uuid)- Elimina un ítem por UUID, devuelve true si tiene éxito
Clase RPGItem extendida que añade propiedades de peso para usar en sistemas de inventario basados en peso.
weight: int- Valor de peso del ítem en el inventario (por defecto: 1)
weight_updated(new_weight)- Emitida cuando se modifica el peso del ítem
Esta clase hereda todas las propiedades, señales y funcionalidades de RPGItem, añadiendo gestión de peso específicamente para sistemas de inventario que rastrean la capacidad de carga.
Sistema de inventario basado en cuadrícula similar a juegos estilo Diablo donde los ítems ocupan ranuras específicas en un diseño de cuadrícula.
width: int- Ancho de la cuadrícula en ranuras (por defecto: 10)height: int- Alto de la cuadrícula en ranuras (por defecto: 10)_slot_inventory: Array[RPGSlotItem]- Array de ítems en el inventario_grid: Array- Cuadrícula 2D representando ranuras ocupadas
slot_item_added(item)- Emitida cuando se añade un ítem al inventarioslot_item_removed(item)- Emitida cuando se elimina un ítem del inventarioslot_item_moved(item, old_position, new_position)- Emitida cuando un ítem cambia de posicióninventory_resized(old_size, new_size)- Emitida cuando cambian las dimensiones de la cuadrícula
add_item(item, position)- Añade un ítem en posición específica o encuentra espacio disponibleremove_item(uuid)- Elimina un ítem por UUIDmove_item(uuid, new_position)- Mueve un ítem a una nueva posiciónget_available_space(position, item_width, item_height)- Verifica si hay espacio disponiblefind_available_position(item_width, item_height)- Encuentra la primera posición disponibleis_position_valid(position, item_width, item_height)- Valida los límites de la posición
Clase RPGItem extendida que añade propiedades espaciales para sistemas de inventario basados en cuadrícula.
width: int- Ancho del ítem en ranuras de cuadrícula (por defecto: 1, mínimo: 1)height: int- Alto del ítem en ranuras de cuadrícula (por defecto: 1, mínimo: 1)position: Vector2i- Posición actual en la cuadrícula del inventario (por defecto: Vector2i.ZERO)
dimensions_changed(old_size, new_size)- Emitida cuando cambia el ancho o altoposition_changed(old_position, new_position)- Emitida cuando cambia la posición
get_occupied_cells()- Devuelve array de celdas de cuadrícula ocupadas por este ítemis_position_valid(inventory_width, inventory_height)- Verifica si la posición actual es válidawould_fit_at(position, inventory_width, inventory_height)- Verifica si el ítem cabría en la posición
Esta clase hereda todas las propiedades, señales y funcionalidades de RPGItem, añadiendo gestión espacial para sistemas de inventario basados en cuadrícula.
Sistema comprehensivo de gestión de estadísticas de personaje con adición dinámica de estadísticas y asignación de puntos.
stat_points: int- Puntos de estadística disponibles para asignación (por defecto: 0)_stats: Dictionary- Diccionario almacenando todas las estadísticas con pares nombre-valor_base_stats: Dictionary- Diccionario almacenando valores base de estadísticas
stat_points_changed(old_points, new_points)- Emitida cuando cambian los puntos de estadísticastat_added(stat_name, value)- Emitida cuando se añade una nueva estadísticastat_changed(stat_name, old_value, new_value)- Emitida cuando cambia el valor de una estadísticastat_points_allocated(stat_name, points)- Emitida cuando se asignan puntos a una estadística
add_stat(stat_name, base_value, current_value)- Añade una nueva estadística al personajeget_stat(stat_name)- Obtiene el valor actual de una estadísticaget_base_stat(stat_name)- Obtiene el valor base de una estadísticaset_stat(stat_name, value)- Establece el valor actual de una estadísticaallocate_stat_points(stat_name, points)- Asigna puntos de estadística para aumentar una estadísticaadd_stat_points(points)- Añade puntos de estadística disponiblesto_dict()- Serializa estadísticas a diccionario para guardarfrom_dict(data)- Carga estadísticas desde diccionario
Clase base abstracta para todas las entidades tipo actor en el sistema RPG.
character_name: String- Nombre del actor (por defecto: "Actor")
character_name_changed(old_name, new_name)- Emitida cuando cambia el nombre del actor
Esta clase sirve como fundación para todas las clases de personaje y enemigo, proporcionando funcionalidad común de actor y capacidades de nomenclatura.
Implementación específica para personajes enemigos heredando de RPGActor.
- Hereda todas las propiedades de RPGActor
- Se pueden añadir propiedades adicionales específicas de enemigos según sea necesario
Esta clase proporciona un punto de partida para la implementación de personajes enemigos con toda la funcionalidad base de actor heredada de RPGActor.
Ítem consumible que aplica un efecto a lo largo del tiempo o instantáneamente.
effect_type: PotionEffect- Tipo de efecto (HEALTH, MANA, SATURATION)value: int- Magnitud del efectoduration: float- Duración en segundos
effect_type_changed(old_value, new_value)value_changed(old_value, new_value)duration_changed(old_value, new_value)
Equipo de protección que proporciona defensa y probabilidad de bloqueo.
defense: int- Valor de defensablock_chance: float- Probabilidad de bloquear ataques (0.0 a 1.0)
defense_changed(old_value, new_value)block_chance_changed(old_value, new_value)
Ítem ofensivo con propiedades de daño y ataque.
damage: int- Daño baseattack_speed: float- Ataques por segundocrit_chance: float- Probabilidad de golpe crítico (0.0 a 1.0)
damage_changed(old_value, new_value)attack_speed_changed(old_value, new_value)crit_chance_changed(old_value, new_value)
