gemwarrior 0.5.2 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +10 -8
- data/bin/gemwarrior +5 -1
- data/gemwarrior.gemspec +1 -1
- data/lib/gemwarrior/battle.rb +29 -10
- data/lib/gemwarrior/entities/boss.rb +18 -0
- data/lib/gemwarrior/entities/entity.rb +1 -1
- data/lib/gemwarrior/entities/items/sparklything.rb +19 -0
- data/lib/gemwarrior/entities/items/stonemite.rb +1 -1
- data/lib/gemwarrior/entities/items/throne.rb +19 -0
- data/lib/gemwarrior/entities/location.rb +27 -12
- data/lib/gemwarrior/entities/monster.rb +2 -2
- data/lib/gemwarrior/entities/monsters/bosses/emerald.rb +54 -0
- data/lib/gemwarrior/entities/player.rb +19 -16
- data/lib/gemwarrior/evaluator.rb +104 -52
- data/lib/gemwarrior/game.rb +2 -1
- data/lib/gemwarrior/inventory.rb +14 -14
- data/lib/gemwarrior/misc/version.rb +1 -1
- data/lib/gemwarrior/repl.rb +1 -1
- data/lib/gemwarrior/world.rb +65 -27
- metadata +8 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3f015fb6369a72803beae935f2698172c35ec720
|
4
|
+
data.tar.gz: cc7a8aaae582b41fd1e27dd955e44452077e7290
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e6c57f60b4b3b7a56b2a88bf4f22fac3aaa9225208e78c323b95d448c08df99b4792e81546f64c03079173a4bebcc4c163884daf0088a4864a793e8636e5a696
|
7
|
+
data.tar.gz: 715ee8977a5f75bd20285fd5e54b7884d62acc7b66aefcb2c4ea08d55ca34d43742e21da427ed4f4b218c648383900b69e059377997d5c7520352aad24133938
|
data/README.md
CHANGED
@@ -29,16 +29,16 @@ Run the commands above and you'll be whisked away to Jool, ready to start or con
|
|
29
29
|
This is in super-hyper-turbo-edition pre-pre-pre-alpha right now, but a working console prompt, some commands (type `h` for a list), and a few locations exist already. Each time you start the game a new hero will be created with a randomized name, but you can change that with `> change name`.
|
30
30
|
|
31
31
|
`> c` - character check for visual identity
|
32
|
-
`> i
|
32
|
+
`> i [object]` - check your inventory (or an individual item within)
|
33
33
|
`> ls [entity_type]` - list entities in the game (monsters, items, locations)
|
34
34
|
`> r` - take a load off and replenish hp
|
35
|
-
`> l
|
36
|
-
`> t
|
37
|
-
`> d
|
38
|
-
`> e
|
35
|
+
`> l [object]` - look at current location and its items and monsters
|
36
|
+
`> t [object]` - take an item from a location
|
37
|
+
`> d [object]` - drop an item from your inventory
|
38
|
+
`> e [object]` - equip an item in your inventory as a weapon
|
39
39
|
`> ue [object]` - unequip an item in your inventory
|
40
|
-
`> g
|
41
|
-
`> a
|
40
|
+
`> g [direction]` - go in a direction, if possible
|
41
|
+
`> a [monster]` - attack a monster
|
42
42
|
`> ch [attribute]` - change some things about yourself
|
43
43
|
`> h` - display available commands
|
44
44
|
`> q` - quit this nonsense w/ prompt
|
@@ -51,12 +51,14 @@ To come:
|
|
51
51
|
* ~~Ability to fight those monsters!~~
|
52
52
|
* ~~Monsters to fight back!~~
|
53
53
|
* ~~Items you can pick up!~~
|
54
|
+
* ~~Main Boss and Win State!~~
|
54
55
|
* Saving!
|
55
56
|
* Loading of said saved state!
|
56
57
|
* More locations to move between!
|
58
|
+
* Randomized worlds!
|
57
59
|
* Quests (maybe)!
|
58
60
|
* Towns (maybe)!
|
59
|
-
* Merchants!
|
61
|
+
* Merchants (maybe)!
|
60
62
|
* Sound FX!
|
61
63
|
* Music!
|
62
64
|
* Epic Length (whereby "Epic" I mean "maybe 30 minutes"?)!
|
data/bin/gemwarrior
CHANGED
@@ -8,7 +8,7 @@ require_relative '../lib/gemwarrior/game'
|
|
8
8
|
GAME_NAME = "Gem Warrior"
|
9
9
|
|
10
10
|
def parse_options
|
11
|
-
options = {:god_mode => false}
|
11
|
+
options = {:god_mode => false, :beast_mode => false}
|
12
12
|
|
13
13
|
optparse = OptionParser.new do |opts|
|
14
14
|
opts.on('-v', '--version', 'Display version number and exit') do
|
@@ -19,6 +19,10 @@ def parse_options
|
|
19
19
|
opts.on('-g', '--god', 'Set godmode to true on load') do
|
20
20
|
options[:god_mode] = true
|
21
21
|
end
|
22
|
+
|
23
|
+
opts.on('-b', '--beast', 'Set beastmode to true on load') do
|
24
|
+
options[:beast_mode] = true
|
25
|
+
end
|
22
26
|
end
|
23
27
|
|
24
28
|
optparse.parse!()
|
data/gemwarrior.gemspec
CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.license = 'MIT'
|
21
21
|
|
22
22
|
spec.add_runtime_dependency 'os', '~> 0.9', '>= 0.9.6'
|
23
|
-
spec.add_runtime_dependency 'matrext', '~> 0.
|
23
|
+
spec.add_runtime_dependency 'matrext', '~> 0.4.7'
|
24
24
|
spec.add_runtime_dependency 'http', '~> 0.8.10'
|
25
25
|
spec.add_runtime_dependency 'json', '~> 1.8.2'
|
26
26
|
spec.add_runtime_dependency 'colorize', '~> 0.7.7'
|
data/lib/gemwarrior/battle.rb
CHANGED
@@ -56,7 +56,6 @@ module Gemwarrior
|
|
56
56
|
puts "You attack #{monster.name}#{player.cur_weapon_name}!"
|
57
57
|
dmg = calculate_damage_to(monster)
|
58
58
|
if dmg > 0
|
59
|
-
puts "> You wound it for #{dmg} point(s)!".colorize(:yellow)
|
60
59
|
take_damage(monster, dmg)
|
61
60
|
if monster_dead?
|
62
61
|
monster_death
|
@@ -118,13 +117,24 @@ module Gemwarrior
|
|
118
117
|
|
119
118
|
def take_damage(entity, dmg)
|
120
119
|
entity.hp_cur = entity.hp_cur.to_i - dmg.to_i
|
120
|
+
who_gets_wounded = ''
|
121
|
+
if entity.eql?(monster)
|
122
|
+
who_gets_wounded = "> You wound #{monster.name} for "
|
123
|
+
else
|
124
|
+
who_gets_wounded = "> You are wounded for "
|
125
|
+
end
|
126
|
+
hit = Thread.new do
|
127
|
+
print who_gets_wounded
|
128
|
+
print "#{Matrext::process({ :phrase => dmg.to_s, :speed => :slow, :oneline => true, :alpha => false, :random => false })}"
|
129
|
+
print " point(s)!\n"
|
130
|
+
end
|
131
|
+
return hit.join
|
121
132
|
end
|
122
133
|
|
123
134
|
def monster_attacks_player
|
124
135
|
puts "#{monster.name} attacks you!"
|
125
136
|
dmg = calculate_damage_to(player)
|
126
137
|
if dmg > 0
|
127
|
-
puts "> You are wounded for #{dmg} point(s)!".colorize(:yellow)
|
128
138
|
take_damage(player, dmg)
|
129
139
|
if player_dead?
|
130
140
|
player_death
|
@@ -152,13 +162,22 @@ module Gemwarrior
|
|
152
162
|
end
|
153
163
|
|
154
164
|
def monster_death
|
155
|
-
puts "You have defeated #{monster.name}
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
165
|
+
puts "You have defeated #{monster.name}!\n".colorize(:green)
|
166
|
+
if monster.is_boss
|
167
|
+
if monster.name.eql?("Emerald")
|
168
|
+
monster.defeated_text
|
169
|
+
exit(0)
|
170
|
+
else
|
171
|
+
puts 'You just beat a boss monster. Way to go!'
|
172
|
+
end
|
173
|
+
else
|
174
|
+
puts 'You get the following spoils of war:'
|
175
|
+
puts " XP : #{monster.xp}".colorize(:green)
|
176
|
+
puts " ROX: #{monster.rox}".colorize(:green)
|
177
|
+
print_battle_line
|
178
|
+
update_player_stats
|
179
|
+
world.location_by_coords(player.cur_coords).remove_monster(monster.name)
|
180
|
+
end
|
162
181
|
end
|
163
182
|
|
164
183
|
def update_player_stats
|
@@ -200,7 +219,7 @@ module Gemwarrior
|
|
200
219
|
def print_escape_text
|
201
220
|
escape = Thread.new do
|
202
221
|
print "* "
|
203
|
-
print "#{Matrext::process({ :phrase => 'POOF', :
|
222
|
+
print "#{Matrext::process({ :phrase => 'POOF', :oneline => true })}"
|
204
223
|
print " *\n"
|
205
224
|
end
|
206
225
|
return escape.join
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# lib/gemwarrior/entities/boss.rb
|
2
|
+
# Boss monster
|
3
|
+
|
4
|
+
require_relative 'monster'
|
5
|
+
|
6
|
+
module Gemwarrior
|
7
|
+
class Boss < Monster
|
8
|
+
attr_reader :win_text
|
9
|
+
|
10
|
+
def win_text
|
11
|
+
win_text = 'You beat #{name}! You win! '
|
12
|
+
win_text << 'You become the true Gem Warrior, marry Queen Ruby, and have many fine, sparkling children. '
|
13
|
+
win_text << 'Thank you for playing. Goodbye.'
|
14
|
+
puts win_text
|
15
|
+
exit(0)
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# lib/gemwarrior/entities/items/sparklything.rb
|
2
|
+
# Item::SparklyThing
|
3
|
+
|
4
|
+
require_relative '../item'
|
5
|
+
|
6
|
+
module Gemwarrior
|
7
|
+
class SparklyThing < Item
|
8
|
+
def initialize
|
9
|
+
self.name = 'SparklyThing(tm)'
|
10
|
+
self.description = 'The sparkling that this thing does is unimaginably brilliant.'
|
11
|
+
self.atk_lo = nil
|
12
|
+
self.atk_hi = nil
|
13
|
+
self.takeable = true
|
14
|
+
self.useable = true
|
15
|
+
self.equippable = false
|
16
|
+
self.equipped = false
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -7,7 +7,7 @@ module Gemwarrior
|
|
7
7
|
class Stonemite < Item
|
8
8
|
def initialize
|
9
9
|
self.name = 'stonemite'
|
10
|
-
self.description = 'Stubby cave debris that is
|
10
|
+
self.description = 'Stubby cave debris that is neat to look at, as it is off-grey and sparkly, but the size makes it unusable as anything but skipping on a lake.'
|
11
11
|
self.atk_lo = nil
|
12
12
|
self.atk_hi = nil
|
13
13
|
self.takeable = true
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# lib/gemwarrior/entities/items/throne.rb
|
2
|
+
# Item::Throne
|
3
|
+
|
4
|
+
require_relative '../item'
|
5
|
+
|
6
|
+
module Gemwarrior
|
7
|
+
class Throne < Item
|
8
|
+
def initialize
|
9
|
+
self.name = 'throne'
|
10
|
+
self.description = 'Made of what appears to be unfulfilled desires and latent, flawed happiness, the well-crafted seat still looks kinda comfy.'
|
11
|
+
self.atk_lo = nil
|
12
|
+
self.atk_hi = nil
|
13
|
+
self.takeable = false
|
14
|
+
self.useable = false
|
15
|
+
self.equippable = false
|
16
|
+
self.equipped = false
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -11,10 +11,9 @@ module Gemwarrior
|
|
11
11
|
|
12
12
|
## ERRORS
|
13
13
|
ERROR_LOCATION_ITEM_REMOVE_INVALID = 'That item cannot be removed as it does not exist here.'
|
14
|
-
ERROR_LOCATION_DESCRIBE_ENTITY_INVALID = 'You do not see that here.'
|
15
14
|
|
16
15
|
attr_accessor :coords, :locs_connected, :danger_level, :items,
|
17
|
-
:
|
16
|
+
:monsters_abounding, :bosses_abounding, :checked_for_monsters
|
18
17
|
|
19
18
|
def initialize(options)
|
20
19
|
self.name = options.fetch(:name)
|
@@ -23,14 +22,14 @@ module Gemwarrior
|
|
23
22
|
self.locs_connected = options.fetch(:locs_connected)
|
24
23
|
self.danger_level = options.fetch(:danger_level)
|
25
24
|
self.items = options.fetch(:items)
|
26
|
-
self.monsters_available = options.fetch(:monsters_available)
|
27
25
|
self.monsters_abounding = []
|
26
|
+
self.bosses_abounding = options[:bosses_abounding]
|
28
27
|
self.checked_for_monsters = false
|
29
28
|
end
|
30
29
|
|
31
30
|
def status
|
32
|
-
status_text = name.ljust(
|
33
|
-
status_text << coords.values.to_a
|
31
|
+
status_text = name.ljust(26).upcase
|
32
|
+
status_text << coords.values.to_a.to_s
|
34
33
|
status_text << " #{description}\n"
|
35
34
|
end
|
36
35
|
|
@@ -60,9 +59,11 @@ module Gemwarrior
|
|
60
59
|
locs_connected[direction.to_sym]
|
61
60
|
end
|
62
61
|
|
63
|
-
def monster_by_name(
|
64
|
-
monsters_abounding
|
65
|
-
|
62
|
+
def monster_by_name(monster_name)
|
63
|
+
monsters_list = monsters_abounding | bosses_abounding
|
64
|
+
|
65
|
+
monsters_list.each do |m|
|
66
|
+
if m.name.downcase.eql?(monster_name.downcase)
|
66
67
|
return m.clone
|
67
68
|
end
|
68
69
|
end
|
@@ -87,13 +88,17 @@ module Gemwarrior
|
|
87
88
|
end
|
88
89
|
|
89
90
|
def list_items
|
90
|
-
return "\n >>
|
91
|
+
return "\n >> Curious object(s): #{items.map(&:name).join(', ')}" if items.length > 0
|
91
92
|
end
|
92
93
|
|
93
94
|
def list_monsters
|
94
95
|
return "\n >> Monster(s) abound: #{monsters_abounding.map(&:name).join(', ')}" if monsters_abounding.length > 0
|
95
96
|
end
|
96
97
|
|
98
|
+
def list_bosses
|
99
|
+
return "\n >> Boss(es) abound: #{bosses_abounding.map(&:name).join(', ')}" if bosses_abounding.length > 0
|
100
|
+
end
|
101
|
+
|
97
102
|
def list_paths
|
98
103
|
valid_paths = []
|
99
104
|
locs_connected.each do |key, value|
|
@@ -104,11 +109,21 @@ module Gemwarrior
|
|
104
109
|
return "\n >> Paths: #{valid_paths.join(', ')}"
|
105
110
|
end
|
106
111
|
|
107
|
-
def populate_monsters
|
108
|
-
self.checked_for_monsters = true
|
112
|
+
def populate_monsters(monsters_available)
|
109
113
|
if has_monster?
|
114
|
+
self.checked_for_monsters = true
|
110
115
|
self.monsters_abounding = []
|
111
|
-
|
116
|
+
random_monster = nil
|
117
|
+
|
118
|
+
# get random non-boss monster
|
119
|
+
loop do
|
120
|
+
random_monster = monsters_available[rand(0..monsters_available.length-1)]
|
121
|
+
unless random_monster.is_boss
|
122
|
+
break
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
monsters_abounding.push(random_monster)
|
112
127
|
else
|
113
128
|
return nil
|
114
129
|
end
|
@@ -5,10 +5,10 @@ require_relative 'creature'
|
|
5
5
|
|
6
6
|
module Gemwarrior
|
7
7
|
class Monster < Creature
|
8
|
-
attr_accessor :battlecry
|
8
|
+
attr_accessor :battlecry, :is_boss
|
9
9
|
|
10
10
|
def describe
|
11
|
-
status_text = name.upcase.ljust(
|
11
|
+
status_text = name.upcase.ljust(26)
|
12
12
|
status_text << "LEVEL: #{level.to_s.rjust(2)}, "
|
13
13
|
status_text << "HP: #{hp_cur.to_s.rjust(3)}/#{hp_max.to_s.rjust(3)} "
|
14
14
|
status_text << "ATK: #{atk_lo.to_s.rjust(2)}-#{atk_hi.to_s.rjust(2)} "
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# lib/gemwarrior/entities/monsters/bosses/emerald.rb
|
2
|
+
# Emerald boss monster
|
3
|
+
|
4
|
+
require_relative '../../monster'
|
5
|
+
require_relative '../../items/sparklything'
|
6
|
+
|
7
|
+
module Gemwarrior
|
8
|
+
class Emerald < Monster
|
9
|
+
attr_accessor :defeated_text
|
10
|
+
|
11
|
+
def initialize
|
12
|
+
self.name = 'Emerald'
|
13
|
+
self.description = 'A wily, beefy, tower of a man, champion of both wisdom and strength, sporting a constant glint in his eyes.'
|
14
|
+
self.face = 'gleaming'
|
15
|
+
self.hands = 'tantalizing'
|
16
|
+
self.mood = 'enraged'
|
17
|
+
|
18
|
+
self.level = 15
|
19
|
+
self.hp_cur = rand((level * 2)..(level * 3))
|
20
|
+
self.hp_max = hp_cur
|
21
|
+
self.atk_lo = rand(level..(level * 2.5).floor)
|
22
|
+
self.atk_hi = rand((level * 2.5).floor..(level * 3).floor)
|
23
|
+
self.defense = rand(5..7)
|
24
|
+
self.dexterity = rand(8..10)
|
25
|
+
|
26
|
+
self.inventory = Inventory.new(items = [SparklyThing.new])
|
27
|
+
self.rox = rand((level * 2)..(level * 3))
|
28
|
+
self.xp = rand(level..(level * 2))
|
29
|
+
|
30
|
+
self.battlecry = 'Ha ha ha ha ha! Prepare yourself: today your whole life crumbles!'
|
31
|
+
self.is_boss = true
|
32
|
+
self.defeated_text = defeated_text
|
33
|
+
end
|
34
|
+
|
35
|
+
def defeated_text
|
36
|
+
0.upto(9) do print '<^>' end
|
37
|
+
print "\n"
|
38
|
+
puts "You beat #{name}! You win!\n"
|
39
|
+
print "You receive the "
|
40
|
+
print "SparklyThing(tm)".colorize(:magenta)
|
41
|
+
print " and become the true "
|
42
|
+
print "Gem Warrior".colorize(:yellow)
|
43
|
+
print "!\n"
|
44
|
+
print "You decide to ignore "
|
45
|
+
print "Queen Ruby".colorize(:red)
|
46
|
+
print " and take your spoils back home\n"
|
47
|
+
print "where you live out the rest of your days staring at it, wondering\n"
|
48
|
+
print "what it was all about.\n\n"
|
49
|
+
puts "Thank you for playing. Goodbye."
|
50
|
+
0.upto(9) do print '<^>' end
|
51
|
+
puts
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -16,7 +16,8 @@ module Gemwarrior
|
|
16
16
|
HANDS_DESC = ['worn', 'balled into fists', 'relaxed', 'cracked', 'tingly', 'mom\'s spaghetti']
|
17
17
|
MOOD_DESC = ['calm', 'excited', 'depressed', 'tense', 'lackadaisical', 'angry', 'positive']
|
18
18
|
|
19
|
-
attr_accessor :stam_cur, :stam_max, :cur_coords,
|
19
|
+
attr_accessor :stam_cur, :stam_max, :cur_coords,
|
20
|
+
:god_mode, :beast_mode
|
20
21
|
|
21
22
|
def initialize(options)
|
22
23
|
self.name = generate_name
|
@@ -25,13 +26,13 @@ module Gemwarrior
|
|
25
26
|
self.face = generate_face
|
26
27
|
self.hands = generate_hands
|
27
28
|
self.mood = generate_mood
|
28
|
-
|
29
|
+
|
29
30
|
self.level = options.fetch(:level)
|
30
31
|
self.xp = options.fetch(:xp)
|
31
32
|
self.hp_cur = options.fetch(:hp_cur)
|
32
33
|
self.hp_max = options.fetch(:hp_max)
|
33
|
-
self.atk_lo = options.fetch(:atk_lo)
|
34
|
-
self.atk_hi = options.fetch(:atk_hi)
|
34
|
+
self.atk_lo = options.fetch(:beast_mode) ? 40 : options.fetch(:atk_lo)
|
35
|
+
self.atk_hi = options.fetch(:beast_mode) ? 40 : options.fetch(:atk_hi)
|
35
36
|
|
36
37
|
self.defense = options.fetch(:defense)
|
37
38
|
self.dexterity = options.fetch(:dexterity)
|
@@ -42,8 +43,9 @@ module Gemwarrior
|
|
42
43
|
self.stam_cur = options.fetch(:stam_cur)
|
43
44
|
self.stam_max = options.fetch(:stam_max)
|
44
45
|
self.cur_coords = options.fetch(:cur_coords)
|
45
|
-
|
46
|
+
|
46
47
|
self.god_mode = options.fetch(:god_mode)
|
48
|
+
self.beast_mode = options.fetch(:beast_mode)
|
47
49
|
end
|
48
50
|
|
49
51
|
def check_self(show_pic = true)
|
@@ -60,16 +62,17 @@ module Gemwarrior
|
|
60
62
|
self.atk_hi = inventory.weapon.atk_hi
|
61
63
|
end
|
62
64
|
|
63
|
-
self_text = "NAME: #{name}\n"
|
64
|
-
self_text = "XY
|
65
|
-
self_text << "WPN
|
66
|
-
self_text << "LVL
|
67
|
-
self_text << "XP
|
68
|
-
self_text << "HP
|
69
|
-
self_text << "ATK
|
70
|
-
self_text << "DEX
|
71
|
-
self_text << "DEF
|
72
|
-
self_text << "GOD
|
65
|
+
self_text = "NAME : #{name}\n"
|
66
|
+
self_text = "XY : #{cur_coords.values.to_a}\n"
|
67
|
+
self_text << "WPN : #{cur_weapon_name}\n"
|
68
|
+
self_text << "LVL : #{level}\n"
|
69
|
+
self_text << "XP : #{xp}\n"
|
70
|
+
self_text << "HP : #{hp_cur}/#{hp_max}\n"
|
71
|
+
self_text << "ATK : #{atk_lo}-#{atk_hi}\n"
|
72
|
+
self_text << "DEX : #{dexterity}\n"
|
73
|
+
self_text << "DEF : #{defense}\n"
|
74
|
+
self_text << "GOD : #{god_mode}\n"
|
75
|
+
self_text << "BEAST: #{beast_mode}\n\n"
|
73
76
|
|
74
77
|
self_text << "#{description}\n\n"
|
75
78
|
|
@@ -148,7 +151,7 @@ module Gemwarrior
|
|
148
151
|
def print_traveling_text(direction_text)
|
149
152
|
loc = Thread.new do
|
150
153
|
print "* "
|
151
|
-
print "#{Matrext::process({ :phrase => direction_text, :
|
154
|
+
print "#{Matrext::process({ :phrase => direction_text, :oneline => true })}"
|
152
155
|
print " *\n"
|
153
156
|
end
|
154
157
|
return loc.join
|
data/lib/gemwarrior/evaluator.rb
CHANGED
@@ -7,29 +7,34 @@ module Gemwarrior
|
|
7
7
|
class Evaluator
|
8
8
|
# CONSTANTS
|
9
9
|
## MESSAGES
|
10
|
-
PROGRAM_NAME
|
11
|
-
QUIT_MESSAGE
|
12
|
-
RESUME_MESSAGE
|
13
|
-
SEPARATOR
|
14
|
-
CHANGE_PARAMS
|
15
|
-
LIST_PARAMS
|
10
|
+
PROGRAM_NAME = 'Gem Warrior'
|
11
|
+
QUIT_MESSAGE = 'Thanks for playing the game. Until next time...'.colorize(:yellow)
|
12
|
+
RESUME_MESSAGE = 'Back to adventuring!'.colorize(:green)
|
13
|
+
SEPARATOR = '=========================================================================='
|
14
|
+
CHANGE_PARAMS = 'Options: name'
|
15
|
+
LIST_PARAMS = 'Options: monsters, items, locations'
|
16
|
+
DEBUG_PARAMS = 'Options: vars, map, stat'
|
17
|
+
DEBUG_STAT_PARAMS = 'Options: atk_lo, atk_hi, strength, dexterity'
|
16
18
|
|
17
19
|
## ERRORS
|
18
|
-
ERROR_COMMAND_INVALID
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
20
|
+
ERROR_COMMAND_INVALID = 'That is not something the game yet understands.'
|
21
|
+
|
22
|
+
ERROR_GO_PARAM_MISSING = 'Just wander aimlessly? A direction would be nice.'
|
23
|
+
ERROR_GO_PARAM_INVALID = 'The place in that direction is far, far, FAR too dangerous. You should try a different way.'
|
24
|
+
ERROR_ATTACK_PARAM_MISSING = 'You cannot just "attack". You gotta choose something to attack.'
|
25
|
+
ERROR_ATTACK_PARAM_INVALID = 'That monster does not exist here or can\'t be attacked.'
|
26
|
+
ERROR_TAKE_PARAM_MISSING = 'You cannot just "take". You gotta choose something to take.'
|
27
|
+
ERROR_DROP_PARAM_MISSING = 'You cannot just "drop". You gotta choose something to drop.'
|
28
|
+
ERROR_EQUIP_PARAM_MISSING = 'You cannot just "equip". You gotta choose something to equip.'
|
29
|
+
ERROR_UNEQUIP_PARAM_MISSING = 'You cannot just "unequip". You gotta choose something to unequip.'
|
30
|
+
ERROR_CHANGE_PARAM_MISSING = 'You cannot just "change". You gotta choose something to change.'
|
31
|
+
ERROR_CHANGE_PARAM_INVALID = 'You cannot change that...yet.'
|
32
|
+
ERROR_LIST_PARAM_MISSING = 'You cannot just "list". You gotta choose something to list.'
|
33
|
+
ERROR_LIST_PARAM_INVALID = 'You cannot list that...yet.'
|
34
|
+
ERROR_DEBUG_PARAM_MISSING = 'You cannot just "debug". You gotta choose a debug command.'
|
35
|
+
ERROR_DEBUG_PARAM_INVALID = 'You cannot debug that...yet.'
|
36
|
+
ERROR_DEBUG_STAT_PARAM_MISSING = 'You cannot just "change stats". You gotta choose a stat to change.'
|
37
|
+
ERROR_DEBUG_STAT_PARAM_INVALID = 'You cannot change that stat...yet.'
|
33
38
|
|
34
39
|
attr_accessor :world, :commands, :aliases, :descriptions, :devcmds, :devaliases
|
35
40
|
|
@@ -72,21 +77,73 @@ module Gemwarrior
|
|
72
77
|
end
|
73
78
|
|
74
79
|
command = tokens.first.downcase
|
75
|
-
|
80
|
+
param1 = tokens[1]
|
81
|
+
param2 = tokens[2]
|
82
|
+
param3 = tokens[3]
|
76
83
|
|
77
84
|
case command
|
78
85
|
# dev commands
|
79
86
|
when 'debug', 'db'
|
80
|
-
if
|
81
|
-
ERROR_DEBUG_PARAM_MISSING
|
87
|
+
if param1.nil?
|
88
|
+
puts ERROR_DEBUG_PARAM_MISSING
|
89
|
+
puts DEBUG_PARAMS
|
82
90
|
else
|
83
|
-
case
|
91
|
+
case param1
|
84
92
|
when 'vars', 'v'
|
85
93
|
world.print_all_vars
|
86
94
|
when 'godmode', 'iddqd', 'god', 'g'
|
87
95
|
world.player.god_mode = !world.player.god_mode
|
96
|
+
when 'beastmode', 'beast', 'b'
|
97
|
+
world.player.beast_mode = !world.player.beast_mode
|
88
98
|
when 'map', 'm'
|
89
99
|
world.print_map
|
100
|
+
when 'stat'
|
101
|
+
if param2.nil?
|
102
|
+
puts ERROR_DEBUG_STAT_PARAM_MISSING
|
103
|
+
puts DEBUG_STAT_PARAMS
|
104
|
+
else
|
105
|
+
case param2
|
106
|
+
when 'atk_lo'
|
107
|
+
unless param3.nil?
|
108
|
+
param3 = param3.to_i
|
109
|
+
if param3.is_a? Numeric
|
110
|
+
if param3 >= 0
|
111
|
+
world.player.atk_lo = param3
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
when 'atk_hi'
|
116
|
+
unless param3.nil?
|
117
|
+
param3 = param3.to_i
|
118
|
+
if param3.is_a? Numeric
|
119
|
+
if param3 >= 0
|
120
|
+
world.player.atk_hi = param3
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
when 'strength', 'str', 'st'
|
125
|
+
unless param3.nil?
|
126
|
+
param3 = param3.to_i
|
127
|
+
if param3.is_a? Numeric
|
128
|
+
if param3 >= 0
|
129
|
+
world.player.atk_lo = param3
|
130
|
+
world.player.atk_hi = param3
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
when 'dexterity', 'dex', 'd'
|
135
|
+
unless param3.nil?
|
136
|
+
param3 = param3.to_i
|
137
|
+
if param3.is_a? Numeric
|
138
|
+
if param3 >= 0
|
139
|
+
world.player.dexterity = param3
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|
143
|
+
else
|
144
|
+
ERROR_DEBUG_STAT_PARAM_INVALID
|
145
|
+
end
|
146
|
+
end
|
90
147
|
else
|
91
148
|
ERROR_DEBUG_PARAM_INVALID
|
92
149
|
end
|
@@ -95,62 +152,57 @@ module Gemwarrior
|
|
95
152
|
when 'character', 'c'
|
96
153
|
world.player.check_self
|
97
154
|
when 'inventory', 'i'
|
98
|
-
if
|
99
|
-
world.player.inventory.describe_item(
|
155
|
+
if param1
|
156
|
+
world.player.inventory.describe_item(param1)
|
100
157
|
else
|
101
158
|
world.player.list_inventory
|
102
159
|
end
|
103
160
|
when 'list', 'ls'
|
104
|
-
if
|
161
|
+
if param1.nil?
|
105
162
|
puts ERROR_LIST_PARAM_MISSING
|
106
163
|
puts LIST_PARAMS
|
107
164
|
else
|
108
|
-
|
109
|
-
when 'monsters', 'items', 'locations'
|
110
|
-
world.list(param)
|
111
|
-
else
|
112
|
-
ERROR_LIST_PARAM_INVALID
|
113
|
-
end
|
165
|
+
world.list(param1)
|
114
166
|
end
|
115
167
|
when 'rest', 'r'
|
116
168
|
world.player.rest
|
117
169
|
when 'look', 'l'
|
118
|
-
if
|
119
|
-
world.describe_entity(
|
170
|
+
if param1
|
171
|
+
world.describe_entity(world.location_by_coords(world.player.cur_coords), param1)
|
120
172
|
else
|
121
173
|
world.describe(world.location_by_coords(world.player.cur_coords))
|
122
174
|
end
|
123
175
|
when 'take', 't'
|
124
|
-
if
|
176
|
+
if param1.nil?
|
125
177
|
ERROR_TAKE_PARAM_MISSING
|
126
178
|
else
|
127
|
-
world.player.inventory.add_item(world.location_by_coords(world.player.cur_coords),
|
179
|
+
world.player.inventory.add_item(world.location_by_coords(world.player.cur_coords), param1)
|
128
180
|
end
|
129
181
|
when 'drop', 'd'
|
130
|
-
if
|
182
|
+
if param1.nil?
|
131
183
|
ERROR_DROP_PARAM_MISSING
|
132
184
|
else
|
133
|
-
world.player.inventory.remove_item(
|
185
|
+
world.player.inventory.remove_item(param1)
|
134
186
|
end
|
135
187
|
when 'equip', 'e'
|
136
|
-
if
|
188
|
+
if param1.nil?
|
137
189
|
ERROR_EQUIP_PARAM_MISSING
|
138
190
|
else
|
139
|
-
world.player.inventory.equip_item(
|
191
|
+
world.player.inventory.equip_item(param1)
|
140
192
|
end
|
141
193
|
when 'unequip', 'ue'
|
142
|
-
if
|
194
|
+
if param1.nil?
|
143
195
|
ERROR_UNEQUIP_PARAM_MISSING
|
144
196
|
else
|
145
|
-
world.player.inventory.unequip_item(
|
197
|
+
world.player.inventory.unequip_item(param1)
|
146
198
|
end
|
147
199
|
when 'go', 'g'
|
148
|
-
if
|
200
|
+
if param1.nil?
|
149
201
|
ERROR_GO_PARAM_MISSING
|
150
202
|
else
|
151
|
-
direction =
|
203
|
+
direction = param1
|
152
204
|
if world.can_move?(direction)
|
153
|
-
world.player.go(world.locations,
|
205
|
+
world.player.go(world.locations, param1)
|
154
206
|
world.location_by_coords(world.player.cur_coords).checked_for_monsters = false
|
155
207
|
world.describe(world.location_by_coords(world.player.cur_coords))
|
156
208
|
else
|
@@ -158,10 +210,10 @@ module Gemwarrior
|
|
158
210
|
end
|
159
211
|
end
|
160
212
|
when 'attack', 'a'
|
161
|
-
if
|
213
|
+
if param1.nil?
|
162
214
|
ERROR_ATTACK_PARAM_MISSING
|
163
215
|
else
|
164
|
-
monster_name =
|
216
|
+
monster_name = param1
|
165
217
|
if world.has_monster_to_attack?(monster_name)
|
166
218
|
monster = world.location_by_coords(world.player.cur_coords).monster_by_name(monster_name)
|
167
219
|
world.player.attack(world, monster)
|
@@ -170,11 +222,11 @@ module Gemwarrior
|
|
170
222
|
end
|
171
223
|
end
|
172
224
|
when 'change', 'ch'
|
173
|
-
if
|
225
|
+
if param1.nil?
|
174
226
|
puts ERROR_CHANGE_PARAM_MISSING
|
175
227
|
puts CHANGE_PARAMS
|
176
228
|
else
|
177
|
-
case
|
229
|
+
case param1
|
178
230
|
when 'name'
|
179
231
|
world.player.modify_name
|
180
232
|
else
|
@@ -222,7 +274,7 @@ module Gemwarrior
|
|
222
274
|
commands_and_aliases = commands | aliases | devcmds | devaliases
|
223
275
|
|
224
276
|
if commands_and_aliases.include?(command.downcase)
|
225
|
-
if tokens.size.between?(1,
|
277
|
+
if tokens.size.between?(1,4)
|
226
278
|
return true
|
227
279
|
end
|
228
280
|
elsif tokens.empty?
|
data/lib/gemwarrior/game.rb
CHANGED
@@ -49,7 +49,8 @@ module Gemwarrior
|
|
49
49
|
:inventory => PLAYER_INVENTORY_DEFAULT,
|
50
50
|
:rox => PLAYER_ROX_DEFAULT,
|
51
51
|
:cur_coords => world.location_coords_by_name('Home'),
|
52
|
-
:god_mode => options.fetch(:god_mode)
|
52
|
+
:god_mode => options.fetch(:god_mode),
|
53
|
+
:beast_mode => options.fetch(:beast_mode)
|
53
54
|
})
|
54
55
|
|
55
56
|
# create the console
|
data/lib/gemwarrior/inventory.rb
CHANGED
@@ -14,24 +14,24 @@ module Gemwarrior
|
|
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
|
-
attr_accessor :
|
17
|
+
attr_accessor :items, :weapon
|
18
18
|
|
19
|
-
def initialize(
|
20
|
-
self.
|
19
|
+
def initialize(items = [], weapon = nil)
|
20
|
+
self.items = items
|
21
21
|
self.weapon = weapon
|
22
22
|
end
|
23
23
|
|
24
24
|
def list_contents
|
25
|
-
if
|
25
|
+
if items.empty?
|
26
26
|
return contents_text = '[empty]'
|
27
27
|
else
|
28
|
-
return contents_text = "
|
28
|
+
return contents_text = "#{items.map(&:name).join ', '}"
|
29
29
|
end
|
30
30
|
end
|
31
31
|
|
32
32
|
def describe_item(item_name)
|
33
|
-
if
|
34
|
-
|
33
|
+
if items.map(&:name).include?(item_name)
|
34
|
+
items.each do |i|
|
35
35
|
if i.name.eql?(item_name)
|
36
36
|
return i.description
|
37
37
|
end
|
@@ -42,8 +42,8 @@ module Gemwarrior
|
|
42
42
|
end
|
43
43
|
|
44
44
|
def equip_item(item_name)
|
45
|
-
if
|
46
|
-
|
45
|
+
if items.map(&:name).include?(item_name)
|
46
|
+
items.each do |i|
|
47
47
|
if i.name.eql?(item_name)
|
48
48
|
if i.equippable
|
49
49
|
i.equipped = true
|
@@ -60,8 +60,8 @@ module Gemwarrior
|
|
60
60
|
end
|
61
61
|
|
62
62
|
def unequip_item(item_name)
|
63
|
-
if
|
64
|
-
|
63
|
+
if items.map(&:name).include?(item_name)
|
64
|
+
items.each do |i|
|
65
65
|
if i.name.eql?(item_name)
|
66
66
|
if i.equippable
|
67
67
|
i.equipped = false
|
@@ -81,7 +81,7 @@ module Gemwarrior
|
|
81
81
|
cur_loc.items.each do |i|
|
82
82
|
if i.name.eql?(item_name)
|
83
83
|
if i.takeable
|
84
|
-
|
84
|
+
items.push(i)
|
85
85
|
cur_loc.remove_item(item_name)
|
86
86
|
return "Added #{item_name} to your increasing collection of bits of tid."
|
87
87
|
else
|
@@ -93,8 +93,8 @@ module Gemwarrior
|
|
93
93
|
end
|
94
94
|
|
95
95
|
def remove_item(item_name)
|
96
|
-
if
|
97
|
-
|
96
|
+
if items.map(&:name).include?(item_name)
|
97
|
+
items.reject! { |item| item.name == item_name }
|
98
98
|
return "The #{item_name} has been thrown on the ground, but far out of reach, and you're much too lazy to go get it now, so it's as good as gone."
|
99
99
|
else
|
100
100
|
ERROR_ITEM_REMOVE_INVALID
|
data/lib/gemwarrior/repl.rb
CHANGED
@@ -79,7 +79,7 @@ module Gemwarrior
|
|
79
79
|
end
|
80
80
|
|
81
81
|
def prompt
|
82
|
-
prompt_template = "\n[LV:%3s][XP:%3s][ROX:%3s] -- [HP:%3s
|
82
|
+
prompt_template = "\n[LV:%3s][XP:%3s][ROX:%3s] -- [HP:%3s/%-3s][STM:%2s/%-2s] -- [%s @ %s]"
|
83
83
|
prompt_vars_arr = [
|
84
84
|
world.player.level,
|
85
85
|
world.player.xp,
|
data/lib/gemwarrior/world.rb
CHANGED
@@ -13,6 +13,7 @@ module Gemwarrior
|
|
13
13
|
|
14
14
|
## ERRORS
|
15
15
|
ERROR_LIST_PARAM_INVALID = 'That is not something that can be listed.'
|
16
|
+
ERROR_LOCATION_DESCRIBE_ENTITY_INVALID = 'You do not see that here.'
|
16
17
|
|
17
18
|
attr_accessor :monsters, :locations, :player
|
18
19
|
|
@@ -72,10 +73,11 @@ module Gemwarrior
|
|
72
73
|
when 'monsters'
|
73
74
|
puts '[MONSTERS]'
|
74
75
|
if details
|
75
|
-
monsters.map { |m| print m.describe }
|
76
|
+
monsters.map { |m| print m.describe unless m.is_boss}
|
77
|
+
monsters.map { |m| print m.describe if m.is_boss }
|
76
78
|
return
|
77
79
|
else
|
78
|
-
">> #{monsters.map(&:name).join(', ')}"
|
80
|
+
monster_text = ">> monsters: #{monsters.map(&:name).join(', ')}"
|
79
81
|
end
|
80
82
|
when 'items'
|
81
83
|
puts '[ITEMS]'
|
@@ -126,15 +128,12 @@ module Gemwarrior
|
|
126
128
|
desc_text = ""
|
127
129
|
desc_text << "[ #{point.name} ]\n"
|
128
130
|
desc_text << point.description
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
unless point.list_items.nil?
|
133
|
-
|
134
|
-
|
135
|
-
unless point.list_monsters.nil?
|
136
|
-
desc_text << point.list_monsters
|
137
|
-
end
|
131
|
+
|
132
|
+
point.populate_monsters(self.monsters) unless point.checked_for_monsters?
|
133
|
+
|
134
|
+
desc_text << point.list_items unless point.list_items.nil?
|
135
|
+
desc_text << point.list_monsters unless point.list_monsters.nil?
|
136
|
+
desc_text << point.list_bosses unless point.list_bosses.nil?
|
138
137
|
desc_text << point.list_paths
|
139
138
|
end
|
140
139
|
|
@@ -153,6 +152,14 @@ module Gemwarrior
|
|
153
152
|
end
|
154
153
|
end
|
155
154
|
end
|
155
|
+
elsif
|
156
|
+
if point.bosses_abounding.map(&:name).include?(entity_name)
|
157
|
+
point.bosses_abounding.each do |b|
|
158
|
+
if b.name.eql?(entity_name)
|
159
|
+
return "#{b.description}"
|
160
|
+
end
|
161
|
+
end
|
162
|
+
end
|
156
163
|
else
|
157
164
|
ERROR_LOCATION_DESCRIBE_ENTITY_INVALID
|
158
165
|
end
|
@@ -163,7 +170,15 @@ module Gemwarrior
|
|
163
170
|
end
|
164
171
|
|
165
172
|
def has_monster_to_attack?(monster_name)
|
166
|
-
location_by_coords(player.cur_coords).monsters_abounding.map(&:name)
|
173
|
+
possible_combatants = location_by_coords(player.cur_coords).monsters_abounding.map(&:name) | location_by_coords(player.cur_coords).bosses_abounding.map(&:name)
|
174
|
+
|
175
|
+
possible_combatants.each do |combatant|
|
176
|
+
if combatant.downcase.eql?(monster_name.downcase)
|
177
|
+
return true
|
178
|
+
end
|
179
|
+
end
|
180
|
+
|
181
|
+
return false
|
167
182
|
end
|
168
183
|
|
169
184
|
private
|
@@ -179,6 +194,7 @@ module Gemwarrior
|
|
179
194
|
require_relative 'entities/monsters/coraliz'
|
180
195
|
require_relative 'entities/monsters/cubicat'
|
181
196
|
require_relative 'entities/monsters/diaman'
|
197
|
+
require_relative 'entities/monsters/bosses/emerald'
|
182
198
|
|
183
199
|
self.monsters = [
|
184
200
|
Alexandrat.new,
|
@@ -190,7 +206,8 @@ module Gemwarrior
|
|
190
206
|
Citrinaga.new,
|
191
207
|
Coraliz.new,
|
192
208
|
Cubicat.new,
|
193
|
-
Diaman.new
|
209
|
+
Diaman.new,
|
210
|
+
Emerald.new
|
194
211
|
]
|
195
212
|
end
|
196
213
|
|
@@ -201,6 +218,7 @@ module Gemwarrior
|
|
201
218
|
require_relative 'entities/items/stalactite'
|
202
219
|
require_relative 'entities/items/stonemite'
|
203
220
|
require_relative 'entities/items/stone'
|
221
|
+
require_relative 'entities/items/throne'
|
204
222
|
require_relative 'entities/items/tree'
|
205
223
|
|
206
224
|
locations = []
|
@@ -212,7 +230,7 @@ module Gemwarrior
|
|
212
230
|
:locs_connected => {:north => true, :east => true, :south => false, :west => true},
|
213
231
|
:danger_level => :none,
|
214
232
|
:items => [Bed.new, Stone.new],
|
215
|
-
:
|
233
|
+
:bosses_abounding => []
|
216
234
|
})
|
217
235
|
)
|
218
236
|
locations.push(Location.new({
|
@@ -222,17 +240,17 @@ module Gemwarrior
|
|
222
240
|
:locs_connected => {:north => false, :east => true, :south => false, :west => true},
|
223
241
|
:danger_level => :low,
|
224
242
|
:items => [],
|
225
|
-
:
|
243
|
+
:bosses_abounding => []
|
226
244
|
})
|
227
245
|
)
|
228
246
|
locations.push(Location.new({
|
229
|
-
:name => 'Cave (
|
247
|
+
:name => 'Cave (Antechamber)',
|
230
248
|
:description => 'Now inside the entrance to the cavern, you confirm that there are stacktites, stonemites, rocksites, and even one or two pebblejites.',
|
231
249
|
:coords => {:x => 7, :y => 0},
|
232
250
|
:locs_connected => {:north => true, :east => true, :south => false, :west => true},
|
233
251
|
:danger_level => :moderate,
|
234
252
|
:items => [Stalactite.new, Stonemite.new],
|
235
|
-
:
|
253
|
+
:bosses_abounding => []
|
236
254
|
})
|
237
255
|
)
|
238
256
|
locations.push(Location.new({
|
@@ -242,7 +260,7 @@ module Gemwarrior
|
|
242
260
|
:locs_connected => {:north => false, :east => true, :south => true, :west => false},
|
243
261
|
:danger_level => :moderate,
|
244
262
|
:items => [],
|
245
|
-
:
|
263
|
+
:bosses_abounding => []
|
246
264
|
})
|
247
265
|
)
|
248
266
|
locations.push(Location.new({
|
@@ -252,7 +270,7 @@ module Gemwarrior
|
|
252
270
|
:locs_connected => {:north => false, :east => false, :south => true, :west => true},
|
253
271
|
:danger_level => :moderate,
|
254
272
|
:items => [],
|
255
|
-
:
|
273
|
+
:bosses_abounding => []
|
256
274
|
})
|
257
275
|
)
|
258
276
|
locations.push(Location.new({
|
@@ -262,7 +280,7 @@ module Gemwarrior
|
|
262
280
|
:locs_connected => {:north => true, :east => false, :south => false, :west => true},
|
263
281
|
:danger_level => :moderate,
|
264
282
|
:items => [],
|
265
|
-
:
|
283
|
+
:bosses_abounding => []
|
266
284
|
})
|
267
285
|
)
|
268
286
|
locations.push(Location.new({
|
@@ -272,7 +290,7 @@ module Gemwarrior
|
|
272
290
|
:locs_connected => {:north => false, :east => true, :south => false, :west => false},
|
273
291
|
:danger_level => :low,
|
274
292
|
:items => [Feather.new, Tree.new],
|
275
|
-
:
|
293
|
+
:bosses_abounding => []
|
276
294
|
})
|
277
295
|
)
|
278
296
|
locations.push(Location.new({
|
@@ -282,17 +300,37 @@ module Gemwarrior
|
|
282
300
|
:locs_connected => {:north => true, :east => false, :south => true, :west => false},
|
283
301
|
:danger_level => :low,
|
284
302
|
:items => [],
|
285
|
-
:
|
303
|
+
:bosses_abounding => []
|
286
304
|
})
|
287
305
|
)
|
288
306
|
locations.push(Location.new({
|
289
|
-
:name => '
|
290
|
-
:description => 'The craziest guy that ever existed is
|
307
|
+
:name => 'Sky Tower (Entrance)',
|
308
|
+
:description => 'The craziest guy that ever existed is inside the towering structure of cloud floors and snow walls standing before you.',
|
291
309
|
:coords => {:x => 5, :y => 2},
|
292
|
-
:locs_connected => {:north =>
|
293
|
-
:danger_level => :
|
310
|
+
:locs_connected => {:north => true, :east => false, :south => true, :west => false},
|
311
|
+
:danger_level => :high,
|
294
312
|
:items => [Gun.new],
|
295
|
-
:
|
313
|
+
:bosses_abounding => []
|
314
|
+
})
|
315
|
+
)
|
316
|
+
locations.push(Location.new({
|
317
|
+
:name => 'Sky Tower (Foyer)',
|
318
|
+
:description => 'There appears to be one path forward, towards the throne room.',
|
319
|
+
:coords => {:x => 5, :y => 3},
|
320
|
+
:locs_connected => {:north => true, :east => false, :south => true, :west => false},
|
321
|
+
:danger_level => :high,
|
322
|
+
:items => [],
|
323
|
+
:bosses_abounding => []
|
324
|
+
})
|
325
|
+
)
|
326
|
+
locations.push(Location.new({
|
327
|
+
:name => 'Sky Tower (Throne Room)',
|
328
|
+
:description => 'There, on a mighty seat made of broken dreams, sits Emerald himself, staring at you coldly, silently.',
|
329
|
+
:coords => {:x => 5, :y => 4},
|
330
|
+
:locs_connected => {:north => false, :east => false, :south => true, :west => false},
|
331
|
+
:danger_level => :high,
|
332
|
+
:items => [Throne.new],
|
333
|
+
:bosses_abounding => [Emerald.new]
|
296
334
|
})
|
297
335
|
)
|
298
336
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: gemwarrior
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.6.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Chadwick
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-06-
|
11
|
+
date: 2015-06-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: os
|
@@ -36,14 +36,14 @@ dependencies:
|
|
36
36
|
requirements:
|
37
37
|
- - "~>"
|
38
38
|
- !ruby/object:Gem::Version
|
39
|
-
version:
|
39
|
+
version: 0.4.7
|
40
40
|
type: :runtime
|
41
41
|
prerelease: false
|
42
42
|
version_requirements: !ruby/object:Gem::Requirement
|
43
43
|
requirements:
|
44
44
|
- - "~>"
|
45
45
|
- !ruby/object:Gem::Version
|
46
|
-
version:
|
46
|
+
version: 0.4.7
|
47
47
|
- !ruby/object:Gem::Dependency
|
48
48
|
name: http
|
49
49
|
requirement: !ruby/object:Gem::Requirement
|
@@ -173,15 +173,18 @@ files:
|
|
173
173
|
- bin/gemwarrior
|
174
174
|
- gemwarrior.gemspec
|
175
175
|
- lib/gemwarrior/battle.rb
|
176
|
+
- lib/gemwarrior/entities/boss.rb
|
176
177
|
- lib/gemwarrior/entities/creature.rb
|
177
178
|
- lib/gemwarrior/entities/entity.rb
|
178
179
|
- lib/gemwarrior/entities/item.rb
|
179
180
|
- lib/gemwarrior/entities/items/bed.rb
|
180
181
|
- lib/gemwarrior/entities/items/feather.rb
|
181
182
|
- lib/gemwarrior/entities/items/gun.rb
|
183
|
+
- lib/gemwarrior/entities/items/sparklything.rb
|
182
184
|
- lib/gemwarrior/entities/items/stalactite.rb
|
183
185
|
- lib/gemwarrior/entities/items/stone.rb
|
184
186
|
- lib/gemwarrior/entities/items/stonemite.rb
|
187
|
+
- lib/gemwarrior/entities/items/throne.rb
|
185
188
|
- lib/gemwarrior/entities/items/tree.rb
|
186
189
|
- lib/gemwarrior/entities/location.rb
|
187
190
|
- lib/gemwarrior/entities/monster.rb
|
@@ -191,6 +194,7 @@ files:
|
|
191
194
|
- lib/gemwarrior/entities/monsters/apatiger.rb
|
192
195
|
- lib/gemwarrior/entities/monsters/aquamarine.rb
|
193
196
|
- lib/gemwarrior/entities/monsters/bloodstorm.rb
|
197
|
+
- lib/gemwarrior/entities/monsters/bosses/emerald.rb
|
194
198
|
- lib/gemwarrior/entities/monsters/citrinaga.rb
|
195
199
|
- lib/gemwarrior/entities/monsters/coraliz.rb
|
196
200
|
- lib/gemwarrior/entities/monsters/cubicat.rb
|