tormenta20 0.2.11 → 0.2.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.ruby-version +1 -0
  3. data/README.md +146 -40
  4. data/db/schema.sql +44 -0
  5. data/db/tormenta20.sqlite3 +0 -0
  6. data/docs/armaduras.md +13 -13
  7. data/docs/armas.md +14 -14
  8. data/docs/condicoes.md +77 -0
  9. data/docs/divindades.md +14 -14
  10. data/docs/escudos.md +12 -12
  11. data/docs/indice_remissivo.md +105 -0
  12. data/docs/itens.md +9 -9
  13. data/docs/livros.md +43 -0
  14. data/docs/magias.md +41 -41
  15. data/docs/materiais_especiais.md +11 -11
  16. data/docs/melhorias.md +12 -12
  17. data/docs/poderes.md +12 -12
  18. data/docs/racas.md +68 -0
  19. data/docs/regras.md +7 -7
  20. data/exe/tormenta20 +3 -3
  21. data/src/json/indice_remissivo/t20_eja.json +1100 -0
  22. data/src/json/livros/t20_eja.json +5 -0
  23. data/src/json/poderes/poderes_gerais/poderes_de_combate/arremesso_multiplo.json +27 -0
  24. data/src/json/poderes/poderes_gerais/poderes_de_combate/ataque_com_escudo.json +21 -0
  25. data/src/json/poderes/poderes_gerais/poderes_de_combate/estilo_de_arma_longa.json +28 -0
  26. data/src/json/poderes/poderes_gerais/poderes_de_combate/estilo_de_uma_arma.json +2 -2
  27. data/src/json/poderes/poderes_gerais/poderes_de_combate/piqueiro.json +21 -0
  28. data/src/json/poderes/poderes_gerais/poderes_de_destino/ao_sabor_do_destino.json +2 -2
  29. data/src/json/poderes/poderes_gerais/poderes_de_destino/costas_largas.json +28 -0
  30. data/src/json/poderes/poderes_gerais/poderes_de_destino/inventario_organizado.json +22 -0
  31. data/src/ruby/tormenta20/concerns/book_referenceable.rb +52 -0
  32. data/src/ruby/tormenta20/database.rb +1 -0
  33. data/src/ruby/tormenta20/models/base.rb +2 -0
  34. data/src/ruby/tormenta20/models/indice_remissivo.rb +57 -0
  35. data/src/ruby/tormenta20/models/livro.rb +29 -0
  36. data/src/ruby/tormenta20/models/raca.rb +1 -0
  37. data/src/ruby/tormenta20/seeder.rb +0 -1
  38. data/src/ruby/tormenta20/version.rb +1 -1
  39. data/src/ruby/tormenta20.rb +17 -0
  40. metadata +22 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 61061e8d442fe601acf2fab0aa5abbde0bb581c3cd392a823a5f098fbe389042
4
- data.tar.gz: c48702b21f4c252cd259a5d16b8412655a9118c77d37eb6fef4a6103e094051d
3
+ metadata.gz: 8156d99b6e735535deff6f5f46c6b0b1e97372ddcb52002076ff31961fd7bad4
4
+ data.tar.gz: 75e84861f7ddeb6a7e71a7a75b4069a899f8deb5c47a8eb646eb7818cd57f24c
5
5
  SHA512:
6
- metadata.gz: 7555285167b243450af2fca516b0453a763ebecccf5937f9336817212c33f638a0392feb9ac1adebb679b7f737d05e0b80f62b88c9c71593edeae49b05d1e011
7
- data.tar.gz: b74fb54b7ae483dc574a6cab2845da668d9ddc2c5aed345dcb5379ce1069999c2c289a91f390c1cfdbf5c4da63317bb92d480aca6126266cec1a4fac4eed89d2
6
+ metadata.gz: 2862f845544e61bd23b4481eea952026cf402103894108e223f43256bbabdc840fb1c8b71078f0bd286bbcbdf471500272b04963f0ce96fd1b4eb50769fff8ab
7
+ data.tar.gz: 00b38aca5faa66b2ed4a53a0d941df44f888a18f2e8fd8bf5d3ef41d716331c1df33e81a4748b3feddb6c23a6dafb5ee85061d6cab74e1a071b4dac99ebef75c
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 3.3.6
data/README.md CHANGED
@@ -1,12 +1,35 @@
1
1
  # Tormenta20
2
2
 
