Skip to content

Instantly share code, notes, and snippets.

@ekzhang
Created July 18, 2016 19:37
Show Gist options
  • Save ekzhang/e02f1160e031eacc2aa5a9c83e499ffd to your computer and use it in GitHub Desktop.
Save ekzhang/e02f1160e031eacc2aa5a9c83e499ffd to your computer and use it in GitHub Desktop.
Code for Voting Game in the AoPS Schoolhouse
'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