tormenta20 0.2.6 → 0.2.8

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 (44) hide show
  1. checksums.yaml +4 -4
  2. data/db/schema.sql +25 -1
  3. data/db/seeds.rb +39 -0
  4. data/db/tormenta20.sqlite3 +0 -0
  5. data/src/json/condicoes/abalado.json +8 -0
  6. data/src/json/condicoes/agarrado.json +13 -0
  7. data/src/json/condicoes/alquebrado.json +8 -0
  8. data/src/json/condicoes/apavorado.json +11 -0
  9. data/src/json/condicoes/atordoado.json +11 -0
  10. data/src/json/condicoes/caido.json +13 -0
  11. data/src/json/condicoes/cego.json +13 -0
  12. data/src/json/condicoes/confuso.json +10 -0
  13. data/src/json/condicoes/debilitado.json +11 -0
  14. data/src/json/condicoes/desprevenido.json +11 -0
  15. data/src/json/condicoes/doente.json +8 -0
  16. data/src/json/condicoes/em_chamas.json +11 -0
  17. data/src/json/condicoes/enfeiticado.json +11 -0
  18. data/src/json/condicoes/enjoado.json +8 -0
  19. data/src/json/condicoes/enredado.json +12 -0
  20. data/src/json/condicoes/envenenado.json +8 -0
  21. data/src/json/condicoes/esmorecido.json +8 -0
  22. data/src/json/condicoes/exausto.json +13 -0
  23. data/src/json/condicoes/fascinado.json +12 -0
  24. data/src/json/condicoes/fatigado.json +12 -0
  25. data/src/json/condicoes/fraco.json +11 -0
  26. data/src/json/condicoes/frustrado.json +11 -0
  27. data/src/json/condicoes/imovel.json +8 -0
  28. data/src/json/condicoes/inconsciente.json +11 -0
  29. data/src/json/condicoes/indefeso.json +13 -0
  30. data/src/json/condicoes/lento.json +12 -0
  31. data/src/json/condicoes/ofuscado.json +11 -0
  32. data/src/json/condicoes/paralisado.json +12 -0
  33. data/src/json/condicoes/pasmo.json +8 -0
  34. data/src/json/condicoes/petrificado.json +11 -0
  35. data/src/json/condicoes/sangrando.json +10 -0
  36. data/src/json/condicoes/sobrecarregado.json +11 -0
  37. data/src/json/condicoes/surdo.json +12 -0
  38. data/src/json/condicoes/surpreendido.json +11 -0
  39. data/src/json/condicoes/vulneravel.json +8 -0
  40. data/src/ruby/tormenta20/models/condicao.rb +66 -0
  41. data/src/ruby/tormenta20/seeder.rb +33 -0
  42. data/src/ruby/tormenta20/version.rb +1 -1
  43. data/src/ruby/tormenta20.rb +10 -0
  44. metadata +37 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 853de121e4caf1ae828b76f6f1bd012a093272d22027548623bf2f0ed71e71f8
4
- data.tar.gz: 4ee2eb6e6a900231a09fdae20ac6fe6604a65ccdbcc313f379109829bc0f07ea
3
+ metadata.gz: 4307d85fbff7bd5b5d717f6cfeb0d31516f11ac0b706954430b22b984f3b0b90
4
+ data.tar.gz: 76ac8b3fc839b7d3eed1f7edcba049b18626bd121b96120af729020cdea4140c
5
5
  SHA512:
6
- metadata.gz: 6877009876a6cf32291bd8e0c7c50e123580418ff83ec01a1fe3c92aac1068667ddba5812e1c6e101ce0be4b68cd93a21ac4b76f6fbb0297552182167c72f71a
7
- data.tar.gz: 5ca05d5d4123293a3db942defaa0d80fa6d2046df02a7b000cfb446d737fecf5be871aec013dda9725b19713a4a1fe77829920f70a1d85ec53f49501c80af46a
6
+ metadata.gz: 1e6cdae56dfe316483ce3a1cc7cd12fabdaa2a51bfbdbae529ffb9afe1f1b260833de4108ef5c6b19628e52a1f8e0fedb42e42738facdbbbcca3cb11b36bb3f2
7
+ data.tar.gz: '0282ce25f0d66e926b1b632a2cfc4c46ba5c4d12788f5559b123d360a9b9df7b7445d739b24c67348a554be443daa337b67c8d63da386be1a98ba345ae86d972'
data/db/schema.sql CHANGED
@@ -45,7 +45,8 @@ CREATE TABLE IF NOT EXISTS poderes (
45
45
  'poder_magia'
46
46
  )),