3
+ [![Gem Version](https://img.shields.io/gem/v/tormenta20)](https://rubygems.org/gems/tormenta20)
4
+ [![CI](https://github.com/LuanGB/tormenta20/actions/workflows/main.yml/badge.svg)](https://github.com/LuanGB/tormenta20/actions/workflows/main.yml)
5
+ [![Coverage](https://codecov.io/gh/YggdrasilGeekNetwork/tormenta20/graph/badge.svg?token=XB8BTBS6PJ)](https://codecov.io/gh/YggdrasilGeekNetwork/tormenta20)
6
+ [![License](https://img.shields.io/github/license/LuanGB/tormenta20)](LICENSE.txt)
7
+
3
8
  Uma biblioteca Ruby com dados do RPG de mesa brasileiro Tormenta20.
4
9
 
5
- A gem inclui um banco de dados SQLite pré-populado com informações sobre magias, classes, origens, divindades, poderes e equipamentos do sistema Tormenta20.
10
+ 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`.
11
+
12
+ ## Dependências do Sistema
13
+
14
+ 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:
15
+
16
+ ```bash
17
+ # Debian/Ubuntu
18
+ apt-get install libsqlite3-0
19
+
20
+ # Alpine
21
+ apk add sqlite-libs
22
+ ```
23
+
24
+ No Dockerfile da sua aplicação:
25
+
26
+ ```dockerfile
27
+ RUN apt-get install --no-install-recommends -y libsqlite3-0
28
+ ```
6
29
 
7
30
  ## Installation
8
31
 
9
- Adicione ao Gemfile da sua aplicacao:
32
+ Adicione ao Gemfile da sua aplicação:
10
33
 
11
34
  ```ruby
12
35
  gem 'tormenta20'
@@ -26,7 +49,7 @@ gem install tormenta20
26
49
 
27
50
  ## Usage
28
51
 
29
- A gem ja vem com o banco de dados populado. Basta fazer require e usar:
52
+ A gem vem com o banco de dados populado. Basta fazer require e usar:
30
53
 
31
54
  ```ruby
32
55
  require 'tormenta20'
@@ -35,18 +58,22 @@ require 'tormenta20'
35
58
  Tormenta20.magias.count # => 198
36
59
  Tormenta20.magias.arcanas # Magias arcanas
37
60
  Tormenta20.magias.divinas # Magias divinas
38
- Tormenta20.magias.by_circle("3") # Magias do 3o circulo
39
- Tormenta20.magias.by_school('evoc') # Magias de evocacao
61
+ Tormenta20.magias.by_circle("3") # Magias do círculo
62
+ Tormenta20.magias.by_school('evoc') # Magias de evocação
40
63
  Tormenta20.magias.arcanas.by_circle("1") # Combinar filtros
41
64
 
42
65
  # Classes
43
66
  Tormenta20.classes.all
44
67
  Tormenta20.classes.conjuradores # Classes com magia
45
68
 
69
+ # Raças
70
+ Tormenta20.racas.all
71
+ Tormenta20.racas.find('anao')
72
+
46
73
  # Origens
47
74
  Tormenta20.origens.all
48
75
  Tormenta20.origens.find('soldado')
49
- Tormenta20.origens.with_unique_power # Origens com poder unico
76
+ Tormenta20.origens.with_unique_power # Origens com poder único
50
77
 
51
78
  # Divindades
52
79
  Tormenta20.divindades.all
@@ -55,10 +82,16 @@ Tormenta20.divindades.energia_negativa # Deuses de energia negativa
55
82
 
56
83
  # Poderes
57
84
  Tormenta20.poderes.all
58
- Tormenta20.poderes.habilidades_unicas # Habilidades unicas de origem
85
+ Tormenta20.poderes.habilidades_unicas # Habilidades únicas de origem
59
86
  Tormenta20.poderes.poderes_concedidos # Poderes concedidos por divindades
60
87
  Tormenta20.poderes.poderes_tormenta # Poderes da Tormenta
61
88
 
89
+ # Condições
90
+ Tormenta20.condicoes.all
91
+ Tormenta20.condicoes.by_type('medo')
92
+ Tormenta20.condicoes.medo
93
+ Tormenta20.condicoes.mental
94
+
62
95
  # Equipamentos
63
96
  Tormenta20.armas.all
64
97
  Tormenta20.armas.simples # Armas simples
@@ -69,17 +102,24 @@ Tormenta20.escudos.all
69
102
 
70
103
  # Itens Superiores
71
104
  Tormenta20.materiais_especiais.all
105
+ Tormenta20.melhorias.all
72
106
 
73
107
  # Regras
74
108
  Tormenta20.regras.all
109
+
110
+ # Índice Remissivo
111
+ Tormenta20.livros.all
112
+ Tormenta20.indice_remissivo.do_livro('t20_eja')
113
+ Tormenta20.indice_remissivo.para_tabela('classes')
114
+ Tormenta20.indice_remissivo.buscar_termo('Fúria')
75
115
  ```
76
116
 
77
117
  ### Query Interface
78
118
 
79
- A gem oferece uma interface de consulta simplificada. Todos os metodos retornam modelos ActiveRecord, permitindo encadeamento de scopes e queries:
119
+ A gem oferece uma interface de consulta simplificada. Todos os métodos retornam modelos ActiveRecord, permitindo encadeamento de scopes e queries:
80
120
 
81
121
  ```ruby
82
- # Accessors disponiveis
122
+ # Accessors disponíveis
83
123
  Tormenta20.origens # => Tormenta20::Models::Origem
84
124
  Tormenta20.poderes # => Tormenta20::Models::Poder
85
125
  Tormenta20.divindades # => Tormenta20::Models::Divindade
@@ -92,67 +132,128 @@ Tormenta20.itens # => Tormenta20::Models::Item
92
132
  Tormenta20.materiais_especiais # => Tormenta20::Models::MaterialEspecial
93
133
  Tormenta20.melhorias # => Tormenta20::Models::Melhoria
94
134
  Tormenta20.regras # => Tormenta20::Models::Regra
135
+ Tormenta20.racas # => Tormenta20::Models::Raca
136
+ Tormenta20.condicoes # => Tormenta20::Models::Condicao
137
+ Tormenta20.livros # => Tormenta20::Models::Livro
138
+ Tormenta20.indice_remissivo # => Tormenta20::Models::IndiceRemissivo
95
139
 
96
140
  # Exemplos de queries ActiveRecord
97
141
  Tormenta20.magias.where(type: 'arcana')
98
142
  Tormenta20.magias.where(school: 'evoc').order(:name)
99
- Tormenta20.poderes.where("name LIKE ?", "%Furia%")
143
+ Tormenta20.poderes.where("name LIKE ?", "%Fúria%")
100
144
  ```
101
145
 
102
- ### Models Disponiveis
146
+ ### Models Disponíveis
103
147
 
104
- | Model | Descricao | Quantidade | Documentacao |
148
+ | Model | Descrição | Quantidade | Documentação |
105
149
  |-------|-----------|------------|--------------|
106
150
  | `Magia` | Magias arcanas, divinas e universais | 198 | [docs/magias.md](docs/magias.md) |
107
151
  | `Classe` | Classes de personagem | 14 | [docs/classes.md](docs/classes.md) |
108
152
  | `Origem` | Origens de personagem | 35 | [docs/origens.md](docs/origens.md) |
109
- | `Divindade` | Deuses do Panteao | 20 | [docs/divindades.md](docs/divindades.md) |
110
- | `Poder` | Poderes (habilidades unicas, concedidos, tormenta) | 129 | [docs/poderes.md](docs/poderes.md) |
153
+ | `Divindade` | Deuses do Panteão | 20 | [docs/divindades.md](docs/divindades.md) |
154
+ | `Poder` | Poderes (habilidades únicas, concedidos, tormenta, classe, raça) | 518 | [docs/poderes.md](docs/poderes.md) |
155
+ | `Raca` | Raças jogáveis | 18 | [docs/racas.md](docs/racas.md) |
156
+ | `Condicao` | Condições de status | 35 | [docs/condicoes.md](docs/condicoes.md) |
111
157
  | `Arma` | Armas | - | [docs/armas.md](docs/armas.md) |
112
158
  | `Armadura` | Armaduras | - | [docs/armaduras.md](docs/armaduras.md) |
113
159
  | `Escudo` | Escudos | 2 | [docs/escudos.md](docs/escudos.md) |
114
160
  | `Item` | Itens gerais | - | [docs/itens.md](docs/itens.md) |
115
161
  | `MaterialEspecial` | Materiais especiais | 6 | [docs/materiais_especiais.md](docs/materiais_especiais.md) |
116
- | `Melhoria` | Melhorias magicas | - | [docs/melhorias.md](docs/melhorias.md) |
117
- | `Regra` | Regras e dados de referencia | 14 | [docs/regras.md](docs/regras.md) |
162
+ | `Melhoria` | Melhorias mágicas | - | [docs/melhorias.md](docs/melhorias.md) |
163
+ | `Regra` | Regras e dados de referência | 14 | [docs/regras.md](docs/regras.md) |
164
+ | `Livro` | Livros indexados | 1 | [docs/livros.md](docs/livros.md) |
165
+ | `IndiceRemissivo` | Entradas do índice remissivo | 1098 | [docs/indice_remissivo.md](docs/indice_remissivo.md) |
166
+
167
+ ### Referência de Livro e Página
168
+
169
+ Todos os modelos incluem o concern `BookReferenceable`. Se o registro estiver indexado no índice remissivo, os seguintes métodos ficam disponíveis:
170
+
171
+ ```ruby
172
+ guerreiro = Tormenta20.classes.find('guerreiro')
173
+
174
+ guerreiro.book_reference # => "T20 - EJA, p. 64"
175
+ guerreiro.page # => 64
176
+ guerreiro.book # => "T20 - EJA"
177
+ guerreiro.full_book # => "Tormenta 20 - Edição Jogo do Ano"
118
178
 
119
- > Cada link de documentacao contem a lista completa de atributos, scopes, metodos e exemplos de uso.
179
+ # Retorna nil se o registro não estiver no índice
180
+ item_sem_indice = Tormenta20.itens.first
181
+ item_sem_indice.book_reference # => nil
182
+ ```
183
+
184
+ O resultado é memoizado por instância — o banco é consultado apenas uma vez por objeto.
185
+
186
+ 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.
187
+
188
+ ### Índice Remissivo
189
+
190
+ O model `IndiceRemissivo` permite buscar entradas por livro, tabela ou termo:
191
+
192
+ ```ruby
193
+ # Todas as entradas de um livro
194
+ Tormenta20.indice_remissivo.do_livro('t20_eja')
195
+
196
+ # Entradas vinculadas a uma tabela específica
197
+ Tormenta20.indice_remissivo.para_tabela('classes')
198
+
199
+ # Entradas vinculadas a registros concretos
200
+ Tormenta20.indice_remissivo.associados
201
+
202
+ # Entradas sem vínculo a registro
203
+ Tormenta20.indice_remissivo.nao_associados
204
+
205
+ # Busca por termo
206
+ Tormenta20.indice_remissivo.buscar_termo('Fúria')
207
+
208
+ # Consultar o livro de uma entrada
209
+ entrada = Tormenta20.indice_remissivo.first
210
+ entrada.livro.nome # => "Tormenta 20 - Edição Jogo do Ano"
211
+ entrada.livro.nome_curto # => "T20 - EJA"
212
+ ```
120
213
 
121
214
  ### Exemplos
122
215
 
123
216
  ```ruby
124
- # Buscar uma magia especifica
217
+ # Buscar uma magia específica
125
218
  bola_de_fogo = Tormenta20.magias.find('bola_de_fogo')
126
- puts bola_de_fogo.name # => "Bola de Fogo"
127
- puts bola_de_fogo.circle # => "3"
128
- puts bola_de_fogo.school # => "evoc"
129
- puts bola_de_fogo.description
219
+ puts bola_de_fogo.name # => "Bola de Fogo"
220
+ puts bola_de_fogo.circle # => "3"
221
+ puts bola_de_fogo.school # => "evoc"
222
+ puts bola_de_fogo.book_reference # => "T20 - EJA, p. ..."
130
223
 
131
224
  # Listar poderes de uma divindade
132
225
  khalmyr = Tormenta20.divindades.find('khalmyr')
133
226
  puts khalmyr.name # => "Khalmyr"
134
227
  puts khalmyr.granted_powers # => ["coragem_total", "espada_justiceira", ...]
228
+ puts khalmyr.book_reference # => "T20 - EJA, p. 99"
135
229
 
136
- # Buscar poderes concedidos
137
- Tormenta20.poderes.poderes_concedidos.each do |poder|
138
- puts "#{poder.name}: #{poder.deities.join(', ')}"
139
- end
140
-
141
- # Classe com informacoes de magia
230
+ # Classe com informações de magia e referência de livro
142
231
  mago = Tormenta20.classes.find('arcanista')
143
232
  puts mago.initial_hp # PV inicial
144
- puts mago.mp_per_level # PM por nivel
233
+ puts mago.mp_per_level # PM por nível
145
234
  puts mago.conjurador? # => true
235
+ puts mago.book_reference # => "T20 - EJA, p. 36"
236
+
237
+ # Raça com bônus de atributo
238
+ anao = Tormenta20.racas.find('anao')
239
+ puts anao.attribute_bonus_for('constituicao') # => 2
240
+ puts anao.visao_no_escuro? # => true
241
+ puts anao.book_reference # => "T20 - EJA, p. 20"
146
242
 
147
- # Filtrar magias arcanas do 1o circulo da escola de evocacao
243
+ # Filtrar magias arcanas do círculo da escola de evocação
148
244
  Tormenta20.magias.arcanas.by_circle("1").by_school("evoc").each do |magia|
149
- puts "#{magia.name} - #{magia.description}"
245
+ puts "#{magia.name} - #{magia.book_reference}"
246
+ end
247
+
248
+ # Condições de medo
249
+ Tormenta20.condicoes.medo.each do |c|
250
+ puts "#{c.name}: #{c.escalates_to ? "escala para #{c.escalates_to}" : 'não escala'}"
150
251
  end
151
252
  ```
152
253
 
153
254
  ## Development
154
255
 
155
- ### Pre-requisitos
256
+ ### Pré-requisitos
156
257
 
157
258
  - Ruby >= 3.0.0
158
259
  - Bundler
@@ -167,7 +268,7 @@ bundle install
167
268
 
168
269
  ### Construir o Banco de Dados
169
270
 
170
- O banco de dados SQLite e construido a partir dos arquivos JSON em `src/json/`:
271
+ O banco de dados SQLite é construído a partir dos arquivos JSON em `src/json/`:
171
272
 
172
273
  ```bash
173
274
  # Construir apenas o banco
@@ -193,16 +294,21 @@ tormenta20/
193
294
  │ │ │ └── poderes_da_tormenta/
194
295
  │ │ ├── equipamentos/
195
296
  │ │ ├── itens_superiores/
196
- │ │ └── regras/
197
- └── ruby/ # Codigo Ruby
297
+ │ │ ├── regras/
298
+ │ ├── condicoes/
299
+ │ │ ├── racas/
300
+ │ │ ├── livros/
301
+ │ │ └── indice_remissivo/ # Índice por livro (ex: t20_eja.json)
302
+ │ └── ruby/ # Código Ruby
198
303
  │ └── tormenta20/
199
304
  │ ├── models/ # ActiveRecord models
200
- │ ├── database.rb # Conexao com banco
305
+ │ ├── concerns/ # Mixins (BookReferenceable)
306
+ │ ├── database.rb # Conexão com banco
201
307
  │ └── seeder.rb # Import de dados
202
308
  ├── db/
203
309
  │ ├── schema.sql # Schema SQLite
204
310
  │ ├── seeds.rb # Script de seed (desenvolvimento)
205
- │ └── tormenta20.sqlite3 # Banco pre-construido (gerado)
311
+ │ └── tormenta20.sqlite3 # Banco pré-construído (gerado)
206
312
  └── bin/
207
313
  └── build_db # Script de build do banco
208
314
  ```
@@ -221,12 +327,12 @@ rake rubocop
221
327
 
222
328
  ## Contributing
223
329
 
224
- Bug reports e pull requests sao bem-vindos em https://github.com/LuanGB/tormenta20.
330
+ Bug reports e pull requests são bem-vindos em https://github.com/LuanGB/tormenta20.
225
331
 
226
332
  ## License
227
333
 
228
- Disponivel como open source sob os termos da [MIT License](https://opensource.org/licenses/MIT).
334
+ Disponível como open source sob os termos da [MIT License](https://opensource.org/licenses/MIT).
229
335
 
230
336
  ## Aviso Legal
231
337
 
232
- Tormenta20 e uma marca registrada da Jambo Editora. Esta biblioteca e um projeto de fa nao oficial e nao e afiliada, endossada ou patrocinada pela Jambo Editora.
338
+ Tormenta20 é uma marca registrada da Jambô Editora. Esta biblioteca é um projeto de não oficial e não é afiliada, endossada ou patrocinada pela Jambô Editora.
data/db/schema.sql CHANGED
@@ -399,6 +399,50 @@ BEGIN
399
399
  UPDATE condicoes SET updated_at = CURRENT_TIMESTAMP WHERE id = NEW.id;
400
400
  END;
401
401
 
402
+ -- -----------------------------------------------------------------------------
403
+ -- LIVROS (Books) — fonte bibliográfica dos dados
404
+ -- -----------------------------------------------------------------------------
405
+ CREATE TABLE IF NOT EXISTS livros (
406
+ id TEXT PRIMARY KEY, -- slug do livro, ex: "t20_eja"
407
+ nome TEXT NOT NULL, -- nome completo
408
+ nome_curto TEXT NOT NULL, -- abreviação exibida, ex: "T20 - EJA"
409
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
410
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
411
+ );
412
+
413
+ CREATE TRIGGER IF NOT EXISTS update_livros_timestamp
414
+ AFTER UPDATE ON livros
415
+ BEGIN
416
+ UPDATE livros SET updated_at = CURRENT_TIMESTAMP WHERE id = NEW.id;
417
+ END;
418
+
419
+ -- -----------------------------------------------------------------------------
420
+ -- INDICE_REMISSIVO — entradas do índice remissivo dos livros
421
+ -- Cada linha é um termo do índice associado a uma página.
422
+ -- Os campos `tabela` e `registro_id` são preenchidos quando o termo é
423
+ -- associado a um registro de outra tabela (ex: classes, poderes, magias…).
424
+ -- -----------------------------------------------------------------------------
425
+ CREATE TABLE IF NOT EXISTS indice_remissivo (
426
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
427
+ livro_id TEXT NOT NULL REFERENCES livros(id),
428
+ termo TEXT NOT NULL, -- termo exatamente como aparece no índice
429
+ pagina INTEGER NOT NULL, -- número da página
430
+ tabela TEXT, -- tabela associada (ex: "classes", "poderes")
431
+ registro_id TEXT, -- id do registro associado (ex: "guerreiro")
432
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
433
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
434
+ );
435
+
436
+ CREATE INDEX IF NOT EXISTS idx_indice_termo ON indice_remissivo(termo);
437
+ CREATE INDEX IF NOT EXISTS idx_indice_livro ON indice_remissivo(livro_id);
438
+ CREATE INDEX IF NOT EXISTS idx_indice_registro ON indice_remissivo(tabela, registro_id);
439
+
440
+ CREATE TRIGGER IF NOT EXISTS update_indice_remissivo_timestamp
441
+ AFTER UPDATE ON indice_remissivo
442
+ BEGIN
443
+ UPDATE indice_remissivo SET updated_at = CURRENT_TIMESTAMP WHERE id = NEW.id;
444
+ END;
445
+
402
446
  -- =============================================================================
403
447
  -- VIEWS ÚTEIS
404
448
  -- =============================================================================
Binary file
data/docs/armaduras.md CHANGED
@@ -4,17 +4,17 @@ Acesso: `Tormenta20.armaduras`
4
4
 
5
5
  ## Atributos
6
6
 
7
- | Atributo | Tipo | Descricao |
7
+ | Atributo | Tipo | Descrição |
8
8
  |----------|------|-----------|
9
- | `id` | String | Identificador unico |
9
+ | `id` | String | Identificador único |
10
10
  | `name` | String | Nome da armadura |
11
11
  | `category` | String | Categoria: `leve`, `pesada` |
12
- | `price` | String | Preco |
13
- | `defense_bonus` | Integer | Bonus de defesa |
12
+ | `price` | String | Preço |
13
+ | `defense_bonus` | Integer | Bônus de defesa |
14
14
  | `armor_penalty` | Integer | Penalidade de armadura |
15
- | `weight` | String | Peso/espacos |
15
+ | `weight` | String | Peso/espaços |
16
16
  | `properties` | Array | Propriedades especiais |
17
- | `description` | String | Descricao |
17
+ | `description` | String | Descrição |
18
18
 
19
19
  ## Scopes (Filtros)
20
20
 
@@ -26,15 +26,15 @@ Tormenta20.armaduras.pesadas # Armaduras pesadas
26
26
  Tormenta20.armaduras.by_category("leve")
27
27
  ```
28
28
 
29
- ## Metodos de Instancia
29
+ ## Métodos de Instância
30
30
 
31
31
  ```ruby
32
32
  armadura = Tormenta20.armaduras.find("couro")
33
33
 
34
- armadura.leve? # Verifica se e armadura leve
34
+ armadura.leve? # Verifica se é armadura leve
35
35
  # => true
36
36
 
37
- armadura.pesada? # Verifica se e armadura pesada
37
+ armadura.pesada? # Verifica se é armadura pesada
38
38
  # => false
39
39
 
40
40
  armadura.to_h # Converte para Hash completo
@@ -53,18 +53,18 @@ Tormenta20.armaduras.leves.each do |a|
53
53
  puts "#{a.name} - #{a.price}"
54
54
  end
55
55
 
56
- # Armaduras pesadas ordenadas por bonus de defesa
56
+ # Armaduras pesadas ordenadas por bônus de defesa
57
57
  Tormenta20.armaduras.pesadas.order(defense_bonus: :desc).each do |a|
58
58
  puts "#{a.name}: +#{a.defense_bonus}"
59
59
  end
60
60
 
61
- # Buscar armadura especifica
61
+ # Buscar armadura específica
62
62
  brunea = Tormenta20.armaduras.find("brunea")
63
63
  puts brunea.name # => "Brunea"
64
- puts brunea.defense_bonus # Bonus de defesa
64
+ puts brunea.defense_bonus # Bônus de defesa
65
65
  puts brunea.armor_penalty # Penalidade
66
66
 
67
- # Armadura com maior bonus de defesa
67
+ # Armadura com maior bônus de defesa
68
68
  Tormenta20.armaduras.order(defense_bonus: :desc).first
69
69
 
70
70
  # Armaduras sem penalidade
data/docs/armas.md CHANGED
@@ -4,19 +4,19 @@ Acesso: `Tormenta20.armas`
4
4
 
5
5
  ## Atributos
6
6
 
7
- | Atributo | Tipo | Descricao |
7
+ | Atributo | Tipo | Descrição |
8
8
  |----------|------|-----------|
9
- | `id` | String | Identificador unico |
9
+ | `id` | String | Identificador único |
10
10
  | `name` | String | Nome da arma |
11
11
  | `category` | String | Categoria: `simples`, `marciais`, `exoticas`, `fogo` |
12
- | `price` | String | Preco |
12
+ | `price` | String | Preço |
13
13
  | `damage` | String | Dano (ex: "1d8") |
14
- | `damage_type` | String | Tipo de dano (corte, perfuracao, etc) |
15
- | `critical` | String | Critico (ex: "19/x2") |
16
- | `range` | String | Alcance (para armas de distancia) |
17
- | `weight` | String | Peso/espacos |
14
+ | `damage_type` | String | Tipo de dano (corte, perfuração, etc) |
15
+ | `critical` | String | Crítico (ex: "19/x2") |
16
+ | `range` | String | Alcance (para armas de distância) |
17
+ | `weight` | String | Peso/espaços |
18
18
  | `properties` | Array | Propriedades especiais |
19
- | `description` | String | Descricao |
19
+ | `description` | String | Descrição |
20
20
 
21
21
  ## Scopes (Filtros)
22
22
 
@@ -25,7 +25,7 @@ Acesso: `Tormenta20.armas`
25
25
  ```ruby
26
26
  Tormenta20.armas.simples # Armas simples
27
27
  Tormenta20.armas.marciais # Armas marciais
28
- Tormenta20.armas.exoticas # Armas exoticas
28
+ Tormenta20.armas.exoticas # Armas exóticas
29
29
  Tormenta20.armas.fogo # Armas de fogo
30
30
  Tormenta20.armas.by_category("simples")
31
31
  ```
@@ -41,16 +41,16 @@ Tormenta20.armas.by_damage_type("impacto")
41
41
  ### Por Alcance
42
42
 
43
43
  ```ruby
44
- Tormenta20.armas.ranged # Armas de distancia (com alcance)
44
+ Tormenta20.armas.ranged # Armas de distância (com alcance)
45
45
  Tormenta20.armas.melee # Armas corpo a corpo (sem alcance)
46
46
  ```
47
47
 
48
- ## Metodos de Instancia
48
+ ## Métodos de Instância
49
49
 
50
50
  ```ruby
51
51
  arma = Tormenta20.armas.find("espada_longa")
52
52
 
53
- arma.ranged? # Verifica se e arma de distancia
53
+ arma.ranged? # Verifica se é arma de distância
54
54
  # => false
55
55
 
56
56
  arma.to_h # Converte para Hash completo
@@ -69,7 +69,7 @@ Tormenta20.armas.simples.each do |a|
69
69
  puts "#{a.name} - #{a.price}"
70
70
  end
71
71
 
72
- # Armas de distancia
72
+ # Armas de distância
73
73
  Tormenta20.armas.ranged.each do |a|
74
74
  puts "#{a.name}: alcance #{a.range}"
75
75
  end
@@ -79,7 +79,7 @@ Tormenta20.armas.by_damage_type("corte").each do |a|
79
79
  puts "#{a.name}: #{a.damage}"
80
80
  end
81
81
 
82
- # Buscar arma especifica
82
+ # Buscar arma específica
83
83
  espada = Tormenta20.armas.find("espada_longa")
84
84
  puts espada.name # => "Espada Longa"
85
85
  puts espada.damage # => "1d8"
data/docs/condicoes.md ADDED
@@ -0,0 +1,77 @@
1
+ # Condições
2
+
3
+ Acesso: `Tormenta20.condicoes`
4
+
5
+ ## Atributos
6
+
7
+ | Atributo | Tipo | Descrição |
8
+ |----------|------|-----------|
9
+ | `id` | String | Identificador único (ex: `"abalado"`) |
10
+ | `name` | String | Nome da condição |
11
+ | `description` | String | Descrição completa da condição |
12
+ | `effects` | Array | Lista de efeitos mecânicos |
13
+ | `condition_type` | String / nil | Categoria da condição (ver abaixo) |
14
+ | `escalates_to` | String / nil | ID da condição para a qual esta escala ao ser reaplicada |
15
+
16
+ ### Tipos de Condição (`condition_type`)
17
+
18
+ | Tipo | Descrição |
19
+ |------|-----------|
20
+ | `medo` | Condições de medo (abalado, apavorado) |
21
+ | `mental` | Condições mentais (fascinado, confuso) |
22
+ | `metabolismo` | Condições metabólicas (envenenado, doente) |
23
+ | `movimento` | Condições de movimento (lento, imóvel, paralisado) |
24
+ | `veneno` | Condições de veneno |
25
+ | `sentidos` | Condições de sentido (cego, surdo) |
26
+ | `cansaco` | Condições de fadiga (fatigado, exausto) |
27
+ | `metamorfose` | Condições de metamorfose (petrificado) |
28
+
29
+ ## Scopes (Filtros)
30
+
31
+ ```ruby
32
+ Tormenta20.condicoes.by_type("medo") # Filtro genérico por tipo
33
+ Tormenta20.condicoes.medo # Condições de medo
34
+ Tormenta20.condicoes.mental # Condições mentais
35
+ Tormenta20.condicoes.metabolismo # Condições metabólicas
36
+ Tormenta20.condicoes.movimento # Condições de movimento
37
+ ```
38
+
39
+ ## Métodos de Instância
40
+
41
+ ```ruby
42
+ condicao = Tormenta20.condicoes.find("abalado")
43
+
44
+ condicao.name # => "Abalado"
45
+ condicao.description # Texto completo
46
+ condicao.effects # => ["...", "..."]
47
+ condicao.condition_type # => "medo"
48
+ condicao.escalates_to # => "apavorado" (ou nil)
49
+
50
+ condicao.to_h # Hash completo
51
+ ```
52
+
53
+ ## Exemplos
54
+
55
+ ```ruby
56
+ # Listar todas as condições
57
+ Tormenta20.condicoes.all.each do |c|
58
+ puts c.name
59
+ end
60
+
61
+ # Condições que escalam para outra
62
+ Tormenta20.condicoes.select { |c| c.escalates_to.present? }.each do |c|
63
+ puts "#{c.name} → #{c.escalates_to}"
64
+ end
65
+
66
+ # Condições de medo em ordem de gravidade
67
+ Tormenta20.condicoes.medo.each do |c|
68
+ puts "#{c.name}: #{c.effects.first}"
69
+ end
70
+
71
+ # Efeitos de uma condição específica
72
+ paralisado = Tormenta20.condicoes.find("paralisado")
73
+ paralisado.effects.each { |e| puts "- #{e}" }
74
+
75
+ # Referência de livro
76
+ Tormenta20.condicoes.find("abalado").book_reference # => "T20 - EJA, p. 394"
77
+ ```
data/docs/divindades.md CHANGED
@@ -4,19 +4,19 @@ Acesso: `Tormenta20.divindades`
4
4
 
5
5
  ## Atributos
6
6
 
7
- | Atributo | Tipo | Descricao |
7
+ | Atributo | Tipo | Descrição |
8
8
  |----------|------|-----------|
9
- | `id` | String | Identificador unico |
9
+ | `id` | String | Identificador único |
10
10
  | `name` | String | Nome da divindade |
11
- | `title` | String | Titulo/epiteto |
12
- | `description` | String | Descricao |
13
- | `beliefs_objectives` | String | Crencas e objetivos |
14
- | `holy_symbol` | String | Simbolo sagrado |
11
+ | `title` | String | Título/epíteto |
12
+ | `description` | String | Descrição |
13
+ | `beliefs_objectives` | String | Crenças e objetivos |
14
+ | `holy_symbol` | String | Símbolo sagrado |
15
15
  | `energy` | String | Tipo de energia: `positiva`, `negativa`, `qualquer` |
16
16
  | `preferred_weapon` | String | Arma preferida |
17
- | `devotees` | Hash | Devotos tipicos (races, classes) |
17
+ | `devotees` | Hash | Devotos típicos (races, classes) |
18
18
  | `granted_powers` | Array | Lista de poderes concedidos |
19
- | `obligations_restrictions` | String | Obrigacoes e restricoes |
19
+ | `obligations_restrictions` | String | Obrigações e restrições |
20
20
 
21
21
  ## Scopes (Filtros)
22
22
 
@@ -29,12 +29,12 @@ Tormenta20.divindades.energia_qualquer # Deuses de energia neutra
29
29
  Tormenta20.divindades.by_energy("positiva")
30
30
  ```
31
31
 
32
- ## Metodos de Instancia
32
+ ## Métodos de Instância
33
33
 
34
34
  ```ruby
35
35
  divindade = Tormenta20.divindades.find("khalmyr")
36
36
 
37
- divindade.races # Racas devotas
37
+ divindade.races # Raças devotas
38
38
  # => ["humano", "anao"]
39
39
 
40
40
  divindade.classes # Classes devotas
@@ -56,14 +56,14 @@ Tormenta20.divindades.energia_positiva.each do |d|
56
56
  puts "#{d.name}: #{d.granted_powers.join(', ')}"
57
57
  end
58
58
 
59
- # Buscar divindade especifica
59
+ # Buscar divindade específica
60
60
  khalmyr = Tormenta20.divindades.find("khalmyr")
61
61
  puts khalmyr.name # => "Khalmyr"
62
- puts khalmyr.title # => "O Deus da Justica"
62
+ puts khalmyr.title # => "O Deus da Justiça"
63
63
  puts khalmyr.preferred_weapon # => "Espada longa"
64
64
  puts khalmyr.granted_powers # Lista de poderes concedidos
65
65
 
66
- # Divindades que concedem um poder especifico
66
+ # Divindades que concedem um poder específico
67
67
  Tormenta20.divindades.select do |d|
68
68
  d.granted_powers&.include?("cura_pelas_maos")
69
69
  end
@@ -72,6 +72,6 @@ end
72
72
  Tormenta20.divindades.group(:energy).count
73
73
  # => {"positiva"=>12, "negativa"=>6, "qualquer"=>2}
74
74
 
75
- # Divindades adoradas por uma raca
75
+ # Divindades adoradas por uma raça
76
76
  Tormenta20.divindades.select { |d| d.races.include?("elfo") }
77
77
  ```