mythal 0.2.0 → 0.2.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: '0755594699c3e8ada4db324d5b88d181c0c6d9b3f1c1d04c3bdd64e14cbeffdc'
4
- data.tar.gz: '09d0440f87024bfe12a8dcda037296b2e74f7b23c863b85a35419537850dfca0'
3
+ metadata.gz: 229d18d0fee0f6ce08cfbdd6ad1dad60bdecc93b6fe61dfa3f23eee39015022e
4
+ data.tar.gz: 209bc0b21ebdbc292389a5c97f52ffc549d0dca088bc2a1c34829393a2023cbf
5
5
  SHA512:
6
- metadata.gz: 47ff05214de1e6a62e6720f14edea452d03c3d646b2031cd2201a19b7769b70223b06c3205b4c9332f69d686bb0c32db6c736eed56c27ce88578d868624f5ac3
7
- data.tar.gz: b5857f68899ff251732dba197fc88b3d2e5e0e06ca8271aad6a51472d17ae4a1cfbe574084496a65e0a06ff660499e97309ef5f4cdb26600f5d5ed53a97748da
6
+ metadata.gz: 0cfce4639aec18f639f64cf1b8dbd28ba95bdda11aac719ec578e5a65481a82ced89890efd73daff5994bfc6a38b9dc5670fe64580a638e4cdf34a728336a420
7
+ data.tar.gz: 21bdab990e8455328552a8aa0f77d462dfe0c1529e82045c0458abf5da1ecc108225dd6e0fdd0527863fe15f2478fffac3e1ee1aae693d871ab9cd50eaaa75e1
data/config.yml CHANGED
@@ -47,3 +47,12 @@ dnd_classes:
47
47
  - monk
48
48
  - warlock
49
49
  - paladin
50
+
51
+ npc_stats_by_challenge_rating:
52
+ 'Headers': [proficiency_bonus, armor_class, hit_points, attack_bonus, damage_per_round, save_dc]
53
+ '0': [2, 13, 1..6, 3, 1..2, 13]
54
+ '1/8': [2, 13, 7..35, 3, 2..3, 13]
55
+ '1/4': [2, 13, 36..49, 3, 4..5, 13]
56
+ '1/2': [2, 13, 50..70, 3, 6..8, 13]
57
+ '1': [2, 13, 71..85, 3, 9..14, 13]
58
+ '2': [2, 13, 16..100, 3, 15..20, 13]
@@ -1,30 +1,11 @@
1
- # require "mythal"
1
+ module Mythal
2
+ end
3
+
2
4
  require "thor"
3
5
  require "procto"
4
6
  require "mythal/version"
5
7
  require "mythal/config"
6
8
  require "mythal/roll"
9
+ require "mythal/stats"
7
10
  require "mythal/npc"
8
-
9
- module Mythal
10
- class CLI < Thor
11
-
12
- desc "roll", "roll some number of dice, plus modifiers e.g. 1d20, or 3d8 + 4"
13
-
14
- def roll(*args)
15
- puts Mythal::Roll.call(*args).message
16
- end
17
-
18
- desc "npc", "generate a random npc, e.g. 'a half-orc barbarian'"
19
-
20
- def npc
21
- puts Mythal::Npc.call(config: config)
22
- end
23
-
24
- private
25
-
26
- def config
27
- @config ||= Mythal::Config.new
28
- end
29
- end
30
- end
11
+ require "mythal/cli"
@@ -0,0 +1,21 @@
1
+ module Mythal
2
+ class CLI < Thor
3
+
4
+ desc "roll", "roll some number of dice, plus modifiers e.g. 1d20, or 3d8 + 4"
5
+
6
+ def roll(*args)
7
+ puts Mythal::Roll.call(*args).message
8
+ end
9
+
10
+ desc "npc", "generate a random npc, e.g. 'a half-orc barbarian'"
11
+ method_option :challenge_rating, type: :string, aliases: "--cr"
12
+ method_option :options, type: :hash, aliases: "-o"
13
+
14
+ def npc
15
+ puts Mythal::Npc.call(
16
+ challenge_rating: options[:challenge_rating],
17
+ user_overrides: options[:options]&.transform_keys(&:to_sym),
18
+ ).message
19
+ end
20
+ end
21
+ end
@@ -3,32 +3,36 @@ require "pathname"
3
3
 
4
4
  module Mythal
5
5
  class Config
6
- def initialize(user_overrides: {})
7
- @user_overrides = user_overrides
8
- end
6
+ class << self
7
+ attr_reader :settings
9
8
 
10
- def traits
11
- config["traits"]
12
- end
9
+ def config
10
+ @config ||= YAML.load(File.read(config_file))
11
+ end
13
12
 
14
- def races
15
- config["races"]
16
- end
13
+ def dnd_classes
14
+ config["dnd_classes"]
15
+ end
17
16
 
18
- def dnd_classes
19
- config["dnd_classes"]
20
- end
17
+ def npc_stats_by_challenge_rating
18
+ config["npc_stats_by_challenge_rating"]
19
+ end
21
20
 
22
- def config
23
- @config ||= user_overrides.empty? ? YAML.load(File.read(config_file)) : user_overrides
24
- end
21
+ def races
22
+ config["races"]
23
+ end
24
+
25
+ def traits
26
+ config["traits"]
27
+ end
25
28
 
26
- private
29
+ private
27
30
 
28
- attr_reader :user_overrides
31
+ attr_reader :user_overrides
29
32
 
30
- def config_file
31
- Pathname.new(File.expand_path("../../../config.yml", __FILE__))
33
+ def config_file
34
+ Pathname.new(File.expand_path("../../../config.yml", __FILE__))
35
+ end
32
36
  end
