gemwarrior 0.7.4 → 0.7.5

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.
@@ -24,6 +24,7 @@ Gem::Specification.new do |spec|
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'
27
+ #spec.add_runtime_dependency 'hr', '~> 0.0.1'
27
28
 
28
29
  #spec.add_runtime_dependency 'feep', '~> 0.1.0'
29
30
  #spec.add_runtime_dependency 'wordnik', '~> 4.12'
@@ -1,296 +1,296 @@
1
- # lib/gemwarrior/battle.rb
2
- # Monster battle
3
-
4
- require_relative 'misc/player_levels'
5
-
6
- module Gemwarrior
7
- class Battle
8
- include PlayerLevels
9
-
10
- # CONSTANTS
11
- ## ERRORS
12
- ERROR_ATTACK_OPTION_INVALID = 'That will not do anything against the monster.'
13
- BEAST_MODE_ATTACK = 100
14
-
15
- ## MESSAGES
16
- TEXT_ESCAPE = 'POOF'
17
-
18
- attr_accessor :world, :player, :monster
19
-
20
- def initialize(options)
21
- self.world = options.fetch(:world)
22
- self.player = options.fetch(:player)
23
- self.monster = options.fetch(:monster)
24
- end
25
-
26
- def start
27
- print_battle_line
28
- puts "You decide to attack the #{monster.name}!"
29
- puts "#{monster.name} cries out: \"#{monster.battlecry}\"".colorize(:yellow)
30
-
31
- # first strike!
32
- if monster_strikes_first?
33
- puts "#{monster.name} strikes first!".colorize(:yellow)
34
- monster_attacks_player
35
- end
36
-
37
- # main battle loop
38
- loop do
39
- if monster_dead?
40
- monster_death
41
- return
42
- elsif player_dead?
43
- player_death
44
- end
45
-
46
- if player_near_death?
47
- puts "You are almost dead!\n".colorize(:yellow)
48
- end
49
- if monster_near_death?
50
- puts "#{monster.name} is almost dead!\n".colorize(:yellow)
51
- end
52
-
53
- puts
54
- print "PLAYER :: #{player.hp_cur.to_s.rjust(3)} HP"
55
- if world.debug_mode
56
- print " (LVL: #{player.level})"
57
- end
58
- print "\n"
59
-
60
- print "MONSTER :: "
61
- if world.debug_mode || PlayerLevels::get_level_stats(player.level)[:special_abilities].include?(:rocking_vision)
62
- print "#{monster.hp_cur.to_s.rjust(3)}"
63
- else
64
- print "???"
65
- end
66
- print " HP"
67
- if world.debug_mode
68
- print " (LVL: #{monster.level})"
69
- end
70
- print "\n"
71
- puts
72
-
73
- puts 'What do you do?'
74
- puts "[Fight/Attack][Look][Run]".colorize(:color => :yellow)
75
-
76
- cmd = gets.chomp.downcase
77
-
78
- # player action
79
- case cmd
80
- when 'fight', 'f', 'attack', 'a'
81
- puts "You attack #{monster.name}#{player.cur_weapon_name}!"
82
- dmg = calculate_damage_to(monster)
83
- if dmg > 0
84
- take_damage(monster, dmg)
85
- if monster_dead?
86
- monster_death
87
- return
88
- end
89
- else
90
- puts "You miss entirely!".colorize(:yellow)
91
- end
92
- when 'look', 'l'
93
- print "#{monster.name}".colorize(:white)
94
- print " (#{monster.hp_cur}/#{monster.hp_max} HP): #{monster.description}\n"
95
- puts "It has some distinguishing features, too: face is #{monster.face}, hands are #{monster.hands}, and general mood is #{monster.mood}."
96
- if world.debug_mode
97
- puts "If defeated, will receive:"
98
- puts " >> XP : #{monster.xp}"
99
- puts " >> ROX : #{monster.rox}"
100
- puts " >> ITEMS: #{monster.inventory.list_contents}"
101
- next
102
- end
103
- when 'run', 'r'
104
- if player_escape?
105
- monster.hp_cur = monster.hp_max
106
- puts "You successfully elude #{monster.name}!".colorize(:green)
107
- print_escape_text
108
- return
109
- else
110
- puts "You were not able to run away! :-(".colorize(:yellow)
111
- end
112
- else
113
- puts ERROR_ATTACK_OPTION_INVALID
114
- next
115
- end
116
-
117
- # monster action
118
- monster_attacks_player
119
- end
120
- end
121
-
122
- private
123
-
124
- # NEUTRAL
125
- def calculate_damage_to(entity)
126
- miss = rand(0..(100 + entity.defense))
127
- if (miss < 15)
128
- 0
129
- else
130
- if entity.eql?(monster)
131
- if player.beast_mode
132
- atk_range = BEAST_MODE_ATTACK..BEAST_MODE_ATTACK
133
- else
134
- atk_range = player.atk_lo..player.atk_hi
135
- end
136
- rand(atk_range)
137
- else
138
- rand(monster.atk_lo..monster.atk_hi)
139
- end
140
- end
141
- end
142
-
143
- def take_damage(entity, dmg)
144
- entity.hp_cur = entity.hp_cur.to_i - dmg.to_i
145
- who_gets_wounded = ''
146
-
147
- if entity.eql?(monster)
148
- who_gets_wounded = "> You wound #{monster.name} for "
149
- else
150
- who_gets_wounded = "> You are wounded for "
151
- end
152
-
153
- print who_gets_wounded
154
- Animation::run({ :phrase => dmg.to_s, :speed => :slow, :oneline => true, :alpha => false, :random => false })
155
- print " point(s)!\n"
156
- end
157
-
158
- # MONSTER
159
- def monster_strikes_first?
160
- if (monster.dexterity > player.dexterity)
161
- return true
162
- else
163
- dex_diff = player.dexterity - monster.dexterity
164
- rand_dex = rand(0..dex_diff)
165
- if rand_dex % 2 > 0
166
- return true
167
- else
168
- return false
169
- end
170
- end
171
- end
172
-
173
- def monster_attacks_player
174
- puts "#{monster.name} attacks you!"
175
- dmg = calculate_damage_to(player)
176
- if dmg > 0
177
- take_damage(player, dmg)
178
- if player_dead?
179
- player_death
180
- end
181
- else
182
- puts "#{monster.name} misses entirely!".colorize(:yellow)
183
- end
184
- end
185
-
186
- def monster_near_death?
187
- ((monster.hp_cur.to_f / monster.hp_max.to_f) < 0.10)
188
- end
189
-
190
- def monster_dead?
191
- monster.hp_cur <= 0
192
- end
193
-
194
- def monster_death
195
- puts "You have defeated #{monster.name}!\n".colorize(:green)
196
- if monster.is_boss
197
- if monster.name.eql?("Emerald")
198
- puts monster.defeated_text
199
- exit(0)
200
- else
201
- puts 'You just beat a boss monster. Way to go!'
202
- puts " XP : #{monster.xp}".colorize(:green)
203
- puts " ROX: #{monster.rox}".colorize(:green)
204
- print_battle_line
205
- update_player_stats
206
- world.location_by_coords(player.cur_coords).remove_monster(monster.name)
207
- end
208
- else
209
- puts 'You get the following spoils of war:'
210
- puts " XP : #{monster.xp}".colorize(:green)
211
- puts " ROX : #{monster.rox}".colorize(:green)
212
- unless monster.inventory.nil?
213
- puts " ITEMS: #{monster.inventory.list_contents}".colorize(:green) unless monster.inventory.items.empty?
214
- end
215
- print_battle_line
216
- update_player_stats
217
- world.location_by_coords(player.cur_coords).remove_monster(monster.name)
218
- end
219
- end
220
-
221
- # PLAYER
222
- def update_player_stats
223
- old_player_level = PlayerLevels::check_level(player.xp)
224
-
225
- player.xp = player.xp + monster.xp
226
- player.rox = player.rox + monster.rox
227
-
228
- monster_items = monster.inventory.items
229
- unless monster_items.nil?
230
- player.inventory.items.concat monster_items unless monster_items.empty?
231
- end
232
-
233
- new_player_level = PlayerLevels::check_level(player.xp)
234
-
235
- if new_player_level > old_player_level
236
- puts 'You leveled up!'
237
- new_stats = PlayerLevels::get_level_stats(new_player_level)
238
-
239
- player.level = new_stats[:level]
240
- puts "You are now level #{player.level}!"
241
- player.hp_cur = new_stats[:hp_max]
242
- player.hp_max = new_stats[:hp_max]
243
- puts "You now have #{player.hp_max} hit points!"
244
- player.stam_cur = new_stats[:stam_max]
245
- player.stam_max = new_stats[:stam_max]
246
- puts "You now have #{player.stam_max} stamina points!"
247
- player.atk_lo = new_stats[:atk_lo]
248
- player.atk_hi = new_stats[:atk_hi]
249
- puts "You now have an attack of #{player.atk_lo}-#{player.atk_hi}!"
250
- player.defense = new_stats[:defense]
251
- puts "You now have #{player.defense} defensive points!"
252
- player.dexterity = new_stats[:dexterity]
253
- puts "You now have #{player.dexterity} dexterity points!"
254
- end
255
- end
256
-
257
- def player_near_death?
258
- ((player.hp_cur.to_f / player.hp_max.to_f) < 0.10 && !player.god_mode)
259
- end
260
-
261
- def player_dead?
262
- (player.hp_cur <= 0 && !player.god_mode)
263
- end
264
-
265
- def player_death
266
- puts "You are dead, slain by the #{monster.name}!".colorize(:red)
267
- puts 'Your adventure ends here. Try again next time!'.colorize(:red)
268
- print_battle_line
269
- exit(0)
270
- end
271
-
272
- def player_escape?
273
- if (player.dexterity > monster.dexterity)
274
- return true
275
- else
276
- dex_diff = monster.dexterity - player.dexterity
277
- rand_dex = rand(0..dex_diff)
278
- if rand_dex % 2 > 0
279
- return true
280
- else
281
- return false
282
- end
283
- end
284
- end
285
-
286
- # STATUS TEXT
287
-
288
- def print_escape_text
289
- Animation::run({ :phrase => "* #{TEXT_ESCAPE} *", :oneline => true })
290
- end
291
-
292
- def print_battle_line
293
- puts '**************************************'
294
- end
295
- end
296
- end
1
+ # lib/gemwarrior/battle.rb
2
+ # Monster battle
3
+
4
+ require_relative 'misc/player_levels'
5
+
6
+ module Gemwarrior
7
+ class Battle
8
+ include PlayerLevels
9
+
10
+ # CONSTANTS
11
+ ## ERRORS
12
+ ERROR_ATTACK_OPTION_INVALID = 'That will not do anything against the monster.'
13
+ BEAST_MODE_ATTACK = 100
14
+
15
+ ## MESSAGES
16
+ TEXT_ESCAPE = 'POOF'
17
+
18
+ attr_accessor :world, :player, :monster
19
+
20
+ def initialize(options)
21
+ self.world = options.fetch(:world)
22
+ self.player = options.fetch(:player)
23
+ self.monster = options.fetch(:monster)
24
+ end
25
+
26
+ def start
27
+ print_battle_line
28
+ puts "You decide to attack the #{monster.name}!"
29
+ puts "#{monster.name} cries out: \"#{monster.battlecry}\"".colorize(:yellow)
30
+
31
+ # first strike!
32
+ if monster_strikes_first?
33
+ puts "#{monster.name} strikes first!".colorize(:yellow)
34
+ monster_attacks_player
35
+ end
36
+
37
+ # main battle loop
38
+ loop do
39
+ if monster_dead?
40
+ monster_death
41
+ return
42
+ elsif player_dead?
43
+ player_death
44
+ end
45
+
46
+ if player_near_death?
47
+ puts "You are almost dead!\n".colorize(:yellow)
48
+ end
49
+ if monster_near_death?
50
+ puts "#{monster.name} is almost dead!\n".colorize(:yellow)
51
+ end
52
+
53
+ puts
54
+ print "PLAYER :: #{player.hp_cur.to_s.rjust(3)} HP"
55
+ if world.debug_mode
56
+ print " (LVL: #{player.level})"
57
+ end
58
+ print "\n"
59
+
60
+ print "MONSTER :: "
61
+ if world.debug_mode || PlayerLevels::get_level_stats(player.level)[:special_abilities].include?(:rocking_vision)
62
+ print "#{monster.hp_cur.to_s.rjust(3)}"
63
+ else
64
+ print "???"
65
+ end
66
+ print " HP"
67
+ if world.debug_mode
68
+ print " (LVL: #{monster.level})"
69
+ end
70
+ print "\n"
71
+ puts
72
+
73
+ puts 'What do you do?'
74
+ puts "[Fight/Attack][Look][Run]".colorize(:color => :yellow)
75
+
76
+ cmd = gets.chomp.downcase
77
+
78
+ # player action
79
+ case cmd
80
+ when 'fight', 'f', 'attack', 'a'
81
+ puts "You attack #{monster.name}#{player.cur_weapon_name}!"
82
+ dmg = calculate_damage_to(monster)
83
+ if dmg > 0
84
+ take_damage(monster, dmg)
85
+ if monster_dead?
86
+ monster_death
87
+ return
88
+ end
89
+ else
90
+ puts "You miss entirely!".colorize(:yellow)
91
+ end
92
+ when 'look', 'l'
93
+ print "#{monster.name}".colorize(:white)
94
+ print " (#{monster.hp_cur}/#{monster.hp_max} HP): #{monster.description}\n"
95
+ puts "It has some distinguishing features, too: face is #{monster.face}, hands are #{monster.hands}, and general mood is #{monster.mood}."
96
+ if world.debug_mode
97
+ puts "If defeated, will receive:"
98
+ puts " >> XP : #{monster.xp}"
99
+ puts " >> ROX : #{monster.rox}"
100
+ puts " >> ITEMS: #{monster.inventory.list_contents}"
101
+ next
102
+ end
103
+ when 'run', 'r'
104
+ if player_escape?
105
+ monster.hp_cur = monster.hp_max
106
+ puts "You successfully elude #{monster.name}!".colorize(:green)
107
+ print_escape_text
108
+ return
109
+ else
110
+ puts "You were not able to run away! :-(".colorize(:yellow)
111
+ end
112
+ else
113
+ puts ERROR_ATTACK_OPTION_INVALID
114
+ next
115
+ end
116
+
117
+ # monster action
118
+ monster_attacks_player
119
+ end
120
+ end
121
+
122
+ private
123
+
124
+ # NEUTRAL
125
+ def calculate_damage_to(entity)
126
+ miss = rand(0..(100 + entity.defense))
127
+ if (miss < 15)
128
+ 0
129
+ else
130
+ if entity.eql?(monster)
131
+ if player.beast_mode
132
+ atk_range = BEAST_MODE_ATTACK..BEAST_MODE_ATTACK
133
+ else
134
+ atk_range = player.atk_lo..player.atk_hi
135
+ end
136
+ rand(atk_range)
137
+ else
138
+ rand(monster.atk_lo..monster.atk_hi)
139
+ end
140
+ end
141
+ end
142
+
143
+ def take_damage(entity, dmg)
144
+ entity.hp_cur = entity.hp_cur.to_i - dmg.to_i
145
+ who_gets_wounded = ''
146
+
147
+ if entity.eql?(monster)
148
+ who_gets_wounded = "> You wound #{monster.name} for "
149
+ else
150
+ who_gets_wounded = "> You are wounded for "
151
+ end
152
+
153
+ print who_gets_wounded
154
+ Animation::run({ :phrase => dmg.to_s, :speed => :slow, :oneline => true, :alpha => false, :random => false })
155
+ print " point(s)!\n"
156
+ end
157
+
158
+ # MONSTER
159
+ def monster_strikes_first?
160
+ if (monster.dexterity > player.dexterity)
161
+ return true
162
+ else
163
+ dex_diff = player.dexterity - monster.dexterity
164
+ rand_dex = rand(0..dex_diff)
165
+ if rand_dex % 2 > 0
166
+ return true
167
+ else
168
+ return false
169
+ end
170
+ end
171
+ end
172
+
173
+ def monster_attacks_player
174
+ puts "#{monster.name} attacks you!"
175
+ dmg = calculate_damage_to(player)
176
+ if dmg > 0
177
+ take_damage(player, dmg)
178
+ if player_dead?
179
+ player_death
180
+ end
181
+ else
182
+ puts "#{monster.name} misses entirely!".colorize(:yellow)
183
+ end
184
+ end
185
+
186
+ def monster_near_death?
187
+ ((monster.hp_cur.to_f / monster.hp_max.to_f) < 0.10)
188
+ end
189
+
190
+ def monster_dead?
191
+ monster.hp_cur <= 0
192
+ end
193
+
194
+ def monster_death
195
+ puts "You have defeated #{monster.name}!\n".colorize(:green)
196
+ if monster.is_boss
197
+ if monster.name.eql?("Emerald")
198
+ puts monster.defeated_text
199
+ exit(0)
200
+ else
201
+ puts 'You just beat a boss monster. Way to go!'
202
+ puts " XP : #{monster.xp}".colorize(:green)
203
+ puts " ROX: #{monster.rox}".colorize(:green)
204
+ print_battle_line
205
+ update_player_stats
206
+ world.location_by_coords(player.cur_coords).remove_monster(monster.name)
207
+ end
208
+ else
209
+ puts 'You get the following spoils of war:'
210
+ puts " XP : #{monster.xp}".colorize(:green)
211
+ puts " ROX : #{monster.rox}".colorize(:green)
212
+ unless monster.inventory.nil?
213
+ puts " ITEMS: #{monster.inventory.list_contents}".colorize(:green) unless monster.inventory.items.empty?
214
+ end
215
+ print_battle_line
216
+ update_player_stats
217
+ world.location_by_coords(player.cur_coords).remove_monster(monster.name)
218
+ end
219
+ end
220
+
221
+ # PLAYER
222
+ def update_player_stats
223
+ old_player_level = PlayerLevels::check_level(player.xp)
224
+
225
+ player.xp = player.xp + monster.xp
226
+ player.rox = player.rox + monster.rox
227
+
228
+ monster_items = monster.inventory.items
229
+ unless monster_items.nil?
230
+ player.inventory.items.concat monster_items unless monster_items.empty?
231
+ end
232
+
233
+ new_player_level = PlayerLevels::check_level(player.xp)
234
+
235
+ if new_player_level > old_player_level
236
+ Animation::run({:phrase => '** LEVEL UP! **'})
237
+ new_stats = PlayerLevels::get_level_stats(new_player_level)
238
+
239
+ player.level = new_stats[:level]
240
+ puts "You are now level #{player.level}!"
241
+ player.hp_cur = new_stats[:hp_max]
242
+ player.hp_max = new_stats[:hp_max]
243
+ puts "You now have #{player.hp_max} hit points!"
244
+ player.stam_cur = new_stats[:stam_max]
245
+ player.stam_max = new_stats[:stam_max]
246
+ puts "You now have #{player.stam_max} stamina points!"
247
+ player.atk_lo = new_stats[:atk_lo]
248
+ player.atk_hi = new_stats[:atk_hi]
249
+ puts "You now have an attack of #{player.atk_lo}-#{player.atk_hi}!"
250
+ player.defense = new_stats[:defense]
251
+ puts "You now have #{player.defense} defensive points!"
252
+ player.dexterity = new_stats[:dexterity]
253
+ puts "You now have #{player.dexterity} dexterity points!"
254
+ end
255
+ end
256
+
257
+ def player_near_death?
258
+ ((player.hp_cur.to_f / player.hp_max.to_f) < 0.10 && !player.god_mode)
259
+ end
260
+
261
+ def player_dead?
262
+ (player.hp_cur <= 0 && !player.god_mode)
263
+ end
264
+
265
+ def player_death
266
+ puts "You are dead, slain by the #{monster.name}!".colorize(:red)
267
+ puts 'Your adventure ends here. Try again next time!'.colorize(:red)
268
+ print_battle_line
269
+ exit(0)
270
+ end
271
+
272
+ def player_escape?
273
+ if (player.dexterity > monster.dexterity)
274
+ return true
275
+ else
276
+ dex_diff = monster.dexterity - player.dexterity
277
+ rand_dex = rand(0..dex_diff)
278
+ if rand_dex % 2 > 0
279
+ return true
280
+ else
281
+ return false
282
+ end
283
+ end
284
+ end
285
+
286
+ # STATUS TEXT
287
+
288
+ def print_escape_text
289
+ Animation::run({ :phrase => "** POOF **", :oneline => true })
290
+ end
291
+
292
+ def print_battle_line
293
+ puts '******************************'
294
+ end
295
+ end
296
+ end