65 lines
1.4 KiB
Ruby
65 lines
1.4 KiB
Ruby
# The game class
|
|
class Game < ActiveRecord::Base
|
|
has_many :players, dependent: :destroy
|
|
has_many :users, through: :players
|
|
accepts_nested_attributes_for :players
|
|
validates :title, presence: true
|
|
|
|
def start
|
|
# Save the game to the database
|
|
return false unless startable?
|
|
|
|
# Start the game TODO
|
|
self.status = 'Game Started' if startable?
|
|
|
|
# Create a deck
|
|
d = Deck.new
|
|
# Shuffle the deck
|
|
d.cards.shuffle!
|
|
# Deal the cards
|
|
players.each do |player|
|
|
13.times do
|
|
card = d.cards.shift
|
|
player.player_cards.new(card.instance_values)
|
|
end
|
|
player.save
|
|
end
|
|
save
|
|
end
|
|
|
|
def validate_startable
|
|
@player_count = players.size
|
|
errors[:players] = 'Must be at least 2 players.' if @player_count < 2
|
|
errors[:players] = 'Must be less than 5 players.' if @player_count > 4
|
|
end
|
|
|
|
def startable?
|
|
@player_count = players.size
|
|
tests = [
|
|
@player_count.between?(2, 4),
|
|
status != 'Game Started'
|
|
]
|
|
tests.each do |test|
|
|
if test == false then return false end
|
|
end
|
|
return true
|
|
end
|
|
|
|
def add_player_from_user(user)
|
|
return false unless can_accomodate(user)
|
|
self.players.create(user: user)
|
|
end
|
|
|
|
def can_accomodate(user)
|
|
!(already_has?(user) || full?)
|
|
end
|
|
|
|
def already_has?(user)
|
|
users.include?(user)
|
|
end
|
|
|
|
def full?
|
|
players.size >= 4
|
|
end
|
|
end
|