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,134 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+ require "json"
5
+
6
+ module Tormenta20
7
+ module Models
8
+ # Model representing a Classe (Character Class) in Tormenta20.
9
+ #
10
+ # Classes define the character's abilities, proficiencies, and progression.
11
+ #
12
+ # @example Find all spellcasting classes
13
+ # Classe.conjuradores
14
+ #
15
+ # @example Get class HP information
16
+ # guerreiro = Classe.find("guerreiro")
17
+ # guerreiro.initial_hp # => 20
18
+ # guerreiro.hp_per_level # => 5
19
+ #
20
+ # @!attribute [rw] id
21
+ # @return [String] Unique identifier (e.g., "guerreiro")
22
+ # @!attribute [rw] name
23
+ # @return [String] Class name (e.g., "Guerreiro")
24
+ # @!attribute [rw] hit_points
25
+ # @return [Hash] Hit points data with "initial" and "per_level" keys
26
+ # @!attribute [rw] mana_points
27
+ # @return [Hash] Mana points data with "per_level" key
28
+ # @!attribute [rw] skills
29
+ # @return [Hash] Skills data with "mandatory", "choose_amount", "choose_from" keys
30
+ # @!attribute [rw] proficiencies
31
+ # @return [Hash] Proficiencies with "weapons", "armors", "shields" keys
32
+ # @!attribute [rw] spellcasting
33
+ # @return [Hash, nil] Spellcasting info or nil if class cannot cast spells
34
+ class Classe < Base
35
+ self.table_name = "classes"
36
+
37
+ validates :id, presence: true, uniqueness: true
38
+ validates :name, presence: true
39
+
40
+ # @!method conjuradores
41
+ # Filter classes that can cast spells.
42
+ # @return [ActiveRecord::Relation<Classe>]
43
+ scope :conjuradores, -> { where.not(spellcasting: nil) }
44
+
45
+ # Get initial hit points for this class.
46
+ #
47
+ # @return [Integer] Initial HP at level 1
48
+ def initial_hp
49
+ hit_points&.dig("initial") || 0
50
+ end
51
+
52
+ # Get hit points gained per level.
53
+ #
54
+ # @return [Integer] HP gained each level
55
+ def hp_per_level
56
+ hit_points&.dig("per_level") || 0
57
+ end
58
+
59
+ # Get mana points gained per level.
60
+ #
61
+ # @return [Integer] MP gained each level
62
+ def mp_per_level
63
+ mana_points&.dig("per_level") || 0
64
+ end
65
+
66
+ # Get mandatory skills for this class.
67
+ #
68
+ # @return [Array<String>] List of mandatory skill names
69
+ def mandatory_skills
70
+ skills&.dig("mandatory") || []
71
+ end
72
+
73
+ # Get number of skills to choose from available list.
74
+ #
75
+ # @return [Integer] Number of skills to choose
76
+ def choose_skills_amount
77
+ skills&.dig("choose_amount") || 0
78
+ end
79
+
80
+ # Get skills available to choose from.
81
+ #
82
+ # @return [Array<String>] List of available skill names
83
+ def available_skills
84
+ skills&.dig("choose_from") || []
85
+ end
86
+
87
+ # Get weapon proficiencies for this class.
88
+ #
89
+ # @return [Array<String>] List of weapon categories (e.g., ["simples", "marciais"])
90
+ def weapon_proficiencies
91
+ proficiencies&.dig("weapons") || []
92
+ end
93
+
94
+ # Get armor proficiencies for this class.
95
+ #
96
+ # @return [Array<String>] List of armor categories (e.g., ["leves", "pesadas"])
97
+ def armor_proficiencies
98
+ proficiencies&.dig("armors") || []
99
+ end
100
+
101
+ # Check if class has shield proficiency.
102
+ #
103
+ # @return [Boolean] true if proficient with shields
104
+ def shield_proficiency?
105
+ proficiencies&.dig("shields") || false
106
+ end
107
+
108
+ # Check if this class can cast spells.
109
+ #
110
+ # @return [Boolean] true if class has spellcasting ability
111
+ def conjurador?
112
+ !spellcasting.nil?
113
+ end
114
+
115
+ # Convert class to a hash representation.
116
+ #
117
+ # @return [Hash] Hash with all class attributes
118
+ def to_h
119
+ {
120
+ id: id,
121
+ name: name,
122
+ hit_points: hit_points,
123
+ mana_points: mana_points,
124
+ skills: skills,
125
+ proficiencies: proficiencies,
126
+ abilities: abilities,
127
+ powers: powers,
128
+ progression: progression,
129
+ spellcasting: spellcasting
130
+ }.compact
131
+ end
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,98 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+ require "json"
5
+
6
+ module Tormenta20
7
+ module Models
8
+ # Model representing a Divindade (Deity) in Tormenta20.
9
+ #
10
+ # Deities grant powers to their followers and have specific energy types.
11
+ #
12
+ # @example Find deities with positive energy
13
+ # Divindade.energia_positiva
14
+ #
15
+ # @example Get deity's granted powers
16
+ # khalmyr = Divindade.find("khalmyr")
17
+ # khalmyr.granted_powers # => ["coragem_total", "espada_justiceira", ...]
18
+ #
19
+ # @!attribute [rw] id
20
+ # @return [String] Unique identifier (e.g., "khalmyr")
21
+ # @!attribute [rw] name
22
+ # @return [String] Deity name (e.g., "Khalmyr")
23
+ # @!attribute [rw] title
24
+ # @return [String] Deity title (e.g., "O Deus da Justiça")
25
+ # @!attribute [rw] energy
26
+ # @return [String] Energy type: "positiva", "negativa", or "qualquer"
27
+ # @!attribute [rw] granted_powers
28
+ # @return [Array<String>] List of power IDs granted to followers
29
+ class Divindade < Base
30
+ self.table_name = "divindades"
31
+
32
+ # Valid energy types for deities.
33
+ ENERGIES = %w[positiva negativa qualquer].freeze
34
+
35
+ validates :id, presence: true, uniqueness: true
36
+ validates :name, presence: true
37
+ validates :energy, presence: true, inclusion: { in: ENERGIES }
38
+
39
+ # @!group Scopes
40
+
41
+ # @!method energia_positiva
42
+ # Filter deities with positive energy.
43
+ # @return [ActiveRecord::Relation<Divindade>]
44
+ scope :energia_positiva, -> { where(energy: "positiva") }
45
+
46
+ # @!method energia_negativa
47
+ # Filter deities with negative energy.
48
+ # @return [ActiveRecord::Relation<Divindade>]
49
+ scope :energia_negativa, -> { where(energy: "negativa") }
50
+
51
+ # @!method energia_qualquer
52
+ # Filter deities with neutral/any energy.
53
+ # @return [ActiveRecord::Relation<Divindade>]
54
+ scope :energia_qualquer, -> { where(energy: "qualquer") }
55
+
56
+ # @!method by_energy(energy)
57
+ # Filter deities by energy type.
58
+ # @param energy [String] Energy type (positiva, negativa, qualquer)
59
+ # @return [ActiveRecord::Relation<Divindade>]
60
+ scope :by_energy, ->(e) { where(energy: e) }
61
+
62
+ # @!endgroup
63
+
64
+ # Get races that typically worship this deity.
65
+ #
66
+ # @return [Array<String>] List of race names
67
+ def races
68
+ devotees&.dig("races") || []
69
+ end
70
+
71
+ # Get classes that typically worship this deity.
72
+ #
73
+ # @return [Array<String>] List of class names
74
+ def classes
75
+ devotees&.dig("classes") || []
76
+ end
77
+
78
+ # Convert deity to a hash representation.
79
+ #
80
+ # @return [Hash] Hash with all deity attributes
81
+ def to_h
82
+ {
83
+ id: id,
84
+ name: name,
85
+ title: title,
86
+ description: description,
87
+ beliefs_objectives: beliefs_objectives,
88
+ holy_symbol: holy_symbol,
89
+ energy: energy,
90
+ preferred_weapon: preferred_weapon,
91
+ devotees: devotees,
92
+ granted_powers: granted_powers,
93
+ obligations_restrictions: obligations_restrictions
94
+ }.compact
95
+ end
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,59 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+ require "json"
5
+
6
+ module Tormenta20
7
+ module Models
8
+ # Model representing an Escudo (Shield) in Tormenta20.
9
+ #
10
+ # Shields provide additional defense bonuses but may impose
11
+ # armor penalties on certain skill checks.
12
+ #
13
+ # @example Find all shields
14
+ # Tormenta20.escudos.all
15
+ #
16
+ # @example Find shield with highest defense
17
+ # Tormenta20.escudos.order(defense_bonus: :desc).first
18
+ #
19
+ # @!attribute [rw] id
20
+ # @return [String] Unique identifier (e.g., "escudo_leve")
21
+ # @!attribute [rw] name
22
+ # @return [String] Shield name in Portuguese
23
+ # @!attribute [rw] price
24
+ # @return [String] Price in Tormenta currency
25
+ # @!attribute [rw] defense_bonus
26
+ # @return [Integer] Defense bonus provided by the shield
27
+ # @!attribute [rw] armor_penalty
28
+ # @return [Integer] Armor penalty for skill checks
29
+ # @!attribute [rw] weight
30
+ # @return [String] Weight in slots/spaces
31
+ # @!attribute [rw] properties
32
+ # @return [Array<String>] Special shield properties
33
+ # @!attribute [rw] description
34
+ # @return [String, nil] Optional description
35
+ class Escudo < Base
36
+ self.table_name = "escudos"
37
+
38
+ validates :id, presence: true, uniqueness: true
39
+ validates :name, presence: true
40
+ validates :defense_bonus, presence: true
41
+
42
+ # Convert the shield to a hash representation.
43
+ #
44
+ # @return [Hash] Hash with all shield attributes (nil values excluded)
45
+ def to_h
46
+ {
47
+ id: id,
48
+ name: name,
49
+ price: price,
50
+ defense_bonus: defense_bonus,
51
+ armor_penalty: armor_penalty,
52
+ weight: weight,
53
+ properties: properties,
54
+ description: description
55
+ }.compact
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+ require "json"
5
+
6
+ module Tormenta20
7
+ module Models
8
+ # Model representing an Item in Tormenta20.
9
+ #
10
+ # Items include general equipment, adventuring gear, tools,
11
+ # and other miscellaneous items.
12
+ #
13
+ # @example Find all items
14
+ # Tormenta20.itens.all
15
+ #
16
+ # @example Find items by category
17
+ # Tormenta20.itens.by_category("equipamento")
18
+ #
19
+ # @!attribute [rw] id
20
+ # @return [String] Unique identifier (e.g., "corda_15m")
21
+ # @!attribute [rw] name
22
+ # @return [String] Item name in Portuguese
23
+ # @!attribute [rw] category
24
+ # @return [String, nil] Item category
25
+ # @!attribute [rw] price
26
+ # @return [String] Price in Tormenta currency
27
+ # @!attribute [rw] weight
28
+ # @return [String] Weight in slots/spaces
29
+ # @!attribute [rw] description
30
+ # @return [String, nil] Item description
31
+ # @!attribute [rw] effects
32
+ # @return [Array<String>, nil] Special effects or uses
33
+ class Item < Base
34
+ self.table_name = "itens"
35
+
36
+ validates :id, presence: true, uniqueness: true
37
+ validates :name, presence: true
38
+
39
+ # @!method by_category(category)
40
+ # Filter items by category.
41
+ # @param category [String] Category to filter by
42
+ # @return [ActiveRecord::Relation<Item>]
43
+ scope :by_category, ->(c) { where(category: c) }
44
+
45
+ # Convert the item to a hash representation.
46
+ #
47
+ # @return [Hash] Hash with all item attributes (nil values excluded)
48
+ def to_h
49
+ {
50
+ id: id,
51
+ name: name,
52
+ category: category,
53
+ price: price,
54
+ weight: weight,
55
+ description: description,
56
+ effects: effects
57
+ }.compact
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,226 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+ require "json"
5
+
6
+ module Tormenta20
7
+ module Models
8
+ # Model representing a Magia (Spell) in Tormenta20.
9
+ #
10
+ # Spells are categorized by type (arcane, divine, universal), circle (1-5),
11
+ # and school (abjuration, evocation, etc.).
12
+ #
13
+ # @example Find all arcane spells
14
+ # Magia.arcanas
15
+ #
16
+ # @example Find 3rd circle evocation spells
17
+ # Magia.by_circle("3").by_school("evoc")
18
+ #
19
+ # @!attribute [rw] id
20
+ # @return [String] Unique identifier (e.g., "bola_de_fogo")
21
+ # @!attribute [rw] name
22
+ # @return [String] Spell name (e.g., "Bola de Fogo")
23
+ # @!attribute [rw] type
24
+ # @return [String] Spell type: "arcana", "divina", or "universal"
25
+ # @!attribute [rw] circle
26
+ # @return [String] Spell circle (1-5)
27
+ # @!attribute [rw] school
28
+ # @return [String] Magic school code (abjur, adiv, conv, encan, evoc, ilus, necro, trans)
29
+ # @!attribute [rw] execution
30
+ # @return [String] Casting time
31
+ # @!attribute [rw] range
32
+ # @return [String] Spell range
33
+ # @!attribute [rw] duration
34
+ # @return [String] Spell duration
35
+ # @!attribute [rw] description
36
+ # @return [String] Full spell description
37
+ class Magia < Base
38
+ self.table_name = "magias"
39
+ self.inheritance_column = nil
40
+
41
+ validates :id, presence: true, uniqueness: true
42
+ validates :name, presence: true
43
+ validates :type, presence: true, inclusion: { in: %w[arcana divina universal] }
44
+ validates :circle, presence: true
45
+ validates :school, presence: true, inclusion: { in: %w[abjur adiv conv encan evoc ilus necro trans] }
46
+ validates :execution, presence: true
47
+ validates :range, presence: true
48
+ validates :duration, presence: true
49
+ validates :description, presence: true
50
+
51
+ # @!group Scopes
52
+
53
+ # @!method arcanas
54
+ # Filter arcane spells only.
55
+ # @return [ActiveRecord::Relation<Magia>]
56
+ scope :arcanas, -> { where(type: "arcana") }
57
+
58
+ # @!method divinas
59
+ # Filter divine spells only.
60
+ # @return [ActiveRecord::Relation<Magia>]
61
+ scope :divinas, -> { where(type: "divina") }
62
+
63
+ # @!method universais
64
+ # Filter universal spells only.
65
+ # @return [ActiveRecord::Relation<Magia>]
66
+ scope :universais, -> { where(type: "universal") }
67
+
68
+ # @!method by_circle(circle)
69
+ # Filter spells by circle.
70
+ # @param circle [String, Integer] The spell circle (1-5)
71
+ # @return [ActiveRecord::Relation<Magia>]
72
+ scope :by_circle, ->(circle) { where(circle: circle.to_s) }
73
+
74
+ # @!method by_school(school)
75
+ # Filter spells by magic school.
76
+ # @param school [String] School code (abjur, adiv, conv, encan, evoc, ilus, necro, trans)
77
+ # @return [ActiveRecord::Relation<Magia>]
78
+ scope :by_school, ->(school) { where(school: school) }
79
+
80
+ # @!method by_type(type)
81
+ # Filter spells by type.
82
+ # @param type [String] Spell type (arcana, divina, universal)
83
+ # @return [ActiveRecord::Relation<Magia>]
84
+ scope :by_type, ->(type) { where(type: type) }
85
+
86
+ # @!endgroup
87
+
88
+ class << self
89
+ # Get all spells.
90
+ #
91
+ # @return [ActiveRecord::Relation<Magia>] All spells
92
+ def todas
93
+ all
94
+ end
95
+
96
+ # Get divine spells (alias for divinas scope).
97
+ #
98
+ # @return [ActiveRecord::Relation<Magia>] Divine spells
99
+ def divinas_list
100
+ divinas
101
+ end
102
+
103
+ # Get arcane spells (alias for arcanas scope).
104
+ #
105
+ # @return [ActiveRecord::Relation<Magia>] Arcane spells
106
+ def arcanas_list
107
+ arcanas
108
+ end
109
+
110
+ # Get universal spells (alias for universais scope).
111
+ #
112
+ # @return [ActiveRecord::Relation<Magia>] Universal spells
113
+ def universais_list
114
+ universais
115
+ end
116
+
117
+ # Find spells by circle (Portuguese alias).
118
+ #
119
+ # @param circle [String, Integer] The spell circle
120
+ # @return [ActiveRecord::Relation<Magia>] Spells of the given circle
121
+ def do_circulo(circle)
122
+ by_circle(circle)
123
+ end
124
+
125
+ # Find spells by school (Portuguese alias).
126
+ #
127
+ # @param school [String] The magic school code
128
+ # @return [ActiveRecord::Relation<Magia>] Spells of the given school
129
+ def da_escola(school)
130
+ by_school(school)
131
+ end
132
+ end
133
+
134
+ # Get target information as a structured hash.
135
+ #
136
+ # @return [Hash] Target info with :amount, :up_to, and :type keys
137
+ def target_info
138
+ {
139
+ amount: target_amount,
140
+ up_to: target_up_to&.positive?,
141
+ type: target_type
142
+ }
143
+ end
144
+
145
+ # Get effect details as a structured hash.
146
+ #
147
+ # @return [Hash, nil] Effect details or nil if no effect info exists
148
+ def effect_details_info
149
+ return nil unless effect_shape || effect_dimention || effect_size
150
+
151
+ {
152
+ shape: effect_shape,
153
+ dimention: effect_dimention,
154
+ size: effect_size,
155
+ other_details: effect_other_details
156
+ }.compact
157
+ end
158
+
159
+ # Get resistance information as a structured hash.
160
+ #
161
+ # @return [Hash, nil] Resistance info or nil if no resistance exists
162
+ def resistence_info
163
+ return nil unless resistence_effect || resistence_skill
164
+
165
+ {
166
+ effect: resistence_effect,
167
+ skill: resistence_skill
168
+ }.compact
169
+ end
170
+
171
+ # Get extra costs as a structured hash.
172
+ #
173
+ # @return [Hash, nil] Extra costs or nil if no extra costs exist
174
+ def extra_costs_info
175
+ return nil unless extra_costs_material_component
176
+
177
+ {
178
+ material_component: extra_costs_material_component,
179
+ material_component_cost: extra_costs_material_cost,
180
+ pm_debuff: extra_costs_pm_debuff,
181
+ pm_sacrifice: extra_costs_pm_sacrifice
182
+ }.compact
183
+ end
184
+
185
+ # Convert spell to a hash representation.
186
+ #
187
+ # @return [Hash] Hash with all spell attributes
188
+ def to_h
189
+ {
190
+ id: id,
191
+ name: name,
192
+ type: type,
193
+ circle: circle,
194
+ school: school,
195
+ execution: execution,
196
+ execution_details: execution_details,
197
+ range: range,
198
+ target: target_info,
199
+ effect: effect,
200
+ effect_details: effect_details_info,
201
+ area_effect: area_effect,
202
+ counterspell: counterspell,
203
+ duration: duration,
204
+ duration_details: duration_details,
205
+ resistence: resistence_info,
206
+ extra_costs: extra_costs_info,
207
+ description: description,
208
+ enhancements: enhancements,
209
+ effects: effects
210
+ }.compact
211
+ end
212
+
213
+ # @api private
214
+ def method_missing(method_name, *args)
215
+ return super unless respond_to_missing?(method_name)
216
+
217
+ send(method_name.to_s.gsub("?", ""), *args)
218
+ end
219
+
220
+ # @api private
221
+ def respond_to_missing?(method_name, include_private = false)
222
+ attributes.key?(method_name.to_s) || super
223
+ end
224
+ end
225
+ end
226
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+ require "json"
5
+
6
+ module Tormenta20
7
+ module Models
8
+ # Model representing a MaterialEspecial (Special Material) in Tormenta20.
9
+ #
10
+ # Special materials can be used to craft weapons and armor,
11
+ # providing additional effects and modifying the item's price.
12
+ #
13
+ # @example Find all special materials
14
+ # Tormenta20.materiais_especiais.all
15
+ #
16
+ # @example Find a specific material
17
+ # Tormenta20.materiais_especiais.find("adamante")
18
+ #
19
+ # @!attribute [rw] id
20
+ # @return [String] Unique identifier (e.g., "adamante")
21
+ # @!attribute [rw] name
22
+ # @return [String] Material name in Portuguese
23
+ # @!attribute [rw] description
24
+ # @return [String, nil] Material description
25
+ # @!attribute [rw] applicable_to
26
+ # @return [Array<String>, nil] Item types this material can be applied to
27
+ # @!attribute [rw] price_modifier
28
+ # @return [String, nil] Price modifier when using this material
29
+ # @!attribute [rw] effects
30
+ # @return [Array<String>, nil] Effects provided by this material
31
+ class MaterialEspecial < Base
32
+ self.table_name = "materiais_especiais"
33
+
34
+ validates :id, presence: true, uniqueness: true
35
+ validates :name, presence: true
36
+
37
+ # Convert the special material to a hash representation.
38
+ #
39
+ # @return [Hash] Hash with all material attributes (nil values excluded)
40
+ def to_h
41
+ {
42
+ id: id,
43
+ name: name,
44
+ description: description,
45
+ applicable_to: applicable_to,
46
+ price_modifier: price_modifier,
47
+ effects: effects
48
+ }.compact
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_record"
4
+ require "json"
5
+
6
+ module Tormenta20
7
+ module Models
8
+ # Model representing a Melhoria (Enhancement/Upgrade) in Tormenta20.
9
+ #
10
+ # Enhancements can be applied to weapons, armor, and other items
11
+ # to provide magical bonuses and special effects.
12
+ #
13
+ # @example Find all enhancements
14
+ # Tormenta20.melhorias.all
15
+ #
16
+ # @example Find a specific enhancement
17
+ # Tormenta20.melhorias.find("flamejante")
18
+ #
19
+ # @!attribute [rw] id
20
+ # @return [String] Unique identifier (e.g., "flamejante")
21
+ # @!attribute [rw] name
22
+ # @return [String] Enhancement name in Portuguese
23
+ # @!attribute [rw] description
24
+ # @return [String, nil] Enhancement description
25
+ # @!attribute [rw] applicable_to
26
+ # @return [Array<String>, nil] Item types this enhancement can be applied to
27
+ # @!attribute [rw] price
28
+ # @return [String, nil] Price or price modifier for this enhancement
29
+ # @!attribute [rw] effects
30
+ # @return [Array<String>, nil] Effects provided by this enhancement
31
+ class Melhoria < Base
32
+ self.table_name = "melhorias"
33
+
34
+ validates :id, presence: true, uniqueness: true
35
+ validates :name, presence: true
36
+
37
+ # Convert the enhancement to a hash representation.
38
+ #
39
+ # @return [Hash] Hash with all enhancement attributes (nil values excluded)
40
+ def to_h
41
+ {
42
+ id: id,
43
+ name: name,
44
+ description: description,
45
+ applicable_to: applicable_to,
46
+ price: price,
47
+ effects: effects
48
+ }.compact
49
+ end
50
+ end
51
+ end
52
+ end