tormenta20 0.2.0 → 0.2.2

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 (471) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +27 -0
  3. data/README.md +203 -12
  4. data/Rakefile +9 -0
  5. data/db/schema.sql +382 -0
  6. data/db/seeds.rb +377 -0
  7. data/db/tormenta20.sqlite3 +0 -0
  8. data/docs/armaduras.md +72 -0
  9. data/docs/armas.md +95 -0
  10. data/docs/classes.md +105 -0
  11. data/docs/divindades.md +77 -0
  12. data/docs/escudos.md +49 -0
  13. data/docs/itens.md +59 -0
  14. data/docs/magias.md +157 -0
  15. data/docs/materiais_especiais.md +50 -0
  16. data/docs/melhorias.md +55 -0
  17. data/docs/origens.md +61 -0
  18. data/docs/poderes.md +98 -0
  19. data/docs/regras.md +51 -0
  20. data/examples/database_usage.rb +155 -0
  21. data/src/json/classes/arcanista.json +86 -0
  22. data/src/json/classes/barbaro.json +85 -0
  23. data/src/json/classes/bardo.json +91 -0
  24. data/src/json/classes/bucaneiro.json +96 -0
  25. data/src/json/classes/cacador.json +96 -0
  26. data/src/json/classes/cavaleiro.json +87 -0
  27. data/src/json/classes/clerigo.json +82 -0
  28. data/src/json/classes/druida.json +88 -0
  29. data/src/json/classes/guerreiro.json +90 -0
  30. data/src/json/classes/inventor.json +100 -0
  31. data/src/json/classes/ladino.json +96 -0
  32. data/src/json/classes/lutador.json +90 -0
  33. data/src/json/classes/nobre.json +100 -0
  34. data/src/json/classes/paladino.json +93 -0
  35. data/src/json/deuses/aharadak.json +26 -0
  36. data/src/json/deuses/allihanna.json +26 -0
  37. data/src/json/deuses/arsenal.json +28 -0
  38. data/src/json/deuses/azgher.json +28 -0
  39. data/src/json/deuses/hyninn.json +28 -0
  40. data/src/json/deuses/kallyadranoch.json +28 -0
  41. data/src/json/deuses/khalmyr.json +27 -0
  42. data/src/json/deuses/lena.json +28 -0
  43. data/src/json/deuses/lin_wu.json +28 -0
  44. data/src/json/deuses/marah.json +28 -0
  45. data/src/json/deuses/megalokk.json +28 -0
  46. data/src/json/deuses/nimb.json +27 -0
  47. data/src/json/deuses/oceano.json +26 -0
  48. data/src/json/deuses/sszzaas.json +28 -0
  49. data/src/json/deuses/tanna_toh.json +28 -0
  50. data/src/json/deuses/tenebra.json +26 -0
  51. data/src/json/deuses/thwor.json +27 -0
  52. data/src/json/deuses/thyatis.json +26 -0
  53. data/src/json/deuses/valkaria.json +30 -0
  54. data/src/json/deuses/wynna.json +25 -0
  55. data/src/json/equipamentos/armaduras/leves/armadura_acolchoada.json +15 -0
  56. data/src/json/equipamentos/armaduras/leves/armadura_de_couro.json +13 -0
  57. data/src/json/equipamentos/armaduras/leves/couraca.json +13 -0
  58. data/src/json/equipamentos/armaduras/leves/couro_batido.json +13 -0
  59. data/src/json/equipamentos/armaduras/leves/gibao_de_peles.json +13 -0
  60. data/src/json/equipamentos/armaduras/pesadas/armadura_completa.json +19 -0
  61. data/src/json/equipamentos/armaduras/pesadas/brunea.json +17 -0
  62. data/src/json/equipamentos/armaduras/pesadas/cota_de_malha.json +17 -0
  63. data/src/json/equipamentos/armaduras/pesadas/loriga_segmentada.json +17 -0
  64. data/src/json/equipamentos/armaduras/pesadas/meia_armadura.json +17 -0
  65. data/src/json/equipamentos/armas/exoticas/chicote.json +23 -0
  66. data/src/json/equipamentos/armas/exoticas/corrente_de_espinhos.json +23 -0
  67. data/src/json/equipamentos/armas/exoticas/espada_bastarda.json +19 -0
  68. data/src/json/equipamentos/armas/exoticas/katana.json +19 -0
  69. data/src/json/equipamentos/armas/exoticas/machado_anao.json +19 -0
  70. data/src/json/equipamentos/armas/exoticas/machado_taurico.json +17 -0
  71. data/src/json/equipamentos/armas/exoticas/rede.json +41 -0
  72. data/src/json/equipamentos/armas/fogo/mosquete.json +21 -0
  73. data/src/json/equipamentos/armas/fogo/pistola.json +21 -0
  74. data/src/json/equipamentos/armas/marciais/alabarda.json +17 -0
  75. data/src/json/equipamentos/armas/marciais/alfange.json +17 -0
  76. data/src/json/equipamentos/armas/marciais/arco_longo.json +22 -0
  77. data/src/json/equipamentos/armas/marciais/besta_pesada.json +21 -0
  78. data/src/json/equipamentos/armas/marciais/cimitarra.json +17 -0
  79. data/src/json/equipamentos/armas/marciais/espada_longa.json +17 -0
  80. data/src/json/equipamentos/armas/marciais/florete.json +17 -0
  81. data/src/json/equipamentos/armas/marciais/gadanho.json +17 -0
  82. data/src/json/equipamentos/armas/marciais/lanca_montada.json +20 -0
  83. data/src/json/equipamentos/armas/marciais/machadinha.json +19 -0
  84. data/src/json/equipamentos/armas/marciais/machado_de_batalha.json +17 -0
  85. data/src/json/equipamentos/armas/marciais/machado_de_guerra.json +17 -0
  86. data/src/json/equipamentos/armas/marciais/mangual.json +21 -0
  87. data/src/json/equipamentos/armas/marciais/marreta.json +17 -0
  88. data/src/json/equipamentos/armas/marciais/martelo_de_guerra.json +17 -0
  89. data/src/json/equipamentos/armas/marciais/montante.json +17 -0
  90. data/src/json/equipamentos/armas/marciais/picareta.json +17 -0
  91. data/src/json/equipamentos/armas/marciais/tridente.json +22 -0
  92. data/src/json/equipamentos/armas/simples/adaga.json +21 -0
  93. data/src/json/equipamentos/armas/simples/arco_curto.json +21 -0
  94. data/src/json/equipamentos/armas/simples/azagaia.json +20 -0
  95. data/src/json/equipamentos/armas/simples/besta_leve.json +21 -0
  96. data/src/json/equipamentos/armas/simples/bordao.json +17 -0
  97. data/src/json/equipamentos/armas/simples/clava.json +17 -0
  98. data/src/json/equipamentos/armas/simples/espada_curta.json +17 -0
  99. data/src/json/equipamentos/armas/simples/foice.json +17 -0
  100. data/src/json/equipamentos/armas/simples/funda.json +23 -0
  101. data/src/json/equipamentos/armas/simples/lanca.json +19 -0
  102. data/src/json/equipamentos/armas/simples/maca.json +17 -0
  103. data/src/json/equipamentos/armas/simples/pique.json +17 -0
  104. data/src/json/equipamentos/armas/simples/tacape.json +17 -0
  105. data/src/json/equipamentos/escudos/escudo_leve.json +22 -0
  106. data/src/json/equipamentos/escudos/escudo_pesado.json +22 -0
  107. data/src/json/equipamentos/itens/alimentacao/batata_valkariana.json +14 -0
  108. data/src/json/equipamentos/itens/alimentacao/gorad_quente.json +12 -0
  109. data/src/json/equipamentos/itens/alimentacao/macarrao_de_yuvalin.json +12 -0
  110. data/src/json/equipamentos/itens/alimentacao/prato_do_aventureiro.json +13 -0
  111. data/src/json/equipamentos/itens/alimentacao/racao_de_viagem.json +14 -0
  112. data/src/json/equipamentos/itens/alimentacao/refeicao_comum.json +9 -0
  113. data/src/json/equipamentos/itens/alimentacao/sopa_de_peixe.json +13 -0
  114. data/src/json/equipamentos/itens/alquimicos/catalisadores/baga_de_fogo.json +17 -0
  115. data/src/json/equipamentos/itens/alquimicos/catalisadores/dente_de_dragao.json +17 -0
  116. data/src/json/equipamentos/itens/alquimicos/catalisadores/essencia_abissal.json +22 -0
  117. data/src/json/equipamentos/itens/alquimicos/catalisadores/liquen_lilas.json +18 -0
  118. data/src/json/equipamentos/itens/alquimicos/catalisadores/musgo_purpura.json +18 -0
  119. data/src/json/equipamentos/itens/alquimicos/catalisadores/ossos_de_monstro.json +17 -0
  120. data/src/json/equipamentos/itens/alquimicos/catalisadores/po_de_cristal.json +18 -0
  121. data/src/json/equipamentos/itens/alquimicos/catalisadores/po_de_giz.json +18 -0
  122. data/src/json/equipamentos/itens/alquimicos/catalisadores/ramo_verdejante.json +16 -0
  123. data/src/json/equipamentos/itens/alquimicos/catalisadores/saco_de_sal.json +18 -0
  124. data/src/json/equipamentos/itens/alquimicos/catalisadores/seixo_de_ambar.json +18 -0
  125. data/src/json/equipamentos/itens/alquimicos/catalisadores/terra_de_cemiterio.json +18 -0
  126. data/src/json/equipamentos/itens/alquimicos/preparados/acido.json +19 -0
  127. data/src/json/equipamentos/itens/alquimicos/preparados/balsamo_restaurador.json +16 -0
  128. data/src/json/equipamentos/itens/alquimicos/preparados/bomba.json +30 -0
  129. data/src/json/equipamentos/itens/alquimicos/preparados/cosmetico.json +18 -0
  130. data/src/json/equipamentos/itens/alquimicos/preparados/elixir_do_amor.json +23 -0
  131. data/src/json/equipamentos/itens/alquimicos/preparados/essencia_de_mana.json +16 -0
  132. data/src/json/equipamentos/itens/alquimicos/preparados/fogo_alquimico.json +27 -0
  133. data/src/json/equipamentos/itens/alquimicos/preparados/po_do_desaparecimento.json +18 -0
  134. data/src/json/equipamentos/itens/alquimicos/venenos/beladona.json +22 -0
  135. data/src/json/equipamentos/itens/alquimicos/venenos/bruma_sonolenta.json +21 -0
  136. data/src/json/equipamentos/itens/alquimicos/venenos/cicuta.json +22 -0
  137. data/src/json/equipamentos/itens/alquimicos/venenos/essencia_de_sombra.json +20 -0
  138. data/src/json/equipamentos/itens/alquimicos/venenos/nevoa_toxica.json +22 -0
  139. data/src/json/equipamentos/itens/alquimicos/venenos/peconha_comum.json +24 -0
  140. data/src/json/equipamentos/itens/alquimicos/venenos/peconha_concentrada.json +22 -0
  141. data/src/json/equipamentos/itens/alquimicos/venenos/peconha_potente.json +22 -0
  142. data/src/json/equipamentos/itens/alquimicos/venenos/po_de_lich.json +23 -0
  143. data/src/json/equipamentos/itens/alquimicos/venenos/riso_de_nimb.json +21 -0
  144. data/src/json/equipamentos/itens/animais/alforje.json +11 -0
  145. data/src/json/equipamentos/itens/animais/cao_de_caca.json +18 -0
  146. data/src/json/equipamentos/itens/animais/cavalo.json +20 -0
  147. data/src/json/equipamentos/itens/animais/cavalo_de_guerra.json +17 -0
  148. data/src/json/equipamentos/itens/animais/estabulo.json +10 -0
  149. data/src/json/equipamentos/itens/animais/ponei.json +21 -0
  150. data/src/json/equipamentos/itens/animais/ponei_de_guerra.json +18 -0
  151. data/src/json/equipamentos/itens/animais/trobo.json +14 -0
  152. data/src/json/equipamentos/itens/aventura/agua_benta.json +23 -0
  153. data/src/json/equipamentos/itens/aventura/algemas.json +35 -0
  154. data/src/json/equipamentos/itens/aventura/arpeu.json +18 -0
  155. data/src/json/equipamentos/itens/aventura/bandoleira_de_pocoes.json +15 -0
  156. data/src/json/equipamentos/itens/aventura/barraca.json +14 -0
  157. data/src/json/equipamentos/itens/aventura/corda.json +26 -0
  158. data/src/json/equipamentos/itens/aventura/espelho.json +10 -0
  159. data/src/json/equipamentos/itens/aventura/lampiao.json +19 -0
  160. data/src/json/equipamentos/itens/aventura/mochila.json +12 -0
  161. data/src/json/equipamentos/itens/aventura/mochila_de_aventureiro.json +14 -0
  162. data/src/json/equipamentos/itens/aventura/oleo.json +19 -0
  163. data/src/json/equipamentos/itens/aventura/organizador_de_pergaminhos.json +14 -0
  164. data/src/json/equipamentos/itens/aventura/pe_de_cabra.json +18 -0
  165. data/src/json/equipamentos/itens/aventura/saco_de_dormir.json +13 -0
  166. data/src/json/equipamentos/itens/aventura/simbolo_sagrado.json +15 -0
  167. data/src/json/equipamentos/itens/aventura/tocha.json +28 -0
  168. data/src/json/equipamentos/itens/aventura/vara_de_madeira.json +12 -0
  169. data/src/json/equipamentos/itens/esotericos/bolsa_de_po.json +17 -0
  170. data/src/json/equipamentos/itens/esotericos/cajado_arcano.json +20 -0
  171. data/src/json/equipamentos/itens/esotericos/cetro_elemental.json +22 -0
  172. data/src/json/equipamentos/itens/esotericos/costela_de_lich.json +18 -0
  173. data/src/json/equipamentos/itens/esotericos/dedo_de_ente.json +21 -0
  174. data/src/json/equipamentos/itens/esotericos/luva_de_ferro.json +17 -0
  175. data/src/json/equipamentos/itens/esotericos/medalhao_de_prata.json +16 -0
  176. data/src/json/equipamentos/itens/esotericos/orbe_cristalino.json +15 -0
  177. data/src/json/equipamentos/itens/esotericos/tomo_hermetico.json +17 -0
  178. data/src/json/equipamentos/itens/esotericos/varinha_arcana.json +15 -0
  179. data/src/json/equipamentos/itens/ferramentas/alaude_elfico.json +16 -0
  180. data/src/json/equipamentos/itens/ferramentas/colecao_de_livros.json +16 -0
  181. data/src/json/equipamentos/itens/ferramentas/equipamento_de_viagem.json +19 -0
  182. data/src/json/equipamentos/itens/ferramentas/estojo_de_disfarces.json +18 -0
  183. data/src/json/equipamentos/itens/ferramentas/flauta_mistica.json +17 -0
  184. data/src/json/equipamentos/itens/ferramentas/gazua.json +18 -0
  185. data/src/json/equipamentos/itens/ferramentas/instrumento_musical.json +20 -0
  186. data/src/json/equipamentos/itens/ferramentas/instrumentos_de_oficio.json +21 -0
  187. data/src/json/equipamentos/itens/ferramentas/luneta.json +15 -0
  188. data/src/json/equipamentos/itens/ferramentas/maleta_de_medicamentos.json +17 -0
  189. data/src/json/equipamentos/itens/ferramentas/sela.json +19 -0
  190. data/src/json/equipamentos/itens/ferramentas/tambor_das_profundezas.json +17 -0
  191. data/src/json/equipamentos/itens/servicos/conducao.json +19 -0
  192. data/src/json/equipamentos/itens/servicos/curandeiro.json +9 -0
  193. data/src/json/equipamentos/itens/servicos/estadia.json +42 -0
  194. data/src/json/equipamentos/itens/servicos/magia.json +23 -0
  195. data/src/json/equipamentos/itens/servicos/mensageiro.json +10 -0
  196. data/src/json/equipamentos/itens/veiculos/balao_goblin.json +34 -0
  197. data/src/json/equipamentos/itens/veiculos/canoa.json +18 -0
  198. data/src/json/equipamentos/itens/veiculos/carroca.json +20 -0
  199. data/src/json/equipamentos/itens/veiculos/carruagem.json +21 -0
  200. data/src/json/equipamentos/itens/veiculos/veleiro.json +11 -0
  201. data/src/json/equipamentos/itens/vestuario/andrajos_de_aldeao.json +16 -0
  202. data/src/json/equipamentos/itens/vestuario/bandana.json +14 -0
  203. data/src/json/equipamentos/itens/vestuario/botas_reforcadas.json +15 -0
  204. data/src/json/equipamentos/itens/vestuario/camisa_bufante.json +14 -0
  205. data/src/json/equipamentos/itens/vestuario/capa_esvoacante.json +14 -0
  206. data/src/json/equipamentos/itens/vestuario/capa_pesada.json +14 -0
  207. data/src/json/equipamentos/itens/vestuario/casaco_longo.json +15 -0
  208. data/src/json/equipamentos/itens/vestuario/chapeu_arcano.json +15 -0
  209. data/src/json/equipamentos/itens/vestuario/enfeite_de_elmo.json +15 -0
  210. data/src/json/equipamentos/itens/vestuario/farrapos_de_ermitao.json +16 -0
  211. data/src/json/equipamentos/itens/vestuario/gorro_de_ervas.json +14 -0
  212. data/src/json/equipamentos/itens/vestuario/luva_de_pelica.json +14 -0
  213. data/src/json/equipamentos/itens/vestuario/manopla.json +15 -0
  214. data/src/json/equipamentos/itens/vestuario/manto_camuflado.json +20 -0
  215. data/src/json/equipamentos/itens/vestuario/manto_eclesiastico.json +14 -0
  216. data/src/json/equipamentos/itens/vestuario/robe_mistico.json +14 -0
  217. data/src/json/equipamentos/itens/vestuario/sapatos_de_camurca.json +14 -0
  218. data/src/json/equipamentos/itens/vestuario/tabardo.json +14 -0
  219. data/src/json/equipamentos/itens/vestuario/traje_da_corte.json +19 -0
  220. data/src/json/equipamentos/itens/vestuario/traje_de_viajante.json +13 -0
  221. data/src/json/equipamentos/itens/vestuario/veste_de_seda.json +14 -0
  222. data/src/json/equipamentos/municoes/balas.json +13 -0
  223. data/src/json/equipamentos/municoes/flechas.json +13 -0
  224. data/src/json/equipamentos/municoes/pedras.json +14 -0
  225. data/src/json/equipamentos/municoes/virotes.json +14 -0
  226. data/src/json/itens_superiores/materiais_especiais/aco_rubi.json +44 -0
  227. data/src/json/itens_superiores/materiais_especiais/adamante.json +35 -0
  228. data/src/json/itens_superiores/materiais_especiais/gelo_eterno.json +33 -0
  229. data/src/json/itens_superiores/materiais_especiais/madeira_tollon.json +31 -0
  230. data/src/json/itens_superiores/materiais_especiais/materia_vermelha.json +51 -0
  231. data/src/json/itens_superiores/materiais_especiais/mitral.json +38 -0
  232. data/src/json/itens_superiores/melhorias/armaduras_escudos/ajustada.json +11 -0
  233. data/src/json/itens_superiores/melhorias/armaduras_escudos/delicada.json +15 -0
  234. data/src/json/itens_superiores/melhorias/armaduras_escudos/espinhosa.json +15 -0
  235. data/src/json/itens_superiores/melhorias/armaduras_escudos/espinhoso.json +11 -0
  236. data/src/json/itens_superiores/melhorias/armaduras_escudos/polida.json +13 -0
  237. data/src/json/itens_superiores/melhorias/armaduras_escudos/reforcada.json +13 -0
  238. data/src/json/itens_superiores/melhorias/armaduras_escudos/selada.json +14 -0
  239. data/src/json/itens_superiores/melhorias/armaduras_escudos/sob_medida.json +13 -0
  240. data/src/json/itens_superiores/melhorias/armas/atroz.json +11 -0
  241. data/src/json/itens_superiores/melhorias/armas/certeira.json +11 -0
  242. data/src/json/itens_superiores/melhorias/armas/cruel.json +11 -0
  243. data/src/json/itens_superiores/melhorias/armas/equilibrada.json +11 -0
  244. data/src/json/itens_superiores/melhorias/armas/harmonizada.json +13 -0
  245. data/src/json/itens_superiores/melhorias/armas/injecao_alquimica.json +14 -0
  246. data/src/json/itens_superiores/melhorias/armas/macica.json +12 -0
  247. data/src/json/itens_superiores/melhorias/armas/mira_telescopica.json +16 -0
  248. data/src/json/itens_superiores/melhorias/armas/precisa.json +12 -0
  249. data/src/json/itens_superiores/melhorias/armas/pungente.json +11 -0
  250. data/src/json/itens_superiores/melhorias/esotericos/canalizador.json +11 -0
  251. data/src/json/itens_superiores/melhorias/esotericos/energetico.json +12 -0
  252. data/src/json/itens_superiores/melhorias/esotericos/harmonizado.json +16 -0
  253. data/src/json/itens_superiores/melhorias/esotericos/poderoso.json +11 -0
  254. data/src/json/itens_superiores/melhorias/esotericos/vigilante.json +11 -0
  255. data/src/json/itens_superiores/melhorias/ferramentas_vestuario/aprimorado.json +15 -0
  256. data/src/json/itens_superiores/melhorias/geral/banhado_a_ouro.json +17 -0
  257. data/src/json/itens_superiores/melhorias/geral/cravejado_de_gemas.json +12 -0
  258. data/src/json/itens_superiores/melhorias/geral/discreto.json +13 -0
  259. data/src/json/itens_superiores/melhorias/geral/macabro.json +12 -0
  260. data/src/json/itens_superiores/melhorias/geral/material_especial.json +13 -0
  261. data/src/json/origens/acolito.json +11 -0
  262. data/src/json/origens/amigo_dos_animais.json +11 -0
  263. data/src/json/origens/amnesico.json +10 -0
  264. data/src/json/origens/aristocrata.json +11 -0
  265. data/src/json/origens/artesao.json +11 -0
  266. data/src/json/origens/artista.json +11 -0
  267. data/src/json/origens/assistente_de_laboratorio.json +11 -0
  268. data/src/json/origens/batedor.json +11 -0
  269. data/src/json/origens/capanga.json +11 -0
  270. data/src/json/origens/charlatao.json +11 -0
  271. data/src/json/origens/circense.json +11 -0
  272. data/src/json/origens/criminoso.json +11 -0
  273. data/src/json/origens/curandeiro.json +11 -0
  274. data/src/json/origens/eremita.json +11 -0
  275. data/src/json/origens/escravo.json +11 -0
  276. data/src/json/origens/estudioso.json +11 -0
  277. data/src/json/origens/fazendeiro.json +11 -0
  278. data/src/json/origens/forasteiro.json +11 -0
  279. data/src/json/origens/gladiador.json +11 -0
  280. data/src/json/origens/guarda.json +11 -0
  281. data/src/json/origens/herdeiro.json +11 -0
  282. data/src/json/origens/heroi_campones.json +11 -0
  283. data/src/json/origens/marujo.json +11 -0
  284. data/src/json/origens/mateiro.json +11 -0
  285. data/src/json/origens/membro_de_guilda.json +11 -0
  286. data/src/json/origens/mercador.json +11 -0
  287. data/src/json/origens/minerador.json +11 -0
  288. data/src/json/origens/nomade.json +11 -0
  289. data/src/json/origens/pivete.json +11 -0
  290. data/src/json/origens/refugiado.json +11 -0
  291. data/src/json/origens/seguidor.json +11 -0
  292. data/src/json/origens/selvagem.json +11 -0
  293. data/src/json/origens/soldado.json +11 -0
  294. data/src/json/origens/taverneiro.json +11 -0
  295. data/src/json/origens/trabalhador.json +11 -0
  296. data/src/json/poderes/habilidades_unicas_de_origem/a_prova_de_tudo.json +14 -0
  297. data/src/json/poderes/habilidades_unicas_de_origem/agua_no_feijao.json +14 -0
  298. data/src/json/poderes/habilidades_unicas_de_origem/alpinista_social.json +9 -0
  299. data/src/json/poderes/habilidades_unicas_de_origem/amigo_especial.json +16 -0
  300. data/src/json/poderes/habilidades_unicas_de_origem/antigo_mestre.json +15 -0
  301. data/src/json/poderes/habilidades_unicas_de_origem/busca_interior.json +13 -0
  302. data/src/json/poderes/habilidades_unicas_de_origem/confissao.json +14 -0
  303. data/src/json/poderes/habilidades_unicas_de_origem/coracao_heroico.json +13 -0
  304. data/src/json/poderes/habilidades_unicas_de_origem/cultura_exotica.json +13 -0
  305. data/src/json/poderes/habilidades_unicas_de_origem/desejo_de_liberdade.json +12 -0
  306. data/src/json/poderes/habilidades_unicas_de_origem/detetive.json +14 -0
  307. data/src/json/poderes/habilidades_unicas_de_origem/dom_artistico.json +10 -0
  308. data/src/json/poderes/habilidades_unicas_de_origem/escavador.json +13 -0
  309. data/src/json/poderes/habilidades_unicas_de_origem/esforcado.json +13 -0
  310. data/src/json/poderes/habilidades_unicas_de_origem/esse_cheiro.json +14 -0
  311. data/src/json/poderes/habilidades_unicas_de_origem/estoico.json +16 -0
  312. data/src/json/poderes/habilidades_unicas_de_origem/frutos_do_trabalho.json +19 -0
  313. data/src/json/poderes/habilidades_unicas_de_origem/gororoba.json +12 -0
  314. data/src/json/poderes/habilidades_unicas_de_origem/heranca.json +13 -0
  315. data/src/json/poderes/habilidades_unicas_de_origem/influencia_militar.json +14 -0
  316. data/src/json/poderes/habilidades_unicas_de_origem/lembrancas_graduais.json +14 -0
  317. data/src/json/poderes/habilidades_unicas_de_origem/medico_de_campo.json +12 -0
  318. data/src/json/poderes/habilidades_unicas_de_origem/membro_da_igreja.json +14 -0
  319. data/src/json/poderes/habilidades_unicas_de_origem/mochileiro.json +9 -0
  320. data/src/json/poderes/habilidades_unicas_de_origem/negociacao.json +12 -0
  321. data/src/json/poderes/habilidades_unicas_de_origem/palpite_fundamentado.json +13 -0
  322. data/src/json/poderes/habilidades_unicas_de_origem/pao_e_circo.json +11 -0
  323. data/src/json/poderes/habilidades_unicas_de_origem/passagem_de_navio.json +13 -0
  324. data/src/json/poderes/habilidades_unicas_de_origem/punguista.json +15 -0
  325. data/src/json/poderes/habilidades_unicas_de_origem/quebra_galho.json +14 -0
  326. data/src/json/poderes/habilidades_unicas_de_origem/rede_de_contatos.json +14 -0
  327. data/src/json/poderes/habilidades_unicas_de_origem/sangue_azul.json +12 -0
  328. data/src/json/poderes/habilidades_unicas_de_origem/truque_de_magica.json +14 -0
  329. data/src/json/poderes/habilidades_unicas_de_origem/vendedor_de_carcacas.json +13 -0
  330. data/src/json/poderes/habilidades_unicas_de_origem/vida_rustica.json +13 -0
  331. data/src/json/poderes/poderes_concedidos/afinidade_com_a_tormenta.json +14 -0
  332. data/src/json/poderes/poderes_concedidos/almejar_o_impossivel.json +13 -0
  333. data/src/json/poderes/poderes_concedidos/anfibio.json +13 -0
  334. data/src/json/poderes/poderes_concedidos/apostar_com_o_trapaceiro.json +12 -0
  335. data/src/json/poderes/poderes_concedidos/armas_da_ambicao.json +12 -0
  336. data/src/json/poderes/poderes_concedidos/arsenal_das_profundezas.json +14 -0
  337. data/src/json/poderes/poderes_concedidos/astucia_da_serpente.json +14 -0
  338. data/src/json/poderes/poderes_concedidos/ataque_piedoso.json +13 -0
  339. data/src/json/poderes/poderes_concedidos/aura_de_medo.json +17 -0
  340. data/src/json/poderes/poderes_concedidos/aura_de_paz.json +18 -0
  341. data/src/json/poderes/poderes_concedidos/aura_restauradora.json +13 -0
  342. data/src/json/poderes/poderes_concedidos/bencao_do_mana.json +10 -0
  343. data/src/json/poderes/poderes_concedidos/caricia_sombria.json +26 -0
  344. data/src/json/poderes/poderes_concedidos/centelha_magica.json +13 -0
  345. data/src/json/poderes/poderes_concedidos/compreender_os_ermos.json +17 -0
  346. data/src/json/poderes/poderes_concedidos/conhecimento_enciclopedico.json +13 -0
  347. data/src/json/poderes/poderes_concedidos/conjurar_arma.json +19 -0
  348. data/src/json/poderes/poderes_concedidos/coragem_total.json +11 -0
  349. data/src/json/poderes/poderes_concedidos/cura_gentil.json +10 -0
  350. data/src/json/poderes/poderes_concedidos/curandeira_perfeita.json +15 -0
  351. data/src/json/poderes/poderes_concedidos/dedo_verde.json +14 -0
  352. data/src/json/poderes/poderes_concedidos/descanso_natural.json +10 -0
  353. data/src/json/poderes/poderes_concedidos/dom_da_esperanca.json +15 -0
  354. data/src/json/poderes/poderes_concedidos/dom_da_imortalidade.json +8 -0
  355. data/src/json/poderes/poderes_concedidos/dom_da_profecia.json +6 -0
  356. data/src/json/poderes/poderes_concedidos/dom_da_ressurreicao.json +8 -0
  357. data/src/json/poderes/poderes_concedidos/dom_da_verdade.json +15 -0
  358. data/src/json/poderes/poderes_concedidos/escamas_draconicas.json +13 -0
  359. data/src/json/poderes/poderes_concedidos/escudo_magico.json +12 -0
  360. data/src/json/poderes/poderes_concedidos/espada_justiceira.json +13 -0
  361. data/src/json/poderes/poderes_concedidos/espada_solar.json +16 -0
  362. data/src/json/poderes/poderes_concedidos/extase_da_loucura.json +12 -0
  363. data/src/json/poderes/poderes_concedidos/familiar_ofidico.json +13 -0
  364. data/src/json/poderes/poderes_concedidos/farsa_do_fingidor.json +14 -0
  365. data/src/json/poderes/poderes_concedidos/fe_guerreira.json +20 -0
  366. data/src/json/poderes/poderes_concedidos/forma_de_macaco.json +20 -0
  367. data/src/json/poderes/poderes_concedidos/fulgor_solar.json +18 -0
  368. data/src/json/poderes/poderes_concedidos/furia_divina.json +20 -0
  369. data/src/json/poderes/poderes_concedidos/golpista_divino.json +14 -0
  370. data/src/json/poderes/poderes_concedidos/habitante_do_deserto.json +14 -0
  371. data/src/json/poderes/poderes_concedidos/inimigo_de_tenebra.json +14 -0
  372. data/src/json/poderes/poderes_concedidos/kiai_divino.json +13 -0
  373. data/src/json/poderes/poderes_concedidos/liberdade_divina.json +12 -0
  374. data/src/json/poderes/poderes_concedidos/manto_da_penumbra.json +14 -0
  375. data/src/json/poderes/poderes_concedidos/mente_analitica.json +16 -0
  376. data/src/json/poderes/poderes_concedidos/mente_vazia.json +16 -0
  377. data/src/json/poderes/poderes_concedidos/mestre_dos_mares.json +18 -0
  378. data/src/json/poderes/poderes_concedidos/olhar_amedrontador.json +14 -0
  379. data/src/json/poderes/poderes_concedidos/palavras_de_bondade.json +14 -0
  380. data/src/json/poderes/poderes_concedidos/percepcao_temporal.json +17 -0
  381. data/src/json/poderes/poderes_concedidos/pesquisa_abencoada.json +15 -0
  382. data/src/json/poderes/poderes_concedidos/poder_oculto.json +21 -0
  383. data/src/json/poderes/poderes_concedidos/presas_primordiais.json +23 -0
  384. data/src/json/poderes/poderes_concedidos/presas_venenosas.json +16 -0
  385. data/src/json/poderes/poderes_concedidos/rejeicao_divina.json +13 -0
  386. data/src/json/poderes/poderes_concedidos/reparar_injustica.json +13 -0
  387. data/src/json/poderes/poderes_concedidos/sangue_de_ferro.json +13 -0
  388. data/src/json/poderes/poderes_concedidos/sangue_ofidico.json +14 -0
  389. data/src/json/poderes/poderes_concedidos/servos_do_dragao.json +24 -0
  390. data/src/json/poderes/poderes_concedidos/sopro_do_mar.json +25 -0
  391. data/src/json/poderes/poderes_concedidos/sorte_dos_loucos.json +13 -0
  392. data/src/json/poderes/poderes_concedidos/talento_artistico.json +14 -0
  393. data/src/json/poderes/poderes_concedidos/teurgista_mistico.json +11 -0
  394. data/src/json/poderes/poderes_concedidos/tradicao_de_lin_wu.json +14 -0
  395. data/src/json/poderes/poderes_concedidos/transmissao_da_loucura.json +17 -0
  396. data/src/json/poderes/poderes_concedidos/tropas_duyshidakk.json +24 -0
  397. data/src/json/poderes/poderes_concedidos/urro_divino.json +13 -0
  398. data/src/json/poderes/poderes_concedidos/visao_nas_trevas.json +10 -0
  399. data/src/json/poderes/poderes_concedidos/voz_da_civilizacao.json +10 -0
  400. data/src/json/poderes/poderes_concedidos/voz_da_natureza.json +18 -0
  401. data/src/json/poderes/poderes_concedidos/voz_dos_monstros.json +11 -0
  402. data/src/json/poderes/poderes_concedidos/zumbificar.json +18 -0
  403. data/src/json/poderes/poderes_da_tormenta/anatomia_insana.json +12 -0
  404. data/src/json/poderes/poderes_da_tormenta/antenas.json +18 -0
  405. data/src/json/poderes/poderes_da_tormenta/armamento_aberrante.json +14 -0
  406. data/src/json/poderes/poderes_da_tormenta/articulacoes_flexiveis.json +15 -0
  407. data/src/json/poderes/poderes_da_tormenta/asas_insetoides.json +17 -0
  408. data/src/json/poderes/poderes_da_tormenta/carapaca.json +12 -0
  409. data/src/json/poderes/poderes_da_tormenta/corpo_aberrante.json +13 -0
  410. data/src/json/poderes/poderes_da_tormenta/cuspir_enxame.json +20 -0
  411. data/src/json/poderes/poderes_da_tormenta/dentes_afiados.json +19 -0
  412. data/src/json/poderes/poderes_da_tormenta/desprezar_a_realidade.json +21 -0
  413. data/src/json/poderes/poderes_da_tormenta/empunhadura_rubra.json +13 -0
  414. data/src/json/poderes/poderes_da_tormenta/fome_de_mana.json +11 -0
  415. data/src/json/poderes/poderes_da_tormenta/larva_explosiva.json +17 -0
  416. data/src/json/poderes/poderes_da_tormenta/legiao_aberrante.json +19 -0
  417. data/src/json/poderes/poderes_da_tormenta/maos_membranosas.json +18 -0
  418. data/src/json/poderes/poderes_da_tormenta/membros_estendidos.json +12 -0
  419. data/src/json/poderes/poderes_da_tormenta/membros_extras.json +27 -0
  420. data/src/json/poderes/poderes_da_tormenta/mente_aberrante.json +20 -0
  421. data/src/json/poderes/poderes_da_tormenta/olhos_vermelhos.json +12 -0
  422. data/src/json/poderes/poderes_da_tormenta/pele_corrompida.json +13 -0
  423. data/src/json/poderes/poderes_da_tormenta/sangue_acido.json +13 -0
  424. data/src/json/poderes/poderes_da_tormenta/visco_rubro.json +15 -0
  425. data/src/json/regras/alcances.json +33 -0
  426. data/src/json/regras/carga.json +47 -0
  427. data/src/json/regras/critico.json +32 -0
  428. data/src/json/regras/dinheiro_inicial.json +27 -0
  429. data/src/json/regras/empunhaduras.json +22 -0
  430. data/src/json/regras/habilidades_armas.json +37 -0
  431. data/src/json/regras/itens_superiores.json +19 -0
  432. data/src/json/regras/limites_uso.json +22 -0
  433. data/src/json/regras/moedas.json +32 -0
  434. data/src/json/regras/passos_dano.json +20 -0
  435. data/src/json/regras/proficiencias.json +32 -0
  436. data/src/json/regras/propositos_armas.json +37 -0
  437. data/src/json/regras/tipos_dano.json +25 -0
  438. data/src/json/regras/venenos.json +45 -0
  439. data/src/ruby/tormenta20/database.rb +224 -0
  440. data/src/ruby/tormenta20/models/arma.rb +123 -0
  441. data/src/ruby/tormenta20/models/armadura.rb +96 -0
  442. data/src/ruby/tormenta20/models/base.rb +19 -0
  443. data/src/ruby/tormenta20/models/classe.rb +134 -0
  444. data/src/ruby/tormenta20/models/divindade.rb +98 -0
  445. data/src/ruby/tormenta20/models/escudo.rb +59 -0
  446. data/src/ruby/tormenta20/models/item.rb +61 -0
  447. data/src/ruby/tormenta20/models/magia.rb +226 -0
  448. data/src/ruby/tormenta20/models/material_especial.rb +52 -0
  449. data/src/ruby/tormenta20/models/melhoria.rb +52 -0
  450. data/src/ruby/tormenta20/models/origem.rb +71 -0
  451. data/src/ruby/tormenta20/models/poder.rb +120 -0
  452. data/src/ruby/tormenta20/models/regra.rb +47 -0
  453. data/src/ruby/tormenta20/seeder.rb +267 -0
  454. data/src/ruby/tormenta20/version.rb +1 -1
  455. data/src/ruby/tormenta20.rb +169 -7
  456. data/src/schema/magia.schema.json +277 -0
  457. data/src/schema/tormenta20.sql +433 -0
  458. data/tasks/jsonlint.rb +6 -4
  459. data/tools/pdf_extractor/README.md +171 -0
  460. data/tools/pdf_extractor/__init__.py +17 -0
  461. data/tools/pdf_extractor/pdf_extractor.py +441 -0
  462. data/tools/pdf_extractor/pipeline.py +450 -0
  463. data/tools/pdf_extractor/prompts.py +789 -0
  464. data/tools/pdf_extractor/requirements.txt +4 -0
  465. metadata +488 -12
  466. data/src/ruby/open_struct_json.rb +0 -35
  467. data/src/ruby/tormenta20/classes.rb +0 -0
  468. data/src/ruby/tormenta20/equipment.rb +0 -0
  469. data/src/ruby/tormenta20/magias.rb +0 -35
  470. data/src/ruby/tormenta20/origins.rb +0 -0
  471. data/src/ruby/tormenta20/races.rb +0 -0
