monotony 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/.rdoc_options +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +78 -0
- data/Rakefile +1 -0
- data/bin/console +14 -0
- data/bin/setup +7 -0
- data/lib/monotony.rb +22 -0
- data/lib/monotony/.yardoc/checksums +0 -0
- data/lib/monotony/.yardoc/object_types +0 -0
- data/lib/monotony/.yardoc/objects/root.dat +0 -0
- data/lib/monotony/.yardoc/proxy_types +0 -0
- data/lib/monotony/basicproperty.rb +174 -0
- data/lib/monotony/behaviour.rb +103 -0
- data/lib/monotony/chance.rb +53 -0
- data/lib/monotony/communitychest.rb +57 -0
- data/lib/monotony/doc/_index.html +88 -0
- data/lib/monotony/doc/class_list.html +58 -0
- data/lib/monotony/doc/css/common.css +1 -0
- data/lib/monotony/doc/css/full_list.css +57 -0
- data/lib/monotony/doc/css/style.css +339 -0
- data/lib/monotony/doc/file_list.html +57 -0
- data/lib/monotony/doc/frames.html +26 -0
- data/lib/monotony/doc/index.html +88 -0
- data/lib/monotony/doc/js/app.js +219 -0
- data/lib/monotony/doc/js/full_list.js +181 -0
- data/lib/monotony/doc/js/jquery.js +4 -0
- data/lib/monotony/doc/method_list.html +57 -0
- data/lib/monotony/doc/top-level-namespace.html +102 -0
- data/lib/monotony/game.rb +307 -0
- data/lib/monotony/player.rb +191 -0
- data/lib/monotony/purchasable.rb +131 -0
- data/lib/monotony/square.rb +23 -0
- data/lib/monotony/station.rb +24 -0
- data/lib/monotony/utility.rb +23 -0
- data/lib/monotony/variants.rb +405 -0
- data/lib/monotony/version.rb +4 -0
- data/monotony.gemspec +33 -0
- metadata +125 -0
@@ -0,0 +1,191 @@
|
|
1
|
+
module Monotony
|
2
|
+
# Represents a player
|
3
|
+
class Player
|
4
|
+
attr_accessor :hits, :board, :name, :currency, :history, :properties, :in_game, :turns_in_jail, :behaviour, :game, :jail_free_cards
|
5
|
+
# @return [Player] self
|
6
|
+
# @param [Hash] args
|
7
|
+
# @option opts [Hash] :behaviour Behaviour has describing this player's reaction to certain in-game situations. See Behaviour class.
|
8
|
+
# @option opts [String] :name The name of the player
|
9
|
+
def initialize(args)
|
10
|
+
@history = []
|
11
|
+
@in_game = true
|
12
|
+
@in_jail = false
|
13
|
+
@turns_in_jail = 0
|
14
|
+
@jail_free_cards = 0
|
15
|
+
@currency = 0
|
16
|
+
@game = nil
|
17
|
+
@name = args[:name]
|
18
|
+
@board = []
|
19
|
+
@properties = []
|
20
|
+
@behaviour = args[:behaviour] || Monotony::DefaultBehaviour::DEFAULT
|
21
|
+
self
|
22
|
+
end
|
23
|
+
|
24
|
+
# @return [Boolean] whether or not this player is currently in jail.
|
25
|
+
def in_jail?
|
26
|
+
@in_jail
|
27
|
+
end
|
28
|
+
|
29
|
+
# @return [Array<Player>] an array of all other players in the game.
|
30
|
+
def opponents
|
31
|
+
@game.players.reject{ |p| p == self }
|
32
|
+
end
|
33
|
+
|
34
|
+
# @return [Integer] the number of houses on properties owned by this player.
|
35
|
+
def num_houses
|
36
|
+
@properties.select { |p| p.is_a? BasicProperty }.collect(&:num_houses).inject(:+) || 0
|
37
|
+
end
|
38
|
+
|
39
|
+
# @return [Integer] the number of hotels on properties owned by this player.
|
40
|
+
def num_hotels
|
41
|
+
@properties.select { |p| p.is_a? BasicProperty }.collect(&:num_hotels).inject(:+) || 0
|
42
|
+
end
|
43
|
+
|
44
|
+
# @return [Integer] the number of property sets owned by this player.
|
45
|
+
def sets_owned
|
46
|
+
@properties.select { |p| p.is_a? BasicProperty }.select(&:set_owned?).group_by { |p| p.set }.keys
|
47
|
+
end
|
48
|
+
|
49
|
+
# Sets whether or not this player is currently in jail.
|
50
|
+
# @param [Boolean] bool True for in jail, False for out of jail.
|
51
|
+
def in_jail=(bool)
|
52
|
+
@in_jail = bool
|
53
|
+
@turns_in_jail = 0 if bool == false
|
54
|
+
end
|
55
|
+
|
56
|
+
# @return [Integer] the number of squares between this player's current position on the board, and the GO square.
|
57
|
+
def distance_to_go
|
58
|
+
index = @board.collect(&:name).find_index('GO')
|
59
|
+
index == 0 ? @board.length : index
|
60
|
+
end
|
61
|
+
|
62
|
+
# Moves a player on the game board.
|
63
|
+
# @param [Integer] n Number of squares to move.
|
64
|
+
# @param [Symbol] direction :forwards or :backwards.
|
65
|
+
# @return [Square] the square the player has landed on.
|
66
|
+
def move(n = 1, direction = :forwards)
|
67
|
+
n = @board.collect(&:name).find_index(n) if n.is_a? String
|
68
|
+
|
69
|
+
case direction
|
70
|
+
when :forwards
|
71
|
+
if n >= distance_to_go
|
72
|
+
unless in_jail?
|
73
|
+
puts '[%s] Passed GO' % @name
|
74
|
+
@game.pay_player(self, @game.go_amount, 'passing go')
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
(n % @board.length).times {
|
79
|
+
@board.push @board.shift
|
80
|
+
}
|
81
|
+
when :backwards
|
82
|
+
n = @board.length - n
|
83
|
+
(n % @board.length).times {
|
84
|
+
@board.unshift @board.pop
|
85
|
+
}
|
86
|
+
end
|
87
|
+
|
88
|
+
@history << @board[0].name
|
89
|
+
@board[0]
|
90
|
+
end
|
91
|
+
|
92
|
+
# @return [Square] The square this player is currently on.
|
93
|
+
def current_square
|
94
|
+
@board[0]
|
95
|
+
end
|
96
|
+
|
97
|
+
# Declares a player as bankrupt, transferring their assets to their creditor.
|
98
|
+
# @param player [Player] the player to whom this player's remaining assets will be transferred. If nil, assets are given to the bank instead.
|
99
|
+
def bankrupt!(player = nil)
|
100
|
+
if player == nil
|
101
|
+
puts '[%s] Bankrupt! Giving all assets to bank' % @name
|
102
|
+
@properties.each do |property|
|
103
|
+
property.owner = nil
|
104
|
+
property.is_mortgaged = false
|
105
|
+
end
|
106
|
+
|
107
|
+
@properties = []
|
108
|
+
else
|
109
|
+
puts '[%s] Bankrupt! Giving all assets to %s' % [ @name, player.name ]
|
110
|
+
@properties.each { |p| p.owner = player }
|
111
|
+
puts '[%s] Transferred properties to %s: %s' % [ @name, player.name, @properties.collect { |p| p.name }.join(', ') ]
|
112
|
+
player.properties.concat @properties unless player == nil
|
113
|
+
@properties = []
|
114
|
+
end
|
115
|
+
out!
|
116
|
+
end
|
117
|
+
|
118
|
+
# Called when a player is unable to pay a debt. Calls the 'money_trouble' behaviour.
|
119
|
+
# @param [Integer] amount amount of currency to be raised.
|
120
|
+
# @return [Boolean] whether or not the player was able to raise the amount required.
|
121
|
+
def money_trouble(amount)
|
122
|
+
puts '[%s] Has money trouble and is trying to raise £%d... (balance: £%d)' % [ @name, (amount - @currency), @currency ]
|
123
|
+
@behaviour[:money_trouble].call(game, self, amount)
|
124
|
+
@currency > amount
|
125
|
+
end
|
126
|
+
|
127
|
+
# Declares a player as out of the game.
|
128
|
+
def out!
|
129
|
+
puts '[%s] is out of the game!' % @name
|
130
|
+
@in_game = false
|
131
|
+
end
|
132
|
+
|
133
|
+
# @return [Boolean] whether or not this player has been eliminated from the game.
|
134
|
+
def is_out?
|
135
|
+
! @in_game
|
136
|
+
end
|
137
|
+
|
138
|
+
# Use a 'get out of jail free' card to exit jail.
|
139
|
+
# @return [Boolean] whether the player was both in jail and had an unused jail card available.
|
140
|
+
def use_jail_card!
|
141
|
+
if @jail_free_cards > 0 and @in_jail
|
142
|
+
puts "[%s] Used a 'get out of jail free' card!" % @name
|
143
|
+
@in_jail = false
|
144
|
+
@turns_in_jail = 0
|
145
|
+
@jail_free_cards = @jail_free_cards - 1
|
146
|
+
true
|
147
|
+
else
|
148
|
+
false
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
# Transfer currency to another player, or the bank.
|
153
|
+
# @return [Boolean] whether or not the player was able to pay the amount requested. False indicates bancruptcy.
|
154
|
+
# @param [Symbol] beneficiary target Player instance or :bank.
|
155
|
+
# @param [Integer] amount amount of currency to transfer.
|
156
|
+
# @param [String] description Reference for the transaction (for game log).
|
157
|
+
def pay(beneficiary = :bank, amount = 0, description = nil)
|
158
|
+
money_trouble(amount) if @currency < amount
|
159
|
+
amount_to_pay = ( @currency >= amount ? amount : @currency )
|
160
|
+
|
161
|
+
case beneficiary
|
162
|
+
when :bank
|
163
|
+
@game.bank_balance = @game.bank_balance + amount_to_pay
|
164
|
+
paying_to = 'bank'
|
165
|
+
when :free_parking
|
166
|
+
@game.free_parking_balance = @game.free_parking_balance + amount_to_pay
|
167
|
+
paying_to = 'free parking'
|
168
|
+
when Player
|
169
|
+
beneficiary.currency = beneficiary.currency + amount_to_pay
|
170
|
+
paying_to = beneficiary.name
|
171
|
+
end
|
172
|
+
|
173
|
+
@currency = @currency - amount_to_pay
|
174
|
+
|
175
|
+
if amount_to_pay < amount then
|
176
|
+
puts '[%s] Unable to pay £%d to %s%s! Paid £%d instead' % [ @name, amount, paying_to, ( description ? ' for %s' % description : '' ), amount_to_pay ]
|
177
|
+
bankrupt!(beneficiary)
|
178
|
+
false
|
179
|
+
else
|
180
|
+
puts '[%s] Paid £%d to %s%s (balance: £%d)' % [ @name, amount, paying_to, ( description ? ' for %s' % description : '' ), @currency ]
|
181
|
+
true
|
182
|
+
end
|
183
|
+
end
|
184
|
+
|
185
|
+
# Roll the dice!
|
186
|
+
# @return [Array<Integer>] dice roll as an array of num_dice integers between 1 and die_size.
|
187
|
+
def roll
|
188
|
+
Array.new(@game.num_dice).collect { Random.rand(1..@game.die_size) }
|
189
|
+
end
|
190
|
+
end
|
191
|
+
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
require 'monotony/square'
|
2
|
+
|
3
|
+
module Monotony
|
4
|
+
# Represents any purchasable property tile.
|
5
|
+
class PurchasableProperty < Square
|
6
|
+
attr_accessor :value, :cost, :is_mortgaged, :owner, :mortgage_value
|
7
|
+
# @param opts [Hash]
|
8
|
+
# @option opts [Integer] :value the value of the property.
|
9
|
+
# @option opts [Integer] :mortgage_value the mortgaged value of the property.
|
10
|
+
# @option opts [Symbol] :set a symbol identifying this property as a member of a set of properties.
|
11
|
+
# @option opts [String] :name the name of the property.
|
12
|
+
def initialize(opts)
|
13
|
+
super
|
14
|
+
@game = nil
|
15
|
+
@is_mortgaged = false
|
16
|
+
@value = opts[:value]
|
17
|
+
@mortgage_value = opts[:mortgage_value]
|
18
|
+
end
|
19
|
+
|
20
|
+
# Transfer a property to another player, in return for currency.
|
21
|
+
# @param player [Player] Receiving player
|
22
|
+
# @param amount [Integer] Sale value
|
23
|
+
def sell_to(player, amount = cost)
|
24
|
+
if player.currency < amount then
|
25
|
+
puts '[%s] Unable to buy %s! (short of cash by £%d)' % [ player.name, @name, ( amount - player.currency ) ]
|
26
|
+
false
|
27
|
+
else
|
28
|
+
player.currency = player.currency - amount.to_i
|
29
|
+
|
30
|
+
if @owner
|
31
|
+
@owner.currency = @owner.currency + amount
|
32
|
+
puts '[%s] Sold %s%s to %s for £%d (new balance: £%d)' % [ @owner.name, @name, (is_mortgaged? ? ' (mortgaged)' : ''), player.name, amount, @owner.currency ]
|
33
|
+
@owner.properties.delete self
|
34
|
+
else
|
35
|
+
puts '[%s] Purchased %s%s for £%d (new balance: £%d)' % [ player.name, @name, (is_mortgaged? ? ' (mortgaged)' : ''), amount, player.currency ]
|
36
|
+
end
|
37
|
+
|
38
|
+
player.properties << self
|
39
|
+
@owner = player
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# Returns the number of properties in the set containing self.
|
44
|
+
# @return [Integer]
|
45
|
+
def number_in_set(game = @owner.game)
|
46
|
+
properties_in_set(game).count
|
47
|
+
end
|
48
|
+
|
49
|
+
# Returns property objects for all properties in the same set as self.
|
50
|
+
# @return [Array<Square>]
|
51
|
+
def properties_in_set(game = @owner.game)
|
52
|
+
game.board.select { |p| p.is_a? self.class }.select { |p| p.set == @set }
|
53
|
+
end
|
54
|
+
|
55
|
+
# @return [Integer] the current cost to either purchase this property unowned, or unmortgage this property if mortgaged.
|
56
|
+
def cost
|
57
|
+
if is_mortgaged?
|
58
|
+
@value * 1.1
|
59
|
+
else
|
60
|
+
@value
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
# @return [Integer] the number of properties in the same set as this one which are currenly owned by players.
|
65
|
+
def number_of_set_owned
|
66
|
+
if @owner
|
67
|
+
@owner.properties.select { |p| p.is_a? self.class }.select { |p| p.set == @set }.count
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
# Offer to purchase this property from another player, thus calling the :trade_proposed behaviour of the receiving player.
|
72
|
+
def place_offer(proposer, amount)
|
73
|
+
@owner.behaviour[:trade_proposed].call(@owner.game, @owner, proposer, self, amount) if proposer.currency >= amount
|
74
|
+
end
|
75
|
+
|
76
|
+
# @return [Boolean] whether or not this property is part of a complete set owned by a single player.
|
77
|
+
def set_owned?
|
78
|
+
if @owner
|
79
|
+
player_basic_properties = @owner.properties.select { |p| p.is_a? self.class }
|
80
|
+
board_basic_properties = @owner.game.board.select { |p| p.is_a? self.class }
|
81
|
+
player_properties_in_set = player_basic_properties.select { |p| p.set == @set and p.is_mortgaged? == false }
|
82
|
+
board_properties_in_set = board_basic_properties.select { |p| p.set == @set }
|
83
|
+
(board_properties_in_set - player_properties_in_set).empty?
|
84
|
+
else
|
85
|
+
false
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
# Gives a property to another player. Available for use as part of a trading behaviour.
|
90
|
+
def give_to(player)
|
91
|
+
puts '[%s] Gave %s to %s' % [ @owner.name, @name, player.name ]
|
92
|
+
@owner.properties.delete self
|
93
|
+
@owner = player
|
94
|
+
player.properties << self
|
95
|
+
end
|
96
|
+
|
97
|
+
# Mortgage the property to raise cash for its owner.
|
98
|
+
# @return [self]
|
99
|
+
def mortgage
|
100
|
+
unless is_mortgaged?
|
101
|
+
puts '[%s] Mortgaged %s for £%d' % [ @owner.name, @name, @mortgage_value ]
|
102
|
+
@is_mortgaged = true
|
103
|
+
@owner.currency = @owner.currency + @mortgage_value
|
104
|
+
@mortgage_value
|
105
|
+
end
|
106
|
+
self
|
107
|
+
end
|
108
|
+
|
109
|
+
# Unmortgage the property.
|
110
|
+
# @return [self]
|
111
|
+
def unmortgage
|
112
|
+
if is_mortgaged?
|
113
|
+
if @owner.currency > cost
|
114
|
+
puts '[%s] Unmortgaged %s for £%d' % [ @owner.name, @name, cost ]
|
115
|
+
@owner.currency = @owner.currency - cost
|
116
|
+
@is_mortgaged = false
|
117
|
+
else
|
118
|
+
puts '[%s] Unable to unmortgage %s (not enough funds)' % [ @owner.name, @name ]
|
119
|
+
end
|
120
|
+
else
|
121
|
+
puts '[%] Tried to unmortgage a non-mortgaged property (%s)' % [ @owner.name, @name ]
|
122
|
+
end
|
123
|
+
self
|
124
|
+
end
|
125
|
+
|
126
|
+
# @return [Boolean] whether or not the property is currently mortgaged.
|
127
|
+
def is_mortgaged?
|
128
|
+
@is_mortgaged
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Monotony
|
2
|
+
|
3
|
+
# Represents any landable square on the board.
|
4
|
+
class Square
|
5
|
+
attr_accessor :action, :name, :owner, :colour
|
6
|
+
|
7
|
+
# @return [Symbol] Returns the name of the set containing this property.
|
8
|
+
attr_accessor :set
|
9
|
+
|
10
|
+
# @param [Hash] opts
|
11
|
+
# @option opts [Symbol] :set a symbol identifying this property as a member of a set of properties.
|
12
|
+
# @option opts [String] :name the name of the property.
|
13
|
+
# @option opts [Proc] :action a procedure to run when a player lands on this square.
|
14
|
+
# @option opts [Symbol] :colour the colour to use when rendering this square on a GUI.
|
15
|
+
def initialize(opts)
|
16
|
+
@owner = nil
|
17
|
+
@set = opts[:set] || nil
|
18
|
+
@name = opts[:name]
|
19
|
+
@action = opts[:action] || Proc.new {|game, owner, player, property|}
|
20
|
+
@colour = opts[:colour] || ( String.colors.include? opts[:set] ? opts[:set] : :light_black )
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require 'monotony/square'
|
2
|
+
require 'monotony/purchasable'
|
3
|
+
|
4
|
+
module Monotony
|
5
|
+
# Represents a railway station tile.
|
6
|
+
class Station < PurchasableProperty
|
7
|
+
# @param [Hash] opts
|
8
|
+
# @option opts [String] :name the name of the station.
|
9
|
+
# @option opts [Symbol] :colour the colour to use when rendering this square on a GUI.
|
10
|
+
def initialize(opts)
|
11
|
+
super
|
12
|
+
@set = :stations
|
13
|
+
@action = Proc.new do |game, owner, player, property|
|
14
|
+
if owner
|
15
|
+
rent = [ 25, 50, 100, 200 ]
|
16
|
+
multiplier = owner.properties.select { |p| p.is_a? Station }.count
|
17
|
+
player.pay(owner, rent[multiplier - 1])
|
18
|
+
else
|
19
|
+
player.behaviour[:purchase_possible].call(game, player, self) if player.currency >= cost
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'monotony/square'
|
2
|
+
require 'monotony/purchasable'
|
3
|
+
|
4
|
+
module Monotony
|
5
|
+
# Represents a utility tile, such as the Electricity Company or Water Works.
|
6
|
+
class Utility < PurchasableProperty
|
7
|
+
|
8
|
+
# @param opts [Hash]
|
9
|
+
# @option opts [String] :name A symbol identifying this property as a member of a set of properties.
|
10
|
+
def initialize(opts)
|
11
|
+
super
|
12
|
+
@set = :utilities
|
13
|
+
@action = Proc.new do |game, owner, player, property|
|
14
|
+
if owner
|
15
|
+
rent = game.last_roll * ( owner.properties.collect { |p| p.is_a? Utility }.count == 2 ? 10 : 4 )
|
16
|
+
player.pay(owner, rent)
|
17
|
+
else
|
18
|
+
player.behaviour[:purchase_possible].call(game, player, self) if player.currency >= cost
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,405 @@
|
|
1
|
+
module Monotony
|
2
|
+
# The classic UK edition of Monopoly.
|
3
|
+
class DefaultLayout
|
4
|
+
# An array of strings representing a deck of 'Community Chest' cards. Will be shuffled before use.
|
5
|
+
COMMUNITY_CHEST = [
|
6
|
+
'Go to jail. Move directly to jail. Do not pass GO. Do not collect £200.',
|
7
|
+
'Receive interest on 7% preference shares (£25)',
|
8
|
+
'Pay hospital £100', 'Pay your insurance premium (£50)',
|
9
|
+
'Advance to GO', 'Income tax refund (collect £20)',
|
10
|
+
'It is your birthday! (£10 from each player)',
|
11
|
+
'Go back to Old Kent Road',
|
12
|
+
'Bank error in your favour (£200)',
|
13
|
+
'Annuity matures (collect £100)',
|
14
|
+
'From sale of stock you get £50',
|
15
|
+
'You have won second prize in a beauty contest (£10)',
|
16
|
+
'Get out of jail free',
|
17
|
+
'Pay a £10 fine or take a chance',
|
18
|
+
"Doctor's fee (£50)",
|
19
|
+
'You inherit £100'
|
20
|
+
]
|
21
|
+
|
22
|
+
# An array of strings representing a deck of 'Chance' cards. Will be shuffled before use.
|
23
|
+
CHANCE = [
|
24
|
+
'Your building loan matures (receive £150)',
|
25
|
+
'Take a trip to Marylebone Station',
|
26
|
+
'Go back three spaces',
|
27
|
+
'Speeding fine (£15)',
|
28
|
+
'Advance to Mayfair',
|
29
|
+
'Make general repairs on all of your houses. For each house pay £25, and for each hotel pay £100.',
|
30
|
+
'Advance to Trafalgar Square',
|
31
|
+
'You are assessed for street repairs. £40 per house, £115 per hotel.',
|
32
|
+
'Pay school fees of £150',
|
33
|
+
'Advance to GO',
|
34
|
+
'Bank pays you dividend of £50',
|
35
|
+
'Drunk in charge (£20 fine)',
|
36
|
+
'Go to jail. Move directly to jail. Do not pass GO. Do not collect £200',
|
37
|
+
'Advance to Pall Mall',
|
38
|
+
'Get out of jail free',
|
39
|
+
'You have won a crossword competition (£100)'
|
40
|
+
]
|
41
|
+
|
42
|
+
# The game board layout, consisting of an array of Squares.
|
43
|
+
BOARD = [
|
44
|
+
Square.new(
|
45
|
+
name: 'GO',
|
46
|
+
action: Proc.new { |game, owner, player, property|
|
47
|
+
game.pay_player(player, game.go_amount, 'landing on GO')
|
48
|
+
}
|
49
|
+
),
|
50
|
+
BasicProperty.new(
|
51
|
+
name: 'Old Kent Road',
|
52
|
+
rent: [ 2, 10, 30, 90, 160, 250 ],
|
53
|
+
house_cost: 50,
|
54
|
+
hotel_cost: 50,
|
55
|
+
mortgage_value: 30,
|
56
|
+
value: 60,
|
57
|
+
set: :brown,
|
58
|
+
colour: :yellow
|
59
|
+
),
|
60
|
+
|
61
|
+
CommunityChest.new(
|
62
|
+
name: 'Community Chest 1',
|
63
|
+
colour: :light_cyan
|
64
|
+
),
|
65
|
+
|
66
|
+
BasicProperty.new(
|
67
|
+
name: 'Whitechapel Road',
|
68
|
+
rent: [ 4, 20, 60, 180, 320, 450 ],
|
69
|
+
house_cost: 50,
|
70
|
+
hotel_cost: 50,
|
71
|
+
mortgage_value: 30,
|
72
|
+
value: 60,
|
73
|
+
set: :brown,
|
74
|
+
colour: :yellow
|
75
|
+
),
|
76
|
+
|
77
|
+
Square.new(
|
78
|
+
name: 'Income Tax',
|
79
|
+
colour: :light_black,
|
80
|
+
action: Proc.new { |game, owner, player, property|
|
81
|
+
player.pay(:bank, 200, 'income tax')
|
82
|
+
}
|
83
|
+
),
|
84
|
+
|
85
|
+
Station.new(
|
86
|
+
name: "King's Cross Station",
|
87
|
+
value: 200,
|
88
|
+
mortgage_value: 100,
|
89
|
+
colour: :light_blue
|
90
|
+
),
|
91
|
+
|
92
|
+
BasicProperty.new(
|
93
|
+
name: 'The Angel Islington',
|
94
|
+
rent: [ 6, 30, 90, 270, 400, 550 ],
|
95
|
+
house_cost: 50,
|
96
|
+
hotel_cost: 50,
|
97
|
+
mortgage_value: 50,
|
98
|
+
value: 100,
|
99
|
+
set: :blue,
|
100
|
+
colour: :blue
|
101
|
+
),
|
102
|
+
|
103
|
+
Chance.new(
|
104
|
+
name: 'Chance 1',
|
105
|
+
colour: :light_cyan
|
106
|
+
),
|
107
|
+
|
108
|
+
BasicProperty.new(
|
109
|
+
name: 'Euston Road',
|
110
|
+
rent: [ 6, 30, 90, 270, 400, 550 ],
|
111
|
+
house_cost: 50,
|
112
|
+
hotel_cost: 50,
|
113
|
+
mortgage_value: 50,
|
114
|
+
value: 100,
|
115
|
+
set: :blue,
|
116
|
+
colour: :blue
|
117
|
+
),
|
118
|
+
|
119
|
+
BasicProperty.new(
|
120
|
+
name: 'Pentonville Road',
|
121
|
+
rent: [ 8, 40, 100, 300, 450, 600 ],
|
122
|
+
house_cost: 50,
|
123
|
+
hotel_cost: 50,
|
124
|
+
mortgage_value: 60,
|
125
|
+
value: 120,
|
126
|
+
set: :blue,
|
127
|
+
colour: :blue
|
128
|
+
),
|
129
|
+
|
130
|
+
Square.new(
|
131
|
+
name: 'Jail',
|
132
|
+
colour: :light_black
|
133
|
+
),
|
134
|
+
|
135
|
+
BasicProperty.new(
|
136
|
+
name: 'Pall Mall',
|
137
|
+
rent: [ 10, 50, 150, 450, 625, 750 ],
|
138
|
+
house_cost: 100,
|
139
|
+
hotel_cost: 100,
|
140
|
+
mortgage_value: 70,
|
141
|
+
value: 140,
|
142
|
+
set: :pink,
|
143
|
+
colour: :light_magenta
|
144
|
+
),
|
145
|
+
|
146
|
+
Utility.new(
|
147
|
+
name: 'Electric Company',
|
148
|
+
value: 150,
|
149
|
+
mortgage_value: 75,
|
150
|
+
colour: :cyan
|
151
|
+
),
|
152
|
+
|
153
|
+
BasicProperty.new(
|
154
|
+
name: 'Whitehall',
|
155
|
+
rent: [ 10, 50, 150, 450, 625, 750 ],
|
156
|
+
house_cost: 100,
|
157
|
+
hotel_cost: 100,
|
158
|
+
mortgage_value: 70,
|
159
|
+
value: 140,
|
160
|
+
set: :pink,
|
161
|
+
colour: :light_magenta
|
162
|
+
|
163
|
+
),
|
164
|
+
|
165
|
+
BasicProperty.new(
|
166
|
+
name: 'Northumberland Avenue',
|
167
|
+
rent: [ 12, 60, 180, 500, 700, 900 ],
|
168
|
+
house_cost: 100,
|
169
|
+
hotel_cost: 100,
|
170
|
+
mortgage_value: 80,
|
171
|
+
value: 160,
|
172
|
+
set: :pink,
|
173
|
+
colour: :light_magenta
|
174
|
+
),
|
175
|
+
|
176
|
+
Station.new(
|
177
|
+
name: 'Marylebone Station',
|
178
|
+
value: 200,
|
179
|
+
mortgage_value: 100,
|
180
|
+
colour: :light_blue
|
181
|
+
),
|
182
|
+
|
183
|
+
BasicProperty.new(
|
184
|
+
name: 'Bow Street',
|
185
|
+
rent: [ 14, 70, 200, 550, 750, 950 ],
|
186
|
+
house_cost: 100,
|
187
|
+
hotel_cost: 100,
|
188
|
+
mortgage_value: 90,
|
189
|
+
value: 180,
|
190
|
+
set: :orange,
|
191
|
+
colour: :light_red
|
192
|
+
),
|
193
|
+
|
194
|
+
CommunityChest.new(
|
195
|
+
name: 'Community Chest 2',
|
196
|
+
set: :communitychest,
|
197
|
+
colour: :light_cyan
|
198
|
+
),
|
199
|
+
|
200
|
+
BasicProperty.new(
|
201
|
+
name: 'Marlborough Street',
|
202
|
+
rent: [ 14, 70, 200, 550, 750, 950 ],
|
203
|
+
house_cost: 100,
|
204
|
+
hotel_cost: 100,
|
205
|
+
mortgage_value: 90,
|
206
|
+
value: 180,
|
207
|
+
set: :orange,
|
208
|
+
colour: :light_red
|
209
|
+
),
|
210
|
+
|
211
|
+
BasicProperty.new(
|
212
|
+
name: 'Vine Street',
|
213
|
+
rent: [ 16, 80, 220, 600, 800, 1000 ],
|
214
|
+
house_cost: 100,
|
215
|
+
hotel_cost: 100,
|
216
|
+
mortgage_value: 100,
|
217
|
+
value: 200,
|
218
|
+
set: :orange,
|
219
|
+
colour: :light_red
|
220
|
+
),
|
221
|
+
|
222
|
+
Square.new(
|
223
|
+
name: 'Free Parking',
|
224
|
+
colour: :white,
|
225
|
+
action: Proc.new { |game, owner, player, property|
|
226
|
+
game.payout_free_parking(player)
|
227
|
+
}
|
228
|
+
),
|
229
|
+
|
230
|
+
BasicProperty.new(
|
231
|
+
name: 'Strand',
|
232
|
+
rent: [ 18, 90, 250, 700, 875, 1050 ],
|
233
|
+
house_cost: 150,
|
234
|
+
hotel_cost: 150,
|
235
|
+
mortgage_value: 110,
|
236
|
+
value: 220,
|
237
|
+
set: :red,
|
238
|
+
colour: :red
|
239
|
+
),
|
240
|
+
|
241
|
+
Chance.new(
|
242
|
+
name: 'Chance 2',
|
243
|
+
colour: :light_cyan
|
244
|
+
),
|
245
|
+
|
246
|
+
BasicProperty.new(
|
247
|
+
name: 'Fleet Street',
|
248
|
+
rent: [ 18, 90, 250, 700, 875, 1050 ],
|
249
|
+
house_cost: 150,
|
250
|
+
hotel_cost: 150,
|
251
|
+
mortgage_value: 110,
|
252
|
+
value: 220,
|
253
|
+
set: :red,
|
254
|
+
colour: :red
|
255
|
+
),
|
256
|
+
|
257
|
+
BasicProperty.new(
|
258
|
+
name: 'Trafalgar Square',
|
259
|
+
rent: [ 20, 100, 300, 750, 925, 1100 ],
|
260
|
+
house_cost: 150,
|
261
|
+
hotel_cost: 150,
|
262
|
+
mortgage_value: 120,
|
263
|
+
value: 240,
|
264
|
+
set: :red,
|
265
|
+
colour: :red
|
266
|
+
),
|
267
|
+
|
268
|
+
Station.new(
|
269
|
+
name: 'Fenchurch St Station',
|
270
|
+
value: 200,
|
271
|
+
mortgage_value: 100,
|
272
|
+
colour: :light_blue
|
273
|
+
),
|
274
|
+
|
275
|
+
BasicProperty.new(
|
276
|
+
name: 'Leicester Square',
|
277
|
+
rent: [ 22, 110, 330, 800, 975, 1150 ],
|
278
|
+
house_cost: 150,
|
279
|
+
hotel_cost: 150,
|
280
|
+
mortgage_value: 130,
|
281
|
+
value: 260,
|
282
|
+
set: :yellow,
|
283
|
+
colour: :yellow
|
284
|
+
),
|
285
|
+
|
286
|
+
BasicProperty.new(
|
287
|
+
name: 'Coventry Street',
|
288
|
+
rent: [ 22, 110, 330, 800, 975, 1150 ],
|
289
|
+
house_cost: 150,
|
290
|
+
hotel_cost: 150,
|
291
|
+
mortgage_value: 130,
|
292
|
+
value: 260,
|
293
|
+
set: :yellow,
|
294
|
+
colour: :yellow
|
295
|
+
),
|
296
|
+
|
297
|
+
Utility.new(
|
298
|
+
name: 'Water Works',
|
299
|
+
value: 150,
|
300
|
+
mortgage_value: 75,
|
301
|
+
colour: :cyan
|
302
|
+
),
|
303
|
+
|
304
|
+
BasicProperty.new(
|
305
|
+
name: 'Piccadilly',
|
306
|
+
rent: [ 22, 120, 360, 850, 1025, 1200 ],
|
307
|
+
house_cost: 150,
|
308
|
+
hotel_cost: 150,
|
309
|
+
mortgage_value: 140,
|
310
|
+
value: 280,
|
311
|
+
set: :yellow,
|
312
|
+
colour: :yellow
|
313
|
+
),
|
314
|
+
|
315
|
+
Square.new(
|
316
|
+
name: 'Go to Jail',
|
317
|
+
colour: :light_black,
|
318
|
+
action: Proc.new {|game, owner, player, property|
|
319
|
+
player.in_jail = true
|
320
|
+
player.move('Jail')
|
321
|
+
puts '[%s] Got sent to jail!' % player.name
|
322
|
+
}
|
323
|
+
),
|
324
|
+
|
325
|
+
BasicProperty.new(
|
326
|
+
name: 'Regent Street',
|
327
|
+
rent: [ 26, 130, 390, 900, 1100, 1275 ],
|
328
|
+
house_cost: 200,
|
329
|
+
hotel_cost: 200,
|
330
|
+
mortgage_value: 150,
|
331
|
+
value: 300,
|
332
|
+
set: :green,
|
333
|
+
colour: :green
|
334
|
+
),
|
335
|
+
|
336
|
+
BasicProperty.new(
|
337
|
+
name: 'Oxford Street',
|
338
|
+
rent: [ 26, 130, 390, 900, 1100, 1275 ],
|
339
|
+
house_cost: 200,
|
340
|
+
hotel_cost: 200,
|
341
|
+
mortgage_value: 150,
|
342
|
+
value: 300,
|
343
|
+
set: :green,
|
344
|
+
colour: :green
|
345
|
+
),
|
346
|
+
|
347
|
+
CommunityChest.new(
|
348
|
+
name: 'Community Chest 3',
|
349
|
+
colour: :light_cyan
|
350
|
+
),
|
351
|
+
|
352
|
+
BasicProperty.new(
|
353
|
+
name: 'Bond Street',
|
354
|
+
rent: [ 28, 150, 450, 1000, 1200, 1400 ],
|
355
|
+
house_cost: 200,
|
356
|
+
hotel_cost: 200,
|
357
|
+
mortgage_value: 160,
|
358
|
+
value: 320,
|
359
|
+
set: :green,
|
360
|
+
colour: :green
|
361
|
+
),
|
362
|
+
|
363
|
+
Station.new(
|
364
|
+
name: 'Liverpool St Station',
|
365
|
+
value: 200,
|
366
|
+
mortgage_value: 100,
|
367
|
+
colour: :light_blue
|
368
|
+
),
|
369
|
+
|
370
|
+
Chance.new(
|
371
|
+
name: 'Chance 3',
|
372
|
+
colour: :light_cyan
|
373
|
+
),
|
374
|
+
|
375
|
+
BasicProperty.new(
|
376
|
+
name: 'Park Lane',
|
377
|
+
rent: [ 35, 175, 500, 1100, 1300, 1500 ],
|
378
|
+
house_cost: 200,
|
379
|
+
hotel_cost: 200,
|
380
|
+
mortgage_value: 175,
|
381
|
+
value: 350,
|
382
|
+
set: :purple,
|
383
|
+
colour: :magenta
|
384
|
+
),
|
385
|
+
|
386
|
+
Square.new(
|
387
|
+
name: 'Super Tax',
|
388
|
+
action: Proc.new {|game, owner, player, property|
|
389
|
+
player.pay(:bank, 100, 'super tax')
|
390
|
+
}
|
391
|
+
),
|
392
|
+
|
393
|
+
BasicProperty.new(
|
394
|
+
name: 'Mayfair',
|
395
|
+
rent: [ 50, 200, 600, 1400, 1700, 2000 ],
|
396
|
+
house_cost: 200,
|
397
|
+
hotel_cost: 200,
|
398
|
+
mortgage_value: 200,
|
399
|
+
value: 400,
|
400
|
+
set: :purple,
|
401
|
+
colour: :magenta
|
402
|
+
)
|
403
|
+
]
|
404
|
+
end
|
405
|
+
end
|