demigod_game 1.0.0 → 1.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- data/README.md +37 -29
- data/lib/demigodGame/Demigod.rb +14 -14
- data/lib/demigodGame/GameData.rb +11 -0
- data/lib/demigodGame/Tile.rb +12 -56
- data/lib/demigodGame/UiHandler.rb +39 -4
- data/lib/demigodGame/World.rb +5 -6
- data/lib/demigodGame/version.rb +1 -1
- data/test/test_demigod.rb +19 -0
- data/test_demigod.rb +18 -0
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YTExYTI0MDdhNWMyMThlZDA3ZmJiN2IzY2M5ZDA2MTg5Yjc4NDVlZg==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
NmFjMDY3ZGY3NmE2YWMxODc4NGI1MmMzNTBhY2U2MmM0MTRiNTIxMA==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
M2I0YmFjZTJjZDZlYWNlYjUyM2Y1MzgyMTJmYzFlZDQxZDkwMmNjY2YzM2Yy
|
10
|
+
YTQ5OWYxNWRhYjI2OGVkZWY3YTg1NTk4MmJiZmQxNmVhMzhkNjJjMjBkY2Vk
|
11
|
+
ZmU3ODJlY2U0NTMxOGViZDcxOGJkYzVlZGI5ZTQzZGNlZDUzYTk=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MTkyNWZiOGE5YjE2MDUxNGU1M2M1MmRmMTVlM2I3NDQ4NDJmNTRhOGFiYjNi
|
14
|
+
ZWNkYzI2ZTI3M2YyOGY2NDc0NTk1MWQ3MjVkMDQ5ZGVjNWNmZjQ4NDMwMDI5
|
15
|
+
YjYwNWQzOTExNTk0M2Y1Zjk1ZTQyMzk5NDFlMDQxMzg5M2VmYTc=
|
data/README.md
CHANGED
@@ -1,29 +1,37 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
1
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
1
|
+
NEW: You can now install the game with 'gem install demigod_game' and then run the game using 'demigod'!!
|
2
|
+
|
3
|
+
Hello
|
4
|
+
=======================================
|
5
|
+
This is just some self practice project where I try to create a bigger game using ruby
|
6
|
+
|
7
|
+
The game
|
8
|
+
--------
|
9
|
+
is an island building game, where you need to manage your resources in
|
10
|
+
order to unleash the dragon from a dragon shrine and get his
|
11
|
+
powers and immortality.. Yeah, very original..
|
12
|
+
|
13
|
+
How to play
|
14
|
+
----------
|
15
|
+
Each turn you can choose a tile and either raise it (using favor), or build on it (using other resources).
|
16
|
+
Sea (_) turns into Plains (P) which turns into either a forest (F) or a mountain ridge (R). Forests can still be converted to mountains.
|
17
|
+
The building are houses, sheeps, woodcutters, chapels, mines and dragon shrine, which give you population, food, wood, favor and iron respectivelt
|
18
|
+
Building the dragon shrine is winning the game (not yet implemened)
|
19
|
+
|
20
|
+
Buildings
|
21
|
+
---------
|
22
|
+
**houses:**
|
23
|
+
can be built on plains and in forests, provide 1 population per turn
|
24
|
+
**sheeps:**
|
25
|
+
can only be built on plains, provides 1 food per turn
|
26
|
+
note: you lose 1 food per population you have, and lost population if you lack food
|
27
|
+
**woodcutters:**
|
28
|
+
provide 1 wood per turn, which is your basic building resource
|
29
|
+
**chapels:**
|
30
|
+
provide 1 favor per 10 population you have (not yet implemented in that way)
|
31
|
+
**mines:**
|
32
|
+
provide 1 iron per turn
|
33
|
+
**dragon shrine:**
|
34
|
+
win condition, build this and you win!
|
35
|
+
more info
|
36
|
+
---------
|
37
|
+
most of the hard data will still probably change, so it will remain for you to find it out :P
|
data/lib/demigodGame/Demigod.rb
CHANGED
@@ -21,7 +21,6 @@ class Demigod
|
|
21
21
|
def initialize (world, resources = GameData::STARTING_RESOURCES)
|
22
22
|
@world = world
|
23
23
|
@resources = resources
|
24
|
-
system "clear" or system "cls"
|
25
24
|
end
|
26
25
|
|
27
26
|
# Handles a turn, main function of the game
|
@@ -40,27 +39,28 @@ class Demigod
|
|
40
39
|
UiHandler.print_turn_message
|
41
40
|
|
42
41
|
# Asks the user for a tile to do his action on
|
43
|
-
decision =
|
42
|
+
decision = UiHandler.get_decision()
|
44
43
|
|
45
|
-
until (@world.
|
44
|
+
until (@world.valid?(decision) || decision == '')
|
46
45
|
UiHandler.print_error(UiHandler::NO_TILE)
|
47
46
|
UiHandler.print_turn_message
|
48
|
-
decision =
|
47
|
+
decision = UiHandler.get_decision()
|
49
48
|
end
|
50
49
|
|
51
50
|
unless decision == ''
|
52
51
|
tile = @world.get_tile decision # returns the tile at decision
|
53
|
-
tile.print_options
|
54
|
-
|
55
|
-
# asks for action on tile
|
56
|
-
decision = gets.chomp
|
57
52
|
|
58
|
-
#
|
59
|
-
until tile.accepts?(decision
|
53
|
+
# checks for legality of move on tiles using tile.accepts? and tile.check_cost
|
54
|
+
until tile.accepts?(decision)
|
60
55
|
break if decision == ''
|
61
|
-
UiHandler.
|
62
|
-
|
63
|
-
|
56
|
+
UiHandler.print_tile_options(tile)
|
57
|
+
decision = UiHandler.get_decision()
|
58
|
+
if (!tile.accepts?(decision))
|
59
|
+
UiHandler.print_error(UiHandler::INVALID)
|
60
|
+
elsif (!tile.check_cost(decision, @resources))
|
61
|
+
decision = nil
|
62
|
+
UiHandler.print_error(UiHandler::RESOURCES)
|
63
|
+
end
|
64
64
|
end
|
65
65
|
|
66
66
|
if decision != ''
|
@@ -71,7 +71,7 @@ class Demigod
|
|
71
71
|
end
|
72
72
|
|
73
73
|
# Clears the screen
|
74
|
-
|
74
|
+
UiHandler.clear_messages()
|
75
75
|
end
|
76
76
|
|
77
77
|
private
|
data/lib/demigodGame/GameData.rb
CHANGED
@@ -52,6 +52,17 @@ module GameData
|
|
52
52
|
:r => RAISE_RIDGE_PRICE
|
53
53
|
}
|
54
54
|
|
55
|
+
OPTIONS = {:w => "Woodcutter",
|
56
|
+
:s => "Sheep",
|
57
|
+
:d => "Dragon Shrine",
|
58
|
+
:m => "Mine",
|
59
|
+
:c => "Chapel",
|
60
|
+
:h => "House",
|
61
|
+
:p => "Plains",
|
62
|
+
:f => "Forest",
|
63
|
+
:r => "Ridge"
|
64
|
+
}
|
65
|
+
|
55
66
|
def self.get_price(sym)
|
56
67
|
return PRICES[sym.to_sym]
|
57
68
|
end
|
data/lib/demigodGame/Tile.rb
CHANGED
@@ -6,46 +6,13 @@
|
|
6
6
|
require_relative 'GameData'
|
7
7
|
class Tile
|
8
8
|
|
9
|
-
attr_reader :
|
9
|
+
attr_reader :options, :built_on, :x, :y
|
10
10
|
def initialize(x, y)
|
11
11
|
@x = x
|
12
12
|
@y = y
|
13
|
-
@raisable = []
|
14
|
-
@buildable = []
|
15
13
|
@type = '.'
|
16
14
|
end
|
17
15
|
|
18
|
-
# The base tile class is abstract and therfore accepts no value
|
19
|
-
# Should probably be overriden in subclasses
|
20
|
-
def accepts?(order, resources)
|
21
|
-
false
|
22
|
-
end
|
23
|
-
|
24
|
-
def print_options
|
25
|
-
|
26
|
-
if @raisable != [] # raising options
|
27
|
-
print "You can raise with:"
|
28
|
-
@raisable.each do |name|
|
29
|
-
print " #{name.to_s} | "
|
30
|
-
end
|
31
|
-
puts
|
32
|
-
end
|
33
|
-
|
34
|
-
if @buildable != [] # building options
|
35
|
-
print "You can build with:"
|
36
|
-
@buildable.each do |name|
|
37
|
-
print " #{name.to_s} | "
|
38
|
-
end
|
39
|
-
puts
|
40
|
-
end
|
41
|
-
|
42
|
-
puts UiHandler::RAISE_WARNING if @built_on
|
43
|
-
puts UiHandler::BACK
|
44
|
-
|
45
|
-
|
46
|
-
print UiHandler::PROMPT
|
47
|
-
end
|
48
|
-
|
49
16
|
def to_s
|
50
17
|
"#{@type}#{@built_on}"
|
51
18
|
end
|
@@ -57,27 +24,18 @@ class Tile
|
|
57
24
|
end
|
58
25
|
|
59
26
|
# Checks if an order is valid
|
60
|
-
def accepts?(order
|
61
|
-
return false if !order.match( /\A\w\Z/
|
27
|
+
def accepts?(order)
|
28
|
+
return false if !order || !order.match( /\A\w\Z/) # vaild command
|
62
29
|
|
63
|
-
|
64
|
-
if (check.to_s == order)
|
65
|
-
cost = GameData.get_price(check)
|
66
|
-
puts "This costs #{cost}"
|
67
|
-
if !check_cost(cost, resources)
|
68
|
-
puts "Not enough resources!"
|
69
|
-
return false
|
70
|
-
end
|
71
|
-
return true
|
72
|
-
end
|
30
|
+
@options.each do |check| # checks which order was given
|
31
|
+
return true if (check.to_s == order)
|
73
32
|
end
|
74
33
|
false
|
75
34
|
end
|
76
35
|
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
36
|
+
def check_cost(order, resources)
|
37
|
+
cost = GameData.get_price(order)
|
38
|
+
puts cost
|
81
39
|
# checks each resource for the correct amount
|
82
40
|
cost.each do |resource, amount|
|
83
41
|
return false if amount > resources[resource]
|
@@ -91,7 +49,7 @@ class Sea < Tile
|
|
91
49
|
|
92
50
|
def initialize(x, y)
|
93
51
|
super(x, y)
|
94
|
-
@
|
52
|
+
@options = [:p]
|
95
53
|
@type = '-'
|
96
54
|
end
|
97
55
|
end
|
@@ -101,7 +59,7 @@ class Ridge < Tile
|
|
101
59
|
|
102
60
|
def initialize(x, y)
|
103
61
|
super(x, y)
|
104
|
-
@
|
62
|
+
@options = [:m, :c, :d]
|
105
63
|
@type = 'R'
|
106
64
|
end
|
107
65
|
end
|
@@ -111,8 +69,7 @@ class Plains < Tile
|
|
111
69
|
|
112
70
|
def initialize(x, y)
|
113
71
|
super(x, y)
|
114
|
-
@
|
115
|
-
@buildable = [:h, :c, :s]
|
72
|
+
@options = [:r, :f, :h, :c, :s]
|
116
73
|
@type = 'P'
|
117
74
|
end
|
118
75
|
end
|
@@ -122,8 +79,7 @@ class Forest < Tile
|
|
122
79
|
|
123
80
|
def initialize(x, y)
|
124
81
|
super(x, y)
|
125
|
-
@
|
126
|
-
@raisable = [:r]
|
82
|
+
@options = [:w, :c, :h, :r]
|
127
83
|
@type = 'F'
|
128
84
|
end
|
129
85
|
end
|
@@ -1,6 +1,8 @@
|
|
1
1
|
# Module to handle most of the output to the screen
|
2
2
|
# =================================================
|
3
3
|
|
4
|
+
require_relative 'GameData'
|
5
|
+
|
4
6
|
module UiHandler
|
5
7
|
|
6
8
|
NEW_GAME = "Welcome to Demigod! What size would you want your world to be?"
|
@@ -11,7 +13,11 @@ module UiHandler
|
|
11
13
|
BACK = "Press enter on an empty line to go back"
|
12
14
|
INVALID = "That's an invalid move!"
|
13
15
|
LOST = "You ran out of resources, I guess you lose..."
|
14
|
-
WIN = "The dragon shrine is built and so the dragons grant you all the powers of immortality"
|
16
|
+
WIN = "The dragon shrine is built and so the dragons grant you all the powers of immortality"
|
17
|
+
AVAILABLE = "Available moves are: "
|
18
|
+
RESOURCES = "Not enough resources!"
|
19
|
+
|
20
|
+
# output #
|
15
21
|
|
16
22
|
def self.print_world(world)
|
17
23
|
puts
|
@@ -50,12 +56,41 @@ module UiHandler
|
|
50
56
|
end
|
51
57
|
|
52
58
|
def self.print_turn_message
|
53
|
-
|
54
|
-
|
59
|
+
puts "Choose a tile to work on. Enter 2 numbers with a space in between i.e. \"1 1\""
|
60
|
+
print PROMPT
|
55
61
|
end
|
56
62
|
|
57
|
-
def self.print_error(error_str)
|
63
|
+
def self.print_error(error_str="An error has occured")
|
58
64
|
puts "Oops! #{error_str}"
|
59
65
|
puts
|
60
66
|
end
|
67
|
+
|
68
|
+
def self.print_lost_message()
|
69
|
+
puts "You ran out of resources! you lost!"
|
70
|
+
puts "(one of youre resources turned negative)"
|
71
|
+
puts
|
72
|
+
end
|
73
|
+
|
74
|
+
def self.print_win_message
|
75
|
+
puts WIN
|
76
|
+
end
|
77
|
+
|
78
|
+
def self.print_tile_options(tile)
|
79
|
+
puts (AVAILABLE)
|
80
|
+
tile.options.each do |key|
|
81
|
+
print ("#{key} - #{GameData::OPTIONS[key]}, ")
|
82
|
+
end
|
83
|
+
puts BACK
|
84
|
+
print PROMPT
|
85
|
+
end
|
86
|
+
|
87
|
+
def self.clear_messages()
|
88
|
+
#system "clear" or system "cls"
|
89
|
+
end
|
90
|
+
|
91
|
+
# input #
|
92
|
+
|
93
|
+
def self.get_decision()
|
94
|
+
gets.chomp()
|
95
|
+
end
|
61
96
|
end
|
data/lib/demigodGame/World.rb
CHANGED
@@ -37,7 +37,7 @@ class World
|
|
37
37
|
elsif order.match(/\A[wsmchd]\Z/) # for build of any building
|
38
38
|
build_on_tile(tile, DECISIONS[:build][order.to_sym])
|
39
39
|
else
|
40
|
-
|
40
|
+
UiHandler.print_error()
|
41
41
|
end
|
42
42
|
end
|
43
43
|
|
@@ -60,15 +60,14 @@ class World
|
|
60
60
|
resources.each do |name, value| # lose condition
|
61
61
|
if value < 0
|
62
62
|
system "clear" or system "cls"
|
63
|
-
|
64
|
-
puts UiHandler::LOST
|
63
|
+
UiHandler.print_lost_message
|
65
64
|
exit
|
66
65
|
end
|
67
66
|
end
|
68
67
|
resources
|
69
68
|
end
|
70
69
|
|
71
|
-
def
|
70
|
+
def valid? (str)
|
72
71
|
str.strip!
|
73
72
|
return false if !str.match(/\A\d+\s\d+\Z/)
|
74
73
|
true
|
@@ -131,11 +130,11 @@ private
|
|
131
130
|
tile.build(BUILDABLE[building.to_sym])
|
132
131
|
@buildings[building.to_sym] += 1
|
133
132
|
if building.to_sym == :dragon
|
134
|
-
|
133
|
+
UiHandler.print_win_message
|
135
134
|
exit
|
136
135
|
end
|
137
136
|
else # This shouldn't happen normally
|
138
|
-
puts "
|
137
|
+
puts "This shouldn't have happened (Buidling already in square)"
|
139
138
|
end
|
140
139
|
|
141
140
|
end
|
data/lib/demigodGame/version.rb
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require_relative '../lib/demigodGame/demigod'
|
3
|
+
require_relative '../lib/demigodGame/world'
|
4
|
+
|
5
|
+
class MyUnitTests < Test::Unit::TestCase
|
6
|
+
|
7
|
+
def setup
|
8
|
+
puts "setup!"
|
9
|
+
end
|
10
|
+
|
11
|
+
def teardown
|
12
|
+
puts "teardown!"
|
13
|
+
end
|
14
|
+
|
15
|
+
def test_basic
|
16
|
+
dummygod = Demigod.new(World.new)
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
data/test_demigod.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
require 'test/unit'
|
2
|
+
require_relative '../lib/demigod_game/demigod'
|
3
|
+
|
4
|
+
class MyUnitTests < Test::Unit::TestCase
|
5
|
+
|
6
|
+
def setup
|
7
|
+
puts "setup!"
|
8
|
+
end
|
9
|
+
|
10
|
+
def teardown
|
11
|
+
puts "teardown!"
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_basic
|
15
|
+
puts "I RAN!"
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: demigod_game
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yuval
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-06-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -61,6 +61,8 @@ files:
|
|
61
61
|
- lib/demigodGame/UiHandler.rb
|
62
62
|
- lib/demigodGame/World.rb
|
63
63
|
- lib/demigodGame/version.rb
|
64
|
+
- test/test_demigod.rb
|
65
|
+
- test_demigod.rb
|
64
66
|
homepage: ''
|
65
67
|
licenses:
|
66
68
|
- MIT
|
@@ -85,4 +87,5 @@ rubygems_version: 2.2.2
|
|
85
87
|
signing_key:
|
86
88
|
specification_version: 4
|
87
89
|
summary: Build your own island and unleash the dragons!
|
88
|
-
test_files:
|
90
|
+
test_files:
|
91
|
+
- test/test_demigod.rb
|