47
47
  description TEXT,
48
- effects JSON DEFAULT '{}',
48
+ effects JSON DEFAULT '[]',
49
+ costs JSON DEFAULT '[]',
49
50
  prerequisites JSON DEFAULT '[]',
50
51
  origin_id TEXT,
51
52
  class_id TEXT,
@@ -375,6 +376,29 @@ BEGIN
375
376
  UPDATE racas SET updated_at = CURRENT_TIMESTAMP WHERE id = NEW.id;
376
377
  END;
377
378
 
379
+ -- -----------------------------------------------------------------------------
380
+ -- CONDIÇÕES (Status Conditions)
381
+ -- -----------------------------------------------------------------------------
382
+ CREATE TABLE IF NOT EXISTS condicoes (
383
+ id TEXT PRIMARY KEY,
384
+ name TEXT NOT NULL,
385
+ description TEXT,
386
+ effects JSON DEFAULT '[]',
387
+ condition_type TEXT,
388
+ escalates_to TEXT,
389
+ created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
390
+ updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
391
+ );
392
+
393
+ CREATE INDEX IF NOT EXISTS idx_condicoes_name ON condicoes(name);
394
+ CREATE INDEX IF NOT EXISTS idx_condicoes_type ON condicoes(condition_type);
395
+
396
+ CREATE TRIGGER IF NOT EXISTS update_condicoes_timestamp
397
+ AFTER UPDATE ON condicoes
398
+ BEGIN
399
+ UPDATE condicoes SET updated_at = CURRENT_TIMESTAMP WHERE id = NEW.id;
400
+ END;
401
+
378
402
  -- =============================================================================
379
403
  -- VIEWS ÚTEIS
380
404
  -- =============================================================================
data/db/seeds.rb CHANGED
@@ -30,6 +30,7 @@ module Tormenta20
30
30
  import_divindades
31
31
  import_poderes_concedidos
32
32
  import_poderes_tormenta
33
+ import_poderes_gerais
33
34
  import_classes
34
35
  import_magias
35
36
  import_equipamentos
@@ -104,6 +105,44 @@ module Tormenta20
104
105
  )
105
106
  end
106
107
 
108
+ # =======================================================================
109
+ # PODERES GERAIS (combate, destino, magia)
110
+ # =======================================================================
111
+ def import_poderes_gerais
112
+ puts "\nImporting poderes_gerais..."
113
+
114
+ json_dir = File.join(JSON_BASE_PATH, "poderes/poderes_gerais")
115
+ return puts " Directory not found: #{json_dir}" unless Dir.exist?(json_dir)
116
+
117
+ files = Dir.glob(File.join(json_dir, "**", "*.json"))
118
+ puts " Found #{files.size} files"
119
+
120
+ success_count = 0
121
+ error_count = 0
122
+
123
+ files.each_with_index do |file, index|
124
+ data = JSON.parse(File.read(file), symbolize_names: true)
125
+
126
+ record = Models::Poder.find_or_initialize_by(id: data[:id])
127
+ record.name = data[:name]
128
+ record.type = data[:type]
129
+ record.description = data[:description]
130
+ record.effects = data[:effects] || []
131
+ record.costs = data[:costs] || []
132
+ record.prerequisites = data[:requirements] || []
133
+ record.save!
134
+
135
+ success_count += 1
136
+ print "\r Imported: #{index + 1}/#{files.size}" if ((index + 1) % 10).zero?
137
+ rescue StandardError => e
138
+ error_count += 1
139
+ puts "\n Error importing #{File.basename(file)}: #{e.message}"
140
+ end
141
+
142
+ puts "\n Successfully imported #{success_count} poderes_gerais"
143
+ puts " Failed to import #{error_count} poderes_gerais" if error_count.positive?
144
+ end
145
+
107
146
  # =======================================================================