@@ -0,0 +1,433 @@
1
+ -- =============================================================================
2
+ -- TORMENTA 20 DATABASE SCHEMA
3
+ -- =============================================================================
4
+ -- Este schema suporta todos os tipos de dados do sistema Tormenta 20
5
+ -- Usa PostgreSQL com JSONB para campos flexíveis de efeitos mecânicos
6
+ -- =============================================================================
7
+
8
+ -- Extensão para UUIDs (opcional, caso queira usar UUIDs como PK)
9
+ -- CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
10
+
11
+ -- =============================================================================
12
+ -- TABELAS PRINCIPAIS
13
+ -- =============================================================================
14
+
15
+ -- -----------------------------------------------------------------------------
16
+ -- ORIGENS (Character Origins)
17
+ -- -----------------------------------------------------------------------------
18
+ CREATE TABLE origens (
19
+ id VARCHAR(100) PRIMARY KEY,
20
+ name VARCHAR(255) NOT NULL,
21
+ description TEXT,
22
+ items JSONB DEFAULT '[]', -- Array de strings com itens iniciais
23
+ benefits JSONB DEFAULT '{}', -- { skills: [], powers: [] }
24
+ unique_power VARCHAR(100), -- Referência ao poder único
25
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
26
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
27
+ );
28
+
29
+ COMMENT ON TABLE origens IS 'Origens de personagem (backgrounds)';
30
+ COMMENT ON COLUMN origens.items IS 'Itens iniciais da origem';
31
+ COMMENT ON COLUMN origens.benefits IS 'Benefícios: perícias e poderes disponíveis';
32
+ COMMENT ON COLUMN origens.unique_power IS 'ID do poder único da origem';
33
+
34
+ -- -----------------------------------------------------------------------------
35
+ -- PODERES (Powers) - Tabela unificada para todos os tipos de poderes
36
+ -- -----------------------------------------------------------------------------
37
+ CREATE TYPE power_type AS ENUM (
38
+ 'habilidade_unica_origem', -- Habilidades únicas de origem
39
+ 'poder_concedido', -- Poderes concedidos por divindades
40
+ 'poder_tormenta', -- Poderes da Tormenta
41
+ 'poder_classe', -- Poderes de classe
42
+ 'poder_geral', -- Poderes gerais
43
+ 'poder_combate', -- Poderes de combate
44
+ 'poder_destino', -- Poderes de destino
45
+ 'poder_magia' -- Poderes de magia
46
+ );
47
+
48
+ CREATE TABLE poderes (
49
+ id VARCHAR(100) PRIMARY KEY,
50
+ name VARCHAR(255) NOT NULL,
51
+ type power_type NOT NULL,
52
+ description TEXT,
53
+ effects JSONB DEFAULT '{}', -- Efeitos mecânicos estruturados
54
+ prerequisites JSONB DEFAULT '[]', -- Pré-requisitos
55
+ origin_id VARCHAR(100), -- Para habilidades únicas de origem
56
+ deities JSONB DEFAULT '[]', -- Para poderes concedidos (array de deity IDs)
57
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
58
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
59
+ );
60
+
61
+ CREATE INDEX idx_poderes_type ON poderes(type);
62
+ CREATE INDEX idx_poderes_origin ON poderes(origin_id) WHERE origin_id IS NOT NULL;
63
+ CREATE INDEX idx_poderes_deities ON poderes USING GIN(deities) WHERE deities != '[]';
64
+
65
+ COMMENT ON TABLE poderes IS 'Todos os tipos de poderes do sistema';
66
+ COMMENT ON COLUMN poderes.effects IS 'Efeitos mecânicos em formato JSON estruturado';
67
+ COMMENT ON COLUMN poderes.deities IS 'Array de IDs de divindades que concedem o poder';
68
+
69
+ -- -----------------------------------------------------------------------------
70
+ -- DIVINDADES (Deities)
71
+ -- -----------------------------------------------------------------------------
72
+ CREATE TYPE energy_type AS ENUM ('positiva', 'negativa', 'qualquer');
73
+
74
+ CREATE TABLE divindades (
75
+ id VARCHAR(100) PRIMARY KEY,
76
+ name VARCHAR(255) NOT NULL,
77
+ title VARCHAR(255), -- Ex: "Deus da Justiça"
78
+ description TEXT,
79
+ beliefs_objectives JSONB DEFAULT '[]', -- Array de strings
80
+ holy_symbol VARCHAR(255),
81
+ energy energy_type NOT NULL DEFAULT 'qualquer',
82
+ preferred_weapon VARCHAR(255),
83
+ devotees JSONB DEFAULT '{}', -- { races: [], classes: [] }
84
+ granted_powers JSONB DEFAULT '[]', -- Array de power IDs
85
+ obligations_restrictions TEXT,
86
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
87
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
88
+ );
89
+
90
+ COMMENT ON TABLE divindades IS 'Deuses do Panteão de Arton';
91
+ COMMENT ON COLUMN divindades.devotees IS 'Raças e classes que podem ser devotos';
92
+ COMMENT ON COLUMN divindades.granted_powers IS 'IDs dos poderes concedidos';
93
+
94
+ -- -----------------------------------------------------------------------------
95
+ -- CLASSES (Character Classes)
96
+ -- -----------------------------------------------------------------------------
97
+ CREATE TABLE classes (
98
+ id VARCHAR(100) PRIMARY KEY,
99
+ name VARCHAR(255) NOT NULL,
100
+ hit_points JSONB NOT NULL, -- { initial: int, per_level: int }
101
+ mana_points JSONB NOT NULL, -- { per_level: int }
102
+ skills JSONB NOT NULL, -- { mandatory: [], choose_amount: int, choose_from: [] }
103
+ proficiencies JSONB NOT NULL, -- { weapons: [], armors: [], shields: bool }
104
+ abilities JSONB DEFAULT '[]', -- Array de ability IDs
105
+ powers JSONB DEFAULT '[]', -- Array de power IDs disponíveis
106
+ progression JSONB DEFAULT '[]', -- Array de { level: int, abilities: [] }
107
+ spellcasting JSONB, -- Configuração de magia (se aplicável)
108
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
109
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
110
+ );
111
+
112
+ COMMENT ON TABLE classes IS 'Classes de personagem';
113
+ COMMENT ON COLUMN classes.progression IS 'Progressão de habilidades por nível';
114
+
115
+ -- -----------------------------------------------------------------------------
116
+ -- MAGIAS (Spells)
117
+ -- -----------------------------------------------------------------------------
118
+ CREATE TYPE spell_type AS ENUM ('arcana', 'divina', 'universal');
119
+ CREATE TYPE spell_school AS ENUM ('abjur', 'adiv', 'conv', 'encan', 'evoc', 'ilusao', 'necro', 'trans');
120
+
121
+ CREATE TABLE magias (
122
+ id VARCHAR(100) PRIMARY KEY,
123
+ name VARCHAR(255) NOT NULL,
124
+ type spell_type NOT NULL,
125
+ circle SMALLINT NOT NULL CHECK (circle >= 1 AND circle <= 5),
126
+ school spell_school NOT NULL,
127
+ execution VARCHAR(50) NOT NULL, -- padrão, completa, reação, livre
128
+ execution_details TEXT,
129
+ range VARCHAR(100),
130
+ target JSONB, -- { amount, up_to, type }
131
+ effect VARCHAR(50), -- area, alvo, etc.
132
+ effect_details JSONB, -- { shape, dimension, size, etc. }
133
+ duration VARCHAR(100),
134
+ duration_details TEXT,
135
+ resistance JSONB, -- { effect, skill }
136
+ extra_costs TEXT,
137
+ description TEXT NOT NULL,
138
+ enhancements JSONB DEFAULT '[]', -- Array de aprimoramentos
139
+ effects JSONB DEFAULT '[]', -- Efeitos mecânicos
140
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
141
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
142
+ );
143
+
144
+ CREATE INDEX idx_magias_type ON magias(type);
145
+ CREATE INDEX idx_magias_circle ON magias(circle);
146
+ CREATE INDEX idx_magias_school ON magias(school);
147
+
148
+ COMMENT ON TABLE magias IS 'Magias arcanas e divinas';
149
+ COMMENT ON COLUMN magias.enhancements IS 'Aprimoramentos disponíveis para a magia';
150
+
151
+ -- -----------------------------------------------------------------------------
152
+ -- EQUIPAMENTOS - ARMAS (Weapons)
153
+ -- -----------------------------------------------------------------------------
154
+ CREATE TYPE weapon_category AS ENUM ('simples', 'marciais', 'exoticas', 'fogo');
155
+ CREATE TYPE damage_type AS ENUM ('corte', 'perfuracao', 'impacto', 'fogo', 'frio', 'eletricidade', 'acido', 'trevas', 'luz', 'psiquico');
156
+
157
+ CREATE TABLE armas (
158
+ id VARCHAR(100) PRIMARY KEY,
159
+ name VARCHAR(255) NOT NULL,
160
+ category weapon_category NOT NULL,
161
+ price INTEGER, -- Preço em T$
162
+ damage VARCHAR(20), -- Ex: "1d8", "2d6"
163
+ damage_type damage_type,
164
+ critical VARCHAR(20), -- Ex: "19/x2", "x3"
165
+ range VARCHAR(50), -- curto, medio, longo ou NULL
166
+ weight DECIMAL(10,2), -- Peso em kg
167
+ properties JSONB DEFAULT '[]', -- Propriedades especiais (array)
168
+ description TEXT,
169
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
170
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
171
+ );
172
+
173
+ CREATE INDEX idx_armas_category ON armas(category);
174
+
175
+ COMMENT ON TABLE armas IS 'Armas do sistema';
176
+
177
+ -- -----------------------------------------------------------------------------
178
+ -- EQUIPAMENTOS - ARMADURAS (Armors)
179
+ -- -----------------------------------------------------------------------------
180
+ CREATE TYPE armor_category AS ENUM ('leve', 'pesada');
181
+
182
+ CREATE TABLE armaduras (
183
+ id VARCHAR(100) PRIMARY KEY,
184
+ name VARCHAR(255) NOT NULL,
185
+ category armor_category NOT NULL,
186
+ price INTEGER,
187
+ defense_bonus INTEGER NOT NULL, -- Bônus de defesa
188
+ armor_penalty INTEGER DEFAULT 0, -- Penalidade de armadura
189
+ weight DECIMAL(10,2),
190
+ properties JSONB DEFAULT '[]',
191
+ description TEXT,
192
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
193
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
194
+ );
195
+
196
+ COMMENT ON TABLE armaduras IS 'Armaduras do sistema';
197
+
198
+ -- -----------------------------------------------------------------------------
199
+ -- EQUIPAMENTOS - ESCUDOS (Shields)
200
+ -- -----------------------------------------------------------------------------
201
+ CREATE TABLE escudos (
202
+ id VARCHAR(100) PRIMARY KEY,
203
+ name VARCHAR(255) NOT NULL,
204
+ price INTEGER,
205
+ defense_bonus INTEGER NOT NULL,
206
+ armor_penalty INTEGER DEFAULT 0,
207
+ weight DECIMAL(10,2),
208
+ properties JSONB DEFAULT '[]',
209
+ description TEXT,
210
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
211
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
212
+ );
213
+
214
+ COMMENT ON TABLE escudos IS 'Escudos do sistema';
215
+
216
+ -- -----------------------------------------------------------------------------
217
+ -- EQUIPAMENTOS - ITENS GERAIS (General Items)
218
+ -- -----------------------------------------------------------------------------
219
+ CREATE TABLE itens (
220
+ id VARCHAR(100) PRIMARY KEY,
221
+ name VARCHAR(255) NOT NULL,
222
+ category VARCHAR(100), -- Categoria do item
223
+ price INTEGER,
224
+ weight DECIMAL(10,2),
225
+ description TEXT,
226
+ effects JSONB DEFAULT '{}',
227
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
228
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
229
+ );
230
+
231
+ COMMENT ON TABLE itens IS 'Itens gerais (equipamentos, ferramentas, etc.)';
232
+
233
+ -- -----------------------------------------------------------------------------
234
+ -- ITENS SUPERIORES - MATERIAIS ESPECIAIS (Special Materials)
235
+ -- -----------------------------------------------------------------------------
236
+ CREATE TABLE materiais_especiais (
237
+ id VARCHAR(100) PRIMARY KEY,
238
+ name VARCHAR(255) NOT NULL,
239
+ description TEXT,
240
+ applicable_to JSONB DEFAULT '[]', -- Tipos de itens aplicáveis
241
+ price_modifier JSONB, -- Modificador de preço
242
+ effects JSONB DEFAULT '{}',
243
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
244
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
245
+ );
246
+
247
+ COMMENT ON TABLE materiais_especiais IS 'Materiais especiais para itens';
248
+
249
+ -- -----------------------------------------------------------------------------
250
+ -- ITENS SUPERIORES - MELHORIAS (Enhancements)
251
+ -- -----------------------------------------------------------------------------
252
+ CREATE TABLE melhorias (
253
+ id VARCHAR(100) PRIMARY KEY,
254
+ name VARCHAR(255) NOT NULL,
255
+ description TEXT,
256
+ applicable_to JSONB DEFAULT '[]',
257
+ price INTEGER,
258
+ effects JSONB DEFAULT '{}',
259
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
260
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
261
+ );
262
+
263
+ COMMENT ON TABLE melhorias IS 'Melhorias mágicas para itens';
264
+
265
+ -- -----------------------------------------------------------------------------
266
+ -- REGRAS (Rules/Reference Data)
267
+ -- -----------------------------------------------------------------------------
268
+ CREATE TABLE regras (
269
+ id VARCHAR(100) PRIMARY KEY,
270
+ name VARCHAR(255) NOT NULL,
271
+ description TEXT,
272
+ data JSONB NOT NULL, -- Dados estruturados da regra
273
+ created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
274
+ updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
275
+ );
276
+
277
+ COMMENT ON TABLE regras IS 'Regras e dados de referência do sistema';
278
+
279
+ -- =============================================================================
280
+ -- TABELAS DE RELACIONAMENTO (Junction Tables)
281
+ -- =============================================================================
282
+
283
+ -- Relacionamento entre divindades e poderes concedidos
284
+ CREATE TABLE divindade_poderes (
285
+ divindade_id VARCHAR(100) REFERENCES divindades(id) ON DELETE CASCADE,
286
+ poder_id VARCHAR(100) REFERENCES poderes(id) ON DELETE CASCADE,
287
+ PRIMARY KEY (divindade_id, poder_id)
288
+ );
289
+
290
+ -- Relacionamento entre classes e poderes disponíveis
291
+ CREATE TABLE classe_poderes (
292
+ classe_id VARCHAR(100) REFERENCES classes(id) ON DELETE CASCADE,
293
+ poder_id VARCHAR(100) REFERENCES poderes(id) ON DELETE CASCADE,
294
+ PRIMARY KEY (classe_id, poder_id)
295
+ );
296
+
297
+ -- Relacionamento entre classes e magias (para classes conjuradoras)
298
+ CREATE TABLE classe_magias (
299
+ classe_id VARCHAR(100) REFERENCES classes(id) ON DELETE CASCADE,
300
+ magia_id VARCHAR(100) REFERENCES magias(id) ON DELETE CASCADE,
301
+ circle_available SMALLINT, -- Círculo em que a magia fica disponível
302
+ PRIMARY KEY (classe_id, magia_id)
303
+ );
304
+
305
+ -- =============================================================================
306
+ -- VIEWS ÚTEIS
307
+ -- =============================================================================
308
+
309
+ -- View de poderes concedidos com suas divindades
310
+ CREATE VIEW v_poderes_concedidos AS
311
+ SELECT
312
+ p.id,
313
+ p.name,
314
+ p.description,
315
+ p.effects,
316
+ p.prerequisites,
317
+ ARRAY_AGG(d.name ORDER BY d.name) as divindades_nomes,
318
+ p.deities as divindades_ids
319
+ FROM poderes p
320
+ LEFT JOIN divindades d ON d.id = ANY(
321
+ SELECT jsonb_array_elements_text(p.deities)
322
+ )
323
+ WHERE p.type = 'poder_concedido'
324
+ GROUP BY p.id, p.name, p.description, p.effects, p.prerequisites, p.deities;
325
+
326
+ -- View de origens com seus poderes únicos
327
+ CREATE VIEW v_origens_completas AS
328
+ SELECT
329
+ o.id,
330
+ o.name,
331
+ o.description,
332
+ o.items,
333
+ o.benefits,
334
+ p.name as unique_power_name,
335
+ p.description as unique_power_description,
336
+ p.effects as unique_power_effects
337
+ FROM origens o
338
+ LEFT JOIN poderes p ON p.id = o.unique_power;
339
+
340
+ -- View de divindades com seus poderes
341
+ CREATE VIEW v_divindades_completas AS
342
+ SELECT
343
+ d.id,
344
+ d.name,
345
+ d.title,
346
+ d.description,
347
+ d.beliefs_objectives,
348
+ d.holy_symbol,
349
+ d.energy,
350
+ d.preferred_weapon,
351
+ d.devotees,
352
+ d.obligations_restrictions,
353
+ ARRAY_AGG(
354
+ jsonb_build_object(
355
+ 'id', p.id,
356
+ 'name', p.name,
357
+ 'description', p.description
358
+ ) ORDER BY p.name
359
+ ) FILTER (WHERE p.id IS NOT NULL) as poderes
360
+ FROM divindades d
361
+ LEFT JOIN poderes p ON p.id = ANY(
362
+ SELECT jsonb_array_elements_text(d.granted_powers)
363
+ )
364
+ GROUP BY d.id;
365
+
366
+ -- =============================================================================
367
+ -- FUNÇÕES AUXILIARES
368
+ -- =============================================================================
369
+
370
+ -- Função para atualizar timestamp de updated_at
371
+ CREATE OR REPLACE FUNCTION update_updated_at_column()
372
+ RETURNS TRIGGER AS $$
373
+ BEGIN
374
+ NEW.updated_at = CURRENT_TIMESTAMP;
375
+ RETURN NEW;
376
+ END;
377
+ $$ language 'plpgsql';
378
+
379
+ -- Triggers para atualização automática de updated_at
380
+ CREATE TRIGGER update_origens_updated_at BEFORE UPDATE ON origens
381
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
382
+
383
+ CREATE TRIGGER update_poderes_updated_at BEFORE UPDATE ON poderes
384
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
385
+
386
+ CREATE TRIGGER update_divindades_updated_at BEFORE UPDATE ON divindades
387
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
388
+
389
+ CREATE TRIGGER update_classes_updated_at BEFORE UPDATE ON classes
390
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
391
+
392
+ CREATE TRIGGER update_magias_updated_at BEFORE UPDATE ON magias
393
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
394
+
395
+ CREATE TRIGGER update_armas_updated_at BEFORE UPDATE ON armas
396
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
397
+
398
+ CREATE TRIGGER update_armaduras_updated_at BEFORE UPDATE ON armaduras
399
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
400
+
401
+ CREATE TRIGGER update_escudos_updated_at BEFORE UPDATE ON escudos
402
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
403
+
404
+ CREATE TRIGGER update_itens_updated_at BEFORE UPDATE ON itens
405
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
406
+
407
+ CREATE TRIGGER update_materiais_especiais_updated_at BEFORE UPDATE ON materiais_especiais
408
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
409
+
410
+ CREATE TRIGGER update_melhorias_updated_at BEFORE UPDATE ON melhorias
411
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
412
+
413
+ CREATE TRIGGER update_regras_updated_at BEFORE UPDATE ON regras
414
+ FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
415
+
416
+ -- =============================================================================
417
+ -- ÍNDICES ADICIONAIS PARA PERFORMANCE
418
+ -- =============================================================================
419
+
420
+ -- Índices GIN para busca em campos JSONB
421
+ CREATE INDEX idx_origens_benefits ON origens USING GIN(benefits);
422
+ CREATE INDEX idx_poderes_effects ON poderes USING GIN(effects);
423
+ CREATE INDEX idx_divindades_devotees ON divindades USING GIN(devotees);
424
+ CREATE INDEX idx_magias_effects ON magias USING GIN(effects);
425
+ CREATE INDEX idx_magias_enhancements ON magias USING GIN(enhancements);
426
+
427
+ -- Índices para busca textual
428
+ CREATE INDEX idx_origens_name ON origens(name);
429
+ CREATE INDEX idx_poderes_name ON poderes(name);
430
+ CREATE INDEX idx_divindades_name ON divindades(name);
431
+ CREATE INDEX idx_classes_name ON classes(name);
432
+ CREATE INDEX idx_magias_name ON magias(name);
433
+ CREATE INDEX idx_armas_name ON armas(name);
data/tasks/jsonlint.rb CHANGED
@@ -1,6 +1,8 @@
1
- require 'jsonlint/rake_task'
1
+ # frozen_string_literal: true
2
+
3
+ require "jsonlint/rake_task"
2
4
  JsonLint::RakeTask.new do |t|
