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
data/db/seeds.rb ADDED
@@ -0,0 +1,377 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "../src/ruby/tormenta20"
4
+ require "json"
5
+
6
+ # Seed script to import JSON data into SQLite database
7
+
8
+ module Tormenta20
9
+ # Seeds module for importing JSON data into the SQLite database.
10
+ #
11
+ # This module provides methods to import all Tormenta20 game data
12
+ # from JSON files into the database.
13
+ #
14
+ # @example Import all data
15
+ # Tormenta20::Seeds.import_all
16
+ #
17
+ # @example Clear and reimport
18
+ # Tormenta20::Seeds.clear_all
19
+ # Tormenta20::Seeds.import_all
20
+ module Seeds
21
+ JSON_BASE_PATH = File.expand_path("../src/json", __dir__)
22
+
23
+ class << self
24
+ def import_all
25
+ puts "Starting data import..."
26
+ puts "=" * 60
27
+
28
+ import_origens
29
+ import_poderes_habilidades_unicas
30
+ import_divindades
31
+ import_poderes_concedidos
32
+ import_poderes_tormenta
33
+ import_classes
34
+ import_magias
35
+ import_equipamentos
36
+ import_itens_superiores
37
+ import_regras
38
+
39
+ puts "=" * 60
40
+ puts "Data import completed!"
41
+ print_summary
42
+ end
43
+
44
+ # =======================================================================
45
+ # ORIGENS
46
+ # =======================================================================
47
+ def import_origens
48
+ import_json_files(
49
+ "origens",
50
+ Models::Origem,
51
+ %i[id name description items benefits unique_power]
52
+ )
53
+ end
54
+
55
+ # =======================================================================
56
+ # PODERES - HABILIDADES ÚNICAS DE ORIGEM
57
+ # =======================================================================
58
+ def import_poderes_habilidades_unicas
59
+ import_json_files(
60
+ "poderes/habilidades_unicas_de_origem",
61
+ Models::Poder,
62
+ %i[id name description effects prerequisites],
63
+ extra_attrs: { type: "habilidade_unica_origem" },
64
+ transform: lambda { |data|
65
+ data[:origin_id] = data.delete(:origin) if data[:origin]
66
+ data
67
+ }
68
+ )
69
+ end
70
+
71
+ # =======================================================================
72
+ # DIVINDADES
73
+ # =======================================================================
74
+ def import_divindades
75
+ import_json_files(
76
+ "deuses",
77
+ Models::Divindade,
78
+ %i[id name title description beliefs_objectives holy_symbol energy
79
+ preferred_weapon devotees granted_powers obligations_restrictions]
80
+ )
81
+ end
82
+
83
+ # =======================================================================
84
+ # PODERES CONCEDIDOS
85
+ # =======================================================================
86
+ def import_poderes_concedidos
87
+ import_json_files(
88
+ "poderes/poderes_concedidos",
89
+ Models::Poder,
90
+ %i[id name description effects prerequisites deities],
91
+ extra_attrs: { type: "poder_concedido" }
92
+ )
93
+ end
94
+
95
+ # =======================================================================
96
+ # PODERES DA TORMENTA
97
+ # =======================================================================
98
+ def import_poderes_tormenta
99
+ import_json_files(
100
+ "poderes/poderes_da_tormenta",
101
+ Models::Poder,
102
+ %i[id name description effects prerequisites],
103
+ extra_attrs: { type: "poder_tormenta" }
104
+ )
105
+ end
106
+
107
+ # =======================================================================
108
+ # CLASSES
109
+ # =======================================================================
110
+ def import_classes
111
+ import_json_files(
112
+ "classes",
113
+ Models::Classe,
114
+ %i[id name hit_points mana_points skills proficiencies abilities powers progression spellcasting]
115
+ )
116
+ end
117
+
118
+ # =======================================================================
119
+ # MAGIAS
120
+ # =======================================================================
121
+ def import_magias
122
+ puts "\nImporting magias..."
123
+
124
+ json_dir = File.join(JSON_BASE_PATH, "magias")
125
+ return puts " Directory not found: #{json_dir}" unless Dir.exist?(json_dir)
126
+
127
+ files = Dir.glob(File.join(json_dir, "*.json"))
128
+ puts " Found #{files.size} magia files"
129
+
130
+ success_count = 0
131
+ error_count = 0
132
+
133
+ files.each_with_index do |file, index|
134
+ data = JSON.parse(File.read(file), symbolize_names: true)
135
+ import_magia(data)
136
+ success_count += 1
137
+ print "\r Imported: #{index + 1}/#{files.size}" if ((index + 1) % 10).zero?
138
+ rescue StandardError => e
139
+ error_count += 1
140
+ puts "\n Error importing #{File.basename(file)}: #{e.message}"
141
+ end
142
+
143
+ puts "\n Successfully imported #{success_count} magias"
144
+ puts " Failed to import #{error_count} magias" if error_count.positive?
145
+ end
146
+
147
+ def import_magia(data)
148
+ raw_target = data[:target]
149
+ target = if raw_target.is_a?(Hash)
150
+ raw_target
151
+ else
152
+ (raw_target.is_a?(Array) ? raw_target.first || {} : {})
153
+ end
154
+ effect_details = data[:effect_details].is_a?(Hash) ? data[:effect_details] : {}
155
+ resistence = data[:resistence].is_a?(Hash) ? data[:resistence] : {}
156
+ extra_costs = data[:extra_costs].is_a?(Hash) ? data[:extra_costs] : {}
157
+
158
+ Models::Magia.find_or_initialize_by(id: data[:id]).tap do |magia|
159
+ magia.name = data[:name]
160
+ magia.type = data[:type]
161
+ magia.circle = data[:circle]
162
+ magia.school = data[:school]
163
+ magia.execution = data[:execution]
164
+ magia.execution_details = data[:execution_details]
165
+ magia.range = data[:range]
166
+ magia.duration = data[:duration]
167
+ magia.duration_details = data[:duration_details]
168
+ magia.counterspell = data[:counterspell]
169
+ magia.description = data[:description] || ""
170
+
171
+ magia.target_amount = target[:amount]
172
+ magia.target_up_to = if target[:up_to].nil?
173
+ nil
174
+ else
175
+ (target[:up_to] ? 1 : 0)
176
+ end
177
+ magia.target_type = target[:type]
178
+
179
+ magia.effect = data[:effect]
180
+ magia.effect_shape = effect_details[:shape]
181
+ magia.effect_dimention = effect_details[:dimention]
182
+ magia.effect_size = effect_details[:size]
183
+ magia.effect_other_details = effect_details[:other_details]
184
+
185
+ magia.area_effect = data[:area_effect]
186
+ magia.area_effect_details = data[:area_effect_details]
187
+
188
+ magia.resistence_effect = resistence[:effect]
189
+ magia.resistence_skill = resistence[:skill]
190
+
191
+ magia.extra_costs_material_component = extra_costs[:material_component]
192
+ magia.extra_costs_material_cost = extra_costs[:material_component_cost]
193
+ magia.extra_costs_pm_debuff = extra_costs[:pm_debuff]
194
+ magia.extra_costs_pm_sacrifice = extra_costs[:pm_sacrifice]
195
+
196
+ magia.enhancements = data[:enhancements] || []
197
+ magia.effects = data[:effects] || []
198
+
199
+ magia.save!
200
+ end
201
+ end
202
+
203
+ # =======================================================================
204
+ # EQUIPAMENTOS
205
+ # =======================================================================
206
+ def import_equipamentos
207
+ import_armas
208
+ import_armaduras
209
+ import_escudos
210
+ import_itens
211
+ end
212
+
213
+ def import_armas
214
+ import_json_files(
215
+ "equipamentos/armas",
216
+ Models::Arma,
217
+ %i[id name category price damage damage_type critical range weight properties description]
218
+ )
219
+ end
220
+
221
+ def import_armaduras
222
+ import_json_files(
223
+ "equipamentos/armaduras",
224
+ Models::Armadura,
225
+ %i[id name category price defense_bonus armor_penalty weight properties description]
226
+ )
227
+ end
228
+
229
+ def import_escudos
230
+ import_json_files(
231
+ "equipamentos/escudos",
232
+ Models::Escudo,
233
+ %i[id name price defense_bonus armor_penalty weight properties description],
234
+ transform: lambda { |data|
235
+ data[:price] ||= data.delete(:preco)
236
+ data[:defense_bonus] ||= data.delete(:bonus_defesa)
237
+ data[:armor_penalty] ||= data.delete(:penalidade_armadura)
238
+ data[:weight] ||= data.delete(:espacos)
239
+ data
240
+ }
241
+ )
242
+ end
243
+
244
+ def import_itens
245
+ import_json_files(
246
+ "equipamentos/itens",
247
+ Models::Item,
248
+ %i[id name category price weight description effects]
249
+ )
250
+ end
251
+
252
+ # =======================================================================
253
+ # ITENS SUPERIORES
254
+ # =======================================================================
255
+ def import_itens_superiores
256
+ import_materiais_especiais
257
+ import_melhorias
258
+ end
259
+
260
+ def import_materiais_especiais
261
+ import_json_files(
262
+ "itens_superiores/materiais_especiais",
263
+ Models::MaterialEspecial,
264
+ %i[id name description applicable_to price_modifier effects]
265
+ )
266
+ end
267
+
268
+ def import_melhorias
269
+ import_json_files(
270
+ "itens_superiores/melhorias",
271
+ Models::Melhoria,
272
+ %i[id name description applicable_to price effects]
273
+ )
274
+ end
275
+
276
+ # =======================================================================
277
+ # REGRAS
278
+ # =======================================================================
279
+ def import_regras
280
+ import_json_files(
281
+ "regras",
282
+ Models::Regra,
283
+ %i[id name description data],
284
+ transform: lambda { |raw|
285
+ base_keys = %i[id name description]
286
+ data_content = raw.reject { |k, _| base_keys.include?(k) }
287
+ { id: raw[:id], name: raw[:name], description: raw[:description], data: data_content }
288
+ }
289
+ )
290
+ end
291
+
292
+ # =======================================================================
293
+ # UTILITY METHODS
294
+ # =======================================================================
295
+ def clear_all
296
+ puts "Clearing all data..."
297
+ [
298
+ Models::Origem, Models::Poder, Models::Divindade, Models::Classe,
299
+ Models::Magia, Models::Arma, Models::Armadura, Models::Escudo,
300
+ Models::Item, Models::MaterialEspecial, Models::Melhoria, Models::Regra
301
+ ].each(&:delete_all)
302
+ puts "Data cleared!"
303
+ end
304
+
305
+ def print_summary
306
+ puts "\nDatabase Summary:"
307
+ puts "-" * 40
308
+ puts " Origens: #{Models::Origem.count}"
309
+ puts " Poderes: #{Models::Poder.count}"
310
+ puts " - Hab. Unicas: #{Models::Poder.habilidades_unicas.count}"
311
+ puts " - Concedidos: #{Models::Poder.poderes_concedidos.count}"
312
+ puts " - Tormenta: #{Models::Poder.poderes_tormenta.count}"
313
+ puts " Divindades: #{Models::Divindade.count}"
314
+ puts " Classes: #{Models::Classe.count}"
315
+ puts " Magias: #{Models::Magia.count}"
316
+ puts " Armas: #{Models::Arma.count}"
317
+ puts " Armaduras: #{Models::Armadura.count}"
318
+ puts " Escudos: #{Models::Escudo.count}"
319
+ puts " Itens: #{Models::Item.count}"
320
+ puts " Materiais Esp.: #{Models::MaterialEspecial.count}"
321
+ puts " Melhorias: #{Models::Melhoria.count}"
322
+ puts " Regras: #{Models::Regra.count}"
323
+ puts "-" * 40
324
+ end
325
+
326
+ private
327
+
328
+ def import_json_files(subdir, model, attrs, extra_attrs: {}, transform: nil)
329
+ entity_name = subdir.split("/").last
330
+ puts "\nImporting #{entity_name}..."
331
+
332
+ json_dir = File.join(JSON_BASE_PATH, subdir)
333
+ unless Dir.exist?(json_dir)
334
+ puts " Directory not found: #{json_dir}"
335
+ return
336
+ end
337
+
338
+ files = Dir.glob(File.join(json_dir, "*.json"))
339
+ puts " Found #{files.size} files"
340
+
341
+ return if files.empty?
342
+
343
+ success_count = 0
344
+ error_count = 0
345
+
346
+ files.each_with_index do |file, index|
347
+ data = JSON.parse(File.read(file), symbolize_names: true)
348
+ data = transform.call(data) if transform
349
+
350
+ record = model.find_or_initialize_by(id: data[:id])
351
+ attrs.each do |attr|
352
+ record.send("#{attr}=", data[attr]) if data.key?(attr)
353
+ end
354
+ extra_attrs.each do |attr, value|
355
+ record.send("#{attr}=", value)
356
+ end
357
+ record.save!
358
+
359
+ success_count += 1
360
+ print "\r Imported: #{index + 1}/#{files.size}" if ((index + 1) % 10).zero?
361
+ rescue StandardError => e
362
+ error_count += 1
363
+ puts "\n Error importing #{File.basename(file)}: #{e.message}"
364
+ end
365
+
366
+ puts "\n Successfully imported #{success_count} #{entity_name}"
367
+ puts " Failed to import #{error_count} #{entity_name}" if error_count.positive?
368
+ end
369
+ end
370
+ end
371
+ end
372
+
373
+ # Run seeds if this file is executed directly
374
+ if __FILE__ == $PROGRAM_NAME
375
+ Tormenta20::Database.setup(mode: :build)
376
+ Tormenta20::Seeds.import_all
377
+ end
Binary file
data/docs/armaduras.md ADDED
@@ -0,0 +1,72 @@
1
+ # Armaduras
2
+
3
+ Acesso: `Tormenta20.armaduras`
4
+
5
+ ## Atributos
6
+
7
+ | Atributo | Tipo | Descricao |
8
+ |----------|------|-----------|
9
+ | `id` | String | Identificador unico |
10
+ | `name` | String | Nome da armadura |
11
+ | `category` | String | Categoria: `leve`, `pesada` |
12
+ | `price` | String | Preco |
13
+ | `defense_bonus` | Integer | Bonus de defesa |
14
+ | `armor_penalty` | Integer | Penalidade de armadura |
15
+ | `weight` | String | Peso/espacos |
16
+ | `properties` | Array | Propriedades especiais |
17
+ | `description` | String | Descricao |
18
+
19
+ ## Scopes (Filtros)
20
+
21
+ ### Por Categoria
22
+
23
+ ```ruby
24
+ Tormenta20.armaduras.leves # Armaduras leves
25
+ Tormenta20.armaduras.pesadas # Armaduras pesadas
26
+ Tormenta20.armaduras.by_category("leve")
27
+ ```
28
+
29
+ ## Metodos de Instancia
30
+
31
+ ```ruby
32
+ armadura = Tormenta20.armaduras.find("couro")
33
+
34
+ armadura.leve? # Verifica se e armadura leve
35
+ # => true
36
+
37
+ armadura.pesada? # Verifica se e armadura pesada
38
+ # => false
39
+
40
+ armadura.to_h # Converte para Hash completo
41
+ ```
42
+
43
+ ## Exemplos
44
+
45
+ ```ruby
46
+ # Listar todas as armaduras
47
+ Tormenta20.armaduras.all.each do |a|
48
+ puts "#{a.name}: +#{a.defense_bonus} Defesa, -#{a.armor_penalty} penalidade"
49
+ end
50
+
51
+ # Armaduras leves
52
+ Tormenta20.armaduras.leves.each do |a|
53
+ puts "#{a.name} - #{a.price}"
54
+ end
55
+
56
+ # Armaduras pesadas ordenadas por bonus de defesa
57
+ Tormenta20.armaduras.pesadas.order(defense_bonus: :desc).each do |a|
58
+ puts "#{a.name}: +#{a.defense_bonus}"
59
+ end
60
+
61
+ # Buscar armadura especifica
62
+ brunea = Tormenta20.armaduras.find("brunea")
63
+ puts brunea.name # => "Brunea"
64
+ puts brunea.defense_bonus # Bonus de defesa
65
+ puts brunea.armor_penalty # Penalidade
66
+
67
+ # Armadura com maior bonus de defesa
68
+ Tormenta20.armaduras.order(defense_bonus: :desc).first
69
+
70
+ # Armaduras sem penalidade
71
+ Tormenta20.armaduras.where(armor_penalty: 0)
72
+ ```
data/docs/armas.md ADDED
@@ -0,0 +1,95 @@
1
+ # Armas
2
+
3
+ Acesso: `Tormenta20.armas`
4
+
5
+ ## Atributos
6
+
7
+ | Atributo | Tipo | Descricao |
8
+ |----------|------|-----------|
9
+ | `id` | String | Identificador unico |
10
+ | `name` | String | Nome da arma |
11
+ | `category` | String | Categoria: `simples`, `marciais`, `exoticas`, `fogo` |
12
+ | `price` | String | Preco |
13
+ | `damage` | String | Dano (ex: "1d8") |
14
+ | `damage_type` | String | Tipo de dano (corte, perfuracao, etc) |
15
+ | `critical` | String | Critico (ex: "19/x2") |
16
+ | `range` | String | Alcance (para armas de distancia) |
17
+ | `weight` | String | Peso/espacos |
18
+ | `properties` | Array | Propriedades especiais |
19
+ | `description` | String | Descricao |
20
+
21
+ ## Scopes (Filtros)
22
+
23
+ ### Por Categoria
24
+
25
+ ```ruby
26
+ Tormenta20.armas.simples # Armas simples
27
+ Tormenta20.armas.marciais # Armas marciais
28
+ Tormenta20.armas.exoticas # Armas exoticas
29
+ Tormenta20.armas.fogo # Armas de fogo
30
+ Tormenta20.armas.by_category("simples")
31
+ ```
32
+
33
+ ### Por Tipo de Dano
34
+
35
+ ```ruby
36
+ Tormenta20.armas.by_damage_type("corte")
37
+ Tormenta20.armas.by_damage_type("perfuracao")
38
+ Tormenta20.armas.by_damage_type("impacto")
39
+ ```
40
+
41
+ ### Por Alcance
42
+
43
+ ```ruby
44
+ Tormenta20.armas.ranged # Armas de distancia (com alcance)
45
+ Tormenta20.armas.melee # Armas corpo a corpo (sem alcance)
46
+ ```
47
+
48
+ ## Metodos de Instancia
49
+
50
+ ```ruby
51
+ arma = Tormenta20.armas.find("espada_longa")
52
+
53
+ arma.ranged? # Verifica se e arma de distancia
54
+ # => false
55
+
56
+ arma.to_h # Converte para Hash completo
57
+ ```
58
+
59
+ ## Exemplos
60
+
61
+ ```ruby
62
+ # Listar todas as armas
63
+ Tormenta20.armas.all.each do |a|
64
+ puts "#{a.name}: #{a.damage} (#{a.damage_type})"
65
+ end
66
+
67
+ # Armas simples
68
+ Tormenta20.armas.simples.each do |a|
69
+ puts "#{a.name} - #{a.price}"
70
+ end
71
+
72
+ # Armas de distancia
73
+ Tormenta20.armas.ranged.each do |a|
74
+ puts "#{a.name}: alcance #{a.range}"
75
+ end
76
+
77
+ # Armas de corte
78
+ Tormenta20.armas.by_damage_type("corte").each do |a|
79
+ puts "#{a.name}: #{a.damage}"
80
+ end
81
+
82
+ # Buscar arma especifica
83
+ espada = Tormenta20.armas.find("espada_longa")
84
+ puts espada.name # => "Espada Longa"
85
+ puts espada.damage # => "1d8"
86
+ puts espada.critical # => "19/x2"
87
+ puts espada.properties # Propriedades especiais
88
+
89
+ # Armas ordenadas por dano
90
+ Tormenta20.armas.order(:damage).reverse
91
+
92
+ # Contar armas por categoria
93
+ Tormenta20.armas.group(:category).count
94
+ # => {"simples"=>15, "marciais"=>20, "exoticas"=>10, "fogo"=>5}
95
+ ```
data/docs/classes.md ADDED
@@ -0,0 +1,105 @@
1
+ # Classes
2
+
3
+ Acesso: `Tormenta20.classes`
4
+
5
+ ## Atributos
6
+
7
+ | Atributo | Tipo | Descricao |
8
+ |----------|------|-----------|
9
+ | `id` | String | Identificador unico |
10
+ | `name` | String | Nome da classe |
11
+ | `hit_points` | Hash | Pontos de vida (initial, per_level) |
12
+ | `mana_points` | Hash | Pontos de mana (per_level) |
13
+ | `skills` | Hash | Pericias (mandatory, choose_amount, choose_from) |
14
+ | `proficiencies` | Hash | Proficiencias (weapons, armors, shields) |
15
+ | `abilities` | Array | Habilidades da classe |
16
+ | `powers` | Array | Poderes disponiveis |
17
+ | `progression` | Hash | Progressao por nivel |
18
+ | `spellcasting` | Hash | Informacoes de conjuracao (se aplicavel) |
19
+
20
+ ## Scopes (Filtros)
21
+
22
+ ```ruby
23
+ # Classes que podem conjurar magias
24
+ Tormenta20.classes.conjuradores
25
+ ```
26
+
27
+ ## Metodos de Instancia
28
+
29
+ ### Pontos de Vida e Mana
30
+
31
+ ```ruby
32
+ classe = Tormenta20.classes.find("guerreiro")
33
+
34
+ classe.initial_hp # PV inicial (ex: 20)
35
+ classe.hp_per_level # PV por nivel (ex: 5)
36
+ classe.mp_per_level # PM por nivel (ex: 3)
37
+ ```
38
+
39
+ ### Pericias
40
+
41
+ ```ruby
42
+ classe.mandatory_skills # Pericias obrigatorias
43
+ # => ["Luta", "Fortitude"]
44
+
45
+ classe.choose_skills_amount # Quantidade de pericias a escolher
46
+ # => 4
47
+
48
+ classe.available_skills # Pericias disponiveis para escolha
49
+ # => ["Atletismo", "Cavalgar", "Intimidacao", ...]
50
+ ```
51
+
52
+ ### Proficiencias
53
+
54
+ ```ruby
55
+ classe.weapon_proficiencies # Proficiencias em armas
56
+ # => ["simples", "marciais"]
57
+
58
+ classe.armor_proficiencies # Proficiencias em armaduras
59
+ # => ["leves", "pesadas"]
60
+
61
+ classe.shield_proficiency? # Proficiencia em escudos
62
+ # => true
63
+ ```
64
+
65
+ ### Conjuracao
66
+
67
+ ```ruby
68
+ classe.conjurador? # Verifica se a classe conjura magias
69
+ # => false (para Guerreiro)
70
+ # => true (para Arcanista)
71
+ ```
72
+
73
+ ### Conversao
74
+
75
+ ```ruby
76
+ classe.to_h # Converte para Hash completo
77
+ ```
78
+
79
+ ## Exemplos
80
+
81
+ ```ruby
82
+ # Listar todas as classes
83
+ Tormenta20.classes.all.each do |c|
84
+ puts "#{c.name}: #{c.initial_hp} PV inicial, +#{c.hp_per_level}/nivel"
85
+ end
86
+
87
+ # Classes conjuradoras
88
+ Tormenta20.classes.conjuradores.each do |c|
89
+ puts "#{c.name} - PM/nivel: #{c.mp_per_level}"
90
+ end
91
+
92
+ # Buscar classe especifica
93
+ arcanista = Tormenta20.classes.find("arcanista")
94
+ puts arcanista.name # => "Arcanista"
95
+ puts arcanista.conjurador? # => true
96
+ puts arcanista.available_skills # Lista de pericias
97
+
98
+ # Classes com mais PV inicial
99
+ Tormenta20.classes.all.sort_by { |c| -c.initial_hp }.each do |c|
100
+ puts "#{c.name}: #{c.initial_hp} PV"
101
+ end
102
+
103
+ # Classes com proficiencia em armaduras pesadas
104
+ Tormenta20.classes.select { |c| c.armor_proficiencies.include?("pesadas") }
105
+ ```