Skip to content

Commit 3504ab8

Browse files
GameOptions singleton now storing most game-specific options, refactoring the squaboozle out of this app
1 parent fac6b29 commit 3504ab8

File tree

12 files changed

+219
-234
lines changed

12 files changed

+219
-234
lines changed

bin/gemwarrior

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,23 @@
33
require 'optparse'
44

55
require_relative '../lib/gemwarrior/game'
6+
require_relative '../lib/gemwarrior/game_options'
67
require_relative '../lib/gemwarrior/version'
78

9+
include Gemwarrior
10+
811
GAME_NAME = 'Gem Warrior'
912

1013
def parse_options_cli
1114
options = {
12-
:beast_mode => false,
13-
:debug_mode => false,
14-
:god_mode => false,
15-
:new_game => false,
16-
:sound_enabled => false,
17-
:sound_volume => 0.3,
18-
:use_wordnik => false,
19-
:extra_command => nil
15+
beast_mode: false,
16+
debug_mode: false,
17+
god_mode: false,
18+
new_game: false,
19+
sound_enabled: false,
20+
sound_volume: 0.3,
21+
use_wordnik: false,
22+
extra_command: nil
2023
}
2124

2225
options_file = read_options_file
@@ -74,21 +77,17 @@ end
7477
def print_error(error)
7578
case error
7679
when OptionParser::InvalidOption
77-
puts "#{$GAME_NAME}: illegal option #{error.args.join(' ')}"
80+
puts "#{GAME_NAME}: illegal option #{error.args.join(' ')}"
7881
else
7982
puts "An unexpected error occurred while running #{GAME_NAME}:"
8083
puts " #{error}\n"
8184
end
8285
end
8386

84-
def get_options_file_path
85-
"#{Dir.home}/.gemwarrior_options"
86-
end
87-
8887
def read_options_file
89-
if File.exist?(get_options_file_path)
88+
if File.exist?(GameOptions.data['options_file_path'])
9089
options = []
91-
File.open(get_options_file_path).readlines.each do |line|
90+
File.open(GameOptions.data['options_file_path']).readlines.each do |line|
9291
options << line.chomp.split(':')
9392
end
9493
return options
@@ -97,6 +96,9 @@ def read_options_file
9796
end
9897

9998
begin
99+
GameOptions.add 'log_file_path', "#{Dir.home}/.gemwarrior_log"
100+
GameOptions.add 'options_file_path', "#{Dir.home}/.gemwarrior_options"
101+
100102
options = parse_options_cli
101103

102104
Gemwarrior::Game.new(options)

lib/gemwarrior/battle.rb

Lines changed: 42 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# Monster battle
33

44
require_relative 'misc/player_levels'
5+
require_relative 'game_options'
56

67
module Gemwarrior
78
class Battle
@@ -23,16 +24,14 @@ def initialize(options)
2324
end
2425

2526
def start(is_arena = nil, is_event = nil)
26-
if world.sound_enabled
27-
Music::cue([
28-
{ frequencies: 'G4', duration: 50 },
29-
{ frequencies: 'G#4', duration: 50 },
30-
{ frequencies: 'G4', duration: 50 },
31-
{ frequencies: 'G#4', duration: 50 },
32-
{ frequencies: 'G4', duration: 50 },
33-
{ frequencies: 'G#4', duration: 50 }
34-
], world.sound_volume)
35-
end
27+
Music::cue([
28+
{ frequencies: 'G4', duration: 50 },
29+
{ frequencies: 'G#4', duration: 50 },
30+
{ frequencies: 'G4', duration: 50 },
31+
{ frequencies: 'G#4', duration: 50 },
32+
{ frequencies: 'G4', duration: 50 },
33+
{ frequencies: 'G#4', duration: 50 }
34+
])
3635

3736
print_battle_line
3837

@@ -77,21 +76,17 @@ def start(is_arena = nil, is_event = nil)
7776

