Change Gather style to volunteer captains

This will change the gather format to allow for players to volunteer to be captain / commander. The gather will not change from the running state until 2 commanders have volunteered. Once commanders have volunteered the gather will switch to the picking state. The voting state is no longer used.

Also, added a new sound alert that will be played when the gather is full but doesn't have 2 captains. This alert will loop every 10 seconds unless you're the commander. And changed the music to play once the gather switches to the picking state and only if the player doesn't have the gather page on focus.
This commit is contained in:
jamal 2014-10-11 15:50:06 -04:00
parent d0029b118f
commit ebd60d19eb
10 changed files with 103 additions and 19 deletions

View file

@ -63,6 +63,22 @@ class GathersController < ApplicationController
redirect_to @gather
end
def captain
raise AccessError unless @gatherer
if @gather.captain1.nil? and @gather.captain2 != @gatherer
@gather.update_attribute :captain1, @gatherer
elsif @gather.captain2.nil? and @gather.captain1 != @gatherer
@gather.update_attribute :captain2, @gatherer
elsif @gatherer == @gather.captain1
@gather.update_attribute :captain1, nil
elsif @gatherer == @gather.captain2
@gather.update_attribute :captain2, nil
end
redirect_to @gather
end
private
def get_gather

View file

@ -1,7 +1,11 @@
module GathersHelper
def render_gather
if @gather.status == Gather::STATE_RUNNING
if @gather.is_full? and !@gather.is_ready? and @gather.captain1 != @gatherer and @gather.captain2 != @gatherer
headers['Gather'] = 'full'
else
headers['Gather'] = 'running'
end
render partial: 'running', layout: false
elsif @gather.status == Gather::STATE_VOTING

View file

@ -89,6 +89,17 @@ class Gather < ActiveRecord::Base
5
end
def is_full?
return gatherers.count == Gather::FULL
end
def is_ready?
if is_full? and !captain1.nil? and !captain2.nil?
return true
end
false
end
def first
Gather.where(:category_id => category_id).order("id ASC").first
end
@ -124,8 +135,6 @@ class Gather < ActiveRecord::Base
g = Gather.new
g.category = self.category
g.save
self.captain1 = self.gatherers.most_voted[1]
self.captain2 = self.gatherers.most_voted[0]
if self.gather_maps.count > 1
self.map1 = self.gather_maps.ordered[0]
self.map2 = self.gather_maps.ordered[1]
@ -139,7 +148,7 @@ class Gather < ActiveRecord::Base
end
def check_captains
if captain1_id_changed? or captain2_id_changed? or admin
if status == STATE_RUNNING and is_ready? or admin
self.turn = 1
self.status = STATE_PICKING
gatherers.each do |gatherer|
@ -151,6 +160,13 @@ class Gather < ActiveRecord::Base
gatherer.update_attributes(:team => nil, :skip_callbacks => true)
end
end
# Create a new shout msgs when the gather is full
Shoutmsg.new({
:shoutable_type => self.class.to_s,
:shoutable_id => self.id,
:text => I18n.t(:gather_start_shout)
}).save
end
end

View file

@ -70,7 +70,7 @@ class Gatherer < ActiveRecord::Base
validates :confirm, :acceptance => true, :unless => Proc.new {|gatherer| gatherer.user.gatherers.count >= 5}
validate :validate_username
after_create :start_gather, :if => Proc.new {|gatherer| gatherer.gather.gatherers.count == Gather::FULL}
after_create :start_gather, :if => Proc.new {|gatherer| gatherer.gather.is_ready?}
after_create :notify_gatherers, :if => Proc.new {|gatherer| gatherer.gather.gatherers.count == Gather::NOTIFY}
after_update :change_turn, :unless => Proc.new {|gatherer| gatherer.skip_callbacks == true}
after_destroy :cleanup_votes
@ -118,6 +118,12 @@ class Gatherer < ActiveRecord::Base
end
def cleanup_votes
if gather.captain1_id == id
gather.update_attribute :captain1, nil
elsif gather.captain2_id == id
gather.update_attribute :captain2, nil
end
gather.map_votes.all(:conditions => {:user_id => user_id}).each { |g| g.destroy }
gather.server_votes.all(:conditions => {:user_id => user_id}).each { |g| g.destroy }
gather.gatherer_votes.all(:conditions => {:user_id => user_id}).each { |g| g.destroy }

View file

@ -17,7 +17,6 @@ class Shoutmsg < ActiveRecord::Base
attr_protected :id, :created_at, :updated_at, :user_id
validates_length_of :text, :in => 1..100
validates_presence_of :user
scope :recent,
:include => :user,

View file

@ -9,6 +9,13 @@
<li<% if gatherer.status > 0 %> class="away"<% end %>>
<%= flag gatherer.user.country %>
<%= namelink gatherer.user %>
<% if gatherer == @gather.captain1 or gatherer == @gather.captain2 %>
<span class="captain">
<%= icon('star') %>
</span>
<% end %>
<% if cuser and cuser.admin? %>
<%= link_to gatherer, method: :delete, class: 'delete' do %>
<%= icon 'times' %>

