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
@@ -0,0 +1,5 @@
1
+ {
2
+ "id": "t20_eja",
3
+ "nome": "Tormenta 20 - Edição Jogo do Ano",
4
+ "nome_curto": "T20 - EJA"
5
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "id": "arremesso_multiplo",
3
+ "name": "Arremesso Múltiplo",
4
+ "type": "poder_geral",
5
+ "sub_type": "poder_de_combate",
6
+ "description": "Uma vez por rodada, quando faz um ataque com uma arma de arremesso, você pode gastar 1 PM para fazer um ataque adicional contra o mesmo alvo, arremessando outra arma de arremesso.",
7
+ "requirements": [
8
+ {
9
+ "type": "attr_value",
10
+ "sub_type": "hard",
11
+ "attr": "des",
12
+ "value": 13
13
+ },
14
+ {
15
+ "type": "power",
16
+ "sub_type": "hard",
17
+ "power": "estilo_de_arremeso"
18
+ }
19
+ ],
20
+ "effects": [
21
+ {
22
+ "type": "active",
23
+ "cost": "1 PM",
24
+ "trigger": "ataque_arremesso"
25
+ }
26
+ ]
27
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "id": "ataque_com_escudo",
3
+ "name": "Ataque com Escudo",
4
+ "type": "poder_geral",
5
+ "sub_type": "poder_de_combate",
6
+ "description": "Uma vez por rodada, se estiver empunhando um escudo e fizer a ação agredir, você pode gastar 1 PM para fazer um ataque corpo a corpo extra com o escudo. Este ataque não faz você perder o bônus do escudo na Defesa.",
7
+ "requirements": [
8
+ {
9
+ "type": "power",
10
+ "sub_type": "hard",
11
+ "power": "estilo_de_arma_e_escudo"
12
+ }
13
+ ],
14
+ "effects": [
15
+ {
16
+ "type": "active",
17
+ "cost": "1 PM",
18
+ "trigger": "acao_agredir"
19
+ }
20
+ ]
21
+ }
@@ -0,0 +1,28 @@
1
+ {
2
+ "id": "estilo_de_arma_longa",
3
+ "name": "Estilo de Arma Longa",
4
+ "type": "poder_geral",
5
+ "sub_type": "poder_de_combate",
6
+ "description": "Você recebe +2 em testes de ataque com armas alongadas e pode atacar alvos adjacentes com essas armas.",
7
+ "requirements": [
8
+ {
9
+ "type": "attr_value",
10
+ "sub_type": "hard",
11
+ "attr": "for",
12
+ "value": 13
13
+ },
14
+ {
15
+ "type": "skill_training",
16
+ "sub_type": "hard",
17
+ "skill": "luta"
18
+ }
19
+ ],
20
+ "effects": [
21
+ {
22
+ "type": "attack_improvement",
23
+ "value": 2,
24
+ "duration": "permanente",
25
+ "requirements": { "weapon": "arma_longa" }
26
+ }
27
+ ]
28
+ }
@@ -1,6 +1,6 @@
1
1
  {
2
- "id": "",
3
- "name": "",
2
+ "id": "estilo_de_uma_arma",
3
+ "name": "Estilo de Uma Arma",
4
4
  "type": "poder_geral",
5
5
  "sub_type": "poder_de_combate",
6
6
  "description": "Se estiver usando uma arma corpo a corpo em uma das mãos e nada na outra, você recebe +2 na Defesa e nos testes de ataque com essa arma (exceto ataques desarmados)",
@@ -0,0 +1,21 @@
1
+ {
2
+ "id": "piqueiro",
3
+ "name": "Piqueiro",
4
+ "type": "poder_geral",
5
+ "sub_type": "poder_de_combate",
6
+ "description": "Uma vez por rodada, se estiver empunhando uma arma alongada e um inimigo entrar voluntariamente em seu alcance corpo a corpo, você pode gastar 1 PM para fazer um ataque corpo a corpo contra este oponente com esta arma. Se o oponente tiver se aproximado fazendo uma investida, seu ataque causa dois dados de dano extra do mesmo tipo.",
7
+ "requirements": [
8
+ {
9
+ "type": "power",
10
+ "sub_type": "hard",
11
+ "power": "estilo_de_arma_longa"
12
+ }
13
+ ],
14
+ "effects": [
15
+ {
16
+ "type": "active",
17
+ "cost": "1 PM",
18
+ "trigger": "inimigo_entra_no_alcance"
19
+ }
20
+ ]
21
+ }
@@ -9,7 +9,7 @@
9
9
  "type": "character_lvl",
10
10
  "sub_type": "hard",
11
11
  "value": 5
12
- },
12
+ }
13
13
  ],
