gemwarrior 0.8.6 → 0.8.7
Sign up to get free protection for your applications and to get access to all the features.
- 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
|