View file

@ -2,15 +2,28 @@
<% if @gather.status == Gather::STATE_RUNNING %>
<% if @gatherer and @gatherer.can_destroy? cuser %>
<% if Gather::FULL == @gather.gatherers.length %>
<p>Gather is full but we are waiting on commanders. If you would like to command, please use the button below.</p>
<% else %>
<p>Gather running, <%= Gather::FULL - @gather.gatherers.length %> more needed.</p>
<%= link_to 'Leave Gather', @gatherer, confirm: 'Are you sure?', method: :delete, class: 'button tiny' %>
<% end %>
<%= form_tag "/gathers/captain/#{@gather.id}" do %>
<%= submit_tag (@gather.captain1 == @gatherer or @gather.captain2 == @gatherer) ? 'Stop Commanding' : 'Command a Team', class: 'button tiny' %>
<% end %>
<%= link_to 'Leave Gather', @gatherer, confirm: 'Are you sure?', method: :delete, class: 'button tiny leave-gather' %>
<% elsif (g = Gatherer.new(gather: @gather, user: cuser)).can_create?(cuser) %>
<%= form_for g do |f| %>
<%= f.hidden_field :gather_id %>
<%= f.hidden_field :user_id %>
<% if Gather::FULL == @gather.gatherers.length %>
<p>Gather is full but we are waiting on commanders. If you would like to command, please use the button below.</p>
<% else %>
<p>Gather running, <%= Gather::FULL - @gather.gatherers.length %> more needed.</p>
<% end %>
<p>
You can download custom maps via the
<%= link_to "Steam Workshop", "http://steamcommunity.com/workshop/browse?searchtext=&childpublishedfileid=0&section=items&appid=4920&browsesort=trend&requiredtags%5B%5D=level" %>.

View file

@ -1,5 +1,6 @@
<div id="jplayer"></div>
<script type="text/javascript">
var gather_focus = true;
var played = false;
var leaving = true;
<% if @gatherer and @gatherer.can_destroy? cuser %>
@ -21,6 +22,8 @@
});
}
var gatherAlertInterval;
$(document).ready(function() {
$.PeriodicalUpdater("/gathers/" + <%= @gather.id %> + ".js", {
method: "GET",
@ -28,8 +31,21 @@
minTimeout: 5000,
maxTimeout: 15000,
success: function(response, text, request) {
if (request.getResponseHeader('Gather') == 'voting') {
if (!played) {
if (request.getResponseHeader('Gather') == 'full') {
// Play notification while we wait on captains
if (!gatherAlertInterval) {
$('#jplayer').jPlayer({
ready: function() {
$(this).jPlayer('setMedia', {mp3: '/sounds/gather-alert.mp3'}).jPlayer("play");
},
loop: false
});
gatherAlertInterval = setInterval(function() { $("#jplayer").jPlayer("play"); }, 10000);
}
} else if (request.getResponseHeader('Gather') == 'picking' && !played) {
played = true
if (!gather_focus) {
$("#jplayer").jPlayer({
ready: function() {
$(this).jPlayer("setMedia", {
@ -48,11 +64,10 @@
volume: 0.6,
swfPath: "/flash"
});
played = true
}
}
else if (response.length > 10) {
clearInterval(gatherAlertInterval);
$("#jplayer").jPlayer("stop");
}
}
@ -74,6 +89,7 @@
var afk_timeout;
var afk_time = 1000 * 60 * 15; // 15 minutes
$(window).blur(function() {
gather_focus = false;
afk_timeout = setTimeout(function() {
if (gatherer_id > 0) {
afk = true;
@ -83,6 +99,12 @@
});
$(window).focus(function() {
gather_focus = true;
if (played) {
$("#jplayer").jPlayer("stop");
}
if (afk) {
updateGathererStatus('active');
$.get("/gathers/" + <%= @gather.id %> + ".js");
@ -128,11 +150,11 @@
</div>
<div class="info">
<h6>Captains</h6>
<h6>Commanders</h6>
<ul>
<li>Vote for the <strong>best</strong> players</li>
<li>Captain 1 = 2nd most voted</li>
<li>Captain 2 = 1st most voted</li>
<li>Players choose to become commanders</li>
<li>Commanders will pick team players</li>
<li>Gather will not start without commanders</li>
</ul>
</div>

View file

@ -21,6 +21,7 @@ en:
contests_join: "Team successfully joined contest."
contests_contester_update: "Contester was successfully updated."
gather_create: "New Gather was started successfully."
gather_start_shout: "The gather is full and commanders are picking teams."
gathers_join: "You have joined the Gather."
gathers_user_pick: "You have successfully selected a player for your team."
gatherers_update: "Gather player successfully updated."

Binary file not shown.