gemwarrior 0.10.5 → 0.10.6
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.
- 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