14
14
  "effects": [
15
15
  {
@@ -83,6 +83,6 @@
83
83
  "skill": "a_sua_escolha",
84
84
  "value": 2,
85
85
  "requirement": "character_lvl_20"
86
- },
86
+ }
87
87
  ]
88
88
  }
@@ -0,0 +1,28 @@
1
+ {
2
+ "id": "costas_largas",
3
+ "name": "Costas Largas",
4
+ "type": "poder_geral",
5
+ "sub_type": "poder_de_destino",
6
+ "description": "Seu limite de carga aumenta em 5 espaços e você pode se beneficiar de um item vestido adicional.",
7
+ "requirements": [
8
+ {
9
+ "type": "attr_value",
10
+ "sub_type": "hard",
11
+ "attr": "con",
12
+ "value": 13
13
+ },
14
+ {
15
+ "type": "attr_value",
16
+ "sub_type": "hard",
17
+ "attr": "for",
18
+ "value": 13
19
+ }
20
+ ],
21
+ "effects": [
22
+ {
23
+ "type": "inventory_improvement",
24
+ "value": 5,
25
+ "duration": "permanente"
26
+ }
27
+ ]
28
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "id": "inventario_organizado",
3
+ "name": "Inventário Organizado",
4
+ "type": "poder_geral",
5
+ "sub_type": "poder_de_destino",
6
+ "description": "Você soma sua Inteligência no limite de espaços que pode carregar. Para você, itens muito leves ou pequenos, que normalmente ocupam meio espaço, em vez disso ocupam 1/4 de espaço.",
7
+ "requirements": [
8
+ {
9
+ "type": "attr_value",
10
+ "sub_type": "hard",
11
+ "attr": "int",
12
+ "value": 13
13
+ }
14
+ ],
15
+ "effects": [
16
+ {
17
+ "type": "inventory_improvement",
18
+ "value": "int_modifier",
19
+ "duration": "permanente"
20
+ }
21
+ ]
22
+ }
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Tormenta20
4
+ module Concerns
5
+ # Mixin that gives any gem model access to its book/page reference.
6
+ #
7
+ # Methods are lazy-loaded: the database is queried on the first call
8
+ # and the result is memoized for the lifetime of the instance.
9
+ #
10
+ # @example
11
+ # guerreiro = Tormenta20.classes.find("guerreiro")
12
+ # guerreiro.book_reference # => "T20 - EJA, p. 56"
13
+ # guerreiro.page # => 56
14
+ # guerreiro.book # => "T20 - EJA"
15
+ # guerreiro.full_book # => "Tormenta 20 - Edição Jogo do Ano"
16
+ module BookReferenceable
17
+ # "T20 - EJA, p. 215" — nil se não houver entrada no índice.
18
+ def book_reference
19
+ entry = _indice_entry
20
+ return nil unless entry
21
+
22
+ "#{entry.livro.nome_curto}, p. #{entry.pagina}"
23
+ end
24
+
25
+ # Número da página (Integer) — nil se não indexado.
26
+ def page
27
+ _indice_entry&.pagina
28
+ end
29
+
30
+ # Nome curto do livro (String) — nil se não indexado.
31
+ def book
32
+ _indice_entry&.livro&.nome_curto
33
+ end
34
+
35
+ # Nome completo do livro (String) — nil se não indexado.
36
+ def full_book
37
+ _indice_entry&.livro&.nome
38
+ end
39
+
40
+ private
41
+
42
+ def _indice_entry
43
+ # Memoize por instância; reset se o id mudar.
44
+ return @_indice_entry if defined?(@_indice_entry)
45
+
46
+ @_indice_entry = Models::IndiceRemissivo
47
+ .includes(:livro)
48
+ .find_by(tabela: self.class.table_name, registro_id: id.to_s)
49
+ end
50
+ end
51
+ end
52
+ end
@@ -125,6 +125,7 @@ module Tormenta20
125
125
  pool: 5,
126
126
  timeout: 5000
127
127
  )
128
+ Models::Base.logger = nil
128
129
 
129
130
  @connected = true
130
131
  end
@@ -14,6 +14,8 @@ module Tormenta20
14
14
  # @abstract Subclass and set table_name to create a new model
15
15
  class Base < ActiveRecord::Base
16
16
  self.abstract_class = true
17
+
18
+ include Concerns::BookReferenceable
17
19
  end
18
20
  end
19
21
  end
@@ -0,0 +1,57 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+
5
+ module Tormenta20
6
+ module Models
7
+ # Entrada do índice remissivo de um livro.
8
+ #
9
+ # Cada linha representa um termo do índice associado a uma página.
10
+ # Os campos +tabela+ e +registro_id+ são opcionais e preenchidos quando
11
+ # o termo é vinculado a um registro concreto de outra tabela da gem.
12
+ #
13
+ # @example Buscar página de "Guerreiro" no T20 EJA
14
+ # Tormenta20::Models::IndiceRemissivo
15
+ # .where(livro_id: "t20_eja", tabela: "classes", registro_id: "guerreiro")
16
+ # .pluck(:pagina)
17
+ #
18
+ # @example Buscar todas as entradas de um livro que mencionam "Magia"
19
+ # Tormenta20::Models::IndiceRemissivo
20
+ # .where(livro_id: "t20_eja")
21
+ # .where("termo LIKE ?", "%Magia%")
22
+ class IndiceRemissivo < Base
23
+ self.table_name = "indice_remissivo"
24
+ self.primary_key = "id"
25
+
26
+ belongs_to :livro,
27
+ class_name: "Tormenta20::Models::Livro",
28
+ foreign_key: "livro_id"
29
+
30
+ validates :livro_id, presence: true
31
+ validates :termo, presence: true
32
+ validates :pagina, presence: true, numericality: { only_integer: true, greater_than: 0 }
33
+
34
+ # Scopes
35
+ scope :do_livro, ->(livro_id) { where(livro_id: livro_id) }
36
+ scope :para_tabela, ->(tabela) { where(tabela: tabela) }
37
+ scope :associados, -> { where.not(registro_id: nil) }
38
+ scope :nao_associados, -> { where(registro_id: nil) }
39
+ scope :buscar_termo, ->(q) { where("termo LIKE ?", "%#{q}%") }
40
+
41
+ def to_h
42
+ {
43
+ id: id,
44
+ livro_id: livro_id,
45
+ termo: termo,
46
+ pagina: pagina,
47
+ tabela: tabela,
48
+ registro_id: registro_id
49
+ }.compact
50
+ end
51
+
52
+ def associado?
53
+ registro_id.present?
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+
5
+ module Tormenta20
6
+ module Models
7
+ # ActiveRecord model for livros (books).
8
+ class Livro < Base
9
+ self.table_name = "livros"
10
+
11
+ has_many :indice_remissivo_entries,
12
+ class_name: "Tormenta20::Models::IndiceRemissivo",
13
+ foreign_key: "livro_id",
14
+ dependent: :destroy
15
+
16
+ validates :id, presence: true, uniqueness: true
17
+ validates :nome, presence: true
18
+ validates :nome_curto, presence: true
19
+
20
+ def to_h
21
+ {
22
+ id: id,
23
+ nome: nome,
24
+ nome_curto: nome_curto
25
+ }
26
+ end
27
+ end
28
+ end
29
+ end
@@ -4,6 +4,7 @@ require "active_record"
4
4
 
5
5
  module Tormenta20
6
6
  module Models
7
+ # ActiveRecord model for raças (playable races).
7
8
  class Raca < Base
8
9
  self.table_name = "racas"
9
10
 
@@ -384,4 +384,3 @@ module Tormenta20
384
384
  end
385
385
  end
386
386
  end
387
-
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Tormenta20
4
- VERSION = "0.2.11"
4
+ VERSION = ENV.fetch("GEM_VERSION", "0.0.0")
5
5
  end
@@ -6,6 +6,9 @@ require "sqlite3"
6
6
 
7
7
  require_relative "tormenta20/database"
8
8
 
9
+ # Load concerns before models
10
+ require_relative "tormenta20/concerns/book_referenceable"
11
+
9
12
  # Load base model first, then other models
10
13
  require_relative "tormenta20/models/base"
11
14
  Dir["#{__dir__}/tormenta20/models/*.rb"].each { |file| require file unless file.include?("base") }
@@ -182,6 +185,20 @@ module Tormenta20
182
185
  Models::Condicao
183
186
  end
184
187
 
188
+ # Acesso aos livros cadastrados.
189
+ #
190
+ # @return [Class] Tormenta20::Models::Livro
191
+ def livros
192
+ Models::Livro
193
+ end
194
+
195
+ # Acesso ao índice remissivo.
196
+ #
197
+ # @return [Class] Tormenta20::Models::IndiceRemissivo
198
+ def indice_remissivo
199
+ Models::IndiceRemissivo
200
+ end
201
+
185
202
  # @!endgroup
186
203
  end
187
204
 
metadata CHANGED
@@ -1,13 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tormenta20
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.11
4
+ version: 0.2.15
5
5
  platform: ruby
6
6
  authors:
7
7
  - LuanGB
8
+ autorequire:
8
9
  bindir: exe
9
10
  cert_chain: []
10
- date: 1980-01-02 00:00:00.000000000 Z
11
+ date: 2026-04-30 00:00:00.000000000 Z
11
12
  dependencies:
12
13
  - !ruby/object:Gem::Dependency
13
14
  name: activerecord
@@ -62,6 +63,7 @@ extra_rdoc_files: []
62
63
  files:
63
64
  - ".rspec"
64
65
  - ".rubocop.yml"
66
+ - ".ruby-version"
65
67
  - CHANGELOG.md
66
68
  - CODE_OF_CONDUCT.md
67
69
  - LICENSE.txt
@@ -73,14 +75,18 @@ files:
73
75
  - docs/armaduras.md
74
76
  - docs/armas.md
75
77
  - docs/classes.md
78
+ - docs/condicoes.md
76
79
  - docs/divindades.md
77
80
  - docs/escudos.md
81
+ - docs/indice_remissivo.md
78
82
  - docs/itens.md
83
+ - docs/livros.md
79
84
  - docs/magias.md
80
85
  - docs/materiais_especiais.md
81
86
  - docs/melhorias.md
82
87
  - docs/origens.md
83
88
  - docs/poderes.md
89
+ - docs/racas.md
84
90
  - docs/regras.md
85
91
  - examples/database_usage.rb
86
92
  - exe/tormenta20
@@ -329,6 +335,7 @@ files:
329
335
  - src/json/equipamentos/municoes/flechas.json
330
336
  - src/json/equipamentos/municoes/pedras.json
331
337
  - src/json/equipamentos/municoes/virotes.json
338
+ - src/json/indice_remissivo/t20_eja.json
332
339
  - src/json/itens_superiores/materiais_especiais/aco_rubi.json
333
340
  - src/json/itens_superiores/materiais_especiais/adamante.json
334
341
  - src/json/itens_superiores/materiais_especiais/gelo_eterno.json
@@ -364,6 +371,7 @@ files:
364
371
  - src/json/itens_superiores/melhorias/geral/discreto.json
365
372
  - src/json/itens_superiores/melhorias/geral/macabro.json
366
373
  - src/json/itens_superiores/melhorias/geral/material_especial.json
374
+ - src/json/livros/t20_eja.json
367
375
  - src/json/magias/abencoar_alimentos.json
368
376
  - src/json/magias/acalmar_animal.json
369
377
  - src/json/magias/adaga_mental.json
@@ -1150,7 +1158,9 @@ files:
1150
1158
  - src/json/poderes/poderes_da_tormenta/visco_rubro.json
1151
1159
  - src/json/poderes/poderes_gerais/poderes_de_combate/acuidade_com_arma.json
1152
1160
  - src/json/poderes/poderes_gerais/poderes_de_combate/arma_secundaria_grande.json
1161
+ - src/json/poderes/poderes_gerais/poderes_de_combate/arremesso_multiplo.json
1153
1162
  - src/json/poderes/poderes_gerais/poderes_de_combate/arremesso_potente.json
1163
+ - src/json/poderes/poderes_gerais/poderes_de_combate/ataque_com_escudo.json
1154
1164
  - src/json/poderes/poderes_gerais/poderes_de_combate/ataque_pesado.json
1155
1165
  - src/json/poderes/poderes_gerais/poderes_de_combate/ataque_poderoso.json
1156
1166
  - src/json/poderes/poderes_gerais/poderes_de_combate/ataque_preciso.json
@@ -1165,6 +1175,7 @@ files:
1165
1175
  - src/json/poderes/poderes_gerais/poderes_de_combate/encouracado.json
1166
1176
  - src/json/poderes/poderes_gerais/poderes_de_combate/esquiva.json
1167
1177
  - src/json/poderes/poderes_gerais/poderes_de_combate/estilo_de_arma_e_escudo.json
1178
+ - src/json/poderes/poderes_gerais/poderes_de_combate/estilo_de_arma_longa.json
1168
1179
  - src/json/poderes/poderes_gerais/poderes_de_combate/estilo_de_arremeso.json
1169
1180
  - src/json/poderes/poderes_gerais/poderes_de_combate/estilo_de_disparo.json
1170
1181
  - src/json/poderes/poderes_gerais/poderes_de_combate/estilo_de_duas_armas.json
@@ -1177,6 +1188,7 @@ files:
1177
1188
  - src/json/poderes/poderes_gerais/poderes_de_combate/ginete.json
1178
1189
  - src/json/poderes/poderes_gerais/poderes_de_combate/inexpugnavel.json
1179
1190
  - src/json/poderes/poderes_gerais/poderes_de_combate/mira_apurada.json
1191
+ - src/json/poderes/poderes_gerais/poderes_de_combate/piqueiro.json
1180
1192
  - src/json/poderes/poderes_gerais/poderes_de_combate/presenca_aterradora.json
1181
1193
  - src/json/poderes/poderes_gerais/poderes_de_combate/proficiencia.json
1182
1194
  - src/json/poderes/poderes_gerais/poderes_de_combate/quebrar_aprimorado.json
@@ -1190,7 +1202,9 @@ files:
1190
1202
  - src/json/poderes/poderes_gerais/poderes_de_destino/atletico.json
1191
1203
  - src/json/poderes/poderes_gerais/poderes_de_destino/atraente.json
1192
1204
  - src/json/poderes/poderes_gerais/poderes_de_destino/comandar.json
1205
+ - src/json/poderes/poderes_gerais/poderes_de_destino/costas_largas.json
1193
1206
  - src/json/poderes/poderes_gerais/poderes_de_destino/foco_em_pericia.json
1207
+ - src/json/poderes/poderes_gerais/poderes_de_destino/inventario_organizado.json
1194
1208
  - src/json/poderes/poderes_gerais/poderes_de_destino/investigador.json
1195
1209
  - src/json/poderes/poderes_gerais/poderes_de_destino/lobo_solitario.json
1196
1210
  - src/json/poderes/poderes_gerais/poderes_de_destino/medicina.json
@@ -1244,6 +1258,7 @@ files:
1244
1258
  - src/json/regras/venenos.json
1245
1259
  - src/python/__init__.py
1246
1260
  - src/ruby/tormenta20.rb
1261
+ - src/ruby/tormenta20/concerns/book_referenceable.rb
1247
1262
  - src/ruby/tormenta20/database.rb
1248
1263
  - src/ruby/tormenta20/models/arma.rb
1249
1264
  - src/ruby/tormenta20/models/armadura.rb
@@ -1252,7 +1267,9 @@ files:
1252
1267
  - src/ruby/tormenta20/models/condicao.rb
1253
1268
  - src/ruby/tormenta20/models/divindade.rb
1254
1269
  - src/ruby/tormenta20/models/escudo.rb
1270
+ - src/ruby/tormenta20/models/indice_remissivo.rb
1255
1271
  - src/ruby/tormenta20/models/item.rb
1272
+ - src/ruby/tormenta20/models/livro.rb
1256
1273
  - src/ruby/tormenta20/models/magia.rb
1257
1274
  - src/ruby/tormenta20/models/material_especial.rb
1258
1275
  - src/ruby/tormenta20/models/melhoria.rb
@@ -1280,6 +1297,7 @@ metadata:
1280
1297
  homepage_uri: https://github.com/LuanGB/tormenta20
1281
1298
  source_code_uri: https://github.com/LuanGB/tormenta20
1282
1299
  changelog_uri: https://github.com/LuanGB/tormenta20/blob/main/CHANGELOG.md
1300
+ post_install_message:
1283
1301
  rdoc_options: []
1284
1302
  require_paths:
1285
1303
  - src/ruby
@@ -1294,7 +1312,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1294
1312
  - !ruby/object:Gem::Version
1295
1313
  version: '0'
1296
1314
  requirements: []
1297
- rubygems_version: 3.7.2
1315
+ rubygems_version: 3.5.22
1316
+ signing_key:
1298
1317
  specification_version: 4
1299
1318
  summary: A Ruby, Node and Python library with data about the Brazilian TTRPG, Tormenta20
1300
1319
  test_files: []