108
147
  # CLASSES
109
148
  # =======================================================================
Binary file
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "abalado",
3
+ "name": "Abalado",
4
+ "description": "Você fica com medo. Sofre –2 em testes de perícia.",
5
+ "effects": ["-2 em testes de perícia"],
6
+ "condition_type": "medo",
7
+ "escalates_to": null
8
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "id": "agarrado",
3
+ "name": "Agarrado",
4
+ "description": "Você está sendo segurado por uma criatura ou efeito. Fica desprevenido e imóvel, sofre –2 em jogadas de ataque e só pode usar armas leves ou armas naturais.",
5
+ "effects": [
6
+ "Fica desprevenido",
7
+ "Fica imóvel",
8
+ "-2 em jogadas de ataque",
9
+ "Só pode usar armas leves ou naturais"
10
+ ],
11
+ "condition_type": null,
12
+ "escalates_to": null
13
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "alquebrado",
3
+ "name": "Alquebrado",
4
+ "description": "Sua mente está enfraquecida. O custo em PM de todas as suas habilidades aumenta em +1.",
5
+ "effects": ["Custo em PM de todas as habilidades +1"],
6
+ "condition_type": "mental",
7
+ "escalates_to": null
8
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "apavorado",
3
+ "name": "Apavorado",
4
+ "description": "Você está dominado pelo medo. Sofre –5 em testes de perícia e não pode se aproximar voluntariamente da fonte do seu medo.",
5
+ "effects": [
6
+ "-5 em testes de perícia",
7
+ "Não pode se aproximar voluntariamente da fonte do medo"
8
+ ],
9
+ "condition_type": "medo",
10
+ "escalates_to": null
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "atordoado",
3
+ "name": "Atordoado",
4
+ "description": "Você está confuso e incapaz de agir. Fica desprevenido e perde sua ação no turno.",
5
+ "effects": [
6
+ "Fica desprevenido",
7
+ "Perde a ação no turno"
8
+ ],
9
+ "condition_type": "mental",
10
+ "escalates_to": null
11
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "id": "caido",
3
+ "name": "Caído",
4
+ "description": "Você está prostrado no chão. Sofre –5 na Defesa contra ataques corpo a corpo, mas +5 na Defesa contra ataques à distância. Sofre –5 em jogadas de ataque corpo a corpo. Seu deslocamento é reduzido a 1,5m (apenas rastejando).",
5
+ "effects": [
6
+ "-5 na Defesa contra ataques corpo a corpo",
7
+ "+5 na Defesa contra ataques à distância",
8
+ "-5 em jogadas de ataque corpo a corpo",
9
+ "Deslocamento reduzido a 1,5m (rastejar)"
10
+ ],
11
+ "condition_type": null,
12
+ "escalates_to": null
13
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "id": "cego",
3
+ "name": "Cego",
4
+ "description": "Você não consegue ver. Fica desprevenido e lento. Sofre –5 em testes de perícias baseadas em Força ou Destreza. Todos os alvos têm cobertura total contra seus ataques.",
5
+ "effects": [
6
+ "Fica desprevenido",
7
+ "Fica lento",
8
+ "-5 em testes de perícias baseadas em Força ou Destreza",
9
+ "Todos os alvos têm cobertura total contra seus ataques"
10
+ ],
11
+ "condition_type": "sentidos",
12
+ "escalates_to": null
13
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "id": "confuso",
3
+ "name": "Confuso",
4
+ "description": "Você age de forma aleatória e imprevisível. No início de cada turno, role 1d6: 1–2 age normalmente, 3–4 não faz nada, 5–6 ataca o alvo mais próximo (aliado ou inimigo).",
5
+ "effects": [
6
+ "No início do turno role 1d6: 1-2 age normalmente, 3-4 fica pasmo, 5-6 ataca o alvo mais próximo"
7
+ ],
8
+ "condition_type": "mental",
9
+ "escalates_to": null
10
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "debilitado",
3
+ "name": "Debilitado",
4
+ "description": "Seu corpo está seriamente comprometido. Sofre –5 em testes de Força, Destreza e Constituição. Se ficar debilitado novamente, fica inconsciente.",
5
+ "effects": [
6
+ "-5 em testes de Força, Destreza e Constituição",
7
+ "Se ficar debilitado novamente → fica inconsciente"
8
+ ],
9
+ "condition_type": null,
10
+ "escalates_to": "inconsciente"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "desprevenido",
3
+ "name": "Desprevenido",
4
+ "description": "Você está sem se defender adequadamente. Sofre –5 na Defesa e em Reflexos.",
5
+ "effects": [
6
+ "-5 na Defesa",
7
+ "-5 em Reflexos"
8
+ ],
9
+ "condition_type": null,
10
+ "escalates_to": null
11
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "doente",
3
+ "name": "Doente",
4
+ "description": "Você está acometido por uma doença. Os efeitos variam conforme a doença específica.",
5
+ "effects": ["Efeitos variam conforme a doença (veja a descrição da doença)"],
6
+ "condition_type": "metabolismo",
7
+ "escalates_to": null
8
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "em_chamas",
3
+ "name": "Em Chamas",
4
+ "description": "Você está pegando fogo. Sofre 1d6 pontos de dano de fogo no início de cada turno. Você pode apagar as chamas usando uma ação padrão para se jogar no chão e rolar.",
5
+ "effects": [
6
+ "1d6 pontos de dano de fogo no início de cada turno",
7
+ "Ação padrão para apagar (jogar no chão e rolar)"
8
+ ],
9
+ "condition_type": null,
10
+ "escalates_to": null
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "enfeiticado",
3
+ "name": "Enfeitiçado",
4
+ "description": "Você está sob encantamento e considera a fonte do efeito como amiga. A fonte recebe +10 em testes de Diplomacia contra você.",
5
+ "effects": [
6
+ "Considera a fonte do efeito como aliada",
7
+ "A fonte recebe +10 em testes de Diplomacia contra você"
8
+ ],
9
+ "condition_type": "mental",
10
+ "escalates_to": null
11
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "enjoado",
3
+ "name": "Enjoado",
4
+ "description": "Você está com náusea. Em cada rodada, pode usar apenas uma ação padrão ou uma ação de movimento (não ambas).",
5
+ "effects": ["Pode usar apenas uma ação padrão OU uma ação de movimento por rodada (não ambas)"],
6
+ "condition_type": "metabolismo",
7
+ "escalates_to": null
8
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "enredado",
3
+ "name": "Enredado",
4
+ "description": "Você está preso por teias, cipós ou efeito similar. Fica lento e vulnerável, e sofre –2 em jogadas de ataque.",
5
+ "effects": [
6
+ "Fica lento",
7
+ "Fica vulnerável",
8
+ "-2 em jogadas de ataque"
9
+ ],
10
+ "condition_type": "movimento",
11
+ "escalates_to": null
12
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "envenenado",
3
+ "name": "Envenenado",
4
+ "description": "Você está sob efeito de veneno. Os efeitos variam conforme o veneno específico.",
5
+ "effects": ["Efeitos variam conforme o veneno (veja a descrição do veneno)"],
6
+ "condition_type": "veneno",
7
+ "escalates_to": null
8
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "esmorecido",
3
+ "name": "Esmorecido",
4
+ "description": "Sua mente está seriamente abalada. Sofre –5 em testes de Inteligência, Sabedoria e Carisma.",
5
+ "effects": ["-5 em testes de Inteligência, Sabedoria e Carisma"],
6
+ "condition_type": "mental",
7
+ "escalates_to": null
8
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "id": "exausto",
3
+ "name": "Exausto",
4
+ "description": "Você está exausto de fadiga. Fica debilitado, lento e vulnerável. Se ficar exausto novamente, fica inconsciente.",
5
+ "effects": [
6
+ "Fica debilitado",
7
+ "Fica lento",
8
+ "Fica vulnerável",
9
+ "Se ficar exausto novamente → fica inconsciente"
10
+ ],
11
+ "condition_type": "cansaco",
12
+ "escalates_to": "inconsciente"
13
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "fascinado",
3
+ "name": "Fascinado",
4
+ "description": "Você está hipnotizado por um estímulo. Sofre –5 em testes de Percepção e só pode fazer ações de observar o que o fascina (não pode atacar, se mover ou fazer outras ações).",
5
+ "effects": [
6
+ "-5 em testes de Percepção",
7
+ "Só pode observar a fonte da fascinação",
8
+ "Não pode atacar, se mover ou realizar outras ações"
9
+ ],
10
+ "condition_type": "mental",
11
+ "escalates_to": null
12
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "fatigado",
3
+ "name": "Fatigado",
4
+ "description": "Você está cansado. Fica fraco e vulnerável. Se ficar fatigado novamente, fica exausto.",
5
+ "effects": [
6
+ "Fica fraco",
7
+ "Fica vulnerável",
8
+ "Se ficar fatigado novamente → fica exausto"
9
+ ],
10
+ "condition_type": "cansaco",
11
+ "escalates_to": "exausto"
12
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "fraco",
3
+ "name": "Fraco",
4
+ "description": "Seu corpo está enfraquecido. Sofre –2 em testes de Força, Destreza e Constituição. Se ficar fraco novamente, fica debilitado.",
5
+ "effects": [
6
+ "-2 em testes de Força, Destreza e Constituição",
7
+ "Se ficar fraco novamente → fica debilitado"
8
+ ],
9
+ "condition_type": null,
10
+ "escalates_to": "debilitado"
11
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "frustrado",
3
+ "name": "Frustrado",
4
+ "description": "Você está mentalmente abalado. Sofre –2 em testes de Inteligência, Sabedoria e Carisma. Se ficar frustrado novamente, fica esmorecido.",
5
+ "effects": [
6
+ "-2 em testes de Inteligência, Sabedoria e Carisma",
7
+ "Se ficar frustrado novamente → fica esmorecido"
8
+ ],
9
+ "condition_type": "mental",
10
+ "escalates_to": "esmorecido"
11
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "imovel",
3
+ "name": "Imóvel",
4
+ "description": "Você não consegue se mover. Todos os seus deslocamentos são reduzidos a 0m.",
5
+ "effects": ["Todos os deslocamentos reduzidos a 0m"],
6
+ "condition_type": "movimento",
7
+ "escalates_to": null
8
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "inconsciente",
3
+ "name": "Inconsciente",
4
+ "description": "Você está desmaiado ou dormindo. Fica indefeso e não pode realizar nenhuma ação.",
5
+ "effects": [
6
+ "Fica indefeso",
7
+ "Não pode realizar nenhuma ação"
8
+ ],
9
+ "condition_type": null,
10
+ "escalates_to": null
11
+ }
@@ -0,0 +1,13 @@
1
+ {
2
+ "id": "indefeso",
3
+ "name": "Indefeso",
4
+ "description": "Você está completamente vulnerável. Fica desprevenido, sofre –10 na Defesa, falha automaticamente em Reflexos e pode sofrer um golpe de misericórdia.",
5
+ "effects": [
6
+ "Fica desprevenido",
7
+ "-10 na Defesa",
8
+ "Falha automaticamente em testes de Reflexos",
9
+ "Pode sofrer golpe de misericórdia"
10
+ ],
11
+ "condition_type": null,
12
+ "escalates_to": null
13
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "lento",
3
+ "name": "Lento",
4
+ "description": "Você está se movendo devagar. Seu deslocamento é reduzido à metade e você não pode correr nem fazer investidas.",
5
+ "effects": [
6
+ "Deslocamento reduzido à metade",
7
+ "Não pode correr",
8
+ "Não pode fazer investidas"
9
+ ],
10
+ "condition_type": "movimento",
11
+ "escalates_to": null
12
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "ofuscado",
3
+ "name": "Ofuscado",
4
+ "description": "Sua visão está prejudicada por luz intensa ou escuridão parcial. Sofre –2 em jogadas de ataque e em testes de Percepção.",
5
+ "effects": [
6
+ "-2 em jogadas de ataque",
7
+ "-2 em testes de Percepção"
8
+ ],
9
+ "condition_type": "sentidos",
10
+ "escalates_to": null
11
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "paralisado",
3
+ "name": "Paralisado",
4
+ "description": "Seu corpo está completamente imóvel. Fica imóvel e indefeso. Só pode realizar ações mentais (como ativar habilidades que não exijam movimento).",
5
+ "effects": [
6
+ "Fica imóvel",
7
+ "Fica indefeso",
8
+ "Só pode realizar ações mentais"
9
+ ],
10
+ "condition_type": null,
11
+ "escalates_to": null
12
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "pasmo",
3
+ "name": "Pasmo",
4
+ "description": "Você está atordoado mentalmente e não consegue agir. Perde todas as suas ações neste turno.",
5
+ "effects": ["Perde todas as ações no turno"],
6
+ "condition_type": "mental",
7
+ "escalates_to": null
8
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "petrificado",
3
+ "name": "Petrificado",
4
+ "description": "Você foi transformado em pedra ou material inerte. Fica inconsciente e ganha RD 8 (contra todos os tipos de dano). Efeito do tipo metamorfose.",
5
+ "effects": [
6
+ "Fica inconsciente",
7
+ "Ganha RD 8 (todos os tipos de dano)"
8
+ ],
9
+ "condition_type": "metamorfose",
10
+ "escalates_to": null
11
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "id": "sangrando",
3
+ "name": "Sangrando",
4
+ "description": "Você está com uma ferida aberta e sangrando. No início de cada turno, deve fazer um teste de Constituição (CD 15) ou sofrer 1d6 pontos de dano.",
5
+ "effects": [
6
+ "No início de cada turno: teste de Constituição CD 15 ou sofre 1d6 de dano"
7
+ ],
8
+ "condition_type": "metabolismo",
9
+ "escalates_to": null
10
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "sobrecarregado",
3
+ "name": "Sobrecarregado",
4
+ "description": "Você está carregando peso excessivo. Sofre –5 na penalidade de armadura e seu deslocamento é reduzido em –3m.",
5
+ "effects": [
6
+ "-5 na penalidade de armadura",
7
+ "Deslocamento reduzido em –3m"
8
+ ],
9
+ "condition_type": null,
10
+ "escalates_to": null
11
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "id": "surdo",
3
+ "name": "Surdo",
4
+ "description": "Você não consegue ouvir. Falha automaticamente em testes de Percepção baseados em audição e sofre –5 em testes de Iniciativa. Há chance de falha ao lançar magias com componente verbal.",
5
+ "effects": [
6
+ "Falha automática em testes de Percepção auditiva",
7
+ "-5 em testes de Iniciativa",
8
+ "Chance de falha em magias com componente verbal"
9
+ ],
10
+ "condition_type": "sentidos",
11
+ "escalates_to": null
12
+ }
@@ -0,0 +1,11 @@
1
+ {
2
+ "id": "surpreendido",
3
+ "name": "Surpreendido",
4
+ "description": "Você foi pego de surpresa no início do combate. Fica desprevenido e não pode realizar ações no turno de surpresa.",
5
+ "effects": [
6
+ "Fica desprevenido",
7
+ "Não pode realizar ações no turno de surpresa"
8
+ ],
9
+ "condition_type": null,
10
+ "escalates_to": null
11
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "id": "vulneravel",
3
+ "name": "Vulnerável",
4
+ "description": "Você está com a guarda baixa. Sofre –2 na Defesa.",
5
+ "effects": ["-2 na Defesa"],
6
+ "condition_type": null,
7
+ "escalates_to": null
8
+ }
@@ -0,0 +1,66 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+ require "json"
5
+
6
+ module Tormenta20
7
+ module Models
8
+ # Model representing a Condição (Status Condition) in Tormenta20.
9
+ #
10
+ # Conditions represent temporary states that affect a character's
11
+ # capabilities during play (e.g., Abalado, Cego, Paralisado).
12
+ #
13
+ # @example Find all conditions
14
+ # Tormenta20.condicoes.all
15
+ #
16
+ # @example Find conditions of a specific type
17
+ # Tormenta20.condicoes.by_type("medo")
18
+ #
19
+ # @!attribute [rw] id
20
+ # @return [String] Unique identifier (e.g., "abalado")
21
+ # @!attribute [rw] name
22
+ # @return [String] Condition name in Portuguese (e.g., "Abalado")
23
+ # @!attribute [rw] description
24
+ # @return [String, nil] Full description of the condition
25
+ # @!attribute [rw] effects
26
+ # @return [Array<String>] List of mechanical effects
27
+ # @!attribute [rw] condition_type
28
+ # @return [String, nil] Category (medo, mental, metabolismo, movimento, veneno, sentidos, cansaco, metamorfose)
29
+ # @!attribute [rw] escalates_to
30
+ # @return [String, nil] ID of the condition this escalates into when reapplied
31
+ class Condicao < Base
32
+ self.table_name = "condicoes"
33
+
34
+ TYPES = %w[
35
+ medo
36
+ mental
37
+ metabolismo
38
+ movimento
39
+ veneno
40
+ sentidos
41
+ cansaco
42
+ metamorfose
43
+ ].freeze
44
+
45
+ validates :id, presence: true, uniqueness: true
46
+ validates :name, presence: true
47
+
48
+ scope :by_type, ->(t) { where(condition_type: t) }
49
+ scope :medo, -> { where(condition_type: "medo") }
50
+ scope :mental, -> { where(condition_type: "mental") }
51
+ scope :metabolismo, -> { where(condition_type: "metabolismo") }
52
+ scope :movimento, -> { where(condition_type: "movimento") }
53
+
54
+ def to_h
55
+ {
56
+ id: id,
57
+ name: name,
58
+ description: description,
59
+ effects: effects,
60
+ condition_type: condition_type,
61
+ escalates_to: escalates_to
62
+ }.compact
63
+ end
64
+ end
65
+ end
66
+ end
@@ -19,12 +19,14 @@ module Tormenta20
19
19
  seed_divindades
