destiny 0.0.0
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 +7 -0
- data/bin/destiny +15 -0
- data/lib/destiny.rb +105 -0
- data/lib/game_mechanics.rb +94 -0
- data/lib/mobs.rb +54 -0
- data/lib/places.rb +96 -0
- data/lib/save_game.json +1 -0
- metadata +50 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 6c5ac7d63dba3be69904a064839ce903ec7c976d
|
4
|
+
data.tar.gz: 70e56709b40ad02bf52db4f5a80e5b77cadbeca8
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b4df0f854ed16649e87d3a69a67fac8ad6c92f8e161c77b8187834bbfba6d73d87dbf42ec45f96d3d1c5451355df0b11dc4928fb1de561d19f1121e8f07c74e0
|
7
|
+
data.tar.gz: be554abc959492b6342d3ade9e8f099596a0154a58b44e86bd000a0bfbb367d8dce68b05290c720a37da0a2fc9833a61283af2f75d2ca7e221201d714c8c9a48
|
data/bin/destiny
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require 'destiny'
|
4
|
+
|
5
|
+
puts # formatting
|
6
|
+
puts " " + "_"*43
|
7
|
+
puts "| Welcome to the exciting world of Destiny! |"
|
8
|
+
puts " " + "-"*43
|
9
|
+
puts # formatting
|
10
|
+
puts "Selectable options will normally be enclosed in []'s."
|
11
|
+
puts "Would you like to start a new game?"
|
12
|
+
|
13
|
+
GameSelect.new.outcome
|
14
|
+
Town.new.choices
|
15
|
+
|
data/lib/destiny.rb
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
require "json"
|
2
|
+
require "game_mechanics"
|
3
|
+
require "mobs"
|
4
|
+
require "places"
|
5
|
+
|
6
|
+
include GameMechanics
|
7
|
+
|
8
|
+
def choose_name
|
9
|
+
puts #formatting
|
10
|
+
puts "Please enter your new character's name:"
|
11
|
+
prompt; gets.chomp
|
12
|
+
end
|
13
|
+
|
14
|
+
def read_one_line(file_name, line_number)
|
15
|
+
File.open(file_name) do |file|
|
16
|
+
current_line = 1
|
17
|
+
file.each_line do |line|
|
18
|
+
return line.chomp if line_number == current_line
|
19
|
+
current_line += 1
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
class GameSelect
|
25
|
+
attr_accessor :game_select
|
26
|
+
|
27
|
+
def initialize default="default"
|
28
|
+
#rspec with user input is more tricky, this allows me to test
|
29
|
+
@default = default
|
30
|
+
return @game_select = @default if @default != "default"
|
31
|
+
#restrict input to valid answers, but don't worry about case
|
32
|
+
begin
|
33
|
+
puts "Please enter [yes] or [no]:"
|
34
|
+
prompt; @game_select = STDIN.gets.chomp.downcase
|
35
|
+
end while not (@game_select == "yes" or @game_select == "no")
|
36
|
+
end
|
37
|
+
|
38
|
+
def outcome
|
39
|
+
if @game_select == "yes"
|
40
|
+
# this is purely for rspec
|
41
|
+
return "Starting a new game, please answer the following questions:" if @default != "default"
|
42
|
+
begin
|
43
|
+
puts # formatting
|
44
|
+
puts "_"*50
|
45
|
+
puts "Starting a new game, please answer the following questions:"
|
46
|
+
puts "Whould you like to play as a knight or wizard?"
|
47
|
+
puts "[1]. Knight"
|
48
|
+
puts "[2]. Wizard"
|
49
|
+
prompt; class_choice = gets.chomp
|
50
|
+
end while not (class_choice == "1" or class_choice == "2")
|
51
|
+
begin
|
52
|
+
player_name = choose_name
|
53
|
+
puts #formatting
|
54
|
+
puts "You have chosen #{player_name} as your character's name. Is this correct?"
|
55
|
+
puts "Please enter [yes] to confirm."
|
56
|
+
prompt; confirm_name = STDIN.gets.chomp.downcase
|
57
|
+
end while not (confirm_name == "yes")
|
58
|
+
if class_choice == "1"
|
59
|
+
@player = Knight.new
|
60
|
+
elsif class_choice == "2"
|
61
|
+
@player = Wizard.new
|
62
|
+
end
|
63
|
+
# Set player name, write attributes to save file, then return player to binary
|
64
|
+
@player.name = "#{player_name}"
|
65
|
+
save_data
|
66
|
+
# Intro for new players
|
67
|
+
puts #formatting
|
68
|
+
puts "Prepare ye, #{@player.name} for great adventure!"
|
69
|
+
puts "Ye are a young #{@player.class} with magnificent deeds ahead of ye!"
|
70
|
+
puts # formatting
|
71
|
+
@player
|
72
|
+
elsif @game_select == "no"
|
73
|
+
# for rspec
|
74
|
+
return "Loading the existing game." if @default != "default"
|
75
|
+
puts # formatting
|
76
|
+
puts "Loading the existing game."
|
77
|
+
puts # formatting
|
78
|
+
@player = load_data
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
|
84
|
+
class NewGame
|
85
|
+
attr_accessor :save_slot, :char_name
|
86
|
+
|
87
|
+
def initialize new_game
|
88
|
+
@new_game = new_game
|
89
|
+
end
|
90
|
+
|
91
|
+
def answer_was game_select="yes"
|
92
|
+
@game_select = game_select
|
93
|
+
#should probably be a case statement that verifies that only yes, y, no, or n was entered
|
94
|
+
# and ignores caps (lower and upper are valid)
|
95
|
+
if @game_select == "yes"
|
96
|
+
puts # formatting
|
97
|
+
puts "Starting a new game, please enter character name:"
|
98
|
+
# @character_name = gets
|
99
|
+
else
|
100
|
+
# Here I will display both save slots with the character names.
|
101
|
+
"Please select a game to load:"
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
end
|
@@ -0,0 +1,94 @@
|
|
1
|
+
module GameMechanics
|
2
|
+
|
3
|
+
@@save_file = 'lib/save_game.json'
|
4
|
+
|
5
|
+
def prompt
|
6
|
+
print ">> "
|
7
|
+
end
|
8
|
+
|
9
|
+
def save_data
|
10
|
+
save_info = {
|
11
|
+
role: @player.class,
|
12
|
+
cur_hp: @player.cur_hp,
|
13
|
+
cur_mana: @player.cur_mana,
|
14
|
+
xp: @player.xp,
|
15
|
+
lvl: @player.lvl,
|
16
|
+
coin: @player.coin,
|
17
|
+
name: @player.name
|
18
|
+
}
|
19
|
+
File.open(@@save_file, "w") do |f|
|
20
|
+
f.write(save_info.to_json)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def load_data
|
25
|
+
load_info = JSON.parse(File.read(@@save_file))
|
26
|
+
role = load_info['role']
|
27
|
+
if role == "Knight"
|
28
|
+
@player = Knight.new
|
29
|
+
elsif role == "Wizard"
|
30
|
+
@player = Wizard.new
|
31
|
+
end
|
32
|
+
# Set attributes based off information in load_info
|
33
|
+
@player.cur_hp = load_info['cur_hp']
|
34
|
+
@player.cur_mana = load_info['cur_mana']
|
35
|
+
@player.xp = load_info['xp']
|
36
|
+
@player.lvl = load_info['lvl']
|
37
|
+
@player.coin = load_info['coin']
|
38
|
+
@player.name = load_info['name']
|
39
|
+
@player
|
40
|
+
# I was trying to do the above assignments with iteration, there has to be a way!
|
41
|
+
# load_info.each do |attribute, value|
|
42
|
+
# @player.#{attribute} = value unless attribute == "role"
|
43
|
+
# end
|
44
|
+
end
|
45
|
+
|
46
|
+
def restore_player
|
47
|
+
@player.cur_hp = @player.hp
|
48
|
+
@player.cur_mana = @player.mana
|
49
|
+
save_data
|
50
|
+
end
|
51
|
+
|
52
|
+
def bar_top
|
53
|
+
"_"*25 + " STATS " + "_"*25
|
54
|
+
end
|
55
|
+
|
56
|
+
def stat_bar name, xp, lvl, coin, cur_hp, cur_mana
|
57
|
+
"Name: #{name} | XP: #{xp} | Lvl: #{lvl} | Coin: #{coin} | HP: #{cur_hp} | Mana: #{cur_mana}"
|
58
|
+
end
|
59
|
+
|
60
|
+
def bar_low
|
61
|
+
"-"*58
|
62
|
+
end
|
63
|
+
|
64
|
+
def dice(sides=6,&block)
|
65
|
+
if block_given?
|
66
|
+
block.call(rand(1..sides))
|
67
|
+
else
|
68
|
+
rand(1..sides)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def random_encounter
|
73
|
+
chance = dice(20)
|
74
|
+
case
|
75
|
+
when (1..5).include?(chance)
|
76
|
+
puts # formatting
|
77
|
+
puts "You get the feeling you are being watched..."
|
78
|
+
puts # formatting
|
79
|
+
when (6..10).include?(chance)
|
80
|
+
puts #format
|
81
|
+
puts "A small goblin springs from the shadows and attacks!!"
|
82
|
+
puts #format
|
83
|
+
when (11..15).include?(chance)
|
84
|
+
puts #format
|
85
|
+
puts "You hear squeeking sounds. BIG squeeking sounds!"
|
86
|
+
puts #format
|
87
|
+
when (16..20).include?(chance)
|
88
|
+
puts # formatting
|
89
|
+
puts "You step into a puddle of water and angrily lift your boot out."
|
90
|
+
puts # formatting
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
data/lib/mobs.rb
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
class Mobs
|
2
|
+
|
3
|
+
attr_accessor :str, :agi, :int, :dmg, :armor, :hp, :cur_hp, :dodge, :mana, :cur_mana, :xp, :lvl, :coin, :name
|
4
|
+
|
5
|
+
def initialize(str, agi, int, dmg, armor, hp, cur_hp, dodge, mana, cur_mana, xp, lvl, coin, name="MOB")
|
6
|
+
@str = str
|
7
|
+
@agi = agi
|
8
|
+
@int = int
|
9
|
+
@dmg = dmg
|
10
|
+
@armor = armor
|
11
|
+
@hp = hp
|
12
|
+
@cur_hp = cur_hp
|
13
|
+
@dodge = dodge
|
14
|
+
@mana = mana
|
15
|
+
@cur_mana = cur_mana
|
16
|
+
@xp = xp
|
17
|
+
@lvl = lvl
|
18
|
+
@coin = coin
|
19
|
+
@name = name
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
class Knight < Mobs
|
25
|
+
|
26
|
+
def initialize(str=14, agi=12, int=8, dmg=6, armor=10, hp=8, cur_hp=8, dodge=20, mana=8, cur_mana=8, xp=0, lvl=1, coin=0, name="Knight")
|
27
|
+
super(str,agi,int,dmg,armor,hp,cur_hp,dodge,mana,cur_mana,xp,lvl,coin,name)
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
|
32
|
+
class Wizard < Mobs
|
33
|
+
|
34
|
+
def initialize(str=8, agi=10, int=16, dmg=3, armor=4, hp=4, cur_hp=4, dodge=10, mana=24, cur_mana=24, xp=0, lvl=1, coin=0, name="Wizard")
|
35
|
+
super(str,agi,int,dmg,armor,hp,cur_hp,dodge,mana,cur_mana,xp,lvl,coin,name)
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
|
40
|
+
class Goblin < Mobs
|
41
|
+
|
42
|
+
def initialize(str=10, agi=10, int=8, dmg=3, armor=6, hp=3, cur_hp=3, dodge=20, mana=2, cur_mana=2, xp=0, lvl=1, coin=0, name="Goblin")
|
43
|
+
super(str,agi,int,dmg,armor,hp,cur_hp,dodge,mana,cur_mana,xp,lvl,coin,name)
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
|
48
|
+
class GiantRat < Mobs
|
49
|
+
|
50
|
+
def initialize(str=12, agi=10, int=4, dmg=3, armor=6, hp=3, cur_hp=3, dodge=10, mana=0, cur_mana=0, xp=0, lvl=1, coin=0, name="ROUS")
|
51
|
+
super(str,agi,int,dmg,armor,hp,cur_hp,dodge,mana,cur_mana,xp,lvl,coin,name)
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
data/lib/places.rb
ADDED
@@ -0,0 +1,96 @@
|
|
1
|
+
# This file will contain the various places the player can go
|
2
|
+
# Town, Tavern, Dungeon and options in each
|
3
|
+
|
4
|
+
class Town
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
# only available as an option in the Dungeon (to return to)
|
8
|
+
puts "These things always start the same way and your adventure is no exception..."
|
9
|
+
puts "You walk into town, scanning each nook and cranny. Most faces are friendly,"
|
10
|
+
puts "some are not..."
|
11
|
+
end
|
12
|
+
|
13
|
+
def choices
|
14
|
+
save_file = 'lib/save_game.txt'
|
15
|
+
move = 0
|
16
|
+
until move == "3"
|
17
|
+
begin
|
18
|
+
load_data
|
19
|
+
puts # formatting
|
20
|
+
puts bar_top
|
21
|
+
puts stat_bar(@player.name, @player.xp, @player.lvl, @player.coin, @player.cur_hp, @player.cur_mana)
|
22
|
+
puts bar_low
|
23
|
+
puts # formatting
|
24
|
+
puts "Please choose where you will head next:"
|
25
|
+
puts "[1]. Ye Old Tavern"
|
26
|
+
puts "[2]. Dungeon"
|
27
|
+
puts "[3]. Exit game"
|
28
|
+
prompt; move = gets.chomp
|
29
|
+
end while not (move == "1" or move == "2" or move == "3")
|
30
|
+
case
|
31
|
+
when move == "1"
|
32
|
+
# Put this in Tavern class???
|
33
|
+
# also Tavern should restore the cur_hp and cur_mana to max values!
|
34
|
+
puts # formatting
|
35
|
+
puts "You enter the tavern. The air is thick with smoke, but you find a place"
|
36
|
+
puts "near a window and after a bowl of hearty soup and a bit of rest, you feel"
|
37
|
+
puts "greatly replenished."
|
38
|
+
puts # formatting
|
39
|
+
restore_player
|
40
|
+
when move == "2"
|
41
|
+
Dungeon.new.choices
|
42
|
+
when move == "3"
|
43
|
+
# This needs to save the players stats before exit
|
44
|
+
# Should probably convert the read from file to restore stats to a module
|
45
|
+
exit
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
|
52
|
+
class Tavern
|
53
|
+
|
54
|
+
# only available as an option in the Town
|
55
|
+
# This class will essentially "heal" the player by restoring mana and hp
|
56
|
+
|
57
|
+
end
|
58
|
+
|
59
|
+
class Dungeon
|
60
|
+
|
61
|
+
# can go here from town, will spawn random encounters, etc.
|
62
|
+
def initialize
|
63
|
+
puts # formatting
|
64
|
+
puts "You have entered the dungeon! DUM DUM DUM!!"
|
65
|
+
end
|
66
|
+
|
67
|
+
def choices
|
68
|
+
move = 0
|
69
|
+
until move == "2"
|
70
|
+
begin
|
71
|
+
load_data
|
72
|
+
puts # formatting
|
73
|
+
puts bar_top
|
74
|
+
puts stat_bar(@player.name, @player.xp, @player.lvl, @player.coin, @player.cur_hp, @player.cur_mana)
|
75
|
+
puts bar_low
|
76
|
+
puts # formatting
|
77
|
+
puts "Now #{@player.name}, what will you do next?"
|
78
|
+
puts "[1]. Go deeper into the dungeon."
|
79
|
+
puts "[2]. Return to town."
|
80
|
+
prompt; move = gets.chomp
|
81
|
+
end while not (move == "1" or move == "2")
|
82
|
+
case
|
83
|
+
when move == "1"
|
84
|
+
puts # formatting
|
85
|
+
puts "You walk further into the dark, dank,"
|
86
|
+
puts "dirty, dungeon, smirking slightly"
|
87
|
+
puts "at your awesome alliteration ability."
|
88
|
+
puts # formatting
|
89
|
+
random_encounter
|
90
|
+
when move == "2"
|
91
|
+
return
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
data/lib/save_game.json
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
{"role":"Wizard","xp":0,"lvl":1,"coin":0,"name":"Gizard"}
|
metadata
ADDED
@@ -0,0 +1,50 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: destiny
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Kody Wilson
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-03-03 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: Role playing game with distinct classes and character development
|
14
|
+
email: kodywilson@gmail.com
|
15
|
+
executables:
|
16
|
+
- destiny
|
17
|
+
extensions: []
|
18
|
+
extra_rdoc_files: []
|
19
|
+
files:
|
20
|
+
- bin/destiny
|
21
|
+
- lib/destiny.rb
|
22
|
+
- lib/game_mechanics.rb
|
23
|
+
- lib/mobs.rb
|
24
|
+
- lib/places.rb
|
25
|
+
- lib/save_game.json
|
26
|
+
homepage: http://rubygems.org/gems/destiny
|
27
|
+
licenses:
|
28
|
+
- MIT
|
29
|
+
metadata: {}
|
30
|
+
post_install_message:
|
31
|
+
rdoc_options: []
|
32
|
+
require_paths:
|
33
|
+
- lib
|
34
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
35
|
+
requirements:
|
36
|
+
- - ">="
|
37
|
+
- !ruby/object:Gem::Version
|
38
|
+
version: '0'
|
39
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
40
|
+
requirements:
|
41
|
+
- - ">="
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
requirements: []
|
45
|
+
rubyforge_project:
|
46
|
+
rubygems_version: 2.2.2
|
47
|
+
signing_key:
|
48
|
+
specification_version: 4
|
49
|
+
summary: text rpg
|
50
|
+
test_files: []
|