diff --git a/app/javascripts/components/gather.js b/app/javascripts/components/gather.js index 841ffcc..c5c0417 100644 --- a/app/javascripts/components/gather.js +++ b/app/javascripts/components/gather.js @@ -173,8 +173,9 @@ const GatherProgress = React.createClass({ }, gatheringProgress() { - const num = this.props.gather.gatherers.length; - const den = 12; + const gather = this.props.gather; + const num = gather.gatherers.length; + const den = gather.teamSize * 2; const remaining = den - num; const message = (remaining === 1) ? "Waiting for last player" : `Waiting for ${remaining} more players`; @@ -186,11 +187,12 @@ const GatherProgress = React.createClass({ }, electionProgress() { - const num = this.props.gather.gatherers.reduce((acc, gatherer) => { + const gather = this.props.gather; + const num = gather.gatherers.reduce((acc, gatherer) => { if (gatherer.leaderVote) acc++; return acc; }, 0); - const den = 12; + const den = gather.teamSize * 2; return { num: num, den: den, @@ -199,17 +201,18 @@ const GatherProgress = React.createClass({ }, selectionProgress() { - const num = this.props.gather.gatherers.reduce((acc, gatherer) => { + const gather = this.props.gather; + const num = gather.gatherers.reduce((acc, gatherer) => { if (gatherer.team !== "lobby") acc++; return acc; }, 0); - const den = 12; + const den = gather.teamSize * 2; return { num: num, den: den, message: `${num} out of ${den} players assigned. Waiting - on ${_.capitalize(this.props.gather.pickingTurn)}s to pick next...` + on ${_.capitalize(gather.pickingTurn)}s to pick next...` }; }, @@ -730,7 +733,7 @@ const GatherMenu = exports.GatherMenu = React.createClass({ key={gather.type}> <strong>{gather.name}</strong> <br /> - {gather.description} + {`${gather.teamSize} v ${gather.teamSize} - ${gather.description}`} </li> ); }) diff --git a/app/javascripts/components/main.js b/app/javascripts/components/main.js index bbc1807..21dd7fc 100644 --- a/app/javascripts/components/main.js +++ b/app/javascripts/components/main.js @@ -158,7 +158,7 @@ const GatherPage = React.createClass({ public: { gatherers: [] }, - skilled: { + large: { gatherers: [] } }, @@ -280,7 +280,7 @@ const GatherPage = React.createClass({ updateTitle() { let gather = this.currentGather(); if (gather && this.state.updateTitle) { - document.title = `NSL Gathers (${gather.gatherers.length}/12)`; + document.title = `NSL Gathers (${gather.gatherers.length}/${gather.teamSize * 2})`; return; } document.title = "NSL Gathers"; diff --git a/lib/gather/gather.js b/lib/gather/gather.js index 149ae76..e238faf 100644 --- a/lib/gather/gather.js +++ b/lib/gather/gather.js @@ -29,19 +29,19 @@ function Gather (options) { time: null }; - this.TEAM_SIZE = 6; + this.teamSize = options.teamSize || 6; // Store cooldown times for gather leaves this.cooldown = {}; this.COOLDOWN_TIME = 60 * 3;// 3 Minutes - this.REGATHER_THRESHOLD = 8; + this.REGATHER_THRESHOLD = Math.floor(this.teamSize / 2) + 2; this.type = options.type || "public"; this.name = options.name || "Public Gather"; - this.description = options.description || "6 v 6 - No player requirements"; + this.description = options.description || "No player requirements"; this.election = { INTERVAL: 60000, // 1 Minute @@ -81,13 +81,13 @@ StateMachine.create({ onbeforeaddGatherer: function (event, from, to, user) { if (this.needsToCoolOff(user)) return false; this.addUser(user); - if (this.gatherers.length !== 12) return false; + if (!this.lobbyFull()) return false; }, // Election State onbeforeselectLeader: function (event, from, to, voter, candidate) { this.voteForLeader(voter, candidate); - if (this.leaderVotes().length !== 12) return false; + if (!this.leaderVotesFull()) return false; }, onenterelection: function () { @@ -133,8 +133,8 @@ StateMachine.create({ }, onbeforeconfirmSelection: function (event, from, to, leader) { - return (this.aliens().length === this.TEAM_SIZE - && this.marines().length === this.TEAM_SIZE); + return (this.aliens().length === this.teamSize + && this.marines().length === this.teamSize); }, // Remove gatherer event @@ -167,8 +167,17 @@ StateMachine.create({ } }); +Gather.prototype.lobbyFull = function () { + return this.gatherers.length === (this.teamSize * 2); +}; + +Gather.prototype.leaderVotesFull = function () { + return this.leaderVotes().length === (this.teamSize * 2); +}; + Gather.prototype.resetState = function () { this.gatherers = []; + this.cancelElectionCountdown(); return this; }; @@ -235,23 +244,15 @@ Gather.prototype.pickingTurn = function () { if (alienCount + marineCount === 2) return "marine"; if (marineCount > alienCount) return "alien"; if (marineCount < alienCount) return "marine"; - switch (total) { - case 4: - return "alien"; - case 6: - return "marine"; - case 8: - return "alien"; - case 10: - return "marine"; - } + if (total % 4 === 0) return "alien"; + return "marine"; }; // Moves player to marine // Optional `mover` argument which will check mover credentials to select // Credentials: Must be leader, must belong to team, must be turn to pick Gather.prototype.moveToMarine = function (user, mover) { - if (this.marines().length >= this.TEAM_SIZE) return; + if (this.marines().length >= this.teamSize) return; if (mover && this.containsUser(mover)) { let leader = this.getGatherer(mover); @@ -272,7 +273,7 @@ Gather.prototype.moveToMarine = function (user, mover) { // Credentials: Must be leader, must belong to team, must be turn to pick Gather.prototype.moveToAlien = function (user, mover) { - if (this.aliens().length >= this.TEAM_SIZE) return; + if (this.aliens().length >= this.teamSize) return; if (mover && this.containsUser(mover)) { let leader = this.getGatherer(mover); @@ -325,6 +326,7 @@ Gather.prototype.toJson = function () { startTime: this.electionStartTime(), interval: this.election.INTERVAL }, + teamSize: this.teamSize, done: { time: this.done.time }, diff --git a/lib/gather/gather_pool.js b/lib/gather/gather_pool.js index 3b83f13..3d62bdc 100644 --- a/lib/gather/gather_pool.js +++ b/lib/gather/gather_pool.js @@ -19,12 +19,13 @@ const GATHER_CONFIGS = [ { type: "public", name: "Public Gather", - description: "No requirements, 6v6" + description: "No Requirements" }, { - type: "skilled", - name: "Competitive Gather", - description: "Hive Requirements, 6v6" + type: "large", + name: "Large Gather", + description: "No Requirements", + teamSize: 7 } ]; diff --git a/spec/gather.js b/spec/gather.js index ad170f9..2b44763 100644 --- a/spec/gather.js +++ b/spec/gather.js @@ -41,6 +41,47 @@ describe("Gather Model:", function () { }); }); + describe("lobbyFull", () => { + let teamSize = 3; + beforeEach(() => { + gather = Gather({ teamSize: teamSize }) + }); + it ("returns false if lobby isn't full", () => { + assert.isFalse(gather.lobbyFull()); + gather.addUser(user); + assert.isFalse(gather.lobbyFull()); + }); + it ("returns true if lobby is full", () => { + gatherers.forEach((g, i) => { + if (i < 6) gather.addUser(g); + }); + assert.isTrue(gather.lobbyFull()); + }); + }); + + describe("leaderVotesFull", () => { + const teamSize = 3; + const gathererSubset = []; + let candidate; + + beforeEach(() => { + gather = Gather({ teamSize: teamSize }) + gatherers.forEach((g, i) => { + if (i < 6) gathererSubset.push(gather.addUser(g)); + }); + candidate = gatherers[0]; + }); + it ("returns false if leader votes are not all in", () => { + assert.isFalse(gather.leaderVotesFull()); + gather.voteForLeader(gathererSubset[1], candidate); + assert.isFalse(gather.leaderVotesFull()); + }); + it ("returns true if leader votes are all in", () => { + gathererSubset.forEach(g => gather.voteForLeader(g, candidate)); + assert.isTrue(gather.leaderVotesFull()); + }); + }); + describe("moveToMarine", function () { it ("moves a player to marine", function () { gather.addUser(user); @@ -52,7 +93,7 @@ describe("Gather Model:", function () { gatherers.forEach(function (gatherer, index) { gather.addUser(gatherer); gather.moveToMarine(gatherer); - assert.isTrue(gather.marines().length <= gather.TEAM_SIZE); + assert.isTrue(gather.marines().length <= gather.teamSize); }); }); describe("with mover argument", function () { @@ -106,7 +147,7 @@ describe("Gather Model:", function () { gatherers.forEach(function (gatherer, index) { gather.addUser(gatherer); gather.moveToAlien(gatherer); - assert.isTrue(gather.aliens().length <= gather.TEAM_SIZE); + assert.isTrue(gather.aliens().length <= gather.teamSize); }); }); describe("with mover argument", function () {