O que é o Godot Open RPG?
O Godot Open RPG é um projeto de demonstração de código aberto construído sobre o motor Godot. Ele reúne os blocos fundamentais de um RPG clássico por turnos — diálogos ramificados, combate estratégico, personagens animados e transições de cenário — em uma única base pronta para estudo e personalização. O objetivo não é entregar um jogo finalizado, mas sim uma arquitetura funcional que acelera a prototipação de aventuras narrativas.
A proposta central é permitir que o desenvolvedor foque na direção criativa e no roteiro, sem precisar reescrever a infraestrutura técnica de um RPG do zero. O projeto inclui recursos visuais de exemplo, cenas demonstrativas e scripts bem organizados, funcionando como ponto de partida para estudantes, educadores e criadores independentes.
Sistema de diálogo com Dialogic
Uma das partes mais trabalhosas de um RPG é criar conversas naturais com ramificações. O Godot Open RPG integra o Dialogic, um plugin visual que permite montar árvores de diálogo sem editar código diretamente.
Para usar o sistema, crie um recurso de timeline dentro do plugin e, na cena do NPC, adicione um nó responsável por disparar a conversa:
extends Area2D
@export var caminho_timeline: String = "res://conteudo/dialogos/chefe_vila.dtl"
@export var identificador_npc: String = "chefe_vila"
@onready var _indicador: Sprite2D = $SpriteIndicador
func _on_body_entered(corpo: Node2D) -> void:
if not corpo.is_in_group("jogador"):
return
_indicador.visible = true
func _input(evento: InputEvent) -> void:
if not evento.is_action_pressed("interagir"):
return
if not _indicador.visible:
return
_iniciar_conversa()
func _iniciar_conversa() -> void:
var memoria = VariaveisGlobais.pegar_escolha(identificador_npc)
Dialogic.start(caminho_timeline)
Dialogic.set_variable("relacao_com_npc", memoria)
Com variáveis do Dialogic, é possível fazer com que personagens lembrem decisões anteriores do jogador. Eventos especiais dentro da timeline também podem acionar animações, tocar sons ou trocar de cena durante uma conversa.
Personagens, animações e combate
O framework oferece uma estrutura reutilizável para personagens jogáveis e inimigos. Cada lutador é representado por uma cena contendo atributos, animações e ações. Abaixo, um exemplo de como um personagem pode processar uma habilidade durante o turno:
class_name Lutador
extends Node2D
@export var atributos: Resource
@export var maquina_animacao: AnimationPlayer
var saude: int
var vigor: int
func _ready() -> void:
_restaurar_estado()
func _restaurar_estado() -> void:
saude = atributos.saude_maxima
vigor = atributos.vigor_inicial
func aplicar_acao(alvo: Lutador, acao: AcaoLutador) -> void:
if vigor < acao.custo_vigor:
return
vigor -= acao.custo_vigor
var dano = _calcular_impacto(acao)
alvo.sofrer_dano(dano)
maquina_animacao.play(acao.animacao_execucao)
func _calcular_impacto(acao: AcaoLutador) -> int:
var base: float = acao.poder
var multiplicador: float = atributos.poder_fisico if acao.categoria == "fisico" else atributos.poder_magico
return int(base * (1.0 + multiplicador / 12.0))
func sofrer_dano(valor: int) -> void:
saude = max(0, saude - valor)
maquina_animacao.play("receber_dano")
Esse padrão separa claramente os dados do personagem, a lógica do combate e a apresentação visual. É possível estender a classe AcaoLutador para criar habilidades mágicas, ataques à distância ou itens de cura, cada uma com sua própria animação e custo.
Mundo, encontros e transições de batalha
A exploração acontece em mapas do mundo aberto, enquanto os combates ocorrem em arenas dedicadas. O fluxo típico é: o jogador caminha por uma área, encontra um inimigo ou gatilho de evento, assiste a uma breve introdução e é transportado para a cena de batalha.
extends Node2D
@export var cena_batalha: PackedScene
@export var tropas_inimigas: Array[Resource]
@export var dialogo_pre_batalha: String = ""
func _on_jogador_encontrado() -> void:
if not dialogo_pre_batalha.is_empty():
Dialogic.start(dialogo_pre_batalha)
await Dialogic.timeline_ended
var instancia: Node = cena_batalha.instantiate()
instancia.configurar_encontro(tropas_inimigas)
get_tree().current_scene.add_child(instancia)
Transicao.tela_para_batalha()
Esse mecanismo facilita a criação de variações como emboscadas noturnas, chefes em áreas específicas ou batalhas com condições ambientais. Após a vitória, a cena do mundo pode ser atualizada para refletir o progresso do jogador, liberando novos caminhos ou alterando o comportamento de NPCs.
Roteiro prático de desenvolvimento
- Preparação do ambiente. Clone o repositório, abra o projeto no Godot e aguarde a importação dos recursos. Leia a documentação inicial para entender a organização de pastas.
- Execução da demonstração. Rode a cena principal para vivenciar o fluxo completo: introdução, diálogo e combate. Observe como os módulos se comunicam.
- Criação de conteúdo. Produza novos diálogos no Dialogic, monte personagens personalizados e desenhe mapas usando os templates existentes.
- Extensão de sistemas. Altere fórmulas de dano, adicione novas habilidades e implemente mecânicas próprias, como elementos opostos ou estados negativos.
- Teste e publicação. Exporte o jogo para as plataformas desejadas e verifique a compatibilidade de controles, áudio e resolução.
Referência rápida de organização
| Componente | Local sugerido | Arquivo de referência |
|---|---|---|
| Diálogos | addons/dialogic/ |
dialogic_handler.gd |
| Lutadores | personagens/lutadores/ |
atributos_lutador.tres |
| Mapas | mapas/exploracao/ |
controle_mapa.gd |
| Combate | batalha/nucleo/ |
gerenciador_batalha.gd |
| Áudio | recursos/sons/ |
reprodutor_trilha.gd |