Tormenta20
Uma biblioteca Ruby com dados do RPG de mesa brasileiro Tormenta20.
A gem inclui um banco de dados SQLite pré-populado com informações sobre magias, classes, origens, divindades, poderes, equipamentos, raças e condições do sistema Tormenta20. Todos os registros expõem referências de livro e página via o concern BookReferenceable.
Dependências do Sistema
A gem usa SQLite3 para armazenar os dados. O driver Ruby (sqlite3 gem) vem com binaries pré-compilados, mas em ambientes Linux (incluindo Docker) a biblioteca de runtime precisa estar presente:
# Debian/Ubuntu
apt-get install libsqlite3-0
# Alpine
apk add sqlite-libsNo Dockerfile da sua aplicação:
RUN apt-get install --no-install-recommends -y libsqlite3-0Installation
Adicione ao Gemfile da sua aplicação:
gem 'tormenta20'E execute:
bundle installOu instale diretamente:
gem install tormenta20Usage
A gem já vem com o banco de dados populado. Basta fazer require e usar:
require 'tormenta20'
# Magias
Tormenta20.magias.count # => 198
Tormenta20.magias.arcanas # Magias arcanas
Tormenta20.magias.divinas # Magias divinas
Tormenta20.magias.by_circle("3") # Magias do 3º círculo
Tormenta20.magias.by_school('evoc') # Magias de evocação
Tormenta20.magias.arcanas.by_circle("1") # Combinar filtros
# Classes
Tormenta20.classes.all
Tormenta20.classes.conjuradores # Classes com magia
# Raças
Tormenta20.racas.all
Tormenta20.racas.find('anao')
# Origens
Tormenta20.origens.all
Tormenta20.origens.find('soldado')
Tormenta20.origens.with_unique_power # Origens com poder único
# Divindades
Tormenta20.divindades.all
Tormenta20.divindades.energia_positiva # Deuses de energia positiva
Tormenta20.divindades.energia_negativa # Deuses de energia negativa
# Poderes
Tormenta20.poderes.all
Tormenta20.poderes.habilidades_unicas # Habilidades únicas de origem
Tormenta20.poderes.poderes_concedidos # Poderes concedidos por divindades
Tormenta20.poderes.poderes_tormenta # Poderes da Tormenta
# Condições
Tormenta20.condicoes.all
Tormenta20.condicoes.by_type('medo')
Tormenta20.condicoes.medo
Tormenta20.condicoes.mental
# Equipamentos
Tormenta20.armas.all
Tormenta20.armas.simples # Armas simples
Tormenta20.armas.marciais # Armas marciais
Tormenta20.armaduras.all
Tormenta20.armaduras.leves # Armaduras leves
Tormenta20.escudos.all
# Itens Superiores
Tormenta20.materiais_especiais.all
Tormenta20.melhorias.all
# Regras
Tormenta20.regras.all
# Índice Remissivo
Tormenta20.livros.all
Tormenta20.indice_remissivo.do_livro('t20_eja')
Tormenta20.indice_remissivo.para_tabela('classes')
Tormenta20.indice_remissivo.buscar_termo('Fúria')Query Interface
A gem oferece uma interface de consulta simplificada. Todos os métodos retornam modelos ActiveRecord, permitindo encadeamento de scopes e queries:
# Accessors disponíveis
Tormenta20.origens # => Tormenta20::Models::Origem
Tormenta20.poderes # => Tormenta20::Models::Poder
Tormenta20.divindades # => Tormenta20::Models::Divindade
Tormenta20.classes # => Tormenta20::Models::Classe
Tormenta20.magias # => Tormenta20::Models::Magia
Tormenta20.armas # => Tormenta20::Models::Arma
Tormenta20.armaduras # => Tormenta20::Models::Armadura
Tormenta20.escudos # => Tormenta20::Models::Escudo
Tormenta20.itens # => Tormenta20::Models::Item
Tormenta20.materiais_especiais # => Tormenta20::Models::MaterialEspecial
Tormenta20.melhorias # => Tormenta20::Models::Melhoria
Tormenta20.regras # => Tormenta20::Models::Regra
Tormenta20.racas # => Tormenta20::Models::Raca
Tormenta20.condicoes # => Tormenta20::Models::Condicao
Tormenta20.livros # => Tormenta20::Models::Livro
Tormenta20.indice_remissivo # => Tormenta20::Models::IndiceRemissivo
# Exemplos de queries ActiveRecord
Tormenta20.magias.where(type: 'arcana')
Tormenta20.magias.where(school: 'evoc').order(:name)
Tormenta20.poderes.where("name LIKE ?", "%Fúria%")Models Disponíveis
| Model | Descrição | Quantidade | Documentação |
|---|---|---|---|
Magia |
Magias arcanas, divinas e universais | 198 | docs/magias.md |
Classe |
Classes de personagem | 14 | docs/classes.md |
Origem |
Origens de personagem | 35 | docs/origens.md |
Divindade |
Deuses do Panteão | 20 | docs/divindades.md |
Poder |
Poderes (habilidades únicas, concedidos, tormenta, classe, raça) | 518 | docs/poderes.md |
Raca |
Raças jogáveis | 18 | docs/racas.md |
Condicao |
Condições de status | 35 | docs/condicoes.md |
Arma |
Armas | - | docs/armas.md |
Armadura |
Armaduras | - | docs/armaduras.md |
Escudo |
Escudos | 2 | docs/escudos.md |
Item |
Itens gerais | - | docs/itens.md |
MaterialEspecial |
Materiais especiais | 6 | docs/materiais_especiais.md |
Melhoria |
Melhorias mágicas | - | docs/melhorias.md |
Regra |
Regras e dados de referência | 14 | docs/regras.md |
Livro |
Livros indexados | 1 | docs/livros.md |
IndiceRemissivo |
Entradas do índice remissivo | 1098 | docs/indice_remissivo.md |
Referência de Livro e Página
Todos os modelos incluem o concern BookReferenceable. Se o registro estiver indexado no índice remissivo, os seguintes métodos ficam disponíveis:
guerreiro = Tormenta20.classes.find('guerreiro')
guerreiro.book_reference # => "T20 - EJA, p. 64"
guerreiro.page # => 64
guerreiro.book # => "T20 - EJA"
guerreiro.full_book # => "Tormenta 20 - Edição Jogo do Ano"
# Retorna nil se o registro não estiver no índice
item_sem_indice = Tormenta20.itens.first
item_sem_indice.book_reference # => nilO resultado é memoizado por instância — o banco é consultado apenas uma vez por objeto.
Os dados do índice remissivo são carregados de src/json/indice_remissivo/<livro_id>.json. Atualmente inclui o índice de Tormenta 20 - Edição Jogo do Ano (t20_eja) com mais de 1000 entradas.
Índice Remissivo
O model IndiceRemissivo permite buscar entradas por livro, tabela ou termo:
# Todas as entradas de um livro
Tormenta20.indice_remissivo.do_livro('t20_eja')
# Entradas vinculadas a uma tabela específica
Tormenta20.indice_remissivo.para_tabela('classes')
# Entradas vinculadas a registros concretos
Tormenta20.indice_remissivo.associados
# Entradas sem vínculo a registro
Tormenta20.indice_remissivo.nao_associados
# Busca por termo
Tormenta20.indice_remissivo.buscar_termo('Fúria')
# Consultar o livro de uma entrada
entrada = Tormenta20.indice_remissivo.first
entrada.livro.nome # => "Tormenta 20 - Edição Jogo do Ano"
entrada.livro.nome_curto # => "T20 - EJA"Exemplos
# Buscar uma magia específica
bola_de_fogo = Tormenta20.magias.find('bola_de_fogo')
puts bola_de_fogo.name # => "Bola de Fogo"
puts bola_de_fogo.circle # => "3"
puts bola_de_fogo.school # => "evoc"
puts bola_de_fogo.book_reference # => "T20 - EJA, p. ..."
# Listar poderes de uma divindade
khalmyr = Tormenta20.divindades.find('khalmyr')
puts khalmyr.name # => "Khalmyr"
puts khalmyr.granted_powers # => ["coragem_total", "espada_justiceira", ...]
puts khalmyr.book_reference # => "T20 - EJA, p. 99"
# Classe com informações de magia e referência de livro
mago = Tormenta20.classes.find('arcanista')
puts mago.initial_hp # PV inicial
puts mago.mp_per_level # PM por nível
puts mago.conjurador? # => true
puts mago.book_reference # => "T20 - EJA, p. 36"
# Raça com bônus de atributo
anao = Tormenta20.racas.find('anao')
puts anao.attribute_bonus_for('constituicao') # => 2
puts anao.visao_no_escuro? # => true
puts anao.book_reference # => "T20 - EJA, p. 20"
# Filtrar magias arcanas do 1º círculo da escola de evocação
Tormenta20.magias.arcanas.by_circle("1").by_school("evoc").each do |magia|
puts "#{magia.name} - #{magia.book_reference}"
end
# Condições de medo
Tormenta20.condicoes.medo.each do |c|
puts "#{c.name}: #{c.escalates_to ? "escala para #{c.escalates_to}" : 'não escala'}"
endDevelopment
Pré-requisitos
- Ruby >= 3.0.0
- Bundler
Setup
git clone https://github.com/LuanGB/tormenta20.git
cd tormenta20
bundle installConstruir o Banco de Dados
O banco de dados SQLite é construído a partir dos arquivos JSON em src/json/:
# Construir apenas o banco
rake build_db
# Build completo da gem (inclui build_db automaticamente)
rake buildEstrutura do Projeto
tormenta20/
├── src/
│ ├── json/ # Dados em formato JSON
│ │ ├── magias/
│ │ ├── classes/
│ │ ├── origens/
│ │ ├── deuses/
│ │ ├── poderes/
│ │ │ ├── habilidades_unicas_de_origem/
│ │ │ ├── poderes_concedidos/
│ │ │ └── poderes_da_tormenta/
│ │ ├── equipamentos/
│ │ ├── itens_superiores/
│ │ ├── regras/
│ │ ├── condicoes/
│ │ ├── racas/
│ │ ├── livros/
│ │ └── indice_remissivo/ # Índice por livro (ex: t20_eja.json)
│ └── ruby/ # Código Ruby
│ └── tormenta20/
│ ├── models/ # ActiveRecord models
│ ├── concerns/ # Mixins (BookReferenceable)
│ ├── database.rb # Conexão com banco
│ └── seeder.rb # Import de dados
├── db/
│ ├── schema.sql # Schema SQLite
│ ├── seeds.rb # Script de seed (desenvolvimento)
│ └── tormenta20.sqlite3 # Banco pré-construído (gerado)
└── bin/
└── build_db # Script de build do banco
Testes
rake specLinting
rake rubocopContributing
Bug reports e pull requests são bem-vindos em https://github.com/LuanGB/tormenta20.
License
Disponível como open source sob os termos da MIT License.
Aviso Legal
Tormenta20 é uma marca registrada da Jambô Editora. Esta biblioteca é um projeto de fã não oficial e não é afiliada, endossada ou patrocinada pela Jambô Editora.