tormenta20 0.2.1 → 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,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+ require "json"
5
+
6
+ module Tormenta20
7
+ module Models
8
+ # Model representing an Origem (Character Origin) in Tormenta20.
9
+ #
10
+ # Origins provide starting skills, items, and sometimes unique powers.
11
+ #
12
+ # @example Find origins with unique powers
13
+ # Origem.with_unique_power
14
+ #
15
+ # @example Get origin skills
16
+ # soldado = Origem.find("soldado")
17
+ # soldado.skills # => ["Fortitude", "Luta"]
18
+ #
19
+ # @!attribute [rw] id
20
+ # @return [String] Unique identifier (e.g., "soldado")
21
+ # @!attribute [rw] name
22
+ # @return [String] Origin name (e.g., "Soldado")
23
+ # @!attribute [rw] description
24
+ # @return [String] Origin description
25
+ # @!attribute [rw] items
26
+ # @return [Array] Starting items
27
+ # @!attribute [rw] benefits
28
+ # @return [Hash] Benefits with "skills" and "powers" keys
29
+ # @!attribute [rw] unique_power
30
+ # @return [Hash, nil] Unique power data or nil
31
+ class Origem < Base
32
+ self.table_name = "origens"
33
+
34
+ validates :id, presence: true, uniqueness: true
35
+ validates :name, presence: true
36
+
37
+ # @!method with_unique_power
38
+ # Filter origins that have a unique power.
39
+ # @return [ActiveRecord::Relation<Origem>]
40
+ scope :with_unique_power, -> { where.not(unique_power: nil) }
41
+
42
+ # Get trained skills from this origin.
43
+ #
44
+ # @return [Array<String>] List of skill names
45
+ def skills
46
+ benefits&.dig("skills") || []
47
+ end
48
+
49
+ # Get powers granted by this origin.
50
+ #
51
+ # @return [Array<String>] List of power names
52
+ def powers
53
+ benefits&.dig("powers") || []
54
+ end
55
+
56
+ # Convert origin to a hash representation.
57
+ #
58
+ # @return [Hash] Hash with all origin attributes
59
+ def to_h
60
+ {
61
+ id: id,
62
+ name: name,
63
+ description: description,
64
+ items: items,
65
+ benefits: benefits,
66
+ unique_power: unique_power
67
+ }.compact
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,120 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+ require "json"
5
+
6
+ module Tormenta20
7
+ module Models
8
+ # Model representing a Poder (Power/Ability) in Tormenta20.
9
+ #
10
+ # Powers can be unique origin abilities, deity-granted powers, Tormenta powers, etc.
11
+ #
12
+ # @example Find deity-granted powers
13
+ # Poder.poderes_concedidos
14
+ #
15
+ # @example Find powers by type
16
+ # Poder.by_type("poder_tormenta")
17
+ #
18
+ # @!attribute [rw] id
19
+ # @return [String] Unique identifier
20
+ # @!attribute [rw] name
21
+ # @return [String] Power name
22
+ # @!attribute [rw] type
23
+ # @return [String] Power type (see TYPES constant)
24
+ # @!attribute [rw] description
25
+ # @return [String] Power description
26
+ # @!attribute [rw] effects
27
+ # @return [Array] Power effects
28
+ # @!attribute [rw] prerequisites
29
+ # @return [Array] Prerequisites to acquire this power
30
+ # @!attribute [rw] origin_id
31
+ # @return [String, nil] Associated origin ID (for unique origin powers)
32
+ # @!attribute [rw] deities
33
+ # @return [Array<String>] Deities that grant this power
34
+ class Poder < Base
35
+ self.table_name = "poderes"
36
+ self.inheritance_column = nil
37
+
38
+ # Valid power types.
39
+ #
40
+ # @return [Array<String>] List of valid type values
41
+ TYPES = %w[
42
+ habilidade_unica_origem
43
+ poder_concedido
44
+ poder_tormenta
45
+ poder_classe
46
+ poder_geral
47
+ poder_combate
48
+ poder_destino
49
+ poder_magia
50
+ ].freeze
51
+
52
+ validates :id, presence: true, uniqueness: true
53
+ validates :name, presence: true
54
+ validates :type, presence: true, inclusion: { in: TYPES }
55
+
56
+ # @!group Scopes
57
+
58
+ # @!method habilidades_unicas
59
+ # Filter unique origin abilities.
60
+ # @return [ActiveRecord::Relation<Poder>]
61
+ scope :habilidades_unicas, -> { where(type: "habilidade_unica_origem") }
62
+
63
+ # @!method poderes_concedidos
64
+ # Filter deity-granted powers.
65
+ # @return [ActiveRecord::Relation<Poder>]
66
+ scope :poderes_concedidos, -> { where(type: "poder_concedido") }
67
+
68
+ # @!method poderes_tormenta
69
+ # Filter Tormenta powers.
70
+ # @return [ActiveRecord::Relation<Poder>]
71
+ scope :poderes_tormenta, -> { where(type: "poder_tormenta") }
72
+
73
+ # @!method poderes_classe
74
+ # Filter class powers.
75
+ # @return [ActiveRecord::Relation<Poder>]
76
+ scope :poderes_classe, -> { where(type: "poder_classe") }
77
+
78
+ # @!method poderes_gerais
79
+ # Filter general powers.
80
+ # @return [ActiveRecord::Relation<Poder>]
81
+ scope :poderes_gerais, -> { where(type: "poder_geral") }
82
+
83
+ # @!method by_type(type)
84
+ # Filter powers by type.
85
+ # @param type [String] Power type
86
+ # @return [ActiveRecord::Relation<Poder>]
87
+ scope :by_type, ->(t) { where(type: t) }
88
+
89
+ # @!method by_origin(origin_id)
90
+ # Filter powers by associated origin.
91
+ # @param origin_id [String] Origin ID
92
+ # @return [ActiveRecord::Relation<Poder>]
93
+ scope :by_origin, ->(origin_id) { where(origin_id: origin_id) }
94
+
95
+ # @!method by_deity(deity_id)
96
+ # Filter powers granted by a specific deity.
97
+ # @param deity_id [String] Deity ID
98
+ # @return [ActiveRecord::Relation<Poder>]
99
+ scope :by_deity, ->(deity_id) { where("json_extract(deities, '$') LIKE ?", "%#{deity_id}%") }
100
+
101
+ # @!endgroup
102
+
103
+ # Convert power to a hash representation.
104
+ #
105
+ # @return [Hash] Hash with all power attributes
106
+ def to_h
107
+ {
108
+ id: id,
109
+ name: name,
110
+ type: type,
111
+ description: description,
112
+ effects: effects,
113
+ prerequisites: prerequisites,
114
+ origin_id: origin_id,
115
+ deities: deities
116
+ }.compact
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+ require "json"
5
+
6
+ module Tormenta20
7
+ module Models
8
+ # Model representing a Regra (Rule) in Tormenta20.
9
+ #
10
+ # Rules contain structured data about game mechanics such as
11
+ # skills, conditions, combat rules, and other game systems.
12
+ #
13
+ # @example Find all rules
14
+ # Tormenta20.regras.all
15
+ #
16
+ # @example Find a specific rule
17
+ # Tormenta20.regras.find("pericias")
18
+ #
19
+ # @!attribute [rw] id
20
+ # @return [String] Unique identifier (e.g., "pericias")
21
+ # @!attribute [rw] name
22
+ # @return [String] Rule name in Portuguese
23
+ # @!attribute [rw] description
24
+ # @return [String, nil] Rule description
25
+ # @!attribute [rw] data
26
+ # @return [Hash, Array] Structured rule data (JSON)
27
+ class Regra < Base
28
+ self.table_name = "regras"
29
+
30
+ validates :id, presence: true, uniqueness: true
31
+ validates :name, presence: true
32
+ validates :data, presence: true
33
+
34
+ # Convert the rule to a hash representation.
35
+ #
36
+ # @return [Hash] Hash with all rule attributes (nil values excluded)
37
+ def to_h
38
+ {
39
+ id: id,
40
+ name: name,
41
+ description: description,
42
+ data: data
43
+ }.compact
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,267 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "json"
4
+
5
+ module Tormenta20
6
+ # Handles importing JSON data into the database
7
+ module Seeder
8
+ JSON_BASE_PATH = File.expand_path("../../json", __dir__)
9
+
10
+ class << self
11
+ def seed_all(verbose: false)
12
+ @verbose = verbose
13
+ log "Seeding database..."
14
+
15
+ seed_origens
16
+ seed_poderes_habilidades_unicas
17
+ seed_divindades
18
+ seed_poderes_concedidos
19
+ seed_poderes_tormenta
20
+ seed_classes
21
+ seed_magias
22
+ seed_equipamentos
23
+ seed_itens_superiores
24
+ seed_regras
25
+
26
+ log "Database seeded successfully!"
27
+ end
28
+
29
+ def seeded?
30
+ Models::Origem.count.positive?
31
+ rescue StandardError
32
+ false
33
+ end
34
+
35
+ private
36
+
37
+ def log(message)
38
+ puts message if @verbose
39
+ end
40
+
41
+ def seed_origens
42
+ import_json_files(
43
+ "origens",
44
+ Models::Origem,
45
+ %i[id name description items benefits unique_power]
46
+ )
47
+ end
48
+
49
+ def seed_poderes_habilidades_unicas
50
+ import_json_files(
51
+ "poderes/habilidades_unicas_de_origem",
52
+ Models::Poder,
53
+ %i[id name description effects prerequisites],
54
+ extra_attrs: { type: "habilidade_unica_origem" },
55
+ transform: lambda { |data|
56
+ data[:origin_id] = data.delete(:origin) if data[:origin]
57
+ data
58
+ }
59
+ )
60
+ end
61
+
62
+ def seed_divindades
63
+ import_json_files(
64
+ "deuses",
65
+ Models::Divindade,
66
+ %i[id name title description beliefs_objectives holy_symbol energy
67
+ preferred_weapon devotees granted_powers obligations_restrictions]
68
+ )
69
+ end
70
+
71
+ def seed_poderes_concedidos
72
+ import_json_files(
73
+ "poderes/poderes_concedidos",
74
+ Models::Poder,
75
+ %i[id name description effects prerequisites deities],
76
+ extra_attrs: { type: "poder_concedido" }
77
+ )
78
+ end
79
+
80
+ def seed_poderes_tormenta
81
+ import_json_files(
82
+ "poderes/poderes_da_tormenta",
83
+ Models::Poder,
84
+ %i[id name description effects prerequisites],
85
+ extra_attrs: { type: "poder_tormenta" }
86
+ )
87
+ end
88
+
89
+ def seed_classes
90
+ import_json_files(
91
+ "classes",
92
+ Models::Classe,
93
+ %i[id name hit_points mana_points skills proficiencies abilities powers progression spellcasting]
94
+ )
95
+ end
96
+
97
+ def seed_magias
98
+ json_dir = File.join(JSON_BASE_PATH, "magias")
99
+ return unless Dir.exist?(json_dir)
100
+
101
+ Dir.glob(File.join(json_dir, "*.json")).each do |file|
102
+ data = JSON.parse(File.read(file), symbolize_names: true)
103
+ import_magia(data)
104
+ rescue StandardError
105
+ next
106
+ end
107
+ end
108
+
109
+ def import_magia(data)
110
+ raw_target = data[:target]
111
+ target = if raw_target.is_a?(Hash)
112
+ raw_target
113
+ else
114
+ (raw_target.is_a?(Array) ? raw_target.first || {} : {})
115
+ end
116
+ effect_details = data[:effect_details].is_a?(Hash) ? data[:effect_details] : {}
117
+ resistence = data[:resistence].is_a?(Hash) ? data[:resistence] : {}
118
+ extra_costs = data[:extra_costs].is_a?(Hash) ? data[:extra_costs] : {}
119
+
120
+ Models::Magia.find_or_initialize_by(id: data[:id]).tap do |magia|
121
+ magia.name = data[:name]
122
+ magia.type = data[:type]
123
+ magia.circle = data[:circle]
124
+ magia.school = data[:school]
125
+ magia.execution = data[:execution]
126
+ magia.execution_details = data[:execution_details]
127
+ magia.range = data[:range]
128
+ magia.duration = data[:duration]
129
+ magia.duration_details = data[:duration_details]
130
+ magia.counterspell = data[:counterspell]
131
+ magia.description = data[:description] || ""
132
+
133
+ magia.target_amount = target[:amount]
134
+ magia.target_up_to = if target[:up_to].nil?
135
+ nil
136
+ else
137
+ (target[:up_to] ? 1 : 0)
138
+ end
139
+ magia.target_type = target[:type]
140
+
141
+ magia.effect = data[:effect]
142
+ magia.effect_shape = effect_details[:shape]
143
+ magia.effect_dimention = effect_details[:dimention]
144
+ magia.effect_size = effect_details[:size]
145
+ magia.effect_other_details = effect_details[:other_details]
146
+
147
+ magia.area_effect = data[:area_effect]
148
+ magia.area_effect_details = data[:area_effect_details]
149
+
150
+ magia.resistence_effect = resistence[:effect]
151
+ magia.resistence_skill = resistence[:skill]
152
+
153
+ magia.extra_costs_material_component = extra_costs[:material_component]
154
+ magia.extra_costs_material_cost = extra_costs[:material_component_cost]
155
+ magia.extra_costs_pm_debuff = extra_costs[:pm_debuff]
156
+ magia.extra_costs_pm_sacrifice = extra_costs[:pm_sacrifice]
157
+
158
+ magia.enhancements = data[:enhancements] || []
159
+ magia.effects = data[:effects] || []
160
+
161
+ magia.save!
162
+ end
163
+ end
164
+
165
+ def seed_equipamentos
166
+ seed_armas
167
+ seed_armaduras
168
+ seed_escudos
169
+ seed_itens
170
+ end
171
+
172
+ def seed_armas
173
+ import_json_files(
174
+ "equipamentos/armas",
175
+ Models::Arma,
176
+ %i[id name category price damage damage_type critical range weight properties description]
177
+ )
178
+ end
179
+
180
+ def seed_armaduras
181
+ import_json_files(
182
+ "equipamentos/armaduras",
183
+ Models::Armadura,
184
+ %i[id name category price defense_bonus armor_penalty weight properties description]
185
+ )
186
+ end
187
+
188
+ def seed_escudos
189
+ import_json_files(
190
+ "equipamentos/escudos",
191
+ Models::Escudo,
192
+ %i[id name price defense_bonus armor_penalty weight properties description],
193
+ transform: lambda { |data|
194
+ data[:price] ||= data.delete(:preco)
195
+ data[:defense_bonus] ||= data.delete(:bonus_defesa)
196
+ data[:armor_penalty] ||= data.delete(:penalidade_armadura)
197
+ data[:weight] ||= data.delete(:espacos)
198
+ data
199
+ }
200
+ )
201
+ end
202
+
203
+ def seed_itens
204
+ import_json_files(
205
+ "equipamentos/itens",
206
+ Models::Item,
207
+ %i[id name category price weight description effects]
208
+ )
209
+ end
210
+
211
+ def seed_itens_superiores
212
+ seed_materiais_especiais
213
+ seed_melhorias
214
+ end
215
+
216
+ def seed_materiais_especiais
217
+ import_json_files(
218
+ "itens_superiores/materiais_especiais",
219
+ Models::MaterialEspecial,
220
+ %i[id name description applicable_to price_modifier effects]
221
+ )
222
+ end
223
+
224
+ def seed_melhorias
225
+ import_json_files(
226
+ "itens_superiores/melhorias",
227
+ Models::Melhoria,
228
+ %i[id name description applicable_to price effects]
229
+ )
230
+ end
231
+
232
+ def seed_regras
233
+ import_json_files(
234
+ "regras",
235
+ Models::Regra,
236
+ %i[id name description data],
237
+ transform: lambda { |raw|
238
+ base_keys = %i[id name description]
239
+ data_content = raw.reject { |k, _| base_keys.include?(k) }
240
+ { id: raw[:id], name: raw[:name], description: raw[:description], data: data_content }
241
+ }
242
+ )
243
+ end
244
+
245
+ def import_json_files(subdir, model, attrs, extra_attrs: {}, transform: nil)
246
+ json_dir = File.join(JSON_BASE_PATH, subdir)
247
+ return unless Dir.exist?(json_dir)
248
+
249
+ Dir.glob(File.join(json_dir, "*.json")).each do |file|
250
+ data = JSON.parse(File.read(file), symbolize_names: true)
251
+ data = transform.call(data) if transform
252
+
253
+ record = model.find_or_initialize_by(id: data[:id])
254
+ attrs.each do |attr|
255
+ record.send("#{attr}=", data[attr]) if data.key?(attr)
256
+ end
257
+ extra_attrs.each do |attr, value|
258
+ record.send("#{attr}=", value)
259
+ end
260
+ record.save!
261
+ rescue StandardError
262
+ next
263
+ end
264
+ end
265
+ end
266
+ end
267
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Tormenta20
4
- VERSION = "0.2.1"
4
+ VERSION = "0.2.2"
5
5
  end
