gemwarrior 0.10.5 → 0.10.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/gemwarrior +2 -0
- data/lib/gemwarrior/battle.rb +57 -45
- data/lib/gemwarrior/entities/entity.rb +3 -4
- data/lib/gemwarrior/repl.rb +1 -2
- data/lib/gemwarrior/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a63dbf4d7fa1730e5bb7504020b668e54cb0a95
|
4
|
+
data.tar.gz: 4ed06ecc25c511622ef4730e7bbc5d9b2c2d1dcb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fa9c14bded730f4ae0f9693094e8893bb7f5f133be99422e90baabe10da96c92f04461d47a4f94e21e2af4557b08261db405c5f064c6c89f5ecd9654b42d53fe
|
7
|
+
data.tar.gz: d75e3ab4f36c04a6946ee6104858f91a7f6d303e92380f193d39741230fe26d02e0a226a9dfd25735db19b85b4fbadd723d0e025f0aab206197471cd1cc86977
|
data/bin/gemwarrior
CHANGED
@@ -17,6 +17,7 @@ GW_OPTS_FILE = "#{GW_HOME}/gw_opts"
|
|
17
17
|
GW_LOG_FILE = "#{GW_HOME}/gw_log"
|
18
18
|
GW_DEFAULT_WORLD_YAML = File.expand_path('../../data/default_world.yaml', __FILE__)
|
19
19
|
GW_DEFAULT_WORLD_BIN = File.expand_path('../../data/default_world.bin', __FILE__)
|
20
|
+
GW_WRAP_WIDTH = 80
|
20
21
|
|
21
22
|
def parse_options_cli
|
22
23
|
options = {
|
@@ -124,6 +125,7 @@ def init_config
|
|
124
125
|
GameOptions.add 'save_file_bin_path', GW_SAVE_FILE_BIN
|
125
126
|
GameOptions.add 'log_file_path', GW_LOG_FILE
|
126
127
|
GameOptions.add 'options_file_path', GW_OPTS_FILE
|
128
|
+
GameOptions.add 'wrap_width', GW_WRAP_WIDTH
|
127
129
|
end
|
128
130
|
|
129
131
|
begin
|
data/lib/gemwarrior/battle.rb
CHANGED
@@ -9,7 +9,7 @@ module Gemwarrior
|
|
9
9
|
# CONSTANTS
|
10
10
|
ERROR_ATTACK_OPTION_INVALID = 'That will not do anything against the monster.'
|
11
11
|
BEAST_MODE_ATTACK = 100
|
12
|
-
ESCAPE_TEXT = '** POOF **'
|
12
|
+
ESCAPE_TEXT = ' ** POOF **'
|
13
13
|
|
14
14
|
attr_accessor :world, :player, :monster, :player_is_defending
|
15
15
|
|
@@ -30,23 +30,24 @@ module Gemwarrior
|
|
30
30
|
{ frequencies: 'G#4', duration: 50 }
|
31
31
|
])
|
32
32
|
|
33
|
-
|
33
|
+
# begin battle!
|
34
|
+
print_battle_header unless is_arena
|
34
35
|
|
35
36
|
if is_arena
|
36
|
-
print 'Your opponent is now...'
|
37
|
+
print ' Your opponent is now...'
|
37
38
|
Animation::run(phrase: "#{monster.name.upcase}!", speed: :slow)
|
38
39
|
elsif is_event
|
39
|
-
puts "You are
|
40
|
+
puts " You are ambushed by #{monster.name}!".colorize(:yellow)
|
40
41
|
else
|
41
|
-
puts "You decide to attack #{monster.name}!"
|
42
|
+
puts " You decide to attack #{monster.name}!"
|
42
43
|
end
|
43
44
|
|
44
|
-
puts "#{monster.name} cries out: \"#{monster.battlecry}\""
|
45
|
+
puts " #{monster.name} cries out: \"#{monster.battlecry}\""
|
45
46
|
|
46
47
|
# first strike!
|
47
48
|
unless is_arena
|
48
49
|
if monster_strikes_first?(is_event)
|
49
|
-
puts "#{monster.name} strikes first!".colorize(:yellow)
|
50
|
+
puts " #{monster.name} strikes first!".colorize(:yellow)
|
50
51
|
monster_attacks_player
|
51
52
|
end
|
52
53
|
end
|
@@ -63,20 +64,20 @@ module Gemwarrior
|
|
63
64
|
|
64
65
|
# check for near death
|
65
66
|
if player_near_death?
|
66
|
-
puts "You are almost dead!\n".colorize(:yellow)
|
67
|
+
puts " You are almost dead!\n".colorize(:yellow)
|
67
68
|
end
|
68
69
|
if monster_near_death?
|
69
|
-
puts "#{monster.name} is almost dead!\n".colorize(:yellow)
|
70
|
+
puts " #{monster.name} is almost dead!\n".colorize(:yellow)
|
70
71
|
end
|
71
72
|
|
72
73
|
puts
|
73
74
|
|
74
75
|
# print health info
|
75
|
-
print "#{player.name.upcase.ljust(12)} :: #{player.hp_cur.to_s.rjust(3)} HP"
|
76
|
+
print " #{player.name.upcase.ljust(12)} :: #{player.hp_cur.to_s.rjust(3)} HP"
|
76
77
|
print " (LVL: #{player.level})" if GameOptions.data['debug_mode']
|
77
78
|
print "\n"
|
78
79
|
|
79
|
-
print "#{monster.name.upcase.ljust(12)} :: "
|
80
|
+
print " #{monster.name.upcase.ljust(12)} :: "
|
80
81
|
if GameOptions.data['debug_mode'] || player.special_abilities.include?(:rocking_vision)
|
81
82
|
print "#{monster.hp_cur.to_s.rjust(3)}"
|
82
83
|
else
|
@@ -90,8 +91,8 @@ module Gemwarrior
|
|
90
91
|
self.player_is_defending = false
|
91
92
|
|
92
93
|
# battle options prompt
|
93
|
-
puts 'What do you do?'
|
94
|
-
print '['.colorize(:yellow)
|
94
|
+
puts ' What do you do?'
|
95
|
+
print ' ['.colorize(:yellow)
|
95
96
|
print 'F'.colorize(:green)
|
96
97
|
print 'ight/'.colorize(:yellow)
|
97
98
|
print 'A'.colorize(:green)
|
@@ -105,13 +106,13 @@ module Gemwarrior
|
|
105
106
|
print 'R'.colorize(:green)
|
106
107
|
print 'un]'.colorize(:yellow)
|
107
108
|
print "\n"
|
108
|
-
|
109
|
+
print ' [BATTLE]> '
|
109
110
|
player_action = STDIN.gets.chomp.downcase
|
110
111
|
|
111
112
|
# player action
|
112
113
|
case player_action
|
113
114
|
when 'fight', 'f', 'attack', 'a'
|
114
|
-
puts "You attack #{monster.name}#{player.cur_weapon_name}!"
|
115
|
+
puts " You attack #{monster.name}#{player.cur_weapon_name}!"
|
115
116
|
dmg = calculate_damage_to(monster)
|
116
117
|
if dmg > 0
|
117
118
|
Music::cue([{ frequencies: 'A4,E4,B5', duration: 75 }])
|
@@ -124,32 +125,33 @@ module Gemwarrior
|
|
124
125
|
else
|
125
126
|
Music::cue([{ frequencies: 'A4', duration: 75 }])
|
126
127
|
|
127
|
-
puts 'You miss entirely!'.colorize(:yellow)
|
128
|
+
puts ' You miss entirely!'.colorize(:yellow)
|
128
129
|
end
|
129
130
|
when 'defend', 'd'
|
130
|
-
puts 'You dig in and defend this round.'
|
131
|
+
puts ' You dig in and defend this round.'
|
131
132
|
self.player_is_defending = true
|
132
133
|
when 'pass', 'p'
|
133
|
-
puts 'You decide to pass your turn for some reason. Brave!'
|
134
|
+
puts ' You decide to pass your turn for some reason. Brave!'
|
134
135
|
when 'look', 'l'
|
135
|
-
print "#{monster.name}".colorize(:white)
|
136
|
+
print " #{monster.name}".colorize(:white)
|
136
137
|
print " (#{monster.hp_cur}/#{monster.hp_max} HP): #{monster.description}\n"
|
137
|
-
puts "It has some distinguishing features, too: face is #{monster.face}, hands are #{monster.hands}, and general mood is #{monster.mood}."
|
138
|
+
puts " It has some distinguishing features, too: face is #{monster.face}, hands are #{monster.hands}, and general mood is #{monster.mood}."
|
138
139
|
if GameOptions.data['debug_mode']
|
139
|
-
puts 'If defeated, will receive:'
|
140
|
-
puts "
|
141
|
-
puts "
|
142
|
-
puts "
|
140
|
+
puts ' If defeated, will receive:'
|
141
|
+
puts " >> XP : #{monster.xp}"
|
142
|
+
puts " >> ROX : #{monster.rox}"
|
143
|
+
puts " >> ITEMS: #{monster.inventory.list_contents}"
|
143
144
|
next
|
144
145
|
end
|
145
146
|
when 'run', 'r'
|
146
147
|
if player_escape?(is_arena)
|
147
148
|
monster.hp_cur = monster.hp_max
|
148
|
-
puts "You successfully elude #{monster.name}!".colorize(:green)
|
149
|
+
puts " You successfully elude #{monster.name}!".colorize(:green)
|
149
150
|
print_escape_text
|
151
|
+
print_battle_line
|
150
152
|
return 'escaped'
|
151
153
|
else
|
152
|
-
puts 'You were not able to run away! :-('.colorize(:yellow)
|
154
|
+
puts ' You were not able to run away! :-('.colorize(:yellow)
|
153
155
|
end
|
154
156
|
else
|
155
157
|
puts ERROR_ATTACK_OPTION_INVALID
|
@@ -207,17 +209,19 @@ module Gemwarrior
|
|
207
209
|
|
208
210
|
def take_damage(entity, dmg)
|
209
211
|
entity.hp_cur = entity.hp_cur.to_i - dmg.to_i
|
210
|
-
|
212
|
+
who_gets_wounded_start = ''
|
211
213
|
|
212
214
|
if entity.eql?(monster)
|
213
|
-
|
215
|
+
who_gets_wounded_start = " > You wound #{monster.name} for "
|
216
|
+
who_gets_wounded_end = " point(s)!\n".colorize(:green)
|
214
217
|
else
|
215
|
-
|
218
|
+
who_gets_wounded_start = ' > You are wounded for '.colorize(:red)
|
219
|
+
who_gets_wounded_end = " point(s)!\n".colorize(:red)
|
216
220
|
end
|
217
221
|
|
218
|
-
print
|
222
|
+
print who_gets_wounded_start
|
219
223
|
Animation::run(phrase: dmg.to_s, speed: :slow, oneline: true, alpha: false, random: false)
|
220
|
-
print
|
224
|
+
print who_gets_wounded_end
|
221
225
|
end
|
222
226
|
|
223
227
|
# MONSTER
|
@@ -236,7 +240,7 @@ module Gemwarrior
|
|
236
240
|
end
|
237
241
|
|
238
242
|
def monster_attacks_player
|
239
|
-
puts "#{monster.name} attacks you!"
|
243
|
+
puts " #{monster.name} attacks you!".colorize(:yellow)
|
240
244
|
|
241
245
|
dmg = calculate_damage_to(player)
|
242
246
|
if dmg > 0
|
@@ -246,7 +250,7 @@ module Gemwarrior
|
|
246
250
|
else
|
247
251
|
Music::cue([{ frequencies: 'B4', duration: 75 }])
|
248
252
|
|
249
|
-
puts "#{monster.name} misses entirely!".colorize(:yellow)
|
253
|
+
puts " #{monster.name} misses entirely!".colorize(:yellow)
|
250
254
|
end
|
251
255
|
end
|
252
256
|
|
@@ -259,7 +263,7 @@ module Gemwarrior
|
|
259
263
|
end
|
260
264
|
|
261
265
|
def monster_death
|
262
|
-
puts "
|
266
|
+
puts " YOU HAVE DEFEATED #{monster.name.upcase}!\n".colorize(:green)
|
263
267
|
|
264
268
|
# stats
|
265
269
|
world.player.monsters_killed += 1
|
@@ -289,19 +293,19 @@ module Gemwarrior
|
|
289
293
|
gets
|
290
294
|
return 'exit'
|
291
295
|
else
|
292
|
-
puts 'You just beat a boss monster. Way to go!'
|
293
|
-
puts "
|
294
|
-
puts "
|
296
|
+
puts ' You just beat a boss monster. Way to go!'
|
297
|
+
puts " XP : #{monster.xp}".colorize(:green)
|
298
|
+
puts " ROX: #{monster.rox}".colorize(:green)
|
295
299
|
print_battle_line
|
296
300
|
player.update_stats(reason: :monster, value: monster)
|
297
301
|
world.location_by_coords(player.cur_coords).remove_monster(monster.name)
|
298
302
|
end
|
299
303
|
else
|
300
|
-
puts 'You get the following spoils of war:'
|
301
|
-
puts "
|
302
|
-
puts "
|
304
|
+
puts ' You get the following spoils of war:'
|
305
|
+
puts " XP : #{monster.xp}".colorize(:green)
|
306
|
+
puts " ROX : #{monster.rox}".colorize(:green)
|
303
307
|
unless monster.inventory.nil?
|
304
|
-
puts "
|
308
|
+
puts " ITEMS: #{monster.inventory.list_contents}".colorize(:green) unless monster.inventory.items.empty?
|
305
309
|
end
|
306
310
|
print_battle_line
|
307
311
|
player.update_stats(reason: :monster, value: monster)
|
@@ -319,7 +323,7 @@ module Gemwarrior
|
|
319
323
|
end
|
320
324
|
|
321
325
|
def player_death
|
322
|
-
puts "You are dead, slain by the #{monster.name}!".colorize(:red)
|
326
|
+
puts " You are dead, slain by the #{monster.name}!".colorize(:red)
|
323
327
|
print_battle_line
|
324
328
|
end
|
325
329
|
|
@@ -330,6 +334,8 @@ module Gemwarrior
|
|
330
334
|
else
|
331
335
|
dex_diff = monster.dexterity - player.dexterity
|
332
336
|
rand_dex = rand(0..dex_diff)
|
337
|
+
rand_dex += rand(0..1) # slight extra chance modifier
|
338
|
+
|
333
339
|
if rand_dex % 2 > 0
|
334
340
|
return true
|
335
341
|
else
|
@@ -341,13 +347,19 @@ module Gemwarrior
|
|
341
347
|
end
|
342
348
|
|
343
349
|
# STATUS TEXT
|
344
|
-
|
345
350
|
def print_escape_text
|
346
|
-
Animation::run(phrase: ESCAPE_TEXT, oneline:
|
351
|
+
Animation::run(phrase: ESCAPE_TEXT, oneline: false)
|
347
352
|
end
|
348
353
|
|
349
354
|
def print_battle_line
|
350
|
-
|
355
|
+
GameOptions.data['wrap_width'].times { print '*'.colorize(background: :red, color: :white) }
|
356
|
+
print "\n"
|
357
|
+
end
|
358
|
+
|
359
|
+
def print_battle_header
|
360
|
+
print_battle_line
|
361
|
+
puts ' BATTLE BEGINS!'.ljust(GameOptions.data['wrap_width']).colorize(background: :red, color: :white)
|
362
|
+
print_battle_line
|
351
363
|
end
|
352
364
|
end
|
353
365
|
end
|
@@ -1,11 +1,10 @@
|
|
1
1
|
# lib/gemwarrior/entities/entity.rb
|
2
2
|
# Base class for an interactable object
|
3
3
|
|
4
|
+
require_relative '../game_options'
|
5
|
+
|
4
6
|
module Gemwarrior
|
5
7
|
class Entity
|
6
|
-
# CONSTANTS
|
7
|
-
WRAP_WIDTH = 80
|
8
|
-
|
9
8
|
attr_accessor :name, :description
|
10
9
|
|
11
10
|
def status
|
@@ -13,7 +12,7 @@ module Gemwarrior
|
|
13
12
|
status_text << "#{description}\n".colorize(:white)
|
14
13
|
end
|
15
14
|
|
16
|
-
def puts(s = '', width =
|
15
|
+
def puts(s = '', width = GameOptions.data['wrap_width'])
|
17
16
|
super s.gsub(/(.{1,#{width}})(\s+|\Z)/, "\\1\n") unless s.nil?
|
18
17
|
end
|
19
18
|
end
|
data/lib/gemwarrior/repl.rb
CHANGED
@@ -19,7 +19,6 @@ module Gemwarrior
|
|
19
19
|
QUIT_MESSAGE = 'Temporal flux detected. Shutting down...'.colorize(:red)
|
20
20
|
MAIN_MENU_QUIT_MESSAGE = 'Giving up so soon? Jool will be waiting...'.colorize(:yellow)
|
21
21
|
SPLASH_MESSAGE = 'Welcome to *Jool*, where randomized fortune is just as likely as mayhem.'
|
22
|
-
WRAP_WIDTH = 80
|
23
22
|
GITHUB_NAME = 'michaelchadwick'
|
24
23
|
GITHUB_PROJECT = 'gemwarrior'
|
25
24
|
|
@@ -77,7 +76,7 @@ module Gemwarrior
|
|
77
76
|
Readline.readline(prompt_text, true).to_s
|
78
77
|
end
|
79
78
|
|
80
|
-
def puts(s = '', width =
|
79
|
+
def puts(s = '', width = GameOptions.data['wrap_width'])
|
81
80
|
super s.gsub(/(.{1,#{width}})(\s+|\Z)/, "\\1\n") unless s.nil?
|
82
81
|
end
|
83
82
|
|
data/lib/gemwarrior/version.rb
CHANGED