33
37
  end
34
38
  end
@@ -2,32 +2,59 @@ module Mythal
2
2
  class Npc
3
3
  include Procto.call
4
4
 
5
- def initialize(config:)
6
- @config = config
5
+ def initialize(challenge_rating: "1/4", user_overrides: {})
6
+ @challenge_rating = challenge_rating
7
+ @user_overrides = user_overrides
7
8
  end
8
9
 
9
10
  def call
10
- character_description
11
+ self
11
12
  end
12
13
 
13
- private
14
-
15
- attr_reader :config
14
+ def stats
15
+ @stats ||= Mythal::Stats.new(
16
+ challenge_rating: challenge_rating,
17
+ options: (user_overrides || {}),
18
+ )
19
+ end
16
20
 
17
21
  def character_description
18
22
  trait + " " + race + " " + dnd_class
19
23
  end
20
24
 
21
- def trait
22
- config.traits.sample
25
+ def dnd_class
26
+ config.dnd_classes.sample
23
27
  end
24
28
 
25
29
  def race
26
30
  config.races.sample
27
31
  end
28
32
 
29
- def dnd_class
30
- config.dnd_classes.sample
33
+ def trait
34
+ config.traits.sample
35
+ end
36
+
37
+ def message
38
+ <<~OUTPUT
39
+ ---
40
+ #{character_description}
41
+ ---
42
+ Armor Class: #{stats.armor_class}
43
+ Hit Points: #{stats.hit_points}
44
+ Attack: +#{stats.attack_bonus}
45
+ Damage: #{stats.damage_per_round} slashing
46
+ Speed: #{stats.speed}ft
47
+ Challenge Rating: #{stats.challenge_rating}
48
+ ---
49
+ OUTPUT
50
+ end
51
+
52
+ private
53
+
54
+ attr_reader :user_overrides, :challenge_rating
55
+
56
+ def config
57
+ Mythal::Config
31
58
  end
32
59
  end
33
60
  end
@@ -0,0 +1,88 @@
1
+ module Mythal
2
+ class Stats
3
+ VALID_ATTRS = %i[
4
+ challenge_rating
5
+ proficiency_bonus
6
+ armor_class
7
+ hit_points
8
+ damage_per_round
9
+ attack_bonus
10
+ save_dc
11
+ speed
12
+ str
13
+ dex
14
+ con
15
+ int
16
+ wis
17
+ cha
18
+ ]
19
+
20
+ VALID_CHALLENGE_RATINGS = %w[0 1/8 1/4 1/2 1 2]
21
+
22
+ attr_reader :challenge_rating, :options
23
+
24
+ def initialize(challenge_rating: "1/4", options: {})
25
+ @challenge_rating = init_challenge_rating(challenge_rating)
26
+ @options = options
27
+ post_initialize
28
+ end
29
+
30
+ def attributes
31
+ {
32
+ challenge_rating: challenge_rating,
33
+ proficiency_bonus: stats_by_cr["proficiency_bonus"],
34
+ armor_class: stats_by_cr["armor_class"],
35
+ hit_points: init_hit_points,
36
+ damage_per_round: init_damage_per_round,
37
+ attack_bonus: stats_by_cr["attack_bonus"],
38
+ save_dc: stats_by_cr["save_dc"],
39
+ speed: 30,
40
+ str: 15,
41
+ dex: 14,
42
+ con: 13,
43
+ int: 12,
44
+ wis: 10,
45
+ cha: 8,
46
+ }.merge(user_overrides)
47
+ end
48
+
49
+ private
50
+
51
+ def config
52
+ Mythal::Config
53
+ end
54
+
55
+ def init_damage_per_round
56
+ Range.new(*stats_by_cr["damage_per_round"].split("..").map(&:to_i)).to_a.sample
57
+ end
58
+
59
+ def stats_by_cr
60
+ @stats_by_cr ||= begin
61
+ raw_stats = config.npc_stats_by_challenge_rating
62
+ raw_stats["Headers"].zip(raw_stats[challenge_rating]).to_h
63
+ end
64
+ end
65
+
66
+ def init_challenge_rating(cr)
67
+ default_cr = "1/4"
68
+ return default_cr unless VALID_CHALLENGE_RATINGS.include?(cr)
69
+ cr
70
+ end
71
+
72
+ def init_hit_points
73
+ Range.new(*stats_by_cr["hit_points"].split("..").map(&:to_i)).to_a.sample
74
+ end
75
+
76
+ def user_overrides
77
+ options.select do |k, _v|
78
+ VALID_ATTRS.include?(k)
79
+ end
80
+ end
81
+
82
+ def post_initialize
83
+ attributes.each do |attr_name, attr_value|
84
+ define_singleton_method(attr_name) { attr_value }
85
+ end
86
+ end
87
+ end
88
+ end
@@ -1,3 +1,3 @@
1
1
  module Mythal
2
- VERSION = "0.2.0"
2
+ VERSION = "0.2.1"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mythal
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - George Groh
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2018-11-13 00:00:00.000000000 Z
11
+ date: 2018-12-09 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -114,9 +114,11 @@ files:
114
114
  - config.yml
115
115
  - exe/mythal
116
116
  - lib/mythal.rb
117
+ - lib/mythal/cli.rb
117
118
  - lib/mythal/config.rb
118
119
  - lib/mythal/npc.rb
119
120
  - lib/mythal/roll.rb
121
+ - lib/mythal/stats.rb
120
122
  - lib/mythal/version.rb
121
123
  - mythal.gemspec
122
124
  homepage: https://github.com/Inglorion-G/mythal