157 lines
3.8 KiB
Ruby
157 lines
3.8 KiB
Ruby
class GamesController < ApplicationController
|
|
before_action :set_game, only: [:show, :edit, :update, :destroy, :play_hand, :join, :start, :my_inventory]
|
|
|
|
respond_to :html, :json
|
|
|
|
def index
|
|
if params[:table_id]
|
|
@table = Table.find(params[:table_id])
|
|
@games = @table.games
|
|
else
|
|
@games = Game.all.order :id
|
|
end
|
|
respond_with(@games)
|
|
end
|
|
|
|
def show
|
|
#TODO: Implement standalone games, without a table?
|
|
#redirect_to @game.table
|
|
respond_with(@game)
|
|
end
|
|
|
|
def new
|
|
@game = Game.new
|
|
respond_with(@game)
|
|
end
|
|
|
|
def edit
|
|
end
|
|
|
|
def play_hand
|
|
authorize @game
|
|
# TODO: move this logic out of controller maybe to model(s) ?
|
|
|
|
# validate player's turn
|
|
if current_user.soft_token == @game.controlling_player.soft_token
|
|
|
|
# Player action: pass
|
|
# TODO: wtf do we need game params for? And why nest hand_type in it?
|
|
# if params[:game]
|
|
if params[:hand_type] == 'Pass'
|
|
@game.set_controlling_player 'next'
|
|
flash[:notice] = 'Successfully passed.'
|
|
# Clear play to beat if play returns to owner
|
|
if @game.play_to_beat.try(:player).try(:id) == @game.controlling_player_id
|
|
@game.play_to_beat_id = nil
|
|
end
|
|
@game.save
|
|
# Player action: play_hand
|
|
elsif params[:player_card_ids]
|
|
@cards_to_play = @game.controlling_player.try(:player_cards).order(:value).find(params[:player_card_ids])
|
|
# Instantiate the play
|
|
@play = @game.controlling_player.plays.new
|
|
@play.game_id = @game.id
|
|
|
|
# TODO Bug next player fails if inventory is empty
|
|
@next_player_id = @game.next_player_id
|
|
@play.player_cards << @cards_to_play
|
|
if @play.save
|
|
@game.controlling_player_id = @next_player_id
|
|
@game.save
|
|
else
|
|
# TODO: Does anything need to happen here?
|
|
#
|
|
# If play is invalid, remove the cards from the play
|
|
#@play.player_cards.map {|card| card.play_id = nil; card.save}
|
|
# Delete play
|
|
#@play.destroy
|
|
end
|
|
|
|
@play.errors.messages.each do |key, msg|
|
|
flash[key] = msg.join
|
|
end
|
|
else
|
|
# No cards are played
|
|
@cards_to_play = []
|
|
end
|
|
else
|
|
flash[:notice] = 'It is not your turn.'
|
|
end
|
|
|
|
respond_to do |format|
|
|
## TODO: Return status message of attempt to play_hand
|
|
# flash[:notice] = 'I hi'
|
|
format.html { redirect_to(@game.table) }
|
|
format.json { render json: @game }
|
|
end
|
|
|
|
end
|
|
|
|
def create
|
|
@game = Game.new(title: game_params[:title])
|
|
if game_params[:player_ids]
|
|
game_params[:player_ids].each do |user_id|
|
|
@game.players.new(user_id: user_id)
|
|
end
|
|
end
|
|
@game.save
|
|
respond_with(@game)
|
|
end
|
|
|
|
def update
|
|
@game.update(game_params)
|
|
respond_with(@game)
|
|
end
|
|
|
|
def destroy
|
|
@game.destroy
|
|
respond_with(@game)
|
|
end
|
|
|
|
def play_now
|
|
# First joinable game or create new game
|
|
@game = Game.play_now
|
|
@seats = @game.table.seats.order(:position).map {|s| s.occupied? ? nil : s}
|
|
# @seats = @game.table.seats
|
|
@seat = @seats.compact.last.sit(current_user)
|
|
@seat.save
|
|
redirect_to @game.table
|
|
end
|
|
|
|
def join
|
|
@game.add_player_from_user(current_user)
|
|
flash[:notice] = 'Successfully joined game...'
|
|
redirect_to(@game)
|
|
end
|
|
|
|
def start
|
|
authorize @game
|
|
begin
|
|
@game.start
|
|
rescue StandardError => e
|
|
@game.errors.messages.each do |key, msg|
|
|
flash[key] = msg.join
|
|
end
|
|
redirect_to(@game.table)
|
|
return
|
|
end
|
|
flash[:notice] = 'Game started.'
|
|
|
|
redirect_to(@game.table)
|
|
end
|
|
|
|
def my_inventory
|
|
@player = @game.players.find_by(user_id: current_user.id)
|
|
end
|
|
|
|
private
|
|
|
|
def set_game
|
|
@game = Game.find(params[:id])
|
|
end
|
|
|
|
def game_params
|
|
params.require(:game).permit(:title, player_ids: [])
|
|
end
|
|
end
|