defmodule ExTTRPGDev.RuleSystems.RuleSystem do alias ExTTRPGDev.RuleSystems.RuleSystem alias ExTTRPGDev.RuleSystems.Metadata alias ExTTRPGDev.RuleSystems.Abilities @moduledoc """ Module for handling a specific Rule System """ defstruct [:metadata, :abilities] @doc """ Loads a RuleSystem struct from a json string representation ## Examples iex> ExTTRPGDev.RuleSystems.RuleSystem.from_json!("a json string") %ExTTRPGDev.RuleSystems.RuleSystem{} """ def from_json!(system_config_json) when is_bitstring(system_config_json) do system_config_json |> Poison.decode!( as: %ExTTRPGDev.RuleSystems.RuleSystem{ metadata: %Metadata{}, abilities: %Abilities{ assignment: %Abilities.Assignment{ rolling_methods: [%Abilities.Assignment.RollingMethod{}], point_buy: %Abilities.Assignment.PointBuy{ score_costs: [%Abilities.Assignment.PointBuy.ScoreCost{}] } }, modifier_calculation: %Abilities.ModifierCalculation{ steps: [%Abilities.ModifierCalculation.Step{}], mapping: [%Abilities.ModifierCalculation.Mapping{}] }, specs: [%Abilities.Spec{}] } } ) end @doc """ Generates a set of ability scores assigned to the rule systems abilities using the system's default assignment method . ## Examples iex> RuleSystem.gen_ability_scores() %{ charisma: [4, 3, 1], constitution: [5, 6, 3], dexterity: [5, 3, 1], intellegence: [4, 3, 3], strength: [4, 1, 5], wisdom: [1, 5, 6] } """ def gen_ability_scores_assigned(%RuleSystem{abilities: %Abilities{} = abilities}) do Abilities.gen_scores(abilities) end @doc """ Generates an unassigned set of ability scores using the system's default assignment method. ## Examples iex> RuleSystem.gen_ability_scores(%RuleSystem{}) [[1, 6, 6], [3, 3, 2], [3, 6, 3], [4, 2, 1], [6, 5, 1], [6, 4, 6]] """ def gen_ability_scores_unassigned(%RuleSystem{abilities: %Abilities{} = abilities}) do Abilities.gen_scores_unassigned(abilities) end end