7877
# print health info
7978
print "#{player.name.upcase.ljust(12)} :: #{player.hp_cur.to_s.rjust(3)} HP"
80-
if world.debug_mode
81-
print " (LVL: #{player.level})"
82-
end
79+
print " (LVL: #{player.level})" if GameOptions.data['debug_mode']
8380
print "\n"
8481

8582
print "#{monster.name.upcase.ljust(12)} :: "
86-
if world.debug_mode || player.special_abilities.include?(:rocking_vision)
83+
if GameOptions.data['debug_mode'] || player.special_abilities.include?(:rocking_vision)
8784
print "#{monster.hp_cur.to_s.rjust(3)}"
8885
else
8986
print '???'
9087
end
9188
print ' HP'
92-
if world.debug_mode
93-
print " (LVL: #{monster.level})"
94-
end
89+
print " (LVL: #{monster.level})" if GameOptions.data['debug_mode']
9590
print "\n"
9691
puts
9792

@@ -122,18 +117,16 @@ def start(is_arena = nil, is_event = nil)
122117
puts "You attack #{monster.name}#{player.cur_weapon_name}!"
123118
dmg = calculate_damage_to(monster)
124119
if dmg > 0
125-
if world.sound_enabled
126-
Music::cue([{ frequencies: 'A4,E4,B5', duration: 75 }], world.sound_volume)
127-
end
120+
Music::cue([{ frequencies: 'A4,E4,B5', duration: 75 }])
121+
128122
take_damage(monster, dmg)
129123
if monster_dead?
130124
result = monster_death
131125
return result
132126
end
133127
else
134-
if world.sound_enabled
135-
Music::cue([{ frequencies: 'A4', duration: 75 }], world.sound_volume)
136-
end
128+
Music::cue([{ frequencies: 'A4', duration: 75 }])
129+
137130
puts 'You miss entirely!'.colorize(:yellow)
138131
end
139132
when 'defend', 'd'
@@ -145,7 +138,7 @@ def start(is_arena = nil, is_event = nil)
145138
print "#{monster.name}".colorize(:white)
146139
print " (#{monster.hp_cur}/#{monster.hp_max} HP): #{monster.description}\n"
147140
puts "It has some distinguishing features, too: face is #{monster.face}, hands are #{monster.hands}, and general mood is #{monster.mood}."
148-
if world.debug_mode
141+
if GameOptions.data['debug_mode']
149142
puts 'If defeated, will receive:'
150143
puts " >> XP : #{monster.xp}"
151144
puts " >> ROX : #{monster.rox}"
@@ -192,7 +185,7 @@ def calculate_damage_to(entity)
192185
atk_range = base_atk_lo..base_atk_hi
193186

194187
# beast mode modifier
195-
if player.beast_mode
188+
if GameOptions.data['beast_mode']
196189
atk_range = BEAST_MODE_ATTACK..BEAST_MODE_ATTACK
197190
# level 3 ability modifier
198191
elsif player.special_abilities.include?(:rock_slide)
@@ -250,14 +243,12 @@ def monster_attacks_player
250243

