{"format":"rpg.pizza/ruleset","id":"exemplo","name":{"pt":"Sistema de Exemplo","en":"Example System"},"version":"1.0.0","languages":["pt","en"],"authors":["rpg.pizza"],"description":{"pt":"Um sistema mínimo para testar a plataforma.","en":"A minimal system to try the platform."},"scripts":[{"name":"main.lua","source":"-- Sistema de Exemplo: mostra o básico da API. Veja docs/formato-de-regras.md.\n\nlocal ATRIBUTOS = {\n  { id = \"for\", name = { pt = \"Força\", en = \"Strength\" } },\n  { id = \"des\", name = { pt = \"Destreza\", en = \"Dexterity\" } },\n  { id = \"con\", name = { pt = \"Constituição\", en = \"Constitution\" } },\n  { id = \"int\", name = { pt = \"Inteligência\", en = \"Intelligence\" } },\n}\n\nlocal function mod(valor) return (valor - 10) // 2 end\n\nfunction build(c)\n  c:sections({\n    { id = \"personagem\", title = { pt = \"Personagem\", en = \"Character\" }, columns = 2 },\n    { id = \"atributos\", title = { pt = \"Atributos\", en = \"Attributes\" }, columns = 4 },\n    { id = \"combate\", title = { pt = \"Combate\", en = \"Combat\" }, columns = 3 },\n    { id = \"niveis\", title = { pt = \"Níveis\", en = \"Levels\" } },\n    { id = \"habilidades\", title = { pt = \"Habilidades\", en = \"Abilities\" } },\n    { id = \"equipamento\", title = { pt = \"Equipamento\", en = \"Gear\" } },\n  })\n\n  -- Raça\n  c:section(\"personagem\")\n  local raca = c:choose({ id = \"raca\", label = { pt = \"Raça\", en = \"Race\" }, from = \"racas\" })\n\n  -- Atributos: o jogador digita o valor base; a raça soma em cima.\n  for _, a in ipairs(ATRIBUTOS) do\n    local base = c:number({ id = a.id, label = a.name, default = 10, min = 3, max = 18, section = \"atributos\" })\n    c:stat({ id = a.id .. \":total\", label = a.name, base = base, hidden = true })\n  end\n  if raca and raca.bonus then\n    for attr, bonus in pairs(raca.bonus) do c:add(attr .. \":total\", bonus, raca.name) end\n  end\n  if raca and raca.escolheAtributo then\n    local escolha = c:choose({ id = \"raca:atributo\", label = { pt = \"Atributo do humano\", en = \"Human attribute\" }, options = ATRIBUTOS })\n    if escolha then c:add(escolha.id .. \":total\", 1, raca.name) end\n  end\n  for _, a in ipairs(ATRIBUTOS) do\n    c:stat({ id = a.id .. \":mod\", label = { pt = \"Mod. \" .. a.name.pt, en = a.name.en .. \" mod.\" }, format = \"bonus\", section = \"atributos\" })\n    c:add(a.id .. \":mod\", mod(c:get(a.id .. \":total\")), a.name)\n  end\n\n  -- Níveis: cada entrada é um nível numa classe (multiclasse é só escolher outra classe).\n  local niveis = c:levels({ id = \"niveis\", from = \"classes\", max = 10, section = \"niveis\" })\n  c:stat({ id = \"pv\", hidden = true })\n  c:stat({ id = \"pm\", hidden = true })\n  local con = c:get(\"con:mod\")\n\n  for _, n in ipairs(niveis) do\n    local classe = n.class\n    if n.index == 1 then\n      c:add(\"pv\", classe.pv + con, classe.name)\n    else\n      c:add(\"pv\", math.max(1, classe.pvPorNivel + con), { pt = \"Nível \" .. n.index, en = \"Level \" .. n.index })\n    end\n    c:add(\"pm\", classe.pm, classe.name)\n\n    -- A cada nível par, um poder da classe (ou um geral, sem classe).\n    if n.index % 2 == 0 then\n      c:heading({ pt = n.index .. \"º nível\", en = \"Level \" .. n.index }, { section = \"niveis\" })\n      local poder = c:choose({\n        id = \"poder:\" .. n.index,\n        label = { pt = \"Poder\", en = \"Power\" },\n        from = \"poderes\",\n        pool = \"poderes\",\n        section = \"niveis\",\n        filter = function(p) return p.classe == nil or p.classe == classe.id end,\n        requires = function(p)\n          if p.forca and c:get(\"for:total\") < p.forca then\n            return false, { pt = \"Exige Força \" .. p.forca .. \".\", en = \"Requires Strength \" .. p.forca .. \".\" }\n          end\n          return true\n        end,\n      })\n      if poder then\n        c:feature({ item = poder, source = classe.name, section = \"habilidades\" })\n        if poder.id == \"robusto\" then c:add(\"pv\", 3, poder.name) end\n        if poder.id == \"foco-arcano\" then c:add(\"pm\", 2, poder.name) end\n      end\n    end\n  end\n\n  c:section(\"combate\")\n  c:resource({ id = \"pv\", label = { pt = \"Pontos de Vida\", en = \"Hit Points\" } })\n  c:resource({ id = \"pm\", label = { pt = \"Pontos de Mana\", en = \"Mana Points\" } })\n  c:stat({ id = \"defesa\", label = { pt = \"Defesa\", en = \"Defense\" }, base = 10 })\n  c:add(\"defesa\", c:get(\"des:mod\"), { pt = \"Destreza\", en = \"Dexterity\" })\n\n  if raca then c:feature({ item = raca, source = { pt = \"Raça\", en = \"Race\" }, section = \"habilidades\" }) end\n\n  c:list({\n    id = \"equipamento\",\n    label = { pt = \"Itens\", en = \"Items\" },\n    section = \"equipamento\",\n    columns = {\n      { id = \"nome\", label = { pt = \"Item\", en = \"Item\" } },\n      { id = \"qtd\", label = { pt = \"Qtd.\", en = \"Qty.\" }, type = \"number\" },\n    },\n  })\n\n  if c.level > 0 and c:get(\"pv\") <= 0 then\n    c:warn({ pt = \"Pontos de vida zerados: confira Constituição.\", en = \"No hit points: check Constitution.\" })\n  end\nend\n"}],"catalogs":{"classes":[{"id":"guerreiro","name":{"pt":"Guerreiro","en":"Fighter"},"description":{"pt":"Mestre das armas.\n\n> **PV:** 12 no 1º nível, 4 por nível.\n> **PM:** 2 por nível.","en":"Master of weapons.\n\n> **HP:** 12 at 1st level, 4 per level.\n> **MP:** 2 per level."},"pv":12,"pvPorNivel":4,"pm":2},{"id":"mago","name":{"pt":"Mago","en":"Wizard"},"description":{"pt":"Estudioso das artes arcanas.\n\n> **PV:** 6 no 1º nível, 2 por nível.\n> **PM:** 5 por nível.","en":"Scholar of the arcane arts.\n\n> **HP:** 6 at 1st level, 2 per level.\n> **MP:** 5 per level."},"pv":6,"pvPorNivel":2,"pm":5}],"poderes":[{"id":"golpe-firme","classe":"guerreiro","name":{"pt":"Golpe Firme","en":"Steady Strike"},"description":{"pt":"+1 em ataques corpo a corpo.","en":"+1 to melee attacks."}},{"id":"brutal","classe":"guerreiro","forca":13,"name":{"pt":"Brutal","en":"Brutal"},"description":{"pt":"+2 em dano. Exige Força 13.","en":"+2 damage. Requires Strength 13."}},{"id":"robusto","repeatable":true,"name":{"pt":"Robusto","en":"Tough"},"description":{"pt":"+3 PV. Pode ser escolhido várias vezes.","en":"+3 HP. Can be taken multiple times."}},{"id":"foco-arcano","classe":"mago","name":{"pt":"Foco Arcano","en":"Arcane Focus"},"description":{"pt":"+2 PM.","en":"+2 MP."}}],"racas":[{"id":"anao","name":{"pt":"Anão","en":"Dwarf"},"description":{"pt":"Constituição +2. Visão no escuro.","en":"Constitution +2. Darkvision."},"bonus":{"con":2}},{"id":"elfo","name":{"pt":"Elfo","en":"Elf"},"description":{"pt":"Destreza +2. Sentidos aguçados.","en":"Dexterity +2. Keen senses."},"bonus":{"des":2}},{"id":"humano","name":{"pt":"Humano","en":"Human"},"description":{"pt":"+1 em um atributo à escolha.","en":"+1 to one attribute of your choice."},"escolheAtributo":true}]}}