@@ -1,12 +1,174 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require 'json'
4
- require 'ostruct'
5
- require 'bundler'
3
+ require "json"
4
+ require "active_record"
5
+ require "sqlite3"
6
6
 
7
- Bundler.setup(:default)
7
+ require_relative "tormenta20/database"
8
8
 
9
- require_relative 'open_struct_json'
10
- Dir[__dir__ + "/tormenta20/*.rb"].each {|file| require file }
9
+ # Load base model first, then other models
10
+ require_relative "tormenta20/models/base"
11
+ Dir["#{__dir__}/tormenta20/models/*.rb"].each { |file| require file unless file.include?("base") }
11
12
 
12
- module Tormenta20; end
13
+ # Load other modules
14
+ Dir["#{__dir__}/tormenta20/*.rb"].each { |file| require file unless file.include?("database") }
15
+
16
+ # Tormenta20 is a Ruby library providing data about the Brazilian TTRPG Tormenta20.
17
+ #
18
+ # It includes a pre-built SQLite database with information about spells, classes,
19
+ # origins, deities, powers, and equipment from the Tormenta20 system.
20
+ #
21
+ # @example Basic usage
22
+ # require 'tormenta20'
23
+ #
24
+ # # Query spells
25
+ # Tormenta20.magias.arcanas.by_circle("3")
26
+ #
27
+ # # Find a specific class
28
+ # Tormenta20.classes.find("guerreiro")
29
+ #
30
+ # @author LuanGB
31
+ # @see https://github.com/LuanGB/tormenta20
32
+ module Tormenta20
33
+ class << self
34
+ # Configure and setup the database connection.
35
+ #
36
+ # @param mode [Symbol] Database mode:
37
+ # - `:builtin` - Use pre-built database (default)
38
+ # - `:build` - Build database on load
39
+ # - `:lazy` - Build database on first use
40
+ # @param db_path [String, nil] Custom path to SQLite database file
41
+ # @return [void]
42
+ #
43
+ # @example Use default builtin database
44
+ # Tormenta20.setup
45
+ #
46
+ # @example Use custom database path
47
+ # Tormenta20.setup(db_path: "/path/to/custom.sqlite3")
48
+ def setup(mode: :builtin, db_path: nil)
49
+ Database.setup(mode: mode, db_path: db_path)
50
+ end
51
+
52
+ # @!group Query Interface
53
+
54
+ # Access the Origem (Origin) model for querying character origins.
55
+ #
56
+ # @return [Class<Models::Origem>] The Origem model class
57
+ # @example
58
+ # Tormenta20.origens.all
59
+ # Tormenta20.origens.with_unique_power
60
+ def origens
61
+ Models::Origem
62
+ end
63
+
64
+ # Access the Poder (Power) model for querying powers and abilities.
65
+ #
66
+ # @return [Class<Models::Poder>] The Poder model class
67
+ # @example
68
+ # Tormenta20.poderes.poderes_concedidos
69
+ # Tormenta20.poderes.by_type("poder_tormenta")
70
+ def poderes
71
+ Models::Poder
72
+ end
73
+
74
+ # Access the Divindade (Deity) model for querying deities.
75
+ #
76
+ # @return [Class<Models::Divindade>] The Divindade model class
77
+ # @example
78
+ # Tormenta20.divindades.energia_positiva
79
+ # Tormenta20.divindades.find("khalmyr")
80
+ def divindades
81
+ Models::Divindade
82
+ end
83
+
84
+ # Access the Classe (Character Class) model for querying classes.
85
+ #
86
+ # @return [Class<Models::Classe>] The Classe model class
87
+ # @example
88
+ # Tormenta20.classes.conjuradores
89
+ # Tormenta20.classes.find("arcanista")
90
+ def classes
91
+ Models::Classe
92
+ end
93
+
94
+ # Access the Magia (Spell) model for querying spells.
95
+ #
96
+ # @return [Class<Models::Magia>] The Magia model class
97
+ # @example
98
+ # Tormenta20.magias.arcanas
99
+ # Tormenta20.magias.by_circle("3").by_school("evoc")
100
+ def magias
101
+ Models::Magia
102
+ end
103
+
104
+ # Access the Arma (Weapon) model for querying weapons.
105
+ #
106
+ # @return [Class<Models::Arma>] The Arma model class
107
+ # @example
108
+ # Tormenta20.armas.simples
109
+ # Tormenta20.armas.ranged
110
+ def armas
111
+ Models::Arma
112
+ end
113
+
114
+ # Access the Armadura (Armor) model for querying armors.
115
+ #
116
+ # @return [Class<Models::Armadura>] The Armadura model class
117
+ # @example
118
+ # Tormenta20.armaduras.leves
119
+ # Tormenta20.armaduras.pesadas
120
+ def armaduras
121
+ Models::Armadura
122
+ end
123
+
124
+ # Access the Escudo (Shield) model for querying shields.
125
+ #
126
+ # @return [Class<Models::Escudo>] The Escudo model class
127
+ # @example
128
+ # Tormenta20.escudos.all
129
+ def escudos
130
+ Models::Escudo
131
+ end
132
+
133
+ # Access the Item model for querying general items.
134
+ #
135
+ # @return [Class<Models::Item>] The Item model class
136
+ # @example
137
+ # Tormenta20.itens.by_category("alquimico")
138
+ def itens
139
+ Models::Item
140
+ end
141
+
142
+ # Access the MaterialEspecial (Special Material) model.
143
+ #
144
+ # @return [Class<Models::MaterialEspecial>] The MaterialEspecial model class
145
+ # @example
146
+ # Tormenta20.materiais_especiais.all
147
+ def materiais_especiais
148
+ Models::MaterialEspecial
149
+ end
150
+
151
+ # Access the Melhoria (Enhancement) model for querying magic enhancements.
152
+ #
153
+ # @return [Class<Models::Melhoria>] The Melhoria model class
154
+ # @example
155
+ # Tormenta20.melhorias.all
156
+ def melhorias
157
+ Models::Melhoria
158
+ end
159
+
160
+ # Access the Regra (Rule) model for querying rules and reference data.
161
+ #
162
+ # @return [Class<Models::Regra>] The Regra model class
163
+ # @example
164
+ # Tormenta20.regras.find("pericias")
165
+ def regras
166
+ Models::Regra
167
+ end
168
+
169
+ # @!endgroup
170
+ end
171
+
172
+ # Auto-setup database when gem is loaded
173
+ setup
174
+ end