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.
- checksums.yaml +4 -4
- data/.rubocop.yml +27 -0
- data/README.md +203 -12
- data/Rakefile +9 -0
- data/db/schema.sql +382 -0
- data/db/seeds.rb +377 -0
- data/db/tormenta20.sqlite3 +0 -0
- data/docs/armaduras.md +72 -0
- data/docs/armas.md +95 -0
- data/docs/classes.md +105 -0
- data/docs/divindades.md +77 -0
- data/docs/escudos.md +49 -0
- data/docs/itens.md +59 -0
- data/docs/magias.md +157 -0
- data/docs/materiais_especiais.md +50 -0
- data/docs/melhorias.md +55 -0
- data/docs/origens.md +61 -0
- data/docs/poderes.md +98 -0
- data/docs/regras.md +51 -0
- data/examples/database_usage.rb +155 -0
- data/src/json/classes/arcanista.json +86 -0
- data/src/json/classes/barbaro.json +85 -0
- data/src/json/classes/bardo.json +91 -0
- data/src/json/classes/bucaneiro.json +96 -0
- data/src/json/classes/cacador.json +96 -0
- data/src/json/classes/cavaleiro.json +87 -0
- data/src/json/classes/clerigo.json +82 -0
- data/src/json/classes/druida.json +88 -0
- data/src/json/classes/guerreiro.json +90 -0
- data/src/json/classes/inventor.json +100 -0
- data/src/json/classes/ladino.json +96 -0
- data/src/json/classes/lutador.json +90 -0
- data/src/json/classes/nobre.json +100 -0
- data/src/json/classes/paladino.json +93 -0
- data/src/json/deuses/aharadak.json +26 -0
- data/src/json/deuses/allihanna.json +26 -0
- data/src/json/deuses/arsenal.json +28 -0
- data/src/json/deuses/azgher.json +28 -0
- data/src/json/deuses/hyninn.json +28 -0
- data/src/json/deuses/kallyadranoch.json +28 -0
- data/src/json/deuses/khalmyr.json +27 -0
- data/src/json/deuses/lena.json +28 -0
- data/src/json/deuses/lin_wu.json +28 -0
- data/src/json/deuses/marah.json +28 -0
- data/src/json/deuses/megalokk.json +28 -0
- data/src/json/deuses/nimb.json +27 -0
- data/src/json/deuses/oceano.json +26 -0
- data/src/json/deuses/sszzaas.json +28 -0
- data/src/json/deuses/tanna_toh.json +28 -0
- data/src/json/deuses/tenebra.json +26 -0
- data/src/json/deuses/thwor.json +27 -0
- data/src/json/deuses/thyatis.json +26 -0
- data/src/json/deuses/valkaria.json +30 -0
- data/src/json/deuses/wynna.json +25 -0
- data/src/json/equipamentos/armaduras/leves/armadura_acolchoada.json +15 -0
- data/src/json/equipamentos/armaduras/leves/armadura_de_couro.json +13 -0
- data/src/json/equipamentos/armaduras/leves/couraca.json +13 -0
- data/src/json/equipamentos/armaduras/leves/couro_batido.json +13 -0
- data/src/json/equipamentos/armaduras/leves/gibao_de_peles.json +13 -0
- data/src/json/equipamentos/armaduras/pesadas/armadura_completa.json +19 -0
- data/src/json/equipamentos/armaduras/pesadas/brunea.json +17 -0
- data/src/json/equipamentos/armaduras/pesadas/cota_de_malha.json +17 -0
- data/src/json/equipamentos/armaduras/pesadas/loriga_segmentada.json +17 -0
- data/src/json/equipamentos/armaduras/pesadas/meia_armadura.json +17 -0
- data/src/json/equipamentos/armas/exoticas/chicote.json +23 -0
- data/src/json/equipamentos/armas/exoticas/corrente_de_espinhos.json +23 -0
- data/src/json/equipamentos/armas/exoticas/espada_bastarda.json +19 -0
- data/src/json/equipamentos/armas/exoticas/katana.json +19 -0
- data/src/json/equipamentos/armas/exoticas/machado_anao.json +19 -0
- data/src/json/equipamentos/armas/exoticas/machado_taurico.json +17 -0
- data/src/json/equipamentos/armas/exoticas/rede.json +41 -0
- data/src/json/equipamentos/armas/fogo/mosquete.json +21 -0
- data/src/json/equipamentos/armas/fogo/pistola.json +21 -0
- data/src/json/equipamentos/armas/marciais/alabarda.json +17 -0
- data/src/json/equipamentos/armas/marciais/alfange.json +17 -0
- data/src/json/equipamentos/armas/marciais/arco_longo.json +22 -0
- data/src/json/equipamentos/armas/marciais/besta_pesada.json +21 -0
- data/src/json/equipamentos/armas/marciais/cimitarra.json +17 -0
- data/src/json/equipamentos/armas/marciais/espada_longa.json +17 -0
- data/src/json/equipamentos/armas/marciais/florete.json +17 -0
- data/src/json/equipamentos/armas/marciais/gadanho.json +17 -0
- data/src/json/equipamentos/armas/marciais/lanca_montada.json +20 -0
- data/src/json/equipamentos/armas/marciais/machadinha.json +19 -0
- data/src/json/equipamentos/armas/marciais/machado_de_batalha.json +17 -0
- data/src/json/equipamentos/armas/marciais/machado_de_guerra.json +17 -0
- data/src/json/equipamentos/armas/marciais/mangual.json +21 -0
- data/src/json/equipamentos/armas/marciais/marreta.json +17 -0
- data/src/json/equipamentos/armas/marciais/martelo_de_guerra.json +17 -0
- data/src/json/equipamentos/armas/marciais/montante.json +17 -0
- data/src/json/equipamentos/armas/marciais/picareta.json +17 -0
- data/src/json/equipamentos/armas/marciais/tridente.json +22 -0
- data/src/json/equipamentos/armas/simples/adaga.json +21 -0
- data/src/json/equipamentos/armas/simples/arco_curto.json +21 -0
- data/src/json/equipamentos/armas/simples/azagaia.json +20 -0
- data/src/json/equipamentos/armas/simples/besta_leve.json +21 -0
- data/src/json/equipamentos/armas/simples/bordao.json +17 -0
- data/src/json/equipamentos/armas/simples/clava.json +17 -0
- data/src/json/equipamentos/armas/simples/espada_curta.json +17 -0
- data/src/json/equipamentos/armas/simples/foice.json +17 -0
- data/src/json/equipamentos/armas/simples/funda.json +23 -0
- data/src/json/equipamentos/armas/simples/lanca.json +19 -0
- data/src/json/equipamentos/armas/simples/maca.json +17 -0
- data/src/json/equipamentos/armas/simples/pique.json +17 -0
- data/src/json/equipamentos/armas/simples/tacape.json +17 -0
- data/src/json/equipamentos/escudos/escudo_leve.json +22 -0
- data/src/json/equipamentos/escudos/escudo_pesado.json +22 -0
- data/src/json/equipamentos/itens/alimentacao/batata_valkariana.json +14 -0
- data/src/json/equipamentos/itens/alimentacao/gorad_quente.json +12 -0
- data/src/json/equipamentos/itens/alimentacao/macarrao_de_yuvalin.json +12 -0
- data/src/json/equipamentos/itens/alimentacao/prato_do_aventureiro.json +13 -0
- data/src/json/equipamentos/itens/alimentacao/racao_de_viagem.json +14 -0
- data/src/json/equipamentos/itens/alimentacao/refeicao_comum.json +9 -0
- data/src/json/equipamentos/itens/alimentacao/sopa_de_peixe.json +13 -0
- data/src/json/equipamentos/itens/alquimicos/catalisadores/baga_de_fogo.json +17 -0
- data/src/json/equipamentos/itens/alquimicos/catalisadores/dente_de_dragao.json +17 -0
- data/src/json/equipamentos/itens/alquimicos/catalisadores/essencia_abissal.json +22 -0
- data/src/json/equipamentos/itens/alquimicos/catalisadores/liquen_lilas.json +18 -0
- data/src/json/equipamentos/itens/alquimicos/catalisadores/musgo_purpura.json +18 -0
- data/src/json/equipamentos/itens/alquimicos/catalisadores/ossos_de_monstro.json +17 -0
- data/src/json/equipamentos/itens/alquimicos/catalisadores/po_de_cristal.json +18 -0
- data/src/json/equipamentos/itens/alquimicos/catalisadores/po_de_giz.json +18 -0
- data/src/json/equipamentos/itens/alquimicos/catalisadores/ramo_verdejante.json +16 -0
- data/src/json/equipamentos/itens/alquimicos/catalisadores/saco_de_sal.json +18 -0
- data/src/json/equipamentos/itens/alquimicos/catalisadores/seixo_de_ambar.json +18 -0
- data/src/json/equipamentos/itens/alquimicos/catalisadores/terra_de_cemiterio.json +18 -0
- data/src/json/equipamentos/itens/alquimicos/preparados/acido.json +19 -0
- data/src/json/equipamentos/itens/alquimicos/preparados/balsamo_restaurador.json +16 -0
- data/src/json/equipamentos/itens/alquimicos/preparados/bomba.json +30 -0
- data/src/json/equipamentos/itens/alquimicos/preparados/cosmetico.json +18 -0
- data/src/json/equipamentos/itens/alquimicos/preparados/elixir_do_amor.json +23 -0
- data/src/json/equipamentos/itens/alquimicos/preparados/essencia_de_mana.json +16 -0
- data/src/json/equipamentos/itens/alquimicos/preparados/fogo_alquimico.json +27 -0
- data/src/json/equipamentos/itens/alquimicos/preparados/po_do_desaparecimento.json +18 -0
- data/src/json/equipamentos/itens/alquimicos/venenos/beladona.json +22 -0
- data/src/json/equipamentos/itens/alquimicos/venenos/bruma_sonolenta.json +21 -0
- data/src/json/equipamentos/itens/alquimicos/venenos/cicuta.json +22 -0
- data/src/json/equipamentos/itens/alquimicos/venenos/essencia_de_sombra.json +20 -0
- data/src/json/equipamentos/itens/alquimicos/venenos/nevoa_toxica.json +22 -0
- data/src/json/equipamentos/itens/alquimicos/venenos/peconha_comum.json +24 -0
- data/src/json/equipamentos/itens/alquimicos/venenos/peconha_concentrada.json +22 -0
- data/src/json/equipamentos/itens/alquimicos/venenos/peconha_potente.json +22 -0
- data/src/json/equipamentos/itens/alquimicos/venenos/po_de_lich.json +23 -0
- data/src/json/equipamentos/itens/alquimicos/venenos/riso_de_nimb.json +21 -0
- data/src/json/equipamentos/itens/animais/alforje.json +11 -0
- data/src/json/equipamentos/itens/animais/cao_de_caca.json +18 -0
- data/src/json/equipamentos/itens/animais/cavalo.json +20 -0
- data/src/json/equipamentos/itens/animais/cavalo_de_guerra.json +17 -0
- data/src/json/equipamentos/itens/animais/estabulo.json +10 -0
- data/src/json/equipamentos/itens/animais/ponei.json +21 -0
- data/src/json/equipamentos/itens/animais/ponei_de_guerra.json +18 -0
- data/src/json/equipamentos/itens/animais/trobo.json +14 -0
- data/src/json/equipamentos/itens/aventura/agua_benta.json +23 -0
- data/src/json/equipamentos/itens/aventura/algemas.json +35 -0
- data/src/json/equipamentos/itens/aventura/arpeu.json +18 -0
- data/src/json/equipamentos/itens/aventura/bandoleira_de_pocoes.json +15 -0
- data/src/json/equipamentos/itens/aventura/barraca.json +14 -0
- data/src/json/equipamentos/itens/aventura/corda.json +26 -0
- data/src/json/equipamentos/itens/aventura/espelho.json +10 -0
- data/src/json/equipamentos/itens/aventura/lampiao.json +19 -0
- data/src/json/equipamentos/itens/aventura/mochila.json +12 -0
- data/src/json/equipamentos/itens/aventura/mochila_de_aventureiro.json +14 -0
- data/src/json/equipamentos/itens/aventura/oleo.json +19 -0
- data/src/json/equipamentos/itens/aventura/organizador_de_pergaminhos.json +14 -0
- data/src/json/equipamentos/itens/aventura/pe_de_cabra.json +18 -0
- data/src/json/equipamentos/itens/aventura/saco_de_dormir.json +13 -0
- data/src/json/equipamentos/itens/aventura/simbolo_sagrado.json +15 -0
- data/src/json/equipamentos/itens/aventura/tocha.json +28 -0
- data/src/json/equipamentos/itens/aventura/vara_de_madeira.json +12 -0
- data/src/json/equipamentos/itens/esotericos/bolsa_de_po.json +17 -0
- data/src/json/equipamentos/itens/esotericos/cajado_arcano.json +20 -0
- data/src/json/equipamentos/itens/esotericos/cetro_elemental.json +22 -0
- data/src/json/equipamentos/itens/esotericos/costela_de_lich.json +18 -0
- data/src/json/equipamentos/itens/esotericos/dedo_de_ente.json +21 -0
- data/src/json/equipamentos/itens/esotericos/luva_de_ferro.json +17 -0
- data/src/json/equipamentos/itens/esotericos/medalhao_de_prata.json +16 -0
- data/src/json/equipamentos/itens/esotericos/orbe_cristalino.json +15 -0
- data/src/json/equipamentos/itens/esotericos/tomo_hermetico.json +17 -0
- data/src/json/equipamentos/itens/esotericos/varinha_arcana.json +15 -0
- data/src/json/equipamentos/itens/ferramentas/alaude_elfico.json +16 -0
- data/src/json/equipamentos/itens/ferramentas/colecao_de_livros.json +16 -0
- data/src/json/equipamentos/itens/ferramentas/equipamento_de_viagem.json +19 -0
- data/src/json/equipamentos/itens/ferramentas/estojo_de_disfarces.json +18 -0
- data/src/json/equipamentos/itens/ferramentas/flauta_mistica.json +17 -0
- data/src/json/equipamentos/itens/ferramentas/gazua.json +18 -0
- data/src/json/equipamentos/itens/ferramentas/instrumento_musical.json +20 -0
- data/src/json/equipamentos/itens/ferramentas/instrumentos_de_oficio.json +21 -0
- data/src/json/equipamentos/itens/ferramentas/luneta.json +15 -0
- data/src/json/equipamentos/itens/ferramentas/maleta_de_medicamentos.json +17 -0
- data/src/json/equipamentos/itens/ferramentas/sela.json +19 -0
- data/src/json/equipamentos/itens/ferramentas/tambor_das_profundezas.json +17 -0
- data/src/json/equipamentos/itens/servicos/conducao.json +19 -0
- data/src/json/equipamentos/itens/servicos/curandeiro.json +9 -0
- data/src/json/equipamentos/itens/servicos/estadia.json +42 -0
- data/src/json/equipamentos/itens/servicos/magia.json +23 -0
- data/src/json/equipamentos/itens/servicos/mensageiro.json +10 -0
- data/src/json/equipamentos/itens/veiculos/balao_goblin.json +34 -0
- data/src/json/equipamentos/itens/veiculos/canoa.json +18 -0
- data/src/json/equipamentos/itens/veiculos/carroca.json +20 -0
- data/src/json/equipamentos/itens/veiculos/carruagem.json +21 -0
- data/src/json/equipamentos/itens/veiculos/veleiro.json +11 -0
- data/src/json/equipamentos/itens/vestuario/andrajos_de_aldeao.json +16 -0
- data/src/json/equipamentos/itens/vestuario/bandana.json +14 -0
- data/src/json/equipamentos/itens/vestuario/botas_reforcadas.json +15 -0
- data/src/json/equipamentos/itens/vestuario/camisa_bufante.json +14 -0
- data/src/json/equipamentos/itens/vestuario/capa_esvoacante.json +14 -0
- data/src/json/equipamentos/itens/vestuario/capa_pesada.json +14 -0
- data/src/json/equipamentos/itens/vestuario/casaco_longo.json +15 -0
- data/src/json/equipamentos/itens/vestuario/chapeu_arcano.json +15 -0
- data/src/json/equipamentos/itens/vestuario/enfeite_de_elmo.json +15 -0
- data/src/json/equipamentos/itens/vestuario/farrapos_de_ermitao.json +16 -0
- data/src/json/equipamentos/itens/vestuario/gorro_de_ervas.json +14 -0
- data/src/json/equipamentos/itens/vestuario/luva_de_pelica.json +14 -0
- data/src/json/equipamentos/itens/vestuario/manopla.json +15 -0
- data/src/json/equipamentos/itens/vestuario/manto_camuflado.json +20 -0
- data/src/json/equipamentos/itens/vestuario/manto_eclesiastico.json +14 -0
- data/src/json/equipamentos/itens/vestuario/robe_mistico.json +14 -0
- data/src/json/equipamentos/itens/vestuario/sapatos_de_camurca.json +14 -0
- data/src/json/equipamentos/itens/vestuario/tabardo.json +14 -0
- data/src/json/equipamentos/itens/vestuario/traje_da_corte.json +19 -0
- data/src/json/equipamentos/itens/vestuario/traje_de_viajante.json +13 -0
- data/src/json/equipamentos/itens/vestuario/veste_de_seda.json +14 -0
- data/src/json/equipamentos/municoes/balas.json +13 -0
- data/src/json/equipamentos/municoes/flechas.json +13 -0
- data/src/json/equipamentos/municoes/pedras.json +14 -0
- data/src/json/equipamentos/municoes/virotes.json +14 -0
- data/src/json/itens_superiores/materiais_especiais/aco_rubi.json +44 -0
- data/src/json/itens_superiores/materiais_especiais/adamante.json +35 -0
- data/src/json/itens_superiores/materiais_especiais/gelo_eterno.json +33 -0
- data/src/json/itens_superiores/materiais_especiais/madeira_tollon.json +31 -0
- data/src/json/itens_superiores/materiais_especiais/materia_vermelha.json +51 -0
- data/src/json/itens_superiores/materiais_especiais/mitral.json +38 -0
- data/src/json/itens_superiores/melhorias/armaduras_escudos/ajustada.json +11 -0
- data/src/json/itens_superiores/melhorias/armaduras_escudos/delicada.json +15 -0
- data/src/json/itens_superiores/melhorias/armaduras_escudos/espinhosa.json +15 -0
- data/src/json/itens_superiores/melhorias/armaduras_escudos/espinhoso.json +11 -0
- data/src/json/itens_superiores/melhorias/armaduras_escudos/polida.json +13 -0
- data/src/json/itens_superiores/melhorias/armaduras_escudos/reforcada.json +13 -0
- data/src/json/itens_superiores/melhorias/armaduras_escudos/selada.json +14 -0
- data/src/json/itens_superiores/melhorias/armaduras_escudos/sob_medida.json +13 -0
- data/src/json/itens_superiores/melhorias/armas/atroz.json +11 -0
- data/src/json/itens_superiores/melhorias/armas/certeira.json +11 -0
- data/src/json/itens_superiores/melhorias/armas/cruel.json +11 -0
- data/src/json/itens_superiores/melhorias/armas/equilibrada.json +11 -0
- data/src/json/itens_superiores/melhorias/armas/harmonizada.json +13 -0
- data/src/json/itens_superiores/melhorias/armas/injecao_alquimica.json +14 -0
- data/src/json/itens_superiores/melhorias/armas/macica.json +12 -0
- data/src/json/itens_superiores/melhorias/armas/mira_telescopica.json +16 -0
- data/src/json/itens_superiores/melhorias/armas/precisa.json +12 -0
- data/src/json/itens_superiores/melhorias/armas/pungente.json +11 -0
- data/src/json/itens_superiores/melhorias/esotericos/canalizador.json +11 -0
- data/src/json/itens_superiores/melhorias/esotericos/energetico.json +12 -0
- data/src/json/itens_superiores/melhorias/esotericos/harmonizado.json +16 -0
- data/src/json/itens_superiores/melhorias/esotericos/poderoso.json +11 -0
- data/src/json/itens_superiores/melhorias/esotericos/vigilante.json +11 -0
- data/src/json/itens_superiores/melhorias/ferramentas_vestuario/aprimorado.json +15 -0
- data/src/json/itens_superiores/melhorias/geral/banhado_a_ouro.json +17 -0
- data/src/json/itens_superiores/melhorias/geral/cravejado_de_gemas.json +12 -0
- data/src/json/itens_superiores/melhorias/geral/discreto.json +13 -0
- data/src/json/itens_superiores/melhorias/geral/macabro.json +12 -0
- data/src/json/itens_superiores/melhorias/geral/material_especial.json +13 -0
- data/src/json/origens/acolito.json +11 -0
- data/src/json/origens/amigo_dos_animais.json +11 -0
- data/src/json/origens/amnesico.json +10 -0
- data/src/json/origens/aristocrata.json +11 -0
- data/src/json/origens/artesao.json +11 -0
- data/src/json/origens/artista.json +11 -0
- data/src/json/origens/assistente_de_laboratorio.json +11 -0
- data/src/json/origens/batedor.json +11 -0
- data/src/json/origens/capanga.json +11 -0
- data/src/json/origens/charlatao.json +11 -0
- data/src/json/origens/circense.json +11 -0
- data/src/json/origens/criminoso.json +11 -0
- data/src/json/origens/curandeiro.json +11 -0
- data/src/json/origens/eremita.json +11 -0
- data/src/json/origens/escravo.json +11 -0
- data/src/json/origens/estudioso.json +11 -0
- data/src/json/origens/fazendeiro.json +11 -0
- data/src/json/origens/forasteiro.json +11 -0
- data/src/json/origens/gladiador.json +11 -0
- data/src/json/origens/guarda.json +11 -0
- data/src/json/origens/herdeiro.json +11 -0
- data/src/json/origens/heroi_campones.json +11 -0
- data/src/json/origens/marujo.json +11 -0
- data/src/json/origens/mateiro.json +11 -0
- data/src/json/origens/membro_de_guilda.json +11 -0
- data/src/json/origens/mercador.json +11 -0
- data/src/json/origens/minerador.json +11 -0
- data/src/json/origens/nomade.json +11 -0
- data/src/json/origens/pivete.json +11 -0
- data/src/json/origens/refugiado.json +11 -0
- data/src/json/origens/seguidor.json +11 -0
- data/src/json/origens/selvagem.json +11 -0
- data/src/json/origens/soldado.json +11 -0
- data/src/json/origens/taverneiro.json +11 -0
- data/src/json/origens/trabalhador.json +11 -0
- data/src/json/poderes/habilidades_unicas_de_origem/a_prova_de_tudo.json +14 -0
- data/src/json/poderes/habilidades_unicas_de_origem/agua_no_feijao.json +14 -0
- data/src/json/poderes/habilidades_unicas_de_origem/alpinista_social.json +9 -0
- data/src/json/poderes/habilidades_unicas_de_origem/amigo_especial.json +16 -0
- data/src/json/poderes/habilidades_unicas_de_origem/antigo_mestre.json +15 -0
- data/src/json/poderes/habilidades_unicas_de_origem/busca_interior.json +13 -0
- data/src/json/poderes/habilidades_unicas_de_origem/confissao.json +14 -0
- data/src/json/poderes/habilidades_unicas_de_origem/coracao_heroico.json +13 -0
- data/src/json/poderes/habilidades_unicas_de_origem/cultura_exotica.json +13 -0
- data/src/json/poderes/habilidades_unicas_de_origem/desejo_de_liberdade.json +12 -0
- data/src/json/poderes/habilidades_unicas_de_origem/detetive.json +14 -0
- data/src/json/poderes/habilidades_unicas_de_origem/dom_artistico.json +10 -0
- data/src/json/poderes/habilidades_unicas_de_origem/escavador.json +13 -0
- data/src/json/poderes/habilidades_unicas_de_origem/esforcado.json +13 -0
- data/src/json/poderes/habilidades_unicas_de_origem/esse_cheiro.json +14 -0
- data/src/json/poderes/habilidades_unicas_de_origem/estoico.json +16 -0
- data/src/json/poderes/habilidades_unicas_de_origem/frutos_do_trabalho.json +19 -0
- data/src/json/poderes/habilidades_unicas_de_origem/gororoba.json +12 -0
- data/src/json/poderes/habilidades_unicas_de_origem/heranca.json +13 -0
- data/src/json/poderes/habilidades_unicas_de_origem/influencia_militar.json +14 -0
- data/src/json/poderes/habilidades_unicas_de_origem/lembrancas_graduais.json +14 -0
- data/src/json/poderes/habilidades_unicas_de_origem/medico_de_campo.json +12 -0
- data/src/json/poderes/habilidades_unicas_de_origem/membro_da_igreja.json +14 -0
- data/src/json/poderes/habilidades_unicas_de_origem/mochileiro.json +9 -0
- data/src/json/poderes/habilidades_unicas_de_origem/negociacao.json +12 -0
- data/src/json/poderes/habilidades_unicas_de_origem/palpite_fundamentado.json +13 -0
- data/src/json/poderes/habilidades_unicas_de_origem/pao_e_circo.json +11 -0
- data/src/json/poderes/habilidades_unicas_de_origem/passagem_de_navio.json +13 -0
- data/src/json/poderes/habilidades_unicas_de_origem/punguista.json +15 -0
- data/src/json/poderes/habilidades_unicas_de_origem/quebra_galho.json +14 -0
- data/src/json/poderes/habilidades_unicas_de_origem/rede_de_contatos.json +14 -0
- data/src/json/poderes/habilidades_unicas_de_origem/sangue_azul.json +12 -0
- data/src/json/poderes/habilidades_unicas_de_origem/truque_de_magica.json +14 -0
- data/src/json/poderes/habilidades_unicas_de_origem/vendedor_de_carcacas.json +13 -0
- data/src/json/poderes/habilidades_unicas_de_origem/vida_rustica.json +13 -0
- data/src/json/poderes/poderes_concedidos/afinidade_com_a_tormenta.json +14 -0
- data/src/json/poderes/poderes_concedidos/almejar_o_impossivel.json +13 -0
- data/src/json/poderes/poderes_concedidos/anfibio.json +13 -0
- data/src/json/poderes/poderes_concedidos/apostar_com_o_trapaceiro.json +12 -0
- data/src/json/poderes/poderes_concedidos/armas_da_ambicao.json +12 -0
- data/src/json/poderes/poderes_concedidos/arsenal_das_profundezas.json +14 -0
- data/src/json/poderes/poderes_concedidos/astucia_da_serpente.json +14 -0
- data/src/json/poderes/poderes_concedidos/ataque_piedoso.json +13 -0
- data/src/json/poderes/poderes_concedidos/aura_de_medo.json +17 -0
- data/src/json/poderes/poderes_concedidos/aura_de_paz.json +18 -0
- data/src/json/poderes/poderes_concedidos/aura_restauradora.json +13 -0
- data/src/json/poderes/poderes_concedidos/bencao_do_mana.json +10 -0
- data/src/json/poderes/poderes_concedidos/caricia_sombria.json +26 -0
- data/src/json/poderes/poderes_concedidos/centelha_magica.json +13 -0
- data/src/json/poderes/poderes_concedidos/compreender_os_ermos.json +17 -0
- data/src/json/poderes/poderes_concedidos/conhecimento_enciclopedico.json +13 -0
- data/src/json/poderes/poderes_concedidos/conjurar_arma.json +19 -0
- data/src/json/poderes/poderes_concedidos/coragem_total.json +11 -0
- data/src/json/poderes/poderes_concedidos/cura_gentil.json +10 -0
- data/src/json/poderes/poderes_concedidos/curandeira_perfeita.json +15 -0
- data/src/json/poderes/poderes_concedidos/dedo_verde.json +14 -0
- data/src/json/poderes/poderes_concedidos/descanso_natural.json +10 -0
- data/src/json/poderes/poderes_concedidos/dom_da_esperanca.json +15 -0
- data/src/json/poderes/poderes_concedidos/dom_da_imortalidade.json +8 -0
- data/src/json/poderes/poderes_concedidos/dom_da_profecia.json +6 -0
- data/src/json/poderes/poderes_concedidos/dom_da_ressurreicao.json +8 -0
- data/src/json/poderes/poderes_concedidos/dom_da_verdade.json +15 -0
- data/src/json/poderes/poderes_concedidos/escamas_draconicas.json +13 -0
- data/src/json/poderes/poderes_concedidos/escudo_magico.json +12 -0
- data/src/json/poderes/poderes_concedidos/espada_justiceira.json +13 -0
- data/src/json/poderes/poderes_concedidos/espada_solar.json +16 -0
- data/src/json/poderes/poderes_concedidos/extase_da_loucura.json +12 -0
- data/src/json/poderes/poderes_concedidos/familiar_ofidico.json +13 -0
- data/src/json/poderes/poderes_concedidos/farsa_do_fingidor.json +14 -0
- data/src/json/poderes/poderes_concedidos/fe_guerreira.json +20 -0
- data/src/json/poderes/poderes_concedidos/forma_de_macaco.json +20 -0
- data/src/json/poderes/poderes_concedidos/fulgor_solar.json +18 -0
- data/src/json/poderes/poderes_concedidos/furia_divina.json +20 -0
- data/src/json/poderes/poderes_concedidos/golpista_divino.json +14 -0
- data/src/json/poderes/poderes_concedidos/habitante_do_deserto.json +14 -0
- data/src/json/poderes/poderes_concedidos/inimigo_de_tenebra.json +14 -0
- data/src/json/poderes/poderes_concedidos/kiai_divino.json +13 -0
- data/src/json/poderes/poderes_concedidos/liberdade_divina.json +12 -0
- data/src/json/poderes/poderes_concedidos/manto_da_penumbra.json +14 -0
- data/src/json/poderes/poderes_concedidos/mente_analitica.json +16 -0
- data/src/json/poderes/poderes_concedidos/mente_vazia.json +16 -0
- data/src/json/poderes/poderes_concedidos/mestre_dos_mares.json +18 -0
- data/src/json/poderes/poderes_concedidos/olhar_amedrontador.json +14 -0
- data/src/json/poderes/poderes_concedidos/palavras_de_bondade.json +14 -0
- data/src/json/poderes/poderes_concedidos/percepcao_temporal.json +17 -0
- data/src/json/poderes/poderes_concedidos/pesquisa_abencoada.json +15 -0
- data/src/json/poderes/poderes_concedidos/poder_oculto.json +21 -0
- data/src/json/poderes/poderes_concedidos/presas_primordiais.json +23 -0
- data/src/json/poderes/poderes_concedidos/presas_venenosas.json +16 -0
- data/src/json/poderes/poderes_concedidos/rejeicao_divina.json +13 -0
- data/src/json/poderes/poderes_concedidos/reparar_injustica.json +13 -0
- data/src/json/poderes/poderes_concedidos/sangue_de_ferro.json +13 -0
- data/src/json/poderes/poderes_concedidos/sangue_ofidico.json +14 -0
- data/src/json/poderes/poderes_concedidos/servos_do_dragao.json +24 -0
- data/src/json/poderes/poderes_concedidos/sopro_do_mar.json +25 -0
- data/src/json/poderes/poderes_concedidos/sorte_dos_loucos.json +13 -0
- data/src/json/poderes/poderes_concedidos/talento_artistico.json +14 -0
- data/src/json/poderes/poderes_concedidos/teurgista_mistico.json +11 -0
- data/src/json/poderes/poderes_concedidos/tradicao_de_lin_wu.json +14 -0
- data/src/json/poderes/poderes_concedidos/transmissao_da_loucura.json +17 -0
- data/src/json/poderes/poderes_concedidos/tropas_duyshidakk.json +24 -0
- data/src/json/poderes/poderes_concedidos/urro_divino.json +13 -0
- data/src/json/poderes/poderes_concedidos/visao_nas_trevas.json +10 -0
- data/src/json/poderes/poderes_concedidos/voz_da_civilizacao.json +10 -0
- data/src/json/poderes/poderes_concedidos/voz_da_natureza.json +18 -0
- data/src/json/poderes/poderes_concedidos/voz_dos_monstros.json +11 -0
- data/src/json/poderes/poderes_concedidos/zumbificar.json +18 -0
- data/src/json/poderes/poderes_da_tormenta/anatomia_insana.json +12 -0
- data/src/json/poderes/poderes_da_tormenta/antenas.json +18 -0
- data/src/json/poderes/poderes_da_tormenta/armamento_aberrante.json +14 -0
- data/src/json/poderes/poderes_da_tormenta/articulacoes_flexiveis.json +15 -0
- data/src/json/poderes/poderes_da_tormenta/asas_insetoides.json +17 -0
- data/src/json/poderes/poderes_da_tormenta/carapaca.json +12 -0
- data/src/json/poderes/poderes_da_tormenta/corpo_aberrante.json +13 -0
- data/src/json/poderes/poderes_da_tormenta/cuspir_enxame.json +20 -0
- data/src/json/poderes/poderes_da_tormenta/dentes_afiados.json +19 -0
- data/src/json/poderes/poderes_da_tormenta/desprezar_a_realidade.json +21 -0
- data/src/json/poderes/poderes_da_tormenta/empunhadura_rubra.json +13 -0
- data/src/json/poderes/poderes_da_tormenta/fome_de_mana.json +11 -0
- data/src/json/poderes/poderes_da_tormenta/larva_explosiva.json +17 -0
- data/src/json/poderes/poderes_da_tormenta/legiao_aberrante.json +19 -0
- data/src/json/poderes/poderes_da_tormenta/maos_membranosas.json +18 -0
- data/src/json/poderes/poderes_da_tormenta/membros_estendidos.json +12 -0
- data/src/json/poderes/poderes_da_tormenta/membros_extras.json +27 -0
- data/src/json/poderes/poderes_da_tormenta/mente_aberrante.json +20 -0
- data/src/json/poderes/poderes_da_tormenta/olhos_vermelhos.json +12 -0
- data/src/json/poderes/poderes_da_tormenta/pele_corrompida.json +13 -0
- data/src/json/poderes/poderes_da_tormenta/sangue_acido.json +13 -0
- data/src/json/poderes/poderes_da_tormenta/visco_rubro.json +15 -0
- data/src/json/regras/alcances.json +33 -0
- data/src/json/regras/carga.json +47 -0
- data/src/json/regras/critico.json +32 -0
- data/src/json/regras/dinheiro_inicial.json +27 -0
- data/src/json/regras/empunhaduras.json +22 -0
- data/src/json/regras/habilidades_armas.json +37 -0
- data/src/json/regras/itens_superiores.json +19 -0
- data/src/json/regras/limites_uso.json +22 -0
- data/src/json/regras/moedas.json +32 -0
- data/src/json/regras/passos_dano.json +20 -0
- data/src/json/regras/proficiencias.json +32 -0
- data/src/json/regras/propositos_armas.json +37 -0
- data/src/json/regras/tipos_dano.json +25 -0
- data/src/json/regras/venenos.json +45 -0
- data/src/ruby/tormenta20/database.rb +224 -0
- data/src/ruby/tormenta20/models/arma.rb +123 -0
- data/src/ruby/tormenta20/models/armadura.rb +96 -0
- data/src/ruby/tormenta20/models/base.rb +19 -0
- data/src/ruby/tormenta20/models/classe.rb +134 -0
- data/src/ruby/tormenta20/models/divindade.rb +98 -0
- data/src/ruby/tormenta20/models/escudo.rb +59 -0
- data/src/ruby/tormenta20/models/item.rb +61 -0
- data/src/ruby/tormenta20/models/magia.rb +226 -0
- data/src/ruby/tormenta20/models/material_especial.rb +52 -0
- data/src/ruby/tormenta20/models/melhoria.rb +52 -0
- data/src/ruby/tormenta20/models/origem.rb +71 -0
- data/src/ruby/tormenta20/models/poder.rb +120 -0
- data/src/ruby/tormenta20/models/regra.rb +47 -0
- data/src/ruby/tormenta20/seeder.rb +267 -0
- data/src/ruby/tormenta20/version.rb +1 -1
- data/src/ruby/tormenta20.rb +169 -7
- data/src/schema/magia.schema.json +277 -0
- data/src/schema/tormenta20.sql +433 -0
- data/tasks/jsonlint.rb +6 -4
- data/tools/pdf_extractor/README.md +171 -0
- data/tools/pdf_extractor/__init__.py +17 -0
- data/tools/pdf_extractor/pdf_extractor.py +441 -0
- data/tools/pdf_extractor/pipeline.py +450 -0
- data/tools/pdf_extractor/prompts.py +789 -0
- data/tools/pdf_extractor/requirements.txt +4 -0
- metadata +488 -12
- data/src/ruby/open_struct_json.rb +0 -35
- data/src/ruby/tormenta20/classes.rb +0 -0
- data/src/ruby/tormenta20/equipment.rb +0 -0
- data/src/ruby/tormenta20/magias.rb +0 -35
- data/src/ruby/tormenta20/origins.rb +0 -0
- 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
|