251244
dmg = calculate_damage_to(player)
252245
if dmg > 0
253-
if world.sound_enabled
254-
Music::cue([{ frequencies: 'B4,E#5,A5', duration: 75 }], world.sound_volume)
255-
end
246+
Music::cue([{ frequencies: 'B4,E#5,A5', duration: 75 }])
247+
256248
take_damage(player, dmg)
257249
else
258-
if world.sound_enabled
259-
Music::cue([{ frequencies: 'B4', duration: 75 }], world.sound_volume)
260-
end
250+
Music::cue([{ frequencies: 'B4', duration: 75 }])
251+
261252
puts "#{monster.name} misses entirely!".colorize(:yellow)
262253
end
263254
end
@@ -279,25 +270,24 @@ def monster_death
279270
if monster.is_boss
280271
# end game boss!
281272
if monster.name.eql?('Emerald')
282-
if world.sound_enabled
283-
Music::cue([
284-
{ frequencies: 'G3', duration: 250 },
285-
{ frequencies: 'A3', duration: 50 },
286-
{ frequencies: 'B3', duration: 50 },
287-
{ frequencies: 'C4', duration: 50 },
288-
{ frequencies: 'D4', duration: 250 },
289-
{ frequencies: 'E4', duration: 50 },
290-
{ frequencies: 'F#4', duration: 50 },
291-
{ frequencies: 'G4', duration: 50 },
292-
{ frequencies: 'A4', duration: 250 },
293-
{ frequencies: 'B4', duration: 50 },
294-
{ frequencies: 'C5', duration: 50 },
295-
{ frequencies: 'D5', duration: 50 },
296-
{ frequencies: 'E5', duration: 50 },
297-
{ frequencies: 'F#5', duration: 50 },
298-
{ frequencies: 'G5', duration: 1000 }
299-
], world.sound_volume)
300-
end
273+
Music::cue([
274+
{ frequencies: 'G3', duration: 250 },
275+
{ frequencies: 'A3', duration: 50 },
276+
{ frequencies: 'B3', duration: 50 },
277+
{ frequencies: 'C4', duration: 50 },
278+
{ frequencies: 'D4', duration: 250 },
279+
{ frequencies: 'E4', duration: 50 },
280+
{ frequencies: 'F#4', duration: 50 },
281+
{ frequencies: 'G4', duration: 50 },
282+
{ frequencies: 'A4', duration: 250 },
283+
{ frequencies: 'B4', duration: 50 },
284+
{ frequencies: 'C5', duration: 50 },
285+
{ frequencies: 'D5', duration: 50 },
286+
{ frequencies: 'E5', duration: 50 },
287+
{ frequencies: 'F#5', duration: 50 },
288+
{ frequencies: 'G5', duration: 1000 }
289+
])
290+
301291
puts monster.defeated_text
302292
gets
303293
return 'exit'
@@ -324,23 +314,14 @@ def monster_death
324314

325315
# PLAYER
326316
def player_near_death?
327-
((player.hp_cur.to_f / player.hp_max.to_f) < 0.10 && !player.god_mode)
317+
((player.hp_cur.to_f / player.hp_max.to_f) < 0.10 && !GameOptions.data['god_mode'])
328318
end
329319

330320
def player_dead?
331-
(player.hp_cur <= 0 && !player.god_mode)
321+
(player.hp_cur <= 0 && !GameOptions.data['god_mode'])
332322
end
333323

334324
def player_death
335-
if world.sound_enabled
336-
Music::cue([
337-
{ frequencies: 'D#5', duration: 100 },
338-
{ frequencies: 'A4', duration: 150 },
339-
{ frequencies: 'F#4', duration: 200 },
340-
{ frequencies: 'F4', duration: 1000 }
341-
], world.sound_volume)
342-
end
343-
344325
puts "You are dead, slain by the #{monster.name}!".colorize(:red)
345326
print_battle_line
346327
end

lib/gemwarrior/entities/location.rb

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# Place in the game
33

44
require_relative 'entity'
5+
require_relative '../game_options'
56

67
module Gemwarrior
78
class Location < Entity
@@ -28,11 +29,11 @@ def initialize(options)
2829
self.checked_for_monsters = false
2930
end
3031

31-
def status(debug_mode = false)
32+
def status
3233
status_text = name.ljust(30).upcase.colorize(:green)
3334
status_text << coords.values.to_a.to_s.colorize(:white)
34-
status_text << " DL[#{danger_level.to_s.ljust(8)}] ".colorize(:white) if debug_mode
35-
status_text << " MLR[#{monster_level_range.to_s.ljust(6)}] ".colorize(:white) if debug_mode
35+
status_text << " DL[#{danger_level.to_s.ljust(8)}] ".colorize(:white) if GameOptions.data['debug_mode']
36+
status_text << " MLR[#{monster_level_range.to_s.ljust(6)}] ".colorize(:white) if GameOptions.data['debug_mode']
3637
status_text << "\n#{description}\n".colorize(:white)
3738
end
3839

0 commit comments

Comments
 (0)