gemwarrior 0.7.4 → 0.7.5

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