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