traveller_rpg 0.0.0.4 → 0.0.1.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 +4 -4
- data/README.md +236 -0
- data/Rakefile +26 -0
- data/VERSION +1 -1
- data/bin/chargen +2 -42
- data/lib/traveller_rpg/career.rb +254 -129
- data/lib/traveller_rpg/career_path.rb +102 -54
- data/lib/traveller_rpg/careers.rb +499 -91
- data/lib/traveller_rpg/character.rb +115 -8
- data/lib/traveller_rpg/homeworld.rb +10 -10
- data/lib/traveller_rpg.rb +8 -9
- metadata +2 -2
@@ -36,8 +36,8 @@ module TravellerRPG
|
|
36
36
|
end
|
37
37
|
end
|
38
38
|
|
39
|
-
def self.stats_dm(
|
40
|
-
case
|
39
|
+
def self.stats_dm(stat_val)
|
40
|
+
case stat_val
|
41
41
|
when 0 then -3
|
42
42
|
when 1..2 then -2
|
43
43
|
when 3..5 then -1
|
@@ -46,23 +46,30 @@ module TravellerRPG
|
|
46
46
|
when 12..14 then 2
|
47
47
|
when 15..20 then 3
|
48
48
|
else
|
49
|
-
raise "unexpected stat: #{
|
49
|
+
raise "unexpected stat: #{stat_val} (#{stat_val.class})"
|
50
50
|
end
|
51
51
|
end
|
52
52
|
|
53
|
-
attr_reader :desc, :stats, :homeworld, :skills,
|
53
|
+
attr_reader :desc, :stats, :homeworld, :skills,
|
54
|
+
:stuff, :credits, :cash_rolls
|
54
55
|
|
55
56
|
def initialize(desc:, stats:, homeworld:,
|
56
|
-
skills: {}, stuff: {}, log: [])
|
57
|
+
skills: {}, stuff: {}, log: [], credits: 0, cash_rolls: 0)
|
57
58
|
@desc = desc
|
58
59
|
@stats = stats
|
59
60
|
@homeworld = homeworld
|
60
61
|
@skills = skills
|
61
62
|
@stuff = stuff
|
62
63
|
@log = log
|
64
|
+
@cash_rolls = cash_rolls # max 3 lifetime
|
65
|
+
@credits = credits
|
63
66
|
self.birth
|
64
67
|
end
|
65
68
|
|
69
|
+
def stats_dm(stat_sym)
|
70
|
+
self.class.stats_dm(@stats[stat_sym])
|
71
|
+
end
|
72
|
+
|
66
73
|
# gain background skills based on homeworld
|
67
74
|
def birth
|
68
75
|
return nil unless @log.empty?
|
@@ -70,7 +77,7 @@ module TravellerRPG
|
|
70
77
|
@desc.name,
|
71
78
|
@homeworld.name,
|
72
79
|
@homeworld.traits.join(' '))
|
73
|
-
skill_count = 3 + self.
|
80
|
+
skill_count = 3 + self.stats_dm(:education)
|
74
81
|
self.log format("Education %i qualifies for %i skills",
|
75
82
|
@stats.education, skill_count)
|
76
83
|
skill_choices = []
|
@@ -87,9 +94,30 @@ module TravellerRPG
|
|
87
94
|
}
|
88
95
|
end
|
89
96
|
skill_choices.each { |sym|
|
90
|
-
|
91
|
-
|
97
|
+
if TravellerRPG::SKILLS.key?(sym)
|
98
|
+
self.log "Acquired background skill: #{sym} 0"
|
99
|
+
@skills[sym] ||= 0
|
100
|
+
else
|
101
|
+
raise(KeyError, sym)
|
102
|
+
end
|
92
103
|
}
|
104
|
+
self
|
105
|
+
end
|
106
|
+
|
107
|
+
def train(sym, level = nil)
|
108
|
+
target = TravellerRPG::SKILLS.key?(sym) ? @skills : @stats
|
109
|
+
target[sym] ||= 0
|
110
|
+
if level
|
111
|
+
if target[sym] < level
|
112
|
+
target[sym] = level
|
113
|
+
else
|
114
|
+
self.log "#{sym} #{level} is < current #{target[sym]}"
|
115
|
+
end
|
116
|
+
else
|
117
|
+
target[sym] += 1
|
118
|
+
level = target[sym]
|
119
|
+
end
|
120
|
+
self.log "#{sym} is trained to #{level}"
|
93
121
|
end
|
94
122
|
|
95
123
|
def add_stuff(benefits)
|
@@ -111,6 +139,7 @@ module TravellerRPG
|
|
111
139
|
return @log unless msg
|
112
140
|
puts msg
|
113
141
|
@log << msg
|
142
|
+
self
|
114
143
|
end
|
115
144
|
|
116
145
|
def name
|
@@ -124,5 +153,83 @@ module TravellerRPG
|
|
124
153
|
def skill_check?(skill, val = 0)
|
125
154
|
@skills[skill] and @skills[skill] >= val
|
126
155
|
end
|
156
|
+
|
157
|
+
def skill_level(sym)
|
158
|
+
@skills[sym] and @skills[sym].clamp(0, 4)
|
159
|
+
end
|
160
|
+
|
161
|
+
def cash_roll(amount)
|
162
|
+
@cash_rolls += 1
|
163
|
+
if @cash_rolls <= 3
|
164
|
+
@credits += amount
|
165
|
+
self.log "Acquired #{amount} credits from cash roll ##{@cash_rolls}"
|
166
|
+
else
|
167
|
+
self.log "Ignoring cash roll ##{@cash_rolls}"
|
168
|
+
end
|
169
|
+
self
|
170
|
+
end
|
171
|
+
|
172
|
+
def benefit(item)
|
173
|
+
if item.is_a?(Integer)
|
174
|
+
if item != 0
|
175
|
+
self.log "Acquired #{item} credits as a career benefit"
|
176
|
+
@credits += item
|
177
|
+
end
|
178
|
+
else
|
179
|
+
self.log "Acquired #{item} as a career benefit"
|
180
|
+
@stuff[item] ||= 0
|
181
|
+
@stuff[item] += 1
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
def report(desc: :short, stats: true, skills: true, stuff: true,
|
186
|
+
log: false, credits: true)
|
187
|
+
hsh = {}
|
188
|
+
if desc
|
189
|
+
hsh['Description'] = { 'Name' => @desc.name,
|
190
|
+
'Gender' => @desc.gender,
|
191
|
+
'Age' => @desc.age }
|
192
|
+
if desc == :long
|
193
|
+
hsh['Description'].merge! 'Appearance' => @desc.appearance,
|
194
|
+
'Temperament' => @desc.temperament,
|
195
|
+
'Plot' => @desc.plot
|
196
|
+
end
|
197
|
+
end
|
198
|
+
if stats
|
199
|
+
hsh['Characteristics'] = {
|
200
|
+
'Strength' => @stats.strength,
|
201
|
+
'Dexterity' => @stats.dexterity,
|
202
|
+
'Endurance' => @stats.endurance,
|
203
|
+
'Intelligence' => @stats.intelligence,
|
204
|
+
'Education' => @stats.education,
|
205
|
+
'Social Status' => @stats.social_status,
|
206
|
+
}
|
207
|
+
end
|
208
|
+
hsh['Skills'] = @skills if skills
|
209
|
+
hsh['Stuff'] = @stuff if stuff
|
210
|
+
hsh['Log'] = @log if log
|
211
|
+
if credits
|
212
|
+
hsh['Credits'] = {
|
213
|
+
'Total' => @credits,
|
214
|
+
'Cash Rolls' => @cash_rolls,
|
215
|
+
}
|
216
|
+
end
|
217
|
+
report = []
|
218
|
+
hsh.each { |section, tbl|
|
219
|
+
report << "#{section}\n==="
|
220
|
+
report << "(none)" if tbl.empty?
|
221
|
+
if tbl.is_a?(Hash)
|
222
|
+
tbl.each { |label, val|
|
223
|
+
report << format("%s: %s", label.to_s.rjust(20, ' '), val.to_s)
|
224
|
+
}
|
225
|
+
elsif tbl.is_a?(Array)
|
226
|
+
report += tbl
|
227
|
+
else
|
228
|
+
report << tbl
|
229
|
+
end
|
230
|
+
report << ' '
|
231
|
+
}
|
232
|
+
report.join("\n")
|
233
|
+
end
|
127
234
|
end
|
128
235
|
end
|
@@ -3,24 +3,24 @@ require 'traveller_rpg'
|
|
3
3
|
module TravellerRPG
|
4
4
|
class Homeworld
|
5
5
|
TRAITS = {
|
6
|
-
agricultural: :
|
6
|
+
agricultural: :animals_group,
|
7
7
|
asteroid: :zero_g,
|
8
8
|
desert: :survival,
|
9
|
-
fluid_oceans: :
|
10
|
-
garden: :
|
9
|
+
fluid_oceans: :seafarer_group,
|
10
|
+
garden: [:animals_riding, :animals_veterinary],
|
11
11
|
high_technology: :computers,
|
12
12
|
high_population: :streetwise,
|
13
13
|
ice_capped: :vacc_suit,
|
14
|
-
industrial: :
|
14
|
+
industrial: :trade_group,
|
15
15
|
low_technology: :survival,
|
16
|
-
poor: :
|
16
|
+
poor: :animals_group,
|
17
17
|
rich: :carouse,
|
18
|
-
water_world: :
|
18
|
+
water_world: :seafarer_group,
|
19
19
|
vacuum: :vacc_suit,
|
20
|
-
education: [:admin, :advocate, :
|
21
|
-
:
|
22
|
-
:
|
23
|
-
:
|
20
|
+
education: [:admin, :advocate, :art_group, :carouse, :comms,
|
21
|
+
:computers, :drive_group, :engineer_group, :language_group,
|
22
|
+
:medic, :physical_sciences_group, :life_sciences_group,
|
23
|
+
:social_sciences_group, :space_sciences_group, :trade_group],
|
24
24
|
}
|
25
25
|
TRAIT_MIN = 3
|
26
26
|
TRAIT_MAX = 6
|
data/lib/traveller_rpg.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module TravellerRPG
|
2
|
-
|
2
|
+
PLAYER_CHOOSE = ENV['HUMAN']
|
3
3
|
|
4
4
|
ROLL_RGX = %r{
|
5
5
|
\A # starts with
|
@@ -22,8 +22,9 @@ module TravellerRPG
|
|
22
22
|
end
|
23
23
|
|
24
24
|
def self.choose(msg, *args)
|
25
|
-
|
26
|
-
|
25
|
+
puts msg + ' (' + args.join(' ') + ')'
|
26
|
+
raise "no choices" if args.empty?
|
27
|
+
return self.player_choose(msg, *args) if PLAYER_CHOOSE
|
27
28
|
choice = args.sample
|
28
29
|
puts "> #{choice}"
|
29
30
|
choice
|
@@ -32,10 +33,11 @@ module TravellerRPG
|
|
32
33
|
def self.player_choose(msg, *args)
|
33
34
|
chosen = false
|
34
35
|
while !chosen
|
35
|
-
|
36
|
-
choice = self.prompt.to_s.downcase.to_sym
|
36
|
+
choice = self.player_prompt
|
37
37
|
if args.include?(choice)
|
38
38
|
chosen = choice
|
39
|
+
elsif args.include?(choice.to_sym)
|
40
|
+
chosen = choice.to_sym
|
39
41
|
else
|
40
42
|
puts "Try again.\n"
|
41
43
|
end
|
@@ -49,10 +51,6 @@ module TravellerRPG
|
|
49
51
|
$stdin.gets(chomp: true)
|
50
52
|
end
|
51
53
|
|
52
|
-
def self.career_class(str)
|
53
|
-
Object.const_get("TravellerRPG::#{str.split('::').last}")
|
54
|
-
end
|
55
|
-
|
56
54
|
# per http://www.traveller-srd.com/core-rules/skills/
|
57
55
|
SKILLS = {
|
58
56
|
admin: nil,
|
@@ -198,6 +196,7 @@ module TravellerRPG
|
|
198
196
|
tactics_group: nil,
|
199
197
|
tactics_military: nil,
|
200
198
|
tactics_ground: nil,
|
199
|
+
tactics_naval: nil,
|
201
200
|
|
202
201
|
trade_group: nil,
|
203
202
|
trade_biologicals: nil,
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: traveller_rpg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rick Hull
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-12-
|
11
|
+
date: 2017-12-05 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: buildar
|