20
20
  seed_poderes_concedidos
21
21
  seed_poderes_tormenta
22
+ seed_poderes_gerais
22
23
  seed_classes
23
24
  seed_habilidades_de_classe
24
25
  seed_magias
25
26
  seed_equipamentos
26
27
  seed_itens_superiores
27
28
  seed_regras
29
+ seed_condicoes
28
30
 
29
31
  log "Database seeded successfully!"
30
32
  end
@@ -124,6 +126,27 @@ module Tormenta20
124
126
  )
125
127
  end
126
128
 
129
+ def seed_poderes_gerais
130
+ base_dir = File.join(JSON_BASE_PATH, "poderes", "poderes_gerais")
131
+ return unless Dir.exist?(base_dir)
132
+
133
+ Dir.glob(File.join(base_dir, "**", "*.json")).each do |file|
134
+ data = JSON.parse(File.read(file), symbolize_names: true)
135
+ next if data[:id].nil?
136
+
137
+ record = Models::Poder.find_or_initialize_by(id: data[:id])
138
+ record.name = data[:name] || data[:id].to_s.humanize
139
+ record.type = data[:type] || "poder_geral"
140
+ record.description = data[:description]
141
+ record.effects = data[:effects] || []
142
+ record.costs = data[:costs] || []
143
+ record.prerequisites = data[:requirements] || []
144
+ record.save!
145
+ rescue StandardError
146
+ next
147
+ end
148
+ end
149
+
127
150
  def seed_classes
