Created
July 18, 2016 19:37
-
-
Save ekzhang/e02f1160e031eacc2aa5a9c83e499ffd to your computer and use it in GitHub Desktop.
Code for Voting Game in the AoPS Schoolhouse
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'use strict'; | |
var ROOM_ID = prompt('What Room ID to use?'); | |
var playing = false; | |
var cqueue = []; | |
var mqueue = []; | |
var votes = {}; | |
var players = new Set([]); | |
var joinInterval; | |
var prevMsg = ''; | |
var _doInput = App.getWindow(ROOM_ID).doInput; | |
App.getWindow(ROOM_ID).doInput = function(data) { | |
mqueue.push(data); | |
}; | |
function info(msg) { | |
if (msg) { | |
cqueue.push(msg); | |
} | |
} | |
function add_player(name) { | |
players.add(name); | |
votes[name] = new Set([]); | |
} | |
function show_players() { | |
info('Players: ' + Array.from(players).join(', ')); | |
} | |
joinInterval = setInterval(show_players, 10000); | |
function unvote(acting) { | |
Object.keys(votes).forEach(function(key, index) { | |
votes[key].delete(acting); | |
}); | |
} | |
function vote(acting, target) { | |
var ar = Array.from(players); | |
for (var i = 0; i < ar.length; i++) { | |
if (ar[i].startsWith(target)) { | |
votes[ar[i]].add(acting); | |
return; | |
} | |
} | |
} | |
function votecount() { | |
var not_voting = new Set(Array.from(players)); | |
var ret = '[color=red][u]Votecount:[/u]\n'; | |
Object.keys(votes).forEach(function(player) { | |
if (votes[player].size > 0) { | |
ret += '[b]' + player + ' (' + votes[player].size.toString() + '):[/b] '; | |
var voter; | |
var iter = votes[player].entries(); | |
while ((voter = iter.next().value) != undefined) { | |
not_voting.delete(voter[0]); | |
ret += voter[0] + ', '; | |
} | |
ret = ret.slice(0, ret.length - 2) + '\n'; | |
} | |
}); | |
ret += '\n'; | |
ret += '[i]Not Voting (' + not_voting.size.toString() + '):[/i] ' + Array.from(not_voting).join(', '); | |
var amt = players.size; | |
ret += '\n[i]With ' + amt.toString() + ' alive, it takes ' + Math.floor((amt+1)/2).toString() + ' to lynch[/i]'; | |
ret += '[/color]'; | |
return ret; | |
} | |
function end_game() { | |
info('Congrats to the winners: ' + Array.from(players).join(', ')); | |
playing = false; | |
players = new Set([]); | |
votes = {}; | |
joinInterval = setInterval(show_players, 10000); | |
} | |
function join_all() { | |
$('.user-list .user').each(function() { | |
Classroom.socket.onPluginMessage({ | |
mod: false, | |
'room-id': ROOM_ID, | |
speaker: $(this).text(), | |
action: 'public-message-event', | |
message: '~~join' | |
}); | |
}); | |
} | |
function god_kill(player) { | |
for (var i = 0; i < (players.size + 1) / 2; i++) { | |
votes[player].add('fz' + Math.floor(Math.random() * 10) | |
+ Math.floor(Math.random() * 10) | |
+ Math.floor(Math.random() * 10) | |
+ Math.floor(Math.random() * 10)); | |
} | |
} | |
setInterval(function() { | |
var msg; | |
if (cqueue.length > 0) { | |
msg = cqueue.shift(); | |
} | |
else if (mqueue.length > 0) { | |
msg = mqueue.shift(); | |
} | |
if (msg && msg != prevMsg) { | |
_doInput(msg); | |
prevMsg = msg; | |
} | |
}, 1050); | |
setInterval(function() { | |
var e = $('div.message-wrapper.is-me').last(); | |
if (!(e == undefined || e.hasClass('mod-executed'))) { | |
var name = e[0].children[0].innerHTML.trim().slice(0, -1); | |
var msg = e[0].children[1].innerHTML; | |
var cmdre = /~~([\w_]+)\s*([^~]+)?/ig; | |
var x; | |
while ((x = cmdre.exec(msg)) != null) { | |
var pre = x[1]; | |
var rest = x[2]; | |
if (pre.startsWith('start')) { | |
playing = true; | |
info(votecount()); | |
clearInterval(joinInterval); | |
joinInterval = -1; | |
} | |
else if (pre.startsWith('end') && playing) { | |
end_game(); | |
} | |
e.addClass('mod-executed'); | |
} | |
} | |
$('div.message-wrapper:not(.executed)').each(function(idx) { | |
var cmdre = /~~([\w_]+)\s*([^~]+)?/ig; | |
var name = $(this)[0].children[0].innerHTML.trim().slice(0, -1); | |
var msg = $(this)[0].children[1].innerHTML; | |
var x; | |
while ((x = cmdre.exec(msg)) != null) { | |
var pre = x[1]; | |
var rest = x[2]; | |
if (pre.startsWith('join') && !playing) { | |
add_player(name); | |
} | |
else if (pre.startsWith('leave')) { | |
players.delete(name); | |
delete votes[name]; | |
} | |
else if (playing && players.has(name)) { | |
if (pre.startsWith('v') && rest) { | |
unvote(name); | |
vote(name, rest.trim()); | |
info(votecount()); | |
var lynched = null; | |
Object.keys(votes).forEach(function(player) { | |
if (votes[player].size > (players.size - 1) / 2) { | |
lynched = player; | |
} | |
}); | |
if (lynched) { | |
info(lynched + ' HAS BEEN VOTED OUT.'); | |
players.delete(lynched); | |
delete votes[lynched]; | |
Object.keys(votes).forEach(function(player) { | |
votes[player].clear(); | |
}); | |
info(votecount()); | |
if (players.size <= 2) { | |
end_game(); | |
} | |
} | |
} | |
else if (pre.startsWith('unvote')) { | |
unvote(name); | |
info(votecount()); | |
} | |
else if (pre.startsWith('leave')) { | |
unvote(name); | |
players.delete(name); | |
delete votes[name]; | |
info(votecount()); | |
if (players.size <= 2) { | |
end_game(); | |
} | |
} | |
} | |
} | |
$(this).addClass('executed'); | |
}); | |
}, 500); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment