tormenta20 0.2.11 → 0.2.12
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.
- checksums.yaml +4 -4
- data/README.md +141 -40
- data/db/schema.sql +44 -0
- data/db/tormenta20.sqlite3 +0 -0
- data/docs/armaduras.md +13 -13
- data/docs/armas.md +14 -14
- data/docs/condicoes.md +77 -0
- data/docs/divindades.md +14 -14
- data/docs/escudos.md +12 -12
- data/docs/indice_remissivo.md +105 -0
- data/docs/itens.md +9 -9
- data/docs/livros.md +43 -0
- data/docs/magias.md +41 -41
- data/docs/materiais_especiais.md +11 -11
- data/docs/melhorias.md +12 -12
- data/docs/poderes.md +12 -12
- data/docs/racas.md +68 -0
- data/docs/regras.md +7 -7
- data/src/json/indice_remissivo/t20_eja.json +1100 -0
- data/src/json/livros/t20_eja.json +5 -0
- data/src/ruby/tormenta20/concerns/book_referenceable.rb +52 -0
- data/src/ruby/tormenta20/database.rb +1 -0
- data/src/ruby/tormenta20/models/base.rb +2 -0
- data/src/ruby/tormenta20/models/indice_remissivo.rb +57 -0
- data/src/ruby/tormenta20/models/livro.rb +28 -0
- data/src/ruby/tormenta20/version.rb +1 -1
- data/src/ruby/tormenta20.rb +17 -0
- metadata +10 -1
data/docs/escudos.md
CHANGED
|
@@ -4,22 +4,22 @@ Acesso: `Tormenta20.escudos`
|
|
|
4
4
|
|
|
5
5
|
## Atributos
|
|
6
6
|
|
|
7
|
-
| Atributo | Tipo |
|
|
7
|
+
| Atributo | Tipo | Descrição |
|
|
8
8
|
|----------|------|-----------|
|
|
9
|
-
| `id` | String | Identificador
|
|
9
|
+
| `id` | String | Identificador único |
|
|
10
10
|
| `name` | String | Nome do escudo |
|
|
11
|
-
| `price` | String |
|
|
12
|
-
| `defense_bonus` | Integer |
|
|
11
|
+
| `price` | String | Preço |
|
|
12
|
+
| `defense_bonus` | Integer | Bônus de defesa |
|
|
13
13
|
| `armor_penalty` | Integer | Penalidade de armadura |
|
|
14
|
-
| `weight` | String | Peso/
|
|
14
|
+
| `weight` | String | Peso/espaços |
|
|
15
15
|
| `properties` | Array | Propriedades especiais |
|
|
16
|
-
| `description` | String |
|
|
16
|
+
| `description` | String | Descrição |
|
|
17
17
|
|
|
18
18
|
## Scopes (Filtros)
|
|
19
19
|
|
|
20
|
-
Este modelo
|
|
20
|
+
Este modelo não possui scopes específicos. Use queries ActiveRecord padrão.
|
|
21
21
|
|
|
22
|
-
##
|
|
22
|
+
## Métodos de Instância
|
|
23
23
|
|
|
24
24
|
```ruby
|
|
25
25
|
escudo = Tormenta20.escudos.first
|
|
@@ -35,15 +35,15 @@ Tormenta20.escudos.all.each do |e|
|
|
|
35
35
|
puts "#{e.name}: +#{e.defense_bonus} Defesa, -#{e.armor_penalty} penalidade"
|
|
36
36
|
end
|
|
37
37
|
|
|
38
|
-
# Buscar escudo
|
|
38
|
+
# Buscar escudo específico
|
|
39
39
|
escudo = Tormenta20.escudos.find("escudo_leve")
|
|
40
40
|
puts escudo.name # Nome
|
|
41
|
-
puts escudo.defense_bonus #
|
|
41
|
+
puts escudo.defense_bonus # Bônus de defesa
|
|
42
42
|
puts escudo.armor_penalty # Penalidade
|
|
43
43
|
|
|
44
|
-
# Escudo com maior
|
|
44
|
+
# Escudo com maior bônus
|
|
45
45
|
Tormenta20.escudos.order(defense_bonus: :desc).first
|
|
46
46
|
|
|
47
|
-
# Escudos ordenados por
|
|
47
|
+
# Escudos ordenados por preço
|
|
48
48
|
Tormenta20.escudos.order(:price)
|
|
49
49
|
```
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
# Índice Remissivo
|
|
2
|
+
|
|
3
|
+
Acesso: `Tormenta20.indice_remissivo`
|
|
4
|
+
|
|
5
|
+
Armazena as entradas do índice remissivo de cada livro. Quando uma entrada possui `tabela` e `registro_id` preenchidos, ela fica vinculada a um registro concreto de outro model — o que permite que qualquer model retorne sua referência de livro e página via `BookReferenceable`.
|
|
6
|
+
|
|
7
|
+
## Atributos
|
|
8
|
+
|
|
9
|
+
| Atributo | Tipo | Descrição |
|
|
10
|
+
|----------|------|-----------|
|
|
11
|
+
| `id` | Integer | Chave primária (autoincremento) |
|
|
12
|
+
| `livro_id` | String | ID do livro (FK para `livros`) |
|
|
13
|
+
| `termo` | String | Termo como aparece no índice |
|
|
14
|
+
| `pagina` | Integer | Número da página |
|
|
15
|
+
| `tabela` | String / nil | Nome da tabela do registro vinculado |
|
|
16
|
+
| `registro_id` | String / nil | ID do registro vinculado |
|
|
17
|
+
|
|
18
|
+
## Scopes (Filtros)
|
|
19
|
+
|
|
20
|
+
```ruby
|
|
21
|
+
# Entradas de um livro específico
|
|
22
|
+
Tormenta20.indice_remissivo.do_livro("t20_eja")
|
|
23
|
+
|
|
24
|
+
# Entradas de uma tabela específica
|
|
25
|
+
Tormenta20.indice_remissivo.para_tabela("classes")
|
|
26
|
+
Tormenta20.indice_remissivo.para_tabela("poderes")
|
|
27
|
+
|
|
28
|
+
# Entradas vinculadas a registros concretos
|
|
29
|
+
Tormenta20.indice_remissivo.associados
|
|
30
|
+
|
|
31
|
+
# Entradas sem vínculo a registro (termos gerais)
|
|
32
|
+
Tormenta20.indice_remissivo.nao_associados
|
|
33
|
+
|
|
34
|
+
# Busca por termo (LIKE)
|
|
35
|
+
Tormenta20.indice_remissivo.buscar_termo("Fúria")
|
|
36
|
+
Tormenta20.indice_remissivo.buscar_termo("magia")
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Métodos de Instância
|
|
40
|
+
|
|
41
|
+
```ruby
|
|
42
|
+
entrada = Tormenta20.indice_remissivo.first
|
|
43
|
+
|
|
44
|
+
entrada.termo # => "guerreiro (classe)"
|
|
45
|
+
entrada.pagina # => 64
|
|
46
|
+
entrada.tabela # => "classes"
|
|
47
|
+
entrada.registro_id # => "guerreiro"
|
|
48
|
+
entrada.associado? # => true
|
|
49
|
+
|
|
50
|
+
entrada.livro.nome # => "Tormenta 20 - Edição Jogo do Ano"
|
|
51
|
+
entrada.livro.nome_curto # => "T20 - EJA"
|
|
52
|
+
|
|
53
|
+
entrada.to_h # Hash completo (exclui nils com compact)
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Associações
|
|
57
|
+
|
|
58
|
+
```ruby
|
|
59
|
+
# A partir de um livro
|
|
60
|
+
Tormenta20.livros.find("t20_eja").indice_remissivo_entries
|
|
61
|
+
|
|
62
|
+
# A partir de qualquer model via BookReferenceable
|
|
63
|
+
Tormenta20.classes.find("guerreiro").book_reference # => "T20 - EJA, p. 64"
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
## BookReferenceable
|
|
67
|
+
|
|
68
|
+
O concern `BookReferenceable` está incluído em todos os models e usa o índice remissivo para resolver as referências. A busca é feita por `(tabela, registro_id)` e o resultado é memoizado por instância.
|
|
69
|
+
|
|
70
|
+
```ruby
|
|
71
|
+
# Todos os métodos disponíveis em qualquer model
|
|
72
|
+
record = Tormenta20.classes.find("arcanista")
|
|
73
|
+
|
|
74
|
+
record.book_reference # => "T20 - EJA, p. 36" (nil se não indexado)
|
|
75
|
+
record.page # => 36
|
|
76
|
+
record.book # => "T20 - EJA"
|
|
77
|
+
record.full_book # => "Tormenta 20 - Edição Jogo do Ano"
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Exemplos
|
|
81
|
+
|
|
82
|
+
```ruby
|
|
83
|
+
# Páginas de todas as classes indexadas
|
|
84
|
+
Tormenta20.indice_remissivo
|
|
85
|
+
.do_livro("t20_eja")
|
|
86
|
+
.para_tabela("classes")
|
|
87
|
+
.order(:pagina)
|
|
88
|
+
.each { |e| puts "#{e.registro_id}: p. #{e.pagina}" }
|
|
89
|
+
|
|
90
|
+
# Termos que não estão vinculados a nenhum registro (regras gerais, locais, etc.)
|
|
91
|
+
Tormenta20.indice_remissivo.nao_associados.buscar_termo("combate").each do |e|
|
|
92
|
+
puts "#{e.termo}: p. #{e.pagina}"
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
# Quantas entradas por tabela
|
|
96
|
+
Tormenta20.indice_remissivo
|
|
97
|
+
.associados
|
|
98
|
+
.group(:tabela)
|
|
99
|
+
.count
|
|
100
|
+
# => { "classes" => 14, "condicoes" => 30, "origens" => 35, ... }
|
|
101
|
+
|
|
102
|
+
# Verificar se um registro está indexado
|
|
103
|
+
Tormenta20.classes.find("guerreiro").page # => 64
|
|
104
|
+
Tormenta20.itens.first.page # => nil (não indexado)
|
|
105
|
+
```
|
data/docs/itens.md
CHANGED
|
@@ -4,14 +4,14 @@ Acesso: `Tormenta20.itens`
|
|
|
4
4
|
|
|
5
5
|
## Atributos
|
|
6
6
|
|
|
7
|
-
| Atributo | Tipo |
|
|
7
|
+
| Atributo | Tipo | Descrição |
|
|
8
8
|
|----------|------|-----------|
|
|
9
|
-
| `id` | String | Identificador
|
|
9
|
+
| `id` | String | Identificador único |
|
|
10
10
|
| `name` | String | Nome do item |
|
|
11
11
|
| `category` | String | Categoria do item |
|
|
12
|
-
| `price` | String |
|
|
13
|
-
| `weight` | String | Peso/
|
|
14
|
-
| `description` | String |
|
|
12
|
+
| `price` | String | Preço |
|
|
13
|
+
| `weight` | String | Peso/espaços |
|
|
14
|
+
| `description` | String | Descrição |
|
|
15
15
|
| `effects` | Array | Efeitos do item |
|
|
16
16
|
|
|
17
17
|
## Scopes (Filtros)
|
|
@@ -24,7 +24,7 @@ Tormenta20.itens.by_category("ferramenta")
|
|
|
24
24
|
Tormenta20.itens.by_category("vestuario")
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
-
##
|
|
27
|
+
## Métodos de Instância
|
|
28
28
|
|
|
29
29
|
```ruby
|
|
30
30
|
item = Tormenta20.itens.first
|
|
@@ -45,11 +45,11 @@ Tormenta20.itens.by_category("alquimico").each do |i|
|
|
|
45
45
|
puts "#{i.name}: #{i.description}"
|
|
46
46
|
end
|
|
47
47
|
|
|
48
|
-
# Buscar item
|
|
48
|
+
# Buscar item específico
|
|
49
49
|
item = Tormenta20.itens.find("corda")
|
|
50
50
|
puts item.name # Nome
|
|
51
|
-
puts item.price #
|
|
52
|
-
puts item.description #
|
|
51
|
+
puts item.price # Preço
|
|
52
|
+
puts item.description # Descrição
|
|
53
53
|
|
|
54
54
|
# Itens ordenados por nome
|
|
55
55
|
Tormenta20.itens.order(:name)
|
data/docs/livros.md
ADDED
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# Livros
|
|
2
|
+
|
|
3
|
+
Acesso: `Tormenta20.livros`
|
|
4
|
+
|
|
5
|
+
Registra os livros cujos índices remissivos estão disponíveis na gem. Usado internamente pelo concern `BookReferenceable` para resolver referências de página em todos os modelos.
|
|
6
|
+
|
|
7
|
+
## Atributos
|
|
8
|
+
|
|
9
|
+
| Atributo | Tipo | Descrição |
|
|
10
|
+
|----------|------|-----------|
|
|
11
|
+
| `id` | String | Slug do livro (ex: `"t20_eja"`) |
|
|
12
|
+
| `nome` | String | Nome completo (ex: `"Tormenta 20 - Edição Jogo do Ano"`) |
|
|
13
|
+
| `nome_curto` | String | Abreviação (ex: `"T20 - EJA"`) |
|
|
14
|
+
|
|
15
|
+
## Associações
|
|
16
|
+
|
|
17
|
+
```ruby
|
|
18
|
+
livro = Tormenta20.livros.find("t20_eja")
|
|
19
|
+
|
|
20
|
+
livro.indice_remissivo_entries # Todas as entradas do índice deste livro
|
|
21
|
+
livro.indice_remissivo_entries.count # => 1098
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## Exemplos
|
|
25
|
+
|
|
26
|
+
```ruby
|
|
27
|
+
# Listar livros disponíveis
|
|
28
|
+
Tormenta20.livros.all.each do |l|
|
|
29
|
+
puts "#{l.id}: #{l.nome} (#{l.nome_curto})"
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# Acessar entradas do índice de um livro
|
|
33
|
+
t20 = Tormenta20.livros.find("t20_eja")
|
|
34
|
+
t20.indice_remissivo_entries.para_tabela("classes").each do |e|
|
|
35
|
+
puts "#{e.termo}: p. #{e.pagina}"
|
|
36
|
+
end
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Livros Disponíveis
|
|
40
|
+
|
|
41
|
+
| ID | Nome | Abreviação | Entradas |
|
|
42
|
+
|----|------|------------|----------|
|
|
43
|
+
| `t20_eja` | Tormenta 20 - Edição Jogo do Ano | T20 - EJA | 1098+ |
|
data/docs/magias.md
CHANGED
|
@@ -4,58 +4,58 @@ Acesso: `Tormenta20.magias`
|
|
|
4
4
|
|
|
5
5
|
## Atributos
|
|
6
6
|
|
|
7
|
-
| Atributo | Tipo |
|
|
7
|
+
| Atributo | Tipo | Descrição |
|
|
8
8
|
|----------|------|-----------|
|
|
9
|
-
| `id` | String | Identificador
|
|
9
|
+
| `id` | String | Identificador único |
|
|
10
10
|
| `name` | String | Nome da magia |
|
|
11
11
|
| `type` | String | Tipo: `arcana`, `divina`, `universal` |
|
|
12
|
-
| `circle` | String |
|
|
12
|
+
| `circle` | String | Círculo (1-5) |
|
|
13
13
|
| `school` | String | Escola de magia |
|
|
14
|
-
| `execution` | String | Tempo de
|
|
15
|
-
| `execution_details` | String | Detalhes da
|
|
14
|
+
| `execution` | String | Tempo de execução |
|
|
15
|
+
| `execution_details` | String | Detalhes da execução |
|
|
16
16
|
| `range` | String | Alcance |
|
|
17
|
-
| `duration` | String |
|
|
18
|
-
| `duration_details` | String | Detalhes da
|
|
19
|
-
| `description` | String |
|
|
17
|
+
| `duration` | String | Duração |
|
|
18
|
+
| `duration_details` | String | Detalhes da duração |
|
|
19
|
+
| `description` | String | Descrição completa |
|
|
20
20
|
| `counterspell` | String | Contramagia |
|
|
21
|
-
| `enhancements` | Array | Aprimoramentos
|
|
21
|
+
| `enhancements` | Array | Aprimoramentos disponíveis |
|
|
22
22
|
| `effects` | Array | Efeitos da magia |
|
|
23
23
|
|
|
24
24
|
### Atributos de Alvo
|
|
25
25
|
|
|
26
|
-
| Atributo | Tipo |
|
|
26
|
+
| Atributo | Tipo | Descrição |
|
|
27
27
|
|----------|------|-----------|
|
|
28
28
|
| `target_amount` | Integer | Quantidade de alvos |
|
|
29
|
-
| `target_up_to` | Boolean |
|
|
29
|
+
| `target_up_to` | Boolean | Até X alvos |
|
|
30
30
|
| `target_type` | String | Tipo de alvo |
|
|
31
31
|
|
|
32
32
|
### Atributos de Efeito
|
|
33
33
|
|
|
34
|
-
| Atributo | Tipo |
|
|
34
|
+
| Atributo | Tipo | Descrição |
|
|
35
35
|
|----------|------|-----------|
|
|
36
36
|
| `effect` | String | Efeito principal |
|
|
37
37
|
| `effect_shape` | String | Forma do efeito |
|
|
38
|
-
| `effect_dimention` | String |
|
|
38
|
+
| `effect_dimention` | String | Dimensão |
|
|
39
39
|
| `effect_size` | String | Tamanho |
|
|
40
40
|
| `effect_other_details` | String | Outros detalhes |
|
|
41
|
-
| `area_effect` | String | Efeito de
|
|
42
|
-
| `area_effect_details` | String | Detalhes da
|
|
41
|
+
| `area_effect` | String | Efeito de área |
|
|
42
|
+
| `area_effect_details` | String | Detalhes da área |
|
|
43
43
|
|
|
44
|
-
### Atributos de
|
|
44
|
+
### Atributos de Resistência
|
|
45
45
|
|
|
46
|
-
| Atributo | Tipo |
|
|
46
|
+
| Atributo | Tipo | Descrição |
|
|
47
47
|
|----------|------|-----------|
|
|
48
|
-
| `resistence_effect` | String | Efeito da
|
|
49
|
-
| `resistence_skill` | String |
|
|
48
|
+
| `resistence_effect` | String | Efeito da resistência |
|
|
49
|
+
| `resistence_skill` | String | Perícia para resistência |
|
|
50
50
|
|
|
51
51
|
### Atributos de Custo Extra
|
|
52
52
|
|
|
53
|
-
| Atributo | Tipo |
|
|
53
|
+
| Atributo | Tipo | Descrição |
|
|
54
54
|
|----------|------|-----------|
|
|
55
55
|
| `extra_costs_material_component` | String | Componente material |
|
|
56
56
|
| `extra_costs_material_cost` | String | Custo do componente |
|
|
57
57
|
| `extra_costs_pm_debuff` | Integer | Debuff de PM |
|
|
58
|
-
| `extra_costs_pm_sacrifice` | Integer |
|
|
58
|
+
| `extra_costs_pm_sacrifice` | Integer | Sacrifício de PM |
|
|
59
59
|
|
|
60
60
|
## Scopes (Filtros)
|
|
61
61
|
|
|
@@ -68,42 +68,42 @@ Tormenta20.magias.universais # Magias universais
|
|
|
68
68
|
Tormenta20.magias.by_type("arcana")
|
|
69
69
|
```
|
|
70
70
|
|
|
71
|
-
### Por
|
|
71
|
+
### Por Círculo
|
|
72
72
|
|
|
73
73
|
```ruby
|
|
74
|
-
Tormenta20.magias.by_circle("1") # Magias do
|
|
75
|
-
Tormenta20.magias.by_circle("5") # Magias do
|
|
76
|
-
Tormenta20.magias.do_circulo("3") # Alias em
|
|
74
|
+
Tormenta20.magias.by_circle("1") # Magias do 1º círculo
|
|
75
|
+
Tormenta20.magias.by_circle("5") # Magias do 5º círculo
|
|
76
|
+
Tormenta20.magias.do_circulo("3") # Alias em português
|
|
77
77
|
```
|
|
78
78
|
|
|
79
79
|
### Por Escola
|
|
80
80
|
|
|
81
81
|
```ruby
|
|
82
|
-
Tormenta20.magias.by_school("evoc") #
|
|
83
|
-
Tormenta20.magias.by_school("abjur") #
|
|
84
|
-
Tormenta20.magias.by_school("adiv") #
|
|
85
|
-
Tormenta20.magias.by_school("conv") #
|
|
82
|
+
Tormenta20.magias.by_school("evoc") # Evocação
|
|
83
|
+
Tormenta20.magias.by_school("abjur") # Abjuração
|
|
84
|
+
Tormenta20.magias.by_school("adiv") # Adivinhação
|
|
85
|
+
Tormenta20.magias.by_school("conv") # Convocação
|
|
86
86
|
Tormenta20.magias.by_school("encan") # Encantamento
|
|
87
|
-
Tormenta20.magias.by_school("ilus") #
|
|
87
|
+
Tormenta20.magias.by_school("ilus") # Ilusão
|
|
88
88
|
Tormenta20.magias.by_school("necro") # Necromancia
|
|
89
|
-
Tormenta20.magias.by_school("trans") #
|
|
90
|
-
Tormenta20.magias.da_escola("evoc") # Alias em
|
|
89
|
+
Tormenta20.magias.by_school("trans") # Transmutação
|
|
90
|
+
Tormenta20.magias.da_escola("evoc") # Alias em português
|
|
91
91
|
```
|
|
92
92
|
|
|
93
93
|
### Combinando Filtros
|
|
94
94
|
|
|
95
95
|
```ruby
|
|
96
|
-
# Magias arcanas do
|
|
96
|
+
# Magias arcanas do 3º círculo
|
|
97
97
|
Tormenta20.magias.arcanas.by_circle("3")
|
|
98
98
|
|
|
99
99
|
# Magias divinas de necromancia
|
|
100
100
|
Tormenta20.magias.divinas.by_school("necro")
|
|
101
101
|
|
|
102
|
-
# Magias universais do
|
|
102
|
+
# Magias universais do 1º círculo de abjuração
|
|
103
103
|
Tormenta20.magias.universais.by_circle("1").by_school("abjur")
|
|
104
104
|
```
|
|
105
105
|
|
|
106
|
-
##
|
|
106
|
+
## Métodos de Classe
|
|
107
107
|
|
|
108
108
|
```ruby
|
|
109
109
|
Tormenta20.magias.todas # Todas as magias (alias para .all)
|
|
@@ -112,7 +112,7 @@ Tormenta20.magias.divinas_list # Lista de divinas
|
|
|
112
112
|
Tormenta20.magias.universais_list # Lista de universais
|
|
113
113
|
```
|
|
114
114
|
|
|
115
|
-
##
|
|
115
|
+
## Métodos de Instância
|
|
116
116
|
|
|
117
117
|
```ruby
|
|
118
118
|
magia = Tormenta20.magias.find("bola_de_fogo")
|
|
@@ -123,7 +123,7 @@ magia.target_info # Hash com info do alvo
|
|
|
123
123
|
magia.effect_details_info # Hash com detalhes do efeito
|
|
124
124
|
# => { shape: "esfera", size: "6m" }
|
|
125
125
|
|
|
126
|
-
magia.resistence_info # Hash com info de
|
|
126
|
+
magia.resistence_info # Hash com info de resistência
|
|
127
127
|
# => { effect: "reduz", skill: "Reflexos" }
|
|
128
128
|
|
|
129
129
|
magia.extra_costs_info # Hash com custos extras
|
|
@@ -135,7 +135,7 @@ magia.to_h # Converte para Hash completo
|
|
|
135
135
|
## Exemplos
|
|
136
136
|
|
|
137
137
|
```ruby
|
|
138
|
-
# Buscar magia
|
|
138
|
+
# Buscar magia específica
|
|
139
139
|
bola_de_fogo = Tormenta20.magias.find("bola_de_fogo")
|
|
140
140
|
puts bola_de_fogo.name # => "Bola de Fogo"
|
|
141
141
|
puts bola_de_fogo.circle # => "3"
|
|
@@ -143,12 +143,12 @@ puts bola_de_fogo.school # => "evoc"
|
|
|
143
143
|
|
|
144
144
|
# Listar todas as magias de cura
|
|
145
145
|
Tormenta20.magias.where("name LIKE ?", "%Cura%").each do |m|
|
|
146
|
-
puts "#{m.name} (#{m.type}, #{m.circle}
|
|
146
|
+
puts "#{m.name} (#{m.type}, #{m.circle}º círculo)"
|
|
147
147
|
end
|
|
148
148
|
|
|
149
|
-
# Magias arcanas ordenadas por
|
|
149
|
+
# Magias arcanas ordenadas por círculo
|
|
150
150
|
Tormenta20.magias.arcanas.order(:circle, :name).each do |m|
|
|
151
|
-
puts "#{m.circle}
|
|
151
|
+
puts "#{m.circle}º - #{m.name}"
|
|
152
152
|
end
|
|
153
153
|
|
|
154
154
|
# Contar magias por escola
|
data/docs/materiais_especiais.md
CHANGED
|
@@ -4,20 +4,20 @@ Acesso: `Tormenta20.materiais_especiais`
|
|
|
4
4
|
|
|
5
5
|
## Atributos
|
|
6
6
|
|
|
7
|
-
| Atributo | Tipo |
|
|
7
|
+
| Atributo | Tipo | Descrição |
|
|
8
8
|
|----------|------|-----------|
|
|
9
|
-
| `id` | String | Identificador
|
|
9
|
+
| `id` | String | Identificador único |
|
|
10
10
|
| `name` | String | Nome do material |
|
|
11
|
-
| `description` | String |
|
|
12
|
-
| `applicable_to` | Array | Tipos de item
|
|
13
|
-
| `price_modifier` | String | Modificador de
|
|
11
|
+
| `description` | String | Descrição |
|
|
12
|
+
| `applicable_to` | Array | Tipos de item aplicáveis |
|
|
13
|
+
| `price_modifier` | String | Modificador de preço |
|
|
14
14
|
| `effects` | Array | Efeitos do material |
|
|
15
15
|
|
|
16
16
|
## Scopes (Filtros)
|
|
17
17
|
|
|
18
|
-
Este modelo
|
|
18
|
+
Este modelo não possui scopes específicos. Use queries ActiveRecord padrão.
|
|
19
19
|
|
|
20
|
-
##
|
|
20
|
+
## Métodos de Instância
|
|
21
21
|
|
|
22
22
|
```ruby
|
|
23
23
|
material = Tormenta20.materiais_especiais.first
|
|
@@ -33,14 +33,14 @@ Tormenta20.materiais_especiais.all.each do |m|
|
|
|
33
33
|
puts "#{m.name}: #{m.description}"
|
|
34
34
|
end
|
|
35
35
|
|
|
36
|
-
# Buscar material
|
|
36
|
+
# Buscar material específico
|
|
37
37
|
adamante = Tormenta20.materiais_especiais.find("adamante")
|
|
38
38
|
puts adamante.name # => "Adamante"
|
|
39
|
-
puts adamante.price_modifier # Modificador de
|
|
40
|
-
puts adamante.applicable_to # Tipos de item
|
|
39
|
+
puts adamante.price_modifier # Modificador de preço
|
|
40
|
+
puts adamante.applicable_to # Tipos de item aplicáveis
|
|
41
41
|
puts adamante.effects # Efeitos
|
|
42
42
|
|
|
43
|
-
# Materiais
|
|
43
|
+
# Materiais aplicáveis a armas
|
|
44
44
|
Tormenta20.materiais_especiais.select do |m|
|
|
45
45
|
m.applicable_to&.include?("arma")
|
|
46
46
|
end
|
data/docs/melhorias.md
CHANGED
|
@@ -4,20 +4,20 @@ Acesso: `Tormenta20.melhorias`
|
|
|
4
4
|
|
|
5
5
|
## Atributos
|
|
6
6
|
|
|
7
|
-
| Atributo | Tipo |
|
|
7
|
+
| Atributo | Tipo | Descrição |
|
|
8
8
|
|----------|------|-----------|
|
|
9
|
-
| `id` | String | Identificador
|
|
9
|
+
| `id` | String | Identificador único |
|
|
10
10
|
| `name` | String | Nome da melhoria |
|
|
11
|
-
| `description` | String |
|
|
12
|
-
| `applicable_to` | Array | Tipos de item
|
|
13
|
-
| `price` | String |
|
|
11
|
+
| `description` | String | Descrição |
|
|
12
|
+
| `applicable_to` | Array | Tipos de item aplicáveis |
|
|
13
|
+
| `price` | String | Preço/custo |
|
|
14
14
|
| `effects` | Array | Efeitos da melhoria |
|
|
15
15
|
|
|
16
16
|
## Scopes (Filtros)
|
|
17
17
|
|
|
18
|
-
Este modelo
|
|
18
|
+
Este modelo não possui scopes específicos. Use queries ActiveRecord padrão.
|
|
19
19
|
|
|
20
|
-
##
|
|
20
|
+
## Métodos de Instância
|
|
21
21
|
|
|
22
22
|
```ruby
|
|
23
23
|
melhoria = Tormenta20.melhorias.first
|
|
@@ -33,12 +33,12 @@ Tormenta20.melhorias.all.each do |m|
|
|
|
33
33
|
puts "#{m.name}: #{m.price}"
|
|
34
34
|
end
|
|
35
35
|
|
|
36
|
-
# Buscar melhoria
|
|
36
|
+
# Buscar melhoria específica
|
|
37
37
|
melhoria = Tormenta20.melhorias.find("afiada")
|
|
38
38
|
puts melhoria.name # Nome
|
|
39
|
-
puts melhoria.description #
|
|
40
|
-
puts melhoria.price #
|
|
41
|
-
puts melhoria.applicable_to # Tipos de item
|
|
39
|
+
puts melhoria.description # Descrição
|
|
40
|
+
puts melhoria.price # Preço
|
|
41
|
+
puts melhoria.applicable_to # Tipos de item aplicáveis
|
|
42
42
|
|
|
43
43
|
# Melhorias para armas
|
|
44
44
|
Tormenta20.melhorias.select do |m|
|
|
@@ -50,6 +50,6 @@ Tormenta20.melhorias.select do |m|
|
|
|
50
50
|
m.applicable_to&.include?("armadura")
|
|
51
51
|
end
|
|
52
52
|
|
|
53
|
-
# Melhorias ordenadas por
|
|
53
|
+
# Melhorias ordenadas por preço
|
|
54
54
|
Tormenta20.melhorias.order(:price)
|
|
55
55
|
```
|
data/docs/poderes.md
CHANGED
|
@@ -4,22 +4,22 @@ Acesso: `Tormenta20.poderes`
|
|
|
4
4
|
|
|
5
5
|
## Atributos
|
|
6
6
|
|
|
7
|
-
| Atributo | Tipo |
|
|
7
|
+
| Atributo | Tipo | Descrição |
|
|
8
8
|
|----------|------|-----------|
|
|
9
|
-
| `id` | String | Identificador
|
|
9
|
+
| `id` | String | Identificador único |
|
|
10
10
|
| `name` | String | Nome do poder |
|
|
11
11
|
| `type` | String | Tipo do poder |
|
|
12
|
-
| `description` | String |
|
|
12
|
+
| `description` | String | Descrição |
|
|
13
13
|
| `effects` | Array | Efeitos do poder |
|
|
14
|
-
| `prerequisites` | Array |
|
|
15
|
-
| `origin_id` | String | ID da origem associada (se
|
|
16
|
-
| `deities` | Array | Divindades que concedem (se
|
|
14
|
+
| `prerequisites` | Array | Pré-requisitos |
|
|
15
|
+
| `origin_id` | String | ID da origem associada (se aplicável) |
|
|
16
|
+
| `deities` | Array | Divindades que concedem (se aplicável) |
|
|
17
17
|
|
|
18
18
|
## Tipos de Poder
|
|
19
19
|
|
|
20
|
-
| Tipo |
|
|
20
|
+
| Tipo | Descrição |
|
|
21
21
|
|------|-----------|
|
|
22
|
-
| `habilidade_unica_origem` | Habilidades
|
|
22
|
+
| `habilidade_unica_origem` | Habilidades únicas de origem |
|
|
23
23
|
| `poder_concedido` | Poderes concedidos por divindades |
|
|
24
24
|
| `poder_tormenta` | Poderes da Tormenta |
|
|
25
25
|
| `poder_classe` | Poderes de classe |
|
|
@@ -33,7 +33,7 @@ Acesso: `Tormenta20.poderes`
|
|
|
33
33
|
### Por Tipo
|
|
34
34
|
|
|
35
35
|
```ruby
|
|
36
|
-
Tormenta20.poderes.habilidades_unicas # Habilidades
|
|
36
|
+
Tormenta20.poderes.habilidades_unicas # Habilidades únicas de origem
|
|
37
37
|
Tormenta20.poderes.poderes_concedidos # Poderes concedidos por divindades
|
|
38
38
|
Tormenta20.poderes.poderes_tormenta # Poderes da Tormenta
|
|
39
39
|
Tormenta20.poderes.poderes_classe # Poderes de classe
|
|
@@ -53,7 +53,7 @@ Tormenta20.poderes.by_origin("soldado") # Poderes da origem Soldado
|
|
|
53
53
|
Tormenta20.poderes.by_deity("khalmyr") # Poderes concedidos por Khalmyr
|
|
54
54
|
```
|
|
55
55
|
|
|
56
|
-
##
|
|
56
|
+
## Métodos de Instância
|
|
57
57
|
|
|
58
58
|
```ruby
|
|
59
59
|
poder = Tormenta20.poderes.find("ataque_poderoso")
|
|
@@ -79,12 +79,12 @@ Tormenta20.poderes.poderes_tormenta.each do |p|
|
|
|
79
79
|
puts "#{p.name}: #{p.description}"
|
|
80
80
|
end
|
|
81
81
|
|
|
82
|
-
# Habilidades
|
|
82
|
+
# Habilidades únicas de uma origem específica
|
|
83
83
|
Tormenta20.poderes.habilidades_unicas.by_origin("soldado").each do |p|
|
|
84
84
|
puts p.name
|
|
85
85
|
end
|
|
86
86
|
|
|
87
|
-
# Poderes com
|
|
87
|
+
# Poderes com pré-requisitos
|
|
88
88
|
Tormenta20.poderes.where.not(prerequisites: nil).each do |p|
|
|
89
89
|
puts "#{p.name}: requer #{p.prerequisites}"
|
|
90
90
|
end
|
data/docs/racas.md
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# Raças
|
|
2
|
+
|
|
3
|
+
Acesso: `Tormenta20.racas`
|
|
4
|
+
|
|
5
|
+
## Atributos
|
|
6
|
+
|
|
7
|
+
| Atributo | Tipo | Descrição |
|
|
8
|
+
|----------|------|-----------|
|
|
9
|
+
| `id` | String | Identificador único (ex: `"anao"`) |
|
|
10
|
+
| `name` | String | Nome da raça |
|
|
11
|
+
| `description` | String | Descrição da raça |
|
|
12
|
+
| `size` | String | Tamanho (`"minúsculo"`, `"pequeno"`, `"médio"`, `"grande"`) |
|
|
13
|
+
| `movement` | Integer | Deslocamento em metros |
|
|
14
|
+
| `vision` | String | Tipo de visão (`"normal"`, `"baixa_luminosidade"`, `"visao_no_escuro"`) |
|
|
15
|
+
| `vision_range` | Integer / nil | Alcance da visão especial em metros |
|
|
16
|
+
| `attribute_bonuses` | Hash | Bônus de atributo por nome (`{ "constituicao" => 2 }`) |
|
|
17
|
+
| `skill_bonuses` | Array | Bônus em perícias |
|
|
18
|
+
| `racial_abilities` | Array | Habilidades raciais fixas |
|
|
19
|
+
| `chosen_abilities_amount` | Integer | Quantidade de habilidades a escolher |
|
|
20
|
+
| `available_chosen_abilities` | Array | Habilidades disponíveis para escolha |
|
|
21
|
+
|
|
22
|
+
## Métodos de Instância
|
|
23
|
+
|
|
24
|
+
```ruby
|
|
25
|
+
raca = Tormenta20.racas.find("anao")
|
|
26
|
+
|
|
27
|
+
# Bônus de atributo
|
|
28
|
+
raca.attribute_bonus_for("constituicao") # => 2
|
|
29
|
+
raca.attribute_bonus_for("forca") # => 0
|
|
30
|
+
|
|
31
|
+
# Tamanho
|
|
32
|
+
raca.minusculo? # => false
|
|
33
|
+
raca.pequeno? # => false
|
|
34
|
+
raca.grande? # => false
|
|
35
|
+
|
|
36
|
+
# Visão
|
|
37
|
+
raca.visao_no_escuro? # => true
|
|
38
|
+
|
|
39
|
+
# Conversão
|
|
40
|
+
raca.to_h # Hash completo com todos os atributos
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Exemplos
|
|
44
|
+
|
|
45
|
+
```ruby
|
|
46
|
+
# Listar todas as raças
|
|
47
|
+
Tormenta20.racas.all.each do |r|
|
|
48
|
+
puts "#{r.name} (#{r.size}) - Deslocamento: #{r.movement}m"
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Raças com visão no escuro
|
|
52
|
+
Tormenta20.racas.select(&:visao_no_escuro?).each do |r|
|
|
53
|
+
puts "#{r.name}: #{r.vision_range}m de visão no escuro"
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
# Raças com bônus em Força
|
|
57
|
+
Tormenta20.racas.select { |r| r.attribute_bonus_for("forca") > 0 }
|
|
58
|
+
|
|
59
|
+
# Bônus de atributos de uma raça específica
|
|
60
|
+
elfo = Tormenta20.racas.find("elfo")
|
|
61
|
+
elfo.attribute_bonuses # => { "destreza" => 2, ... }
|
|
62
|
+
|
|
63
|
+
# Raças pequenas
|
|
64
|
+
Tormenta20.racas.select(&:pequeno?)
|
|
65
|
+
|
|
66
|
+
# Referência de livro
|
|
67
|
+
Tormenta20.racas.find("minotauro").book_reference # => "T20 - EJA, p. 25"
|
|
68
|
+
```
|