3
- t.paths = %w(
5
+ t.paths = %w[
4
6
  spec/**/*.json
5
- )
6
- end
7
+ ]
8
+ end
@@ -0,0 +1,171 @@
1
+ # PDF Extractor - Tormenta 20
2
+
3
+ Pipeline para extrair dados estruturados do PDF do Tormenta 20 e convertê-los em JSON usando um modelo LLM local (Ollama).
4
+
5
+ ## Requisitos
6
+
7
+ ### Sistema
8
+ - Python 3.10+
9
+ - GPU com 12GB+ VRAM (recomendado) ou CPU com 32GB+ RAM
10
+
11
+ ### Ollama
12
+ ```bash
13
+ # Instalar Ollama
14
+ curl -fsSL https://ollama.com/install.sh | sh
15
+
16
+ # Baixar modelo recomendado
17
+ ollama pull mistral
18
+ # ou
19
+ ollama pull llama3
20
+ ```
21
+
22
+ ### Dependências Python
23
+ ```bash
24
+ cd tools/pdf_extractor
25
+ pip install -r requirements.txt
26
+ ```
27
+
28
+ ## Uso
29
+
30
+ ### 1. Listar seções disponíveis no PDF
31
+
32
+ ```bash
33
+ python pdf_extractor.py tormenta20.pdf --list-sections
34
+ ```
35
+
36
+ Saída esperada:
37
+ ```
38
+ Seções encontradas no índice:
39
+ ============================================================
40
+ racas: páginas 18-31 (Raças)
41
+ classes: páginas 32-84 (Classes)
42
+ origens: páginas 85-95 (Origens)
43
+ deuses: páginas 96-105 (Deuses)
44
+ ...
45
+ ```
46
+
47
+ ### 2. Extrair entidades (dry-run)
48
+
49
+ Veja quais entidades serão extraídas sem processá-las:
50
+
51
+ ```bash
52
+ python pipeline.py tormenta20.pdf racas racas --dry-run
53
+ ```
54
+
55
+ ### 3. Extrair e gerar JSONs
56
+
57
+ ```bash
58
+ # Extrair todas as raças
59
+ python pipeline.py tormenta20.pdf racas racas
60
+
61
+ # Extrair classes com modelo específico
62
+ python pipeline.py tormenta20.pdf classes classes --model llama3
63
+
64
+ # Especificar diretório de saída
65
+ python pipeline.py tormenta20.pdf magias magias --output-dir ../../src/json/magias
66
+ ```
67
+
68
+ ## Tipos de Entidade Disponíveis
69
+
70
+ | Tipo | Descrição | Páginas (aprox.) |
71
+ |------|-----------|------------------|
72
+ | `racas` | Raças jogáveis | 18-31 |
73
+ | `classes` | Classes de personagem | 32-84 |
74
+ | `origens` | Origens de personagem | 85-95 |
75
+ | `divindades` | Deuses do panteão | 96-105 |
76
+ | `pericias` | Perícias | 114-123 |
77
+ | `poderes` | Poderes gerais | 124-137 |
78
+ | `poderes_combate` | Poderes de combate | 124-128 |
79
+ | `poderes_destino` | Poderes de destino | 129-130 |
80
+ | `poderes_magia` | Poderes de magia | 131 |
81
+ | `poderes_concedidos` | Poderes concedidos (deuses) | 132-135 |
82
+ | `poderes_tormenta` | Poderes da Tormenta | 136-137 |
83
+ | `armas` | Armas | 142-151 |
84
+ | `armaduras` | Armaduras e escudos | 152-154 |
85
+ | `itens_gerais` | Itens gerais | 155-163 |
86
+ | `itens_superiores` | Itens superiores | 164-167 |
87
+ | `magias` | Magias | 178-211 |
88
+ | `criaturas` | Criaturas/monstros | 282-316 |
89
+ | `perigos` | Perigos e armadilhas | 317-321 |
90
+ | `tesouros` | Tesouros | 327-332 |
91
+ | `itens_magicos_armas` | Armas mágicas | 335-337 |
92
+ | `itens_magicos_armaduras` | Armaduras mágicas | 338-340 |
93
+ | `pocoes_pergaminhos` | Poções e pergaminhos | 341 |
94
+ | `acessorios` | Acessórios mágicos | 342-345 |
95
+ | `artefatos` | Artefatos | 346-349 |
96
+ | `condicoes` | Condições | 394 |
97
+
98
+ ## Estrutura de Saída
99
+
100
+ Os JSONs são salvos em `src/json/<tipo>/` por padrão:
101
+
102
+ ```
103
+ src/json/
104
+ ├── racas/
105
+ │ ├── humano.json
106
+ │ ├── anao.json
107
+ │ └── ...
108
+ ├── classes/
109
+ │ ├── arcanista.json
110
+ │ └── ...
111
+ └── ...
112
+ ```
113
+
114
+ ## Modelos Recomendados
115
+
116
+ | Modelo | VRAM | Qualidade | Velocidade |
117
+ |--------|------|-----------|------------|
118
+ | `mistral` | ~10GB | Excelente | Rápido |
119
+ | `llama3` | ~10GB | Excelente | Rápido |
120
+ | `mixtral` | ~32GB | Superior | Médio |
121
+ | `qwen2.5:14b` | ~11GB | Muito boa | Médio |
122
+
123
+ ## Troubleshooting
124
+
125
+ ### Ollama não está rodando
126
+ ```bash
127
+ ollama serve
128
+ ```
129
+
130
+ ### Modelo não instalado
131
+ ```bash
132
+ ollama pull mistral
133
+ ```
134
+
135
+ ### Memória insuficiente
136
+ Use um modelo menor ou quantização:
137
+ ```bash
138
+ ollama pull mistral:7b-q4_0
139
+ ```
140
+
141
+ ### JSON mal formatado
142
+ O pipeline tenta extrair JSON mesmo de respostas malformadas. Se falhar, a entidade será listada nos erros do relatório final. Você pode:
143
+ 1. Processar novamente apenas as entidades que falharam
144
+ 2. Ajustar o prompt em `prompts.py`
145
+ 3. Criar o JSON manualmente
146
+
147
+ ## Uso Programático
148
+
149
+ ```python
150
+ from pdf_extractor import extract_entities, list_available_sections
151
+ from pipeline import run_pipeline, LLMClient
152
+
153
+ # Listar seções
154
+ sections = list_available_sections("tormenta20.pdf")
155
+
156
+ # Extrair entidades de uma seção
157
+ entities = extract_entities("tormenta20.pdf", "racas", "racas")
158
+
159
+ # Executar pipeline completo
160
+ stats = run_pipeline(
161
+ pdf_path="tormenta20.pdf",
162
+ section="racas",
163
+ entity_type="racas",
164
+ model="mistral",
165
+ output_dir="./output"
166
+ )
167
+ ```
168
+
169
+ ## Contribuindo
170
+
171
+ Se encontrar padrões de extração que não funcionam bem, ajuste os regex em `ENTITY_PATTERNS` no arquivo `pdf_extractor.py`.
@@ -0,0 +1,17 @@
1
+ """
2
+ Ferramentas para extração de dados do PDF do Tormenta 20.
3
+ """
4
+
5
+ from .pdf_extractor import PDFExtractor, extract_entities, list_available_sections
6
+ from .prompts import get_prompt, PROMPTS
7
+ from .pipeline import run_pipeline, LLMClient
8
+
9
+ __all__ = [
10
+ "PDFExtractor",
11
+ "extract_entities",
12
+ "list_available_sections",
13
+ "get_prompt",
14
+ "PROMPTS",
15
+ "run_pipeline",
16
+ "LLMClient"
17
+ ]