gemwarrior 0.8.6 → 0.8.7
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/bin/gemwarrior +15 -9
- data/gemwarrior.gemspec +1 -0
- data/lib/gemwarrior/arena.rb +10 -10
- data/lib/gemwarrior/battle.rb +41 -36
- data/lib/gemwarrior/entities/item.rb +2 -2
- data/lib/gemwarrior/entities/items/arena_master.rb +4 -4
- data/lib/gemwarrior/entities/items/bed.rb +1 -1
- data/lib/gemwarrior/entities/items/couch.rb +1 -1
- data/lib/gemwarrior/entities/items/floor_tile.rb +3 -3
- data/lib/gemwarrior/entities/items/gun.rb +1 -1
- data/lib/gemwarrior/entities/items/herb.rb +1 -1
- data/lib/gemwarrior/entities/items/ladder.rb +2 -2
- data/lib/gemwarrior/entities/items/map.rb +2 -2
- data/lib/gemwarrior/entities/items/massive_door.rb +1 -1
- data/lib/gemwarrior/entities/items/opalaser.rb +1 -1
- data/lib/gemwarrior/entities/items/pond.rb +2 -2
- data/lib/gemwarrior/entities/items/rope.rb +2 -2
- data/lib/gemwarrior/entities/items/snowman.rb +1 -1
- data/lib/gemwarrior/entities/items/sparklything.rb +1 -1
- data/lib/gemwarrior/entities/items/tent.rb +1 -1
- data/lib/gemwarrior/entities/items/tower_switch.rb +1 -1
- data/lib/gemwarrior/entities/items/waterfall.rb +1 -1
- data/lib/gemwarrior/entities/location.rb +19 -19
- data/lib/gemwarrior/entities/monster.rb +2 -2
- data/lib/gemwarrior/entities/monsters/alexandrat.rb +3 -3
- data/lib/gemwarrior/entities/monsters/amberoo.rb +3 -3
- data/lib/gemwarrior/entities/monsters/amethystle.rb +3 -3
- data/lib/gemwarrior/entities/monsters/apatiger.rb +2 -2
- data/lib/gemwarrior/entities/monsters/aquamarine.rb +3 -3
- data/lib/gemwarrior/entities/monsters/bloodstorm.rb +3 -3
- data/lib/gemwarrior/entities/monsters/bosses/emerald.rb +4 -4
- data/lib/gemwarrior/entities/monsters/bosses/garynetty.rb +2 -2
- data/lib/gemwarrior/entities/monsters/citrinaga.rb +3 -3
- data/lib/gemwarrior/entities/monsters/coraliz.rb +3 -3
- data/lib/gemwarrior/entities/monsters/cubicat.rb +3 -3
- data/lib/gemwarrior/entities/monsters/diaman.rb +3 -3
- data/lib/gemwarrior/entities/player.rb +275 -263
- data/lib/gemwarrior/evaluator.rb +448 -448
- data/lib/gemwarrior/game.rb +5 -5
- data/lib/gemwarrior/inventory.rb +14 -10
- data/lib/gemwarrior/misc/animation.rb +1 -1
- data/lib/gemwarrior/misc/music.rb +1 -1
- data/lib/gemwarrior/misc/name_generator.rb +8 -8
- data/lib/gemwarrior/misc/player_levels.rb +1 -1
- data/lib/gemwarrior/misc/timer.rb +50 -0
- data/lib/gemwarrior/misc/wordlist.rb +7 -7
- data/lib/gemwarrior/repl.rb +55 -21
- data/lib/gemwarrior/version.rb +1 -1
- data/lib/gemwarrior/world.rb +21 -21
- metadata +17 -2
data/lib/gemwarrior/game.rb
CHANGED
@@ -17,7 +17,7 @@ require_relative 'inventory'
|
|
17
17
|
module Gemwarrior
|
18
18
|
class Game
|
19
19
|
include PlayerLevels
|
20
|
-
|
20
|
+
|
21
21
|
# CONSTANTS
|
22
22
|
## PLAYER DEFAULTS
|
23
23
|
PLAYER_DESC_DEFAULT = 'Picked to do battle against a wizened madman for a shiny something or other for world-saving purposes.'
|
@@ -25,13 +25,13 @@ module Gemwarrior
|
|
25
25
|
PLAYER_ROX_DEFAULT = 0
|
26
26
|
|
27
27
|
attr_accessor :world, :eval, :repl
|
28
|
-
|
28
|
+
|
29
29
|
def initialize(options)
|
30
30
|
# create new world and player
|
31
31
|
self.world = World.new
|
32
|
-
|
32
|
+
|
33
33
|
start_stats = PlayerLevels::get_level_stats(1)
|
34
|
-
|
34
|
+
|
35
35
|
world.debug_mode = options.fetch(:debug_mode)
|
36
36
|
world.use_wordnik = options.fetch(:use_wordnik)
|
37
37
|
world.sound = options.fetch(:sound)
|
@@ -51,7 +51,7 @@ module Gemwarrior
|
|
51
51
|
:inventory => PLAYER_INVENTORY_DEFAULT,
|
52
52
|
:rox => world.debug_mode ? 300 : PLAYER_ROX_DEFAULT,
|
53
53
|
:cur_coords => world.location_coords_by_name('Home'),
|
54
|
-
|
54
|
+
|
55
55
|
:god_mode => options.fetch(:god_mode),
|
56
56
|
:beast_mode => options.fetch(:beast_mode),
|
57
57
|
:use_wordnik => options.fetch(:use_wordnik)
|
data/lib/gemwarrior/inventory.rb
CHANGED
@@ -13,14 +13,14 @@ module Gemwarrior
|
|
13
13
|
ERROR_ITEM_EQUIP_NONWEAPON = 'That cannot be equipped as a weapon.'
|
14
14
|
ERROR_ITEM_UNEQUIP_INVALID = 'You do not have anything called that to unequip.'
|
15
15
|
ERROR_ITEM_UNEQUIP_NONWEAPON = 'That cannot be unequipped.'
|
16
|
-
|
16
|
+
|
17
17
|
attr_accessor :items, :weapon
|
18
|
-
|
18
|
+
|
19
19
|
def initialize(items = [], weapon = nil)
|
20
20
|
self.items = items
|
21
21
|
self.weapon = weapon
|
22
22
|
end
|
23
|
-
|
23
|
+
|
24
24
|
def list_contents
|
25
25
|
if items.nil? || items.empty?
|
26
26
|
return contents_text = '[empty]'
|
@@ -28,11 +28,11 @@ module Gemwarrior
|
|
28
28
|
return contents_text = "#{items.map(&:name).join ', '}"
|
29
29
|
end
|
30
30
|
end
|
31
|
-
|
31
|
+
|
32
32
|
def has_item?(item_name)
|
33
33
|
items.map(&:name).include?(item_name)
|
34
34
|
end
|
35
|
-
|
35
|
+
|
36
36
|
def describe_item(item_name)
|
37
37
|
if has_item?(item_name)
|
38
38
|
items.each do |i|
|
@@ -44,7 +44,7 @@ module Gemwarrior
|
|
44
44
|
ERROR_ITEM_DESCRIBE_INVALID
|
45
45
|
end
|
46
46
|
end
|
47
|
-
|
47
|
+
|
48
48
|
def equip_item(item_name)
|
49
49
|
if has_item?(item_name)
|
50
50
|
items.each do |i|
|
@@ -62,7 +62,7 @@ module Gemwarrior
|
|
62
62
|
ERROR_ITEM_EQUIP_INVALID
|
63
63
|
end
|
64
64
|
end
|
65
|
-
|
65
|
+
|
66
66
|
def unequip_item(item_name)
|
67
67
|
if has_item?(item_name)
|
68
68
|
items.each do |i|
|
@@ -80,13 +80,17 @@ module Gemwarrior
|
|
80
80
|
ERROR_ITEM_UNEQUIP_INVALID
|
81
81
|
end
|
82
82
|
end
|
83
|
-
|
84
|
-
def add_item(cur_loc, item_name)
|
83
|
+
|
84
|
+
def add_item(cur_loc, item_name, player)
|
85
85
|
cur_loc.items.each do |i|
|
86
86
|
if i.name.eql?(item_name)
|
87
87
|
if i.takeable
|
88
88
|
items.push(i)
|
89
89
|
cur_loc.remove_item(item_name)
|
90
|
+
|
91
|
+
# stats
|
92
|
+
player.items_taken += 1
|
93
|
+
|
90
94
|
return "Added #{item_name} to your increasing collection of bits of tid."
|
91
95
|
else
|
92
96
|
return ERROR_ITEM_ADD_UNTAKEABLE
|
@@ -95,7 +99,7 @@ module Gemwarrior
|
|
95
99
|
end
|
96
100
|
ERROR_ITEM_ADD_INVALID
|
97
101
|
end
|
98
|
-
|
102
|
+
|
99
103
|
def remove_item(item_name)
|
100
104
|
if has_item?(item_name)
|
101
105
|
items.reject! { |item| item.name == item_name }
|
@@ -19,7 +19,7 @@ module Gemwarrior
|
|
19
19
|
volume = note[:volume].nil? ? defaults[:volume] : note[:volume]
|
20
20
|
duration = note[:duration].nil? ? defaults[:duration] : note[:duration]
|
21
21
|
notext = note[:notext].nil? ? defaults[:notext] : note[:notext]
|
22
|
-
|
22
|
+
|
23
23
|
Feep::Base.new({
|
24
24
|
:freq_or_note => note_to_play,
|
25
25
|
:waveform => waveform,
|
@@ -23,7 +23,7 @@ class NameGenerator
|
|
23
23
|
end
|
24
24
|
return names
|
25
25
|
end
|
26
|
-
|
26
|
+
|
27
27
|
# generator function
|
28
28
|
def generate_name
|
29
29
|
chain = nil
|
@@ -31,7 +31,7 @@ class NameGenerator
|
|
31
31
|
if (chain = markov_chain(self.type))
|
32
32
|
return markov_name(chain)
|
33
33
|
end
|
34
|
-
|
34
|
+
|
35
35
|
return ''
|
36
36
|
end
|
37
37
|
|
@@ -42,7 +42,7 @@ class NameGenerator
|
|
42
42
|
for i in 1..count
|
43
43
|
list.push(generate_name)
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
return list
|
47
47
|
end
|
48
48
|
|
@@ -61,7 +61,7 @@ class NameGenerator
|
|
61
61
|
end
|
62
62
|
end
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
return false
|
66
66
|
end
|
67
67
|
|
@@ -92,7 +92,7 @@ class NameGenerator
|
|
92
92
|
end
|
93
93
|
end
|
94
94
|
end
|
95
|
-
|
95
|
+
|
96
96
|
return scale_chain(chain)
|
97
97
|
end
|
98
98
|
|
@@ -107,7 +107,7 @@ class NameGenerator
|
|
107
107
|
chain[key] = {}
|
108
108
|
chain[key][token] = 1
|
109
109
|
end
|
110
|
-
|
110
|
+
|
111
111
|
return chain
|
112
112
|
end
|
113
113
|
|
@@ -125,7 +125,7 @@ class NameGenerator
|
|
125
125
|
table_len[key] += weighted
|
126
126
|
end
|
127
127
|
end
|
128
|
-
|
128
|
+
|
129
129
|
chain['table_len'] = table_len
|
130
130
|
|
131
131
|
return chain
|
@@ -162,7 +162,7 @@ class NameGenerator
|
|
162
162
|
t += chain_value
|
163
163
|
return chain_key if (idx < t)
|
164
164
|
end
|
165
|
-
|
165
|
+
|
166
166
|
return '-'
|
167
167
|
end
|
168
168
|
end
|
@@ -0,0 +1,50 @@
|
|
1
|
+
# lib/gemwarrior/misc/timer.rb
|
2
|
+
# Timer
|
3
|
+
|
4
|
+
module Gemwarrior
|
5
|
+
class Timer
|
6
|
+
attr_accessor :duration_in_s, :timer_name, :background, :progress, :verbose
|
7
|
+
|
8
|
+
DEFAULTS = {
|
9
|
+
duration_in_s: 1,
|
10
|
+
timer_name: 'Timer',
|
11
|
+
background: false,
|
12
|
+
progress: false,
|
13
|
+
verbose: true
|
14
|
+
}
|
15
|
+
|
16
|
+
def initialize(options = {})
|
17
|
+
options = DEFAULTS.merge(options)
|
18
|
+
|
19
|
+
self.duration_in_s = options[:duration_in_s]
|
20
|
+
self.timer_name = options[:timer_name]
|
21
|
+
self.background = options[:background]
|
22
|
+
self.progress = options[:progress]
|
23
|
+
self.verbose = options[:verbose]
|
24
|
+
end
|
25
|
+
|
26
|
+
def start
|
27
|
+
if background
|
28
|
+
Thread.start { self.run }
|
29
|
+
else
|
30
|
+
self.run
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def run
|
35
|
+
puts "#{timer_name} began at #{Time.now} for #{duration_in_s} seconds" if verbose
|
36
|
+
|
37
|
+
end_time = Time.now + duration_in_s
|
38
|
+
|
39
|
+
loop do
|
40
|
+
sleep 1
|
41
|
+
print '.' if progress
|
42
|
+
if Time.now >= end_time
|
43
|
+
print "\n"
|
44
|
+
puts "#{timer_name} ended at #{Time.now}" if verbose
|
45
|
+
return
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
@@ -18,9 +18,9 @@ module Gemwarrior
|
|
18
18
|
STATIC_VERB_VALUES = [
|
19
19
|
'accentuate', 'accompany', 'blatter', 'bully', 'collide', 'crusade', 'disallow', 'entitle', 'infest', 'lateral', 'micturate', 'mourn', 'munge', 'numb', 'outdraw', 'overstep', 'plummet', 'refill', 'refurnish', 'reroute', 'rumple', 'scupper', 'smoosh', 'spifflicate', 'straighten', 'synthesize', 'terrorize', 'unshift', 'vociferate'
|
20
20
|
]
|
21
|
-
|
21
|
+
|
22
22
|
attr_accessor :use_wordnik, :type, :limit, :words, :error
|
23
|
-
|
23
|
+
|
24
24
|
def initialize(use_wordnik = false, type = 'noun', limit = 10)
|
25
25
|
self.use_wordnik = use_wordnik
|
26
26
|
self.type = type
|
@@ -34,7 +34,7 @@ module Gemwarrior
|
|
34
34
|
|
35
35
|
return random_value.nil? ? get_random_value : random_value
|
36
36
|
end
|
37
|
-
|
37
|
+
|
38
38
|
def list_words
|
39
39
|
words.join(',')
|
40
40
|
end
|
@@ -52,7 +52,7 @@ module Gemwarrior
|
|
52
52
|
error = 'invalid wordlist type'
|
53
53
|
return
|
54
54
|
end
|
55
|
-
|
55
|
+
|
56
56
|
json_return = HTTP.get(
|
57
57
|
url,
|
58
58
|
:params => {
|
@@ -70,7 +70,7 @@ module Gemwarrior
|
|
70
70
|
:api_key => api_key
|
71
71
|
}
|
72
72
|
)
|
73
|
-
|
73
|
+
|
74
74
|
json_data = JSON.parse(json_return.to_s)
|
75
75
|
|
76
76
|
if json_data.include?('type') && json_data.include?('message')
|
@@ -87,10 +87,10 @@ module Gemwarrior
|
|
87
87
|
end
|
88
88
|
end
|
89
89
|
end
|
90
|
-
|
90
|
+
|
91
91
|
return get_static_values(type)
|
92
92
|
end
|
93
|
-
|
93
|
+
|
94
94
|
def get_static_values(type = nil)
|
95
95
|
static_values = []
|
96
96
|
0.upto(10) do
|
data/lib/gemwarrior/repl.rb
CHANGED
@@ -3,7 +3,9 @@
|
|
3
3
|
|
4
4
|
require 'readline'
|
5
5
|
require 'os'
|
6
|
+
require 'clocker'
|
6
7
|
|
8
|
+
require_relative 'misc/timer'
|
7
9
|
require_relative 'misc/wordlist'
|
8
10
|
require_relative 'evaluator'
|
9
11
|
require_relative 'version'
|
@@ -14,9 +16,9 @@ module Gemwarrior
|
|
14
16
|
## MESSAGES
|
15
17
|
QUIT_MESSAGE = 'Temporal flux detected. Shutting down...'.colorize(:red)
|
16
18
|
SPLASH_MESSAGE = 'Welcome to the land of *Jool*, where randomized fortune is just as likely as mayhem.'
|
17
|
-
|
19
|
+
|
18
20
|
attr_accessor :world, :eval
|
19
|
-
|
21
|
+
|
20
22
|
def initialize(world, evaluator)
|
21
23
|
self.world = world
|
22
24
|
self.eval = evaluator
|
@@ -25,26 +27,41 @@ module Gemwarrior
|
|
25
27
|
def start(initialCommand = nil)
|
26
28
|
setup_screen(initialCommand)
|
27
29
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
rescue Interrupt
|
35
|
-
puts
|
36
|
-
puts QUIT_MESSAGE
|
37
|
-
exit(0)
|
38
|
-
end
|
30
|
+
clocker = Clocker.new
|
31
|
+
|
32
|
+
at_exit do
|
33
|
+
pl = world.player
|
34
|
+
duration = clocker.stop
|
35
|
+
print_stats(duration, pl)
|
39
36
|
end
|
37
|
+
|
38
|
+
clocker.clock {
|
39
|
+
# main loop
|
40
|
+
loop do
|
41
|
+
prompt
|
42
|
+
begin
|
43
|
+
input = read_line
|
44
|
+
result = eval.evaluate(input)
|
45
|
+
if result.eql?("exit")
|
46
|
+
exit
|
47
|
+
else
|
48
|
+
puts result
|
49
|
+
end
|
50
|
+
rescue Interrupt
|
51
|
+
puts
|
52
|
+
puts QUIT_MESSAGE
|
53
|
+
exit
|
54
|
+
end
|
55
|
+
end
|
56
|
+
}
|
40
57
|
end
|
41
|
-
|
58
|
+
|
42
59
|
private
|
43
|
-
|
60
|
+
|
44
61
|
def clear_screen
|
45
62
|
OS.windows? ? system('cls') : system('clear')
|
46
63
|
end
|
47
|
-
|
64
|
+
|
48
65
|
def print_logo
|
49
66
|
if world.sound
|
50
67
|
Music::cue([
|
@@ -57,7 +74,7 @@ module Gemwarrior
|
|
57
74
|
puts "\\-+-+-+ +-+-+-+-+-+-+-/".colorize(:yellow)
|
58
75
|
puts '[[[[[[[DEBUGGING]]]]]]]'.colorize(:white) if world.debug_mode
|
59
76
|
end
|
60
|
-
|
77
|
+
|
61
78
|
def print_splash_message
|
62
79
|
SPLASH_MESSAGE.length.times do print '=' end
|
63
80
|
puts
|
@@ -65,7 +82,7 @@ module Gemwarrior
|
|
65
82
|
SPLASH_MESSAGE.length.times do print '=' end
|
66
83
|
puts
|
67
84
|
end
|
68
|
-
|
85
|
+
|
69
86
|
def print_fortune
|
70
87
|
noun1_values = WordList.new(world.use_wordnik, 'noun-plural')
|
71
88
|
noun2_values = WordList.new(world.use_wordnik, 'noun-plural')
|
@@ -73,7 +90,7 @@ module Gemwarrior
|
|
73
90
|
|
74
91
|
puts "* Remember: #{noun1_values.get_random_value} and #{noun2_values.get_random_value} are the key to #{noun3_values.get_random_value} *\n\n"
|
75
92
|
end
|
76
|
-
|
93
|
+
|
77
94
|
def print_help
|
78
95
|
puts '* Basic functions: look, go, character, inventory, attack *'
|
79
96
|
puts '* Type \'help\' for complete command list'
|
@@ -81,6 +98,23 @@ module Gemwarrior
|
|
81
98
|
puts
|
82
99
|
end
|
83
100
|
|
101
|
+
def print_stats(duration, pl)
|
102
|
+
puts '######################################################################'
|
103
|
+
puts
|
104
|
+
print 'Gem Warrior'.colorize(:color => :white, :background => :black)
|
105
|
+
print " played for #{duration[:mins].to_s.colorize(:color => :white, :background => :black)} minutes, #{duration[:secs].to_s.colorize(:color => :white, :background => :black)} seconds, and #{duration[:ms].to_s.colorize(:color => :white, :background => :black)} milliseconds\n"
|
106
|
+
puts '----------------------------------------------------------------------'
|
107
|
+
print "Player killed #{pl.monsters_killed.to_s.colorize(:color => :white, :background => :black)} monster(s)"
|
108
|
+
print "\n".ljust(8)
|
109
|
+
print "picked up #{pl.items_taken.to_s.colorize(:color => :white, :background => :black)} item(s)"
|
110
|
+
print "\n".ljust(8)
|
111
|
+
print "traveled #{pl.movements_made.to_s.colorize(:color => :white, :background => :black)} time(s)"
|
112
|
+
print "\n".ljust(8)
|
113
|
+
print "rested #{pl.rests_taken.to_s.colorize(:color => :white, :background => :black)} time(s)"
|
114
|
+
puts
|
115
|
+
puts '######################################################################'
|
116
|
+
end
|
117
|
+
|
84
118
|
def setup_screen(initialCommand = nil)
|
85
119
|
# welcome player to game
|
86
120
|
clear_screen
|
@@ -92,7 +126,7 @@ module Gemwarrior
|
|
92
126
|
# hook to do something right off the bat
|
93
127
|
puts eval.evaluate(initialCommand) unless initialCommand.nil?
|
94
128
|
end
|
95
|
-
|
129
|
+
|
96
130
|
def prompt
|
97
131
|
prompt_template = "\n[LV:%3s][XP:%3s][ROX:%3s] -- [HP:%3s/%-3s][STM:%2s/%-2s] -- [%s @ %s]"
|
98
132
|
if world.debug_mode
|
@@ -114,7 +148,7 @@ module Gemwarrior
|
|
114
148
|
end
|
115
149
|
puts (prompt_template % prompt_vars_arr).colorize(:yellow)
|
116
150
|
end
|
117
|
-
|
151
|
+
|
118
152
|
def read_line
|
119
153
|
prompt_text = world.debug_mode ? ' GW[D]> ' : ' GW> '
|
120
154
|
Readline.readline(prompt_text, true).to_s
|