destiny 0.0.5 → 0.0.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/destiny +2 -2
- data/lib/choice.rb +38 -0
- data/lib/destiny.rb +12 -9
- data/lib/dungeon_map.rb +49 -0
- data/lib/edge_coloring_graph.rb +10 -0
- data/lib/game_mechanics.rb +56 -39
- data/lib/mobs.rb +56 -15
- data/lib/places.rb +98 -67
- metadata +28 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 71528913273e887206aa8b6c88d484b3665c5886
|
4
|
+
data.tar.gz: b4fc818bc75a7fc1b5fef413d9e806c260d054b2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 44afd297308dafc321fb6cd8caf1d13ace7e254eb3af10ebe6baf793ab69e0da59a84e4ac61dbc7316fac2757c97cbe34cb4a7ae99c082402607d6401d3f14ed
|
7
|
+
data.tar.gz: 421c2281bcc2d434a8cc6fc27ad0d79f7395d01ed373139f89573045b0c6c758bc3bf9832c91b14a1c6560738307b960c2ce5209becf02d3610e5b25103eb404
|
data/bin/destiny
CHANGED
@@ -7,12 +7,12 @@ require 'destiny'
|
|
7
7
|
puts # formatting
|
8
8
|
puts " " + "_"*53
|
9
9
|
puts "|" + " "*53 + "|"
|
10
|
-
puts "| Welcome to the exciting world of Destiny! |"
|
10
|
+
puts "| " + "Welcome to the exciting world of Destiny!".yellow + " |"
|
11
11
|
puts "|" + " "*53 + "|"
|
12
12
|
puts " " + "-"*53
|
13
13
|
puts # formatting
|
14
14
|
puts # formatting
|
15
|
-
puts "Selectable options will normally be enclosed in []'s."
|
15
|
+
puts "Selectable options will normally be enclosed in " + "[]".yellow + "'s."
|
16
16
|
puts # formatting
|
17
17
|
if File.exists?('../lib/save_game.json')
|
18
18
|
puts "Would you like to start a new game?"
|
data/lib/choice.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
require 'colorize'
|
2
|
+
|
3
|
+
class Choice
|
4
|
+
attr_reader :choices
|
5
|
+
|
6
|
+
def initialize msg, choices
|
7
|
+
@msg = msg
|
8
|
+
@choices = choices
|
9
|
+
end
|
10
|
+
|
11
|
+
def prompt
|
12
|
+
put_prompt_msg
|
13
|
+
get_prompt_resp
|
14
|
+
end
|
15
|
+
|
16
|
+
def to_s
|
17
|
+
@choices
|
18
|
+
end
|
19
|
+
|
20
|
+
def add(command, msg)
|
21
|
+
@choices[command] = msg
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
def put_prompt_msg
|
26
|
+
p = []
|
27
|
+
p << @msg
|
28
|
+
@choices.each do |key, description|
|
29
|
+
p << "[#{key}] ".yellow + description
|
30
|
+
end
|
31
|
+
puts "#{p.join("\n")}\n"
|
32
|
+
end
|
33
|
+
|
34
|
+
def get_prompt_resp
|
35
|
+
gets.chomp
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
data/lib/destiny.rb
CHANGED
@@ -2,6 +2,7 @@ require "json"
|
|
2
2
|
require "game_mechanics"
|
3
3
|
require "mobs"
|
4
4
|
require "places"
|
5
|
+
require "choice"
|
5
6
|
|
6
7
|
include GameMechanics
|
7
8
|
|
@@ -37,12 +38,14 @@ class GameSelect
|
|
37
38
|
puts # formatting
|
38
39
|
puts "_"*50
|
39
40
|
puts "Starting a new game, please answer the following questions:"
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
41
|
+
c = Choice.new "Whould you like to play as a knight, wizard, cleric, or rogue?",
|
42
|
+
{
|
43
|
+
"1" => "Knight",
|
44
|
+
"2" => "Wizard",
|
45
|
+
"3" => "Cleric",
|
46
|
+
"4" => "Rogue"
|
47
|
+
}
|
48
|
+
class_choice = c.prompt
|
46
49
|
end while not (class_choice == "1" or class_choice == "2" or class_choice == "3" or class_choice == "4")
|
47
50
|
begin
|
48
51
|
player_name = choose_name
|
@@ -78,16 +81,16 @@ class GameSelect
|
|
78
81
|
@player = load_data
|
79
82
|
end
|
80
83
|
end
|
81
|
-
|
84
|
+
|
82
85
|
end
|
83
86
|
|
84
87
|
class NewGame
|
85
88
|
# Not using this right now. Later, I hope to support multiple characters and then
|
86
89
|
# I will move the newgame stuff into here. Need a save file with multiple lines support first
|
87
90
|
attr_accessor :save_slot, :char_name
|
88
|
-
|
91
|
+
|
89
92
|
def initialize new_game
|
90
93
|
@new_game = new_game
|
91
94
|
end
|
92
|
-
|
95
|
+
|
93
96
|
end
|
data/lib/dungeon_map.rb
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'edge_coloring_graph'
|
2
|
+
require 'choice'
|
3
|
+
|
4
|
+
DoorNames = {
|
5
|
+
:w => 'wooden door',
|
6
|
+
:i => 'iron door',
|
7
|
+
:c => 'crack in the wall',
|
8
|
+
:r => 'rusty door'
|
9
|
+
}
|
10
|
+
|
11
|
+
class DungeonMap
|
12
|
+
def initialize map
|
13
|
+
@map = map
|
14
|
+
end
|
15
|
+
|
16
|
+
def door_to current_location, command
|
17
|
+
doors = doors_at current_location
|
18
|
+
if doors[command.to_sym]
|
19
|
+
return doors[command.to_sym]
|
20
|
+
else
|
21
|
+
return current_location
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def choices location
|
26
|
+
doors = doors_at location
|
27
|
+
door_choices = {}
|
28
|
+
doors.keys.each do |command|
|
29
|
+
door_choices[command.to_sym] = "Go through the #{DoorNames[command]}."
|
30
|
+
end
|
31
|
+
Choice.new 'Where will you go next?', door_choices
|
32
|
+
end
|
33
|
+
|
34
|
+
def doors_at location
|
35
|
+
doors = {}
|
36
|
+
@map[location].each_with_index do |door, next_room|
|
37
|
+
doors[door.to_sym] = next_room if door != ' '
|
38
|
+
end
|
39
|
+
doors
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_s
|
43
|
+
rows = []
|
44
|
+
@map.each_with_index do |row, i|
|
45
|
+
rows << "#{i}|#{row.join '|'}"
|
46
|
+
end
|
47
|
+
rows.join "\n"
|
48
|
+
end
|
49
|
+
end
|
data/lib/game_mechanics.rb
CHANGED
@@ -1,11 +1,11 @@
|
|
1
1
|
module GameMechanics
|
2
|
-
|
2
|
+
|
3
3
|
@@save_file = '../lib/save_game.json'
|
4
|
-
|
4
|
+
|
5
5
|
def prompt
|
6
6
|
print ">> "
|
7
7
|
end
|
8
|
-
|
8
|
+
|
9
9
|
def yes_no
|
10
10
|
#restrict input to valid answers, but don't worry about case
|
11
11
|
begin
|
@@ -13,7 +13,7 @@ module GameMechanics
|
|
13
13
|
prompt; @yes_no = STDIN.gets.chomp.downcase
|
14
14
|
end while not (@yes_no == "yes" or @yes_no == "no")
|
15
15
|
end
|
16
|
-
|
16
|
+
|
17
17
|
def save_data
|
18
18
|
# increase level as player gets more xp!
|
19
19
|
case
|
@@ -31,6 +31,12 @@ module GameMechanics
|
|
31
31
|
@player.lvl = 6
|
32
32
|
when (15001..19000).include?(@player.xp)
|
33
33
|
@player.lvl = 7
|
34
|
+
when (19001..24000).include?(@player.xp)
|
35
|
+
@player.lvl = 8
|
36
|
+
when (24001..29000).include?(@player.xp)
|
37
|
+
@player.lvl = 9
|
38
|
+
when @player.xp > 29000
|
39
|
+
@player.lvl = 10
|
34
40
|
end
|
35
41
|
save_info = {
|
36
42
|
role: @player.class,
|
@@ -48,7 +54,7 @@ module GameMechanics
|
|
48
54
|
f.write(save_info.to_json)
|
49
55
|
end
|
50
56
|
end
|
51
|
-
|
57
|
+
|
52
58
|
def load_data
|
53
59
|
load_info = JSON.parse(File.read(@@save_file))
|
54
60
|
role = load_info['role']
|
@@ -63,7 +69,7 @@ module GameMechanics
|
|
63
69
|
end
|
64
70
|
# Set stats based off information in load_info
|
65
71
|
@player.lvl = load_info['lvl']
|
66
|
-
@player.xp = load_info['xp']
|
72
|
+
@player.xp = load_info['xp']
|
67
73
|
@player.coin = load_info['coin']
|
68
74
|
@player.name = load_info['name']
|
69
75
|
@player.cur_hp = load_info['cur_hp']
|
@@ -79,7 +85,7 @@ module GameMechanics
|
|
79
85
|
# I was trying to do the above assignments with iteration, there has to be a way!
|
80
86
|
# load_info.each do |attribute, value|
|
81
87
|
# @player.#{attribute} = value unless attribute == "role"
|
82
|
-
# end
|
88
|
+
# end
|
83
89
|
end
|
84
90
|
|
85
91
|
def restore_player
|
@@ -90,31 +96,40 @@ module GameMechanics
|
|
90
96
|
end
|
91
97
|
|
92
98
|
def bar_top
|
93
|
-
"_"*27 + " STATS " + "_"*27
|
99
|
+
"_"*27 + " " + "STATS" + " " + "_"*27
|
94
100
|
end
|
95
|
-
|
101
|
+
|
96
102
|
def stat_bar name, xp, lvl, coin, cur_hp, cur_mana
|
97
|
-
" Name: #{name} | XP: #{xp} | Lvl: #{lvl} | Coin: #{coin} | HP: #{cur_hp} | Mana: #{cur_mana}"
|
103
|
+
" Name: " + "#{name}" + " | XP: #{xp} | Lvl: #{lvl} | Coin: #{coin} | HP: #{cur_hp} | Mana: #{cur_mana}"
|
98
104
|
end
|
99
|
-
|
105
|
+
|
100
106
|
def bar_low
|
101
107
|
"-"*61
|
102
108
|
end
|
103
|
-
|
109
|
+
|
104
110
|
def is_even?(x)
|
105
111
|
x % 2 == 0 ? true : false
|
106
112
|
end
|
107
|
-
|
113
|
+
|
108
114
|
def player_croaks
|
109
115
|
puts # formatting
|
116
|
+
if @player.class.to_s == "Wizard" and @player.spell_buff == true
|
117
|
+
puts "A single tear falls from Draco as he fades away..."
|
118
|
+
puts #formatting
|
119
|
+
@player.spell_buff = false
|
120
|
+
end
|
110
121
|
puts "It happens to the best of us #{@player.name}."
|
111
122
|
puts "Fortunately for you, the game of Destiny never ends."
|
112
123
|
puts "The game will exit now and you can restart in town."
|
113
124
|
puts # formatting
|
114
125
|
puts "Better luck next time, eh?"
|
126
|
+
@player.buff_food = false
|
127
|
+
@player.buff_drink = false
|
128
|
+
@player.cur_hp = @player.hp/2
|
129
|
+
save_data
|
115
130
|
exit
|
116
131
|
end
|
117
|
-
|
132
|
+
|
118
133
|
def combat bad_guy
|
119
134
|
# create an opponent
|
120
135
|
@bad_guy = bad_guy.new
|
@@ -129,14 +144,16 @@ module GameMechanics
|
|
129
144
|
@heal = false
|
130
145
|
puts # formatting
|
131
146
|
puts bar_low + "--"
|
132
|
-
puts " #{@player.name} - HP: #{@player.cur_hp} - Mana: #{@player.cur_mana} | - VS - | #{@bad_guy.name} - HP: #{@bad_guy.cur_hp} - Mana: #{@bad_guy.cur_mana}"
|
147
|
+
puts " #{@player.name} - HP: #{@player.cur_hp} - Mana: #{@player.cur_mana} |".green + " - VS - " + "| #{@bad_guy.name} - HP: #{@bad_guy.cur_hp} - Mana: #{@bad_guy.cur_mana}".red
|
133
148
|
puts bar_low + "--"
|
134
149
|
puts # formatting
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
150
|
+
choice_opts = {
|
151
|
+
"1" => "Attack.",
|
152
|
+
"2" => "Run."
|
153
|
+
}
|
154
|
+
choice_opts["3"] = "Cast Heal and Attack." if @player.class.to_s == "Cleric"
|
155
|
+
c = Choice.new "#{@bad_guy.name} vs. #{@player.name}, what will you do?", choice_opts
|
156
|
+
move = c.prompt
|
140
157
|
move = "4" if move == "3" and @player.class.to_s != "Cleric"
|
141
158
|
end while not (move == "1" or move == "2" or move == "3")
|
142
159
|
@heal = true if move == "3" # set cleric heal flag to true
|
@@ -151,13 +168,13 @@ module GameMechanics
|
|
151
168
|
@dmg_dlt = dice(@player.dmg) + dmg_mod
|
152
169
|
elsif @player.class.to_s == "Wizard"
|
153
170
|
begin
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
171
|
+
choice_opts = { "1" => "one dart" }
|
172
|
+
choice_opts["2"] = "two darts" if @player.cur_mana - 2*@player.lvl >= 0
|
173
|
+
choice_opts["3"] = "three darts" if @player.cur_mana - 3*@player.lvl >= 0
|
174
|
+
c = Choice.new "How many magic darts will you shoot?", choice_opts
|
175
|
+
darts = c.prompt.to_i
|
176
|
+
darts = 4 if darts == 2 and @player.cur_mana - 2*@player.lvl < 0
|
177
|
+
darts = 4 if darts == 3 and @player.cur_mana - 3*@player.lvl < 0
|
161
178
|
end while not (darts == 1 or darts == 2 or darts == 3)
|
162
179
|
puts # formatting
|
163
180
|
puts "#{@player.name} conjures #{darts} magic dart that zips toward the #{@bad_guy.name}." if darts == 1
|
@@ -176,10 +193,10 @@ module GameMechanics
|
|
176
193
|
end
|
177
194
|
@heal_amount = dice(2)*@player.lvl + heal_bonus + 1 # testing with the +1, what I am going for here
|
178
195
|
# is to balance the heal with their lower damage and hp
|
179
|
-
puts "Praying intently, you add #{@heal_amount} health points as you prepare to strike."
|
196
|
+
puts "Praying intently, you add " + "#{@heal_amount}".green + " health points as you prepare to strike."
|
197
|
+
@player.cur_hp = @player.cur_hp + @heal_amount
|
180
198
|
puts "#{@player.name}, any health points above your normal maximum will fade after combat." if @player.cur_hp > @player.hp
|
181
199
|
puts # formatting
|
182
|
-
@player.cur_hp = @player.cur_hp + @heal_amount
|
183
200
|
end
|
184
201
|
puts "#{@player.name} brings the holy mace thundering down upon #{@bad_guy.name}!"
|
185
202
|
puts # formatting
|
@@ -201,7 +218,7 @@ module GameMechanics
|
|
201
218
|
@dmg_dlt = @dmg_dlt - @bad_guy.armor/4
|
202
219
|
@dmg_dlt = 0 if @dmg_dlt < 1
|
203
220
|
puts #formatting
|
204
|
-
puts "You deal #{@dmg_dlt} damage to the #{@bad_guy.name}." unless @dmg_dlt < 1
|
221
|
+
puts "You deal " + "#{@dmg_dlt}".green + " damage to the #{@bad_guy.name}." unless @dmg_dlt < 1
|
205
222
|
puts # formatting
|
206
223
|
@bad_guy.cur_hp = @bad_guy.cur_hp - @dmg_dlt
|
207
224
|
end
|
@@ -227,7 +244,7 @@ module GameMechanics
|
|
227
244
|
else
|
228
245
|
dmg_taken = dice(@bad_guy.dmg) - @player.armor/4
|
229
246
|
if @player.class.to_s == "Wizard" and @player.spell_buff == true and dmg_taken > 1
|
230
|
-
draco_helps = @player.lvl
|
247
|
+
draco_helps = @player.lvl + @player.lvl/2 # Trying a bump in mitigation as Wizard is squishy!
|
231
248
|
dmg_taken = dmg_taken - draco_helps
|
232
249
|
puts "Draco helps shield you absorbing some of the potential damage."
|
233
250
|
puts # formatting
|
@@ -235,7 +252,7 @@ module GameMechanics
|
|
235
252
|
dmg_taken = 0 if dmg_taken < 1
|
236
253
|
@player.cur_hp = @player.cur_hp - dmg_taken
|
237
254
|
if dmg_taken > 0
|
238
|
-
puts "#{@bad_guy.name} hits YOU for #{dmg_taken} damage!"
|
255
|
+
puts "#{@bad_guy.name} hits YOU for " + "#{dmg_taken}".red + " damage!"
|
239
256
|
puts "OUCH!"
|
240
257
|
else
|
241
258
|
puts "You deflect the blow and take no damage."
|
@@ -276,7 +293,7 @@ module GameMechanics
|
|
276
293
|
dmg_taken = dice(@bad_guy.dmg) - @player.armor/4
|
277
294
|
dmg_taken = 0 if dmg_taken < 1
|
278
295
|
@player.cur_hp = @player.cur_hp - dmg_taken
|
279
|
-
puts "#{@bad_guy.name} hits YOU for #{dmg_taken} damage!" unless dmg_taken < 1
|
296
|
+
puts "#{@bad_guy.name} hits YOU for " + "#{dmg_taken}".red + " damage!" unless dmg_taken < 1
|
280
297
|
puts "OUCH!" unless dmg_taken < 1
|
281
298
|
end
|
282
299
|
puts #formatting
|
@@ -292,14 +309,14 @@ module GameMechanics
|
|
292
309
|
puts "Ah, the life of a rogue, so free, so evasive!"
|
293
310
|
puts "#{@player.name}, using your roguish powers you slip away unseen, leaving"
|
294
311
|
puts "#{@bad_guy.name} cursing and muttering in the dark."
|
295
|
-
end
|
312
|
+
end
|
296
313
|
save_data
|
297
314
|
return
|
298
315
|
end
|
299
316
|
end
|
300
|
-
|
317
|
+
|
301
318
|
end
|
302
|
-
|
319
|
+
|
303
320
|
def dice(sides=6,&block)
|
304
321
|
if block_given?
|
305
322
|
block.call(rand(1..sides))
|
@@ -361,7 +378,7 @@ module GameMechanics
|
|
361
378
|
player_croaks
|
362
379
|
end
|
363
380
|
save_data
|
364
|
-
end
|
381
|
+
end
|
365
382
|
end
|
366
|
-
|
367
|
-
end
|
383
|
+
|
384
|
+
end
|
data/lib/mobs.rb
CHANGED
@@ -91,18 +91,28 @@ class GiantRat < Mobs
|
|
91
91
|
def initialize(str=12, agi=10, int=4, dmg=5, armor=6, hp=8, cur_hp=8, dodge=5, mana=0, cur_mana=0, xp=150, lvl=1, coin=1, name="Giant Rat")
|
92
92
|
rat_type = dice(10)
|
93
93
|
case
|
94
|
-
when (1..
|
94
|
+
when (1..5).include?(rat_type)
|
95
95
|
# no change, you just get the generic giant rat
|
96
|
-
when (9
|
96
|
+
when (6..9).include?(rat_type)
|
97
97
|
# this feller is much harder to defeat
|
98
|
-
str =
|
99
|
-
dmg =
|
98
|
+
str = 14
|
99
|
+
dmg = 6
|
100
100
|
hp = 10
|
101
101
|
cur_hp = 10
|
102
102
|
dodge = 10
|
103
|
-
xp =
|
104
|
-
coin =
|
103
|
+
xp = 250
|
104
|
+
coin = 2
|
105
105
|
name = "ROUS"
|
106
|
+
when rat_type == 10
|
107
|
+
# Giant rat mini boss!
|
108
|
+
str = 16
|
109
|
+
dmg = 8
|
110
|
+
hp = 12
|
111
|
+
cur_hp = 12
|
112
|
+
dodge = 15
|
113
|
+
xp = 400
|
114
|
+
coin = 4
|
115
|
+
name = "Nuck Chorris"
|
106
116
|
end
|
107
117
|
super(str,agi,int,dmg,armor,hp,cur_hp,dodge,mana,cur_mana,xp,lvl,coin,name)
|
108
118
|
end
|
@@ -115,9 +125,9 @@ class Goblin < Mobs
|
|
115
125
|
# Should probably create a method that does the below
|
116
126
|
goblin_type = dice(10)
|
117
127
|
case
|
118
|
-
when (1..
|
128
|
+
when (1..5).include?(goblin_type)
|
119
129
|
# no change, you just get the generic goblin
|
120
|
-
when (
|
130
|
+
when (6..9).include?(goblin_type)
|
121
131
|
# this feller is stronger, but less nimble
|
122
132
|
str = 16
|
123
133
|
dmg = 6
|
@@ -128,6 +138,16 @@ class Goblin < Mobs
|
|
128
138
|
xp = 200
|
129
139
|
coin = 2
|
130
140
|
name = "Goblin Warrior"
|
141
|
+
when goblin_type == 10
|
142
|
+
# Mini boss goblin!
|
143
|
+
str = 16
|
144
|
+
dmg = 8
|
145
|
+
armor = 10
|
146
|
+
hp = 10
|
147
|
+
cur_hp = 10
|
148
|
+
xp = 300
|
149
|
+
coin = 3
|
150
|
+
name = "Goblin Chief"
|
131
151
|
end
|
132
152
|
super(str,agi,int,dmg,armor,hp,cur_hp,dodge,mana,cur_mana,xp,lvl,coin,name)
|
133
153
|
end
|
@@ -139,19 +159,28 @@ class Kobold < Mobs
|
|
139
159
|
def initialize(str=12, agi=8, int=8, dmg=5, armor=5, hp=6, cur_hp=6, dodge=10, mana=2, cur_mana=2, xp=150, lvl=1, coin=2, name="Kobold")
|
140
160
|
kobold_type = dice(10)
|
141
161
|
case
|
142
|
-
when (1..
|
162
|
+
when (1..5).include?(kobold_type)
|
143
163
|
# no change, you just get the generic kobold
|
144
|
-
when (
|
164
|
+
when (6..9).include?(kobold_type)
|
145
165
|
# this one has double the chance to dodge as a regular kobold
|
146
166
|
agi = 16
|
147
167
|
dmg = 6
|
148
168
|
armor = 6
|
149
|
-
hp = 8
|
150
|
-
cur_hp = 8
|
151
169
|
dodge = 20
|
152
170
|
xp = 300
|
153
171
|
coin = 4
|
154
172
|
name = "Kobold Thief"
|
173
|
+
when kobold_type == 10
|
174
|
+
# kobold mini boss!
|
175
|
+
str = 16
|
176
|
+
agi = 12
|
177
|
+
dmg = 8
|
178
|
+
armor = 8
|
179
|
+
hp = 10
|
180
|
+
cur_hp = 10
|
181
|
+
xp = 400
|
182
|
+
coin = 5
|
183
|
+
name = "Kobold Berserker"
|
155
184
|
end
|
156
185
|
super(str,agi,int,dmg,armor,hp,cur_hp,dodge,mana,cur_mana,xp,lvl,coin,name)
|
157
186
|
end
|
@@ -163,9 +192,9 @@ class Skeleton < Mobs
|
|
163
192
|
def initialize(str=12, agi=10, int=8, dmg=5, armor=6, hp=8, cur_hp=8, dodge=5, mana=0, cur_mana=0, xp=200, lvl=1, coin=3, name="Skeleton")
|
164
193
|
skeleton_type = dice(10)
|
165
194
|
case
|
166
|
-
when (1..
|
195
|
+
when (1..5).include?(skeleton_type)
|
167
196
|
# no change, you just get the generic skeleton
|
168
|
-
when (
|
197
|
+
when (6..9).include?(skeleton_type)
|
169
198
|
# this feller is considerably tougher
|
170
199
|
str = 16
|
171
200
|
dmg = 6
|
@@ -173,8 +202,20 @@ class Skeleton < Mobs
|
|
173
202
|
hp = 10
|
174
203
|
cur_hp = 10
|
175
204
|
xp = 300
|
176
|
-
coin =
|
205
|
+
coin = 3
|
177
206
|
name = "Skeletal Knight"
|
207
|
+
when skeleton_type == 10
|
208
|
+
# skeleton mini boss!
|
209
|
+
str = 14
|
210
|
+
agi = 14
|
211
|
+
dmg = 8
|
212
|
+
armor = 8
|
213
|
+
hp = 10
|
214
|
+
cur_hp = 10
|
215
|
+
dodge = 10
|
216
|
+
xp = 400
|
217
|
+
coin = 5
|
218
|
+
name = "Skeleton of Geoff"
|
178
219
|
end
|
179
220
|
super(str,agi,int,dmg,armor,hp,cur_hp,dodge,mana,cur_mana,xp,lvl,coin,name)
|
180
221
|
end
|
data/lib/places.rb
CHANGED
@@ -1,8 +1,10 @@
|
|
1
1
|
# This file will contain the various places the player can go
|
2
2
|
# Town, Tavern, Dungeon and options in each
|
3
|
+
require 'choice'
|
4
|
+
require 'dungeon_map'
|
3
5
|
|
4
6
|
class Town
|
5
|
-
|
7
|
+
|
6
8
|
def initialize
|
7
9
|
# Town is only available as an option in the Dungeon (to return to)
|
8
10
|
# initialize is only called the first time, so this greeting is only seen once
|
@@ -10,22 +12,24 @@ class Town
|
|
10
12
|
puts "You walk into town, scanning each nook and cranny. Most faces are friendly,"
|
11
13
|
puts "some are not..."
|
12
14
|
end
|
13
|
-
|
15
|
+
|
14
16
|
def choices
|
15
17
|
move = 0
|
16
18
|
until move == "3"
|
17
19
|
begin
|
18
20
|
load_data
|
19
21
|
puts # formatting
|
20
|
-
puts bar_top
|
22
|
+
puts bar_top.yellow
|
21
23
|
puts stat_bar(@player.name, @player.xp, @player.lvl, @player.coin, @player.cur_hp, @player.cur_mana)
|
22
|
-
puts bar_low
|
24
|
+
puts bar_low.yellow
|
23
25
|
puts # formatting
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
26
|
+
c = Choice.new "Please choose where you will head next:",
|
27
|
+
{
|
28
|
+
"1" => "The Dungeon",
|
29
|
+
"2" => "Ye Old Tavern",
|
30
|
+
"3" => "Exit Game"
|
31
|
+
}
|
32
|
+
move = c.prompt
|
29
33
|
end while not (move == "1" or move == "2" or move == "3")
|
30
34
|
case
|
31
35
|
when move == "1"
|
@@ -43,9 +47,30 @@ class Town
|
|
43
47
|
end
|
44
48
|
|
45
49
|
class Dungeon
|
46
|
-
|
50
|
+
# a sample map
|
51
|
+
# a map is an edge array defining a graph. Edges have colorings.
|
52
|
+
# TODO: make a set of maps and define them elsewhere
|
53
|
+
# write an algorithm to create good maps
|
54
|
+
#
|
55
|
+
|
47
56
|
# can get here from town, initialize just gives a one time (per visit) message
|
48
57
|
def initialize
|
58
|
+
|
59
|
+
map = <<-MAP
|
60
|
+
0 1 2 3 4 5 6 7 8 9
|
61
|
+
0| | |r| | |w| |c| | |
|
62
|
+
1| | | | |w|c| | | | |
|
63
|
+
2|r| | |c| |i| | |w| |
|
64
|
+
3| | |c| | | |i| | | |
|
65
|
+
4| |w| | | | | | | | |
|
66
|
+
5|w|c|i| | | | | | | |
|
67
|
+
6| | | |i| | | |w| |r|
|
68
|
+
7|c| | | | | |w| | |i|
|
69
|
+
8| | |w| | | | | | |c|
|
70
|
+
9| | | | | | |r|i|c| |
|
71
|
+
MAP
|
72
|
+
@map = map.split("\n")[1..map.length].map {|line| line.split('|')[1..map.length]}
|
73
|
+
@dungeon_map = DungeonMap.new @map
|
49
74
|
puts # formatting
|
50
75
|
rand_greet = dice(3)
|
51
76
|
rand_greet = "You have entered the dungeon! DUM DUM DUM!!" if rand_greet == 1
|
@@ -53,25 +78,24 @@ class Dungeon
|
|
53
78
|
rand_greet = "As you enter the dungeon, you notice strange markings along the walls..." if rand_greet == 3
|
54
79
|
puts rand_greet
|
55
80
|
end
|
56
|
-
|
81
|
+
|
57
82
|
def choices
|
58
83
|
move = 0
|
59
84
|
load_data
|
60
|
-
|
61
|
-
until move == "
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
end while not (move == "1" or move == "2" or move == "3")
|
85
|
+
room_id = 0 # start at room 0
|
86
|
+
until move == "t" and room_id == 0
|
87
|
+
puts # formatting
|
88
|
+
puts bar_top.yellow
|
89
|
+
puts stat_bar(@player.name, @player.xp, @player.lvl, @player.coin, @player.cur_hp, @player.cur_mana)
|
90
|
+
puts bar_low.yellow
|
91
|
+
puts # formatting
|
92
|
+
c = @dungeon_map.choices room_id
|
93
|
+
c.add('t', 'Go back to town.') if room_id == 0
|
94
|
+
if @player.class.to_s == "Wizard" and
|
95
|
+
@player.spell_buff == false
|
96
|
+
c.add('f', "Conjure Wizard Familar")
|
97
|
+
end
|
98
|
+
move = c.prompt
|
75
99
|
# apply food buff
|
76
100
|
@player.cur_hp = @player.cur_hp + @player.lvl if @player.buff_food == true
|
77
101
|
# prevent food buff from raising current health points above maximum
|
@@ -80,8 +104,9 @@ class Dungeon
|
|
80
104
|
@player.cur_mana = @player.cur_mana + @player.lvl if @player.buff_drink == true
|
81
105
|
# prevent drink buff from raising current mana points above maximum
|
82
106
|
@player.cur_mana = @player.mana if @player.cur_mana > @player.mana
|
83
|
-
|
84
|
-
|
107
|
+
new_room_id = @dungeon_map.door_to room_id, move
|
108
|
+
if new_room_id != room_id
|
109
|
+
room_id = new_room_id
|
85
110
|
puts # formatting
|
86
111
|
rand_msg = dice(3)
|
87
112
|
rand_msg = "You walk further into the dark, dank, dirty, dungeon, smirking slightly at your awesome alliteration ability." if rand_msg == 1
|
@@ -89,30 +114,25 @@ class Dungeon
|
|
89
114
|
rand_msg = "More strange markings, they seem to mean something, but what and who wrote them?" if rand_msg == 3
|
90
115
|
puts rand_msg
|
91
116
|
puts # formatting
|
92
|
-
bread_crumb = bread_crumb + 1
|
93
117
|
random_encounter
|
94
|
-
|
95
|
-
if bread_crumb <= 1
|
96
|
-
puts # formatting
|
97
|
-
puts "You make it back to town in one piece!"
|
98
|
-
puts # formatting
|
99
|
-
# remove food buffs from player when they leave the dungeon
|
100
|
-
@player.buff_food = false
|
101
|
-
@player.buff_drink = false
|
102
|
-
if @player.class.to_s == "Wizard" and @player.spell_buff == true
|
103
|
-
puts "Drako wishes you well and fades away, ready to help another day."
|
104
|
-
puts #formatting
|
105
|
-
@player.spell_buff = false
|
106
|
-
end
|
107
|
-
save_data
|
108
|
-
return
|
109
|
-
end
|
110
|
-
bread_crumb = bread_crumb - 1
|
118
|
+
elsif move == "t" # back to town
|
111
119
|
puts # formatting
|
112
|
-
puts "You
|
120
|
+
puts "You make it back to town in one piece!"
|
113
121
|
puts # formatting
|
114
|
-
|
115
|
-
|
122
|
+
# remove food buffs from player when they leave the dungeon
|
123
|
+
@player.buff_food = false
|
124
|
+
@player.buff_drink = false
|
125
|
+
if @player.class.to_s == "Wizard" and @player.spell_buff == true
|
126
|
+
puts "Drako wishes you well and fades away, ready to help another day."
|
127
|
+
puts #formatting
|
128
|
+
@player.spell_buff = false
|
129
|
+
end
|
130
|
+
save_data
|
131
|
+
return
|
132
|
+
# wizard familiar
|
133
|
+
elsif move == "f" and
|
134
|
+
@player.class.to_s == "Wizard" and
|
135
|
+
@player.spell_buff == false
|
116
136
|
puts # formatting
|
117
137
|
puts "#{@player.name} concentrates intently while waving the magic wand and casting the spell..."
|
118
138
|
puts # formatting
|
@@ -127,7 +147,7 @@ class Dungeon
|
|
127
147
|
end
|
128
148
|
|
129
149
|
class Tavern
|
130
|
-
|
150
|
+
|
131
151
|
# only available as an option in the Town
|
132
152
|
# The tavern will "heal" the player by restoring mana and hp
|
133
153
|
def initialize
|
@@ -139,28 +159,30 @@ class Tavern
|
|
139
159
|
puts "Some rest would probably do you good, #{@player.name}." if @player.cur_hp < @player.hp
|
140
160
|
puts # formatting
|
141
161
|
end
|
142
|
-
|
162
|
+
|
143
163
|
def choices
|
144
164
|
move = 0
|
145
165
|
until move == "4"
|
146
166
|
begin
|
147
167
|
puts # formatting
|
148
|
-
puts bar_top
|
168
|
+
puts bar_top.yellow
|
149
169
|
puts stat_bar(@player.name, @player.xp, @player.lvl, @player.coin, @player.cur_hp, @player.cur_mana)
|
150
|
-
puts bar_low
|
170
|
+
puts bar_low.yellow
|
151
171
|
puts # formatting
|
152
|
-
room_cost = @player.lvl*
|
153
|
-
nourish_cost = @player.lvl
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
172
|
+
room_cost = @player.lvl*2
|
173
|
+
nourish_cost = @player.lvl
|
174
|
+
c = Choice.new "What would you like to do in the tavern, #{@player.name}?",
|
175
|
+
{
|
176
|
+
"1" => "Buy some food. | Cost: #{nourish_cost} coins.",
|
177
|
+
"2" => "Buy a drink. | Cost: #{nourish_cost} coins.",
|
178
|
+
"3" => "Rest. | Cost: #{room_cost} coins.",
|
179
|
+
"4" => "Leave the tavern."
|
180
|
+
}
|
181
|
+
move = c.prompt
|
160
182
|
end while not (move == "1" or move == "2" or move == "3" or move == "4")
|
161
183
|
case
|
162
184
|
when move == "1"
|
163
|
-
if @player.coin >= @player.lvl
|
185
|
+
if @player.coin >= @player.lvl and @player.buff_food != true
|
164
186
|
@player.buff_food = true
|
165
187
|
puts # formatting
|
166
188
|
puts "You find a seat at an open table and the waiter approaches to take your order."
|
@@ -169,14 +191,17 @@ class Tavern
|
|
169
191
|
puts "health as you travel in the dungeon."
|
170
192
|
puts # formatting
|
171
193
|
puts "You order and enjoy a delicious meal, #{@player.name}, you really do feel swell!"
|
172
|
-
@player.coin = @player.coin - @player.lvl
|
194
|
+
@player.coin = @player.coin - @player.lvl
|
173
195
|
save_data
|
196
|
+
elsif @player.buff_food == true
|
197
|
+
puts #formatting
|
198
|
+
puts "You couldn't possibly eat anymore."
|
174
199
|
else
|
175
200
|
puts # formatting
|
176
201
|
puts "You can't afford a meal! Go to the dungeon and earn some money!"
|
177
202
|
end
|
178
203
|
when move == "2"
|
179
|
-
if @player.coin >= @player.lvl
|
204
|
+
if @player.coin >= @player.lvl and @player.buff_drink != true
|
180
205
|
@player.buff_drink = true
|
181
206
|
puts # formatting
|
182
207
|
puts "You sally up to the bar and the barkeep approaches to take your order."
|
@@ -185,23 +210,29 @@ class Tavern
|
|
185
210
|
puts "mana as you travel in the dungeon."
|
186
211
|
puts # formatting
|
187
212
|
puts "You swirl the wine, sniff, then take a sip, #{@player.name}, you really do feel superior!"
|
188
|
-
@player.coin = @player.coin - @player.lvl
|
213
|
+
@player.coin = @player.coin - @player.lvl
|
189
214
|
save_data
|
215
|
+
elsif @player.buff_drink == true
|
216
|
+
puts #formatting
|
217
|
+
puts "You couldn't possibly drink anymore."
|
190
218
|
else
|
191
219
|
puts # formatting
|
192
220
|
puts "You can't afford wine, you churl! Go to the dungeon and earn some money!"
|
193
221
|
end
|
194
222
|
when move == "3"
|
195
|
-
if @player.coin >= @player.lvl*
|
223
|
+
if @player.coin >= @player.lvl*2 and (@player.cur_hp != @player.hp or @player.cur_mana != @player.mana)
|
196
224
|
health = @player.cur_hp
|
197
225
|
mana = @player.cur_mana
|
198
|
-
@player.coin = @player.coin - @player.lvl*
|
226
|
+
@player.coin = @player.coin - @player.lvl*2
|
199
227
|
restore_player
|
200
228
|
health = @player.cur_hp - health
|
201
229
|
mana = @player.cur_mana - mana
|
202
230
|
puts # formatting
|
203
231
|
puts "You pay for a small room and get a good night of rest."
|
204
232
|
puts "Resting has restored #{health} health points and #{mana} points of mana."
|
233
|
+
elsif (@player.cur_hp == @player.hp and @player.cur_mana == @player.mana)
|
234
|
+
puts # formatting
|
235
|
+
puts "You don't really need to rest, get out there and make your own discoveries!"
|
205
236
|
else
|
206
237
|
puts # formatting
|
207
238
|
puts "You can't afford a room! Hit the dungeon and earn some money!"
|
metadata
CHANGED
@@ -1,16 +1,37 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: destiny
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kody Wilson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-03-
|
12
|
-
dependencies:
|
13
|
-
|
11
|
+
date: 2014-03-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: colorize
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 0.7.0
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 0.7.0
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.7.0
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 0.7.0
|
33
|
+
description: Role playing game with distinct classes, character development, and a
|
34
|
+
dungeon map!
|
14
35
|
email: kodywilson@gmail.com
|
15
36
|
executables:
|
16
37
|
- destiny
|
@@ -18,7 +39,10 @@ extensions: []
|
|
18
39
|
extra_rdoc_files: []
|
19
40
|
files:
|
20
41
|
- bin/destiny
|
42
|
+
- lib/choice.rb
|
21
43
|
- lib/destiny.rb
|
44
|
+
- lib/dungeon_map.rb
|
45
|
+
- lib/edge_coloring_graph.rb
|
22
46
|
- lib/game_mechanics.rb
|
23
47
|
- lib/mobs.rb
|
24
48
|
- lib/places.rb
|