128
151
  import_json_files(
129
152
  "classes",
@@ -153,6 +176,7 @@ module Tormenta20
153
176
  record.class_id = class_id
154
177
  record.description = data[:description]
155
178
  record.effects = data[:effects] || []
179
+ record.costs = data[:costs] || []
156
180
  record.prerequisites = data[:requirements] || []
157
181
  record.save!
158
182
  rescue StandardError
@@ -309,6 +333,14 @@ module Tormenta20
309
333
  )
310
334
  end
311
335
 
336
+ def seed_condicoes
337
+ import_json_files(
338
+ "condicoes",
339
+ Models::Condicao,
340
+ %i[id name description effects condition_type escalates_to]
341
+ )
342
+ end
343
+
312
344
  def import_json_files(subdir, model, attrs, extra_attrs: {}, transform: nil)
313
345
  json_dir = File.join(JSON_BASE_PATH, subdir)
314
346
  return unless Dir.exist?(json_dir)
@@ -332,3 +364,4 @@ module Tormenta20
332
364
  end
333
365
  end
334
366
  end
367
+
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Tormenta20
4
- VERSION = "0.2.6"
4
+ VERSION = "0.2.8"
5
5
  end
@@ -172,6 +172,16 @@ module Tormenta20
172
172
  Models::Raca
173
173
  end
174
174
 
175
+ # Access the Condicao (Status Condition) model for querying conditions.
176
+ #
177
+ # @return [Class<Models::Condicao>] The Condicao model class
178
+ # @example
179
+ # Tormenta20.condicoes.all
180
+ # Tormenta20.condicoes.by_type("medo")
181
+ def condicoes
182
+ Models::Condicao
183
+ end
184
+
175
185
  # @!endgroup
176
186
  end
177
187
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tormenta20
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.6
4
+ version: 0.2.8
5
5
  platform: ruby
6
6
  authors:
7
7
  - LuanGB
@@ -103,6 +103,41 @@ files:
103
103
  - src/json/classes/lutador.json
104
104
  - src/json/classes/nobre.json
105
105
  - src/json/classes/paladino.json
106
+ - src/json/condicoes/abalado.json
107
+ - src/json/condicoes/agarrado.json
108
+ - src/json/condicoes/alquebrado.json
109
+ - src/json/condicoes/apavorado.json
110
+ - src/json/condicoes/atordoado.json
111
+ - src/json/condicoes/caido.json
112
+ - src/json/condicoes/cego.json
113
+ - src/json/condicoes/confuso.json
114
+ - src/json/condicoes/debilitado.json
115
+ - src/json/condicoes/desprevenido.json
116
+ - src/json/condicoes/doente.json
117
+ - src/json/condicoes/em_chamas.json
118
+ - src/json/condicoes/enfeiticado.json
119
+ - src/json/condicoes/enjoado.json
120
+ - src/json/condicoes/enredado.json
121
+ - src/json/condicoes/envenenado.json
122
+ - src/json/condicoes/esmorecido.json
123
+ - src/json/condicoes/exausto.json
124
+ - src/json/condicoes/fascinado.json
125
+ - src/json/condicoes/fatigado.json
126
+ - src/json/condicoes/fraco.json
127
+ - src/json/condicoes/frustrado.json
128
+ - src/json/condicoes/imovel.json
129
+ - src/json/condicoes/inconsciente.json
130
+ - src/json/condicoes/indefeso.json
131
+ - src/json/condicoes/lento.json
132
+ - src/json/condicoes/ofuscado.json
133
+ - src/json/condicoes/paralisado.json
134
+ - src/json/condicoes/pasmo.json
135
+ - src/json/condicoes/petrificado.json
136
+ - src/json/condicoes/sangrando.json
137
+ - src/json/condicoes/sobrecarregado.json
138
+ - src/json/condicoes/surdo.json
139
+ - src/json/condicoes/surpreendido.json
140
+ - src/json/condicoes/vulneravel.json
106
141
  - src/json/deuses/aharadak.json
107
142
  - src/json/deuses/allihanna.json
108
143
  - src/json/deuses/arsenal.json
@@ -1214,6 +1249,7 @@ files:
1214
1249
  - src/ruby/tormenta20/models/armadura.rb
1215
1250
  - src/ruby/tormenta20/models/base.rb
1216
1251
  - src/ruby/tormenta20/models/classe.rb
1252
+ - src/ruby/tormenta20/models/condicao.rb
1217
1253
  - src/ruby/tormenta20/models/divindade.rb
1218
1254
  - src/ruby/tormenta20/models/escudo.rb
1219
1255
  - src/ruby/tormenta20/models/item.rb