var errors = ""; var errorgame = 0; var output = ""; var oneline = ""; var normsum = 0; var rawscores = ""; var hof = ""; var other6s = ""; var normalgame = 35; function debug(o) { output += o; } var roundpts; var roundacros; var duppoints; var grosspts; var roompts; var missingrnds; var sums; var scores; var scoresa; var tot_players; var gamesep = "</td><td>&nbsp; "; var faceoffchar = "*"; var faceoffscore = "<b>" + faceoffchar + "</b> "; var missingchar = "_"; var missingscore = missingchar + ","; var recap = ""; var re_comma = /\,$/; var re_nonl = /[\r\n]/g; var re_nobr = /<BR>/gi; function extrainfo() { var codes = "xartyweflsbqjpoidcghkmnuvzxartyw"; return codes.substr(Math.floor(Math.random()*26),1) + Math.floor((Math.random()*100)) + codes.substr(Math.floor(Math.random()*26),2) + Math.floor((Math.random()*1000)); } function add_to_recap(s) { recap += s; } function add_br_to_recap() { recap += "<BR>"; } var tot_rounds; function score_round(rnd, faceoff, topic) { if (!faceoff) tot_rounds++; var countedvotes = -1; var roundtotal = -1; var numacros = -1; var playerscheck = new Array(); var bold1 = "<b>"; var bold2 = "</b>"; for (k in roundpts) { numacros++; roundtotal += roundpts[k]; if (k == roundwinner) countedvotes += roundpts[k]; else if (roundpts[k] > 1) countedvotes += roundpts[k]-1; if (!sums[k]) sums[k] = 0; if (rnd == 1) { scores[k] = scores[k].replace(re_comma, ""); scores[k] += gamesep; } if (faceoff) scores[k] += faceoffscore; else { roompts += roundpts[k]; scores[k] += bold1 + roundpts[k] + bold2 + ","; scoresa[k][scoresa[k].length] = roundpts[k]; sums[k] = Number(sums[k]) + Number(roundpts[k]); } bold1 = bold2 = ""; playerscheck[k] = 1; } if (!faceoff) { for (k in scores) { if (!playerscheck[k]) { scores[k] += (rnd == 1 ? gamesep : "") + missingscore; scoresa[k][scoresa[k].length] = 0; missingrnds++; } } } roundtotal -= roundpts[roundwinner]; var roundvotes = (numacros > roundtotal) ? numacros : roundtotal; if (countedvotes > roundvotes) roundvotes = countedvotes; roundvotes -= duppoints; if (!faceoff && roundpts[roundwinner] >= 6) { makehofrow (topic, roundwinner, winningacro, roundpts[roundwinner], roundvotes); } } function makehofrow(topic, roundwinner, winningacro, winnerpts, roundvotes) { if (winnerpts > roundvotes) roundvotes = winnerpts; var td1 = "<td>", td2 = "</td>\n"; var newrow = "<tr>" + "<td align=\"center\">WEEK " + td2 + td1 + roundwinner + td2 + td1 + topic + td2 + td1 + winningacro + td2 + td1 + (100*winnerpts/roundvotes).toFixed(1) + "&nbsp;(" + winnerpts + "/" + roundvotes + ")" + td2 + "</tr>"; if (winnerpts*2 > roundvotes) hof += newrow; else other6s += newrow; } function checkdupacro(acro) { var i; var lcacro = acro.toLowerCase(); for (i = 0; i < roundacros.length; i++) { if (roundacros[i] == lcacro) return 1; } roundacros[i] = lcacro; return 0; } function showta() { var i,j,k; var newtext = document.getElementById("newtext"); var first = 0; var player, acro, points, letters; var colon; recap = ""; hof = ""; other6s = ""; var game = 1; var faceoff = 0; tot_rounds = 0; missingrnds = 0; sums = new Array(); scores = new Array(); scoresa = new Array(); roundpts = new Array(); roundacros = new Array(); duppoints = 0; grosspts = new Array(); roompts = 0; oneline = ""; normsum = 0; rawscores = ""; output = "<b>Bold</b> indicates round winner, <BR>\n" + faceoffchar + " indicates faceoff round (not counted)<BR>\n" + missingchar + " indicates no score for that round<BR>\n" + "<BR>\n"; var prev_round = 0, round = 0; var topic = "", prev_topic = "", chat_topic = ""; var re_scor = /SCORING FOR ROUND (\d+)/; var re_endscor = /\'\*+\s*$/; var re_rcv = /(.*) received (\d+) point.s. for '(.*)'/; var re_startround = /Starting Round (\d+)\.\s*/; var re_topic = /The topic is (.*)\.\s*$/; var re_topic2 = /TOPIC:+(.*)\s*$/; var re_chat = /^[{*]/; var re_final = /^Final Scores: (.*) - (\d+) points./; var re_endofgame = / FINAL SCORES /; var Start = new Date(); var ta=document.getElementById("TA"); var tarr1=ta.value.split('\n'); var tarr=new Array(); j=0; for (i=0; i<tarr1.length; i++) { if (!tarr1[i].match(re_chat) || tarr1[i].match(re_topic2)) { tarr[j++]=i; if (tarr1[i].match(re_rcv)) { var k=RegExp.$1; if (!scores[k]) scores[k]="#"; grosspts[k]=0; } } } tot_players=0; for (k in scores) { scores[k]=""; scoresa[k]=new Array(); tot_players++; } var state_is_rcvlines=0; for (i=0; i<tarr.length; i++) { var line=tarr1[tarr[i]]; if (state_is_rcvlines && !line.match(re_rcv) && !line.match(re_endscor)) { alert( "Unexpected or incomplete line among scores\nGame: " + (game-1) + " Round: " + round + " - Scoring aborted\n>>>>" + line); return; } if (line.match(re_startround)) { round = RegExp.$1; topic = line.match(re_topic) ? RegExp.$1 : ""; if (round == 1) { add_br_to_recap(); add_to_recap("<b> Game " + (game++) + "</b>"); add_br_to_recap(); } } else if (line.match(re_topic2)) { chat_topic = RegExp.$1; chat_topic = chat_topic.replace(re_nonl, ""); } else if (line.match(re_endofgame)) { if (prev_round > 0) { score_round(prev_round, faceoff, prev_topic); prev_round = 0; } } else if (line.match(re_scor)) { state_is_rcvlines = 1; var r = RegExp.$1; if (r - prev_round != 1) alert("Round Numbers not in sequence: " + prev_round + " -> " + r ); if (prev_round > 0) score_round(prev_round, faceoff, prev_topic); if (r == round) faceoff = 0; else { if (!faceoff) { add_br_to_recap(); add_to_recap("<b>Faceoff:</b>"); add_br_to_recap(); } add_br_to_recap(); faceoff = 1; } round = r; letters = ((round-1) % 5) + 3; first = 1; roundpts = new Array(); roundacros = new Array(); duppoints = 0; prev_round = round; if (chat_topic) { topic = chat_topic; chat_topic = ""; } colon = ""; if (topic && topic.charAt(0) != ':') colon = ": "; if (!faceoff) { add_br_to_recap(); add_to_recap("<u>Round "+ round + colon + topic + "</u>"); add_br_to_recap(); } prev_topic = topic; topic = ""; } else if ( line.match(re_endscor) ) { state_is_rcvlines = 0; } else if ( line.match(re_rcv) ) { player = RegExp.$1; points = RegExp.$2; acro = RegExp.$3; if (checkdupacro(acro)) duppoints += Number(points); if (!grosspts[player]) grosspts[player] = 0; grosspts[player] += Number(points); if (first == 1) { if (points > Number(letters)) points -= Number(letters); roundwinner = player; winningacro = acro; } roundpts[player] = Number(points); if (points > 4 && !faceoff) { player = "<b>" + player; acro = acro + "</b>" + " (" + points + " votes)"; } if (points > 2 || faceoff || first) { add_to_recap(player + ": " + acro); add_br_to_recap(); } first = 0; } else if ( line.match(re_final) ) { player = RegExp.$1; points = RegExp.$2; if (!grosspts[player]) grosspts[player] = 0; if ( Number(points) != Number(grosspts[player])) { if (game-1 != errorgame) { errors += "<br>"; errorgame = game-1; } var n = Number(points) - Number(grosspts[player]); errors += "* <b>" + n + "</b> points missing for <b>" + player + "</b> in game " + (game-1) + "<BR>"; } grosspts[player] = 0; } } if (prev_round > 0) {score_round(prev_round, faceoff, prev_topic); prev_round = 0;} var avgplayers = tot_players * (tot_rounds*tot_players-missingrnds) / (tot_rounds*tot_players); var adjfact = avgplayers * normalgame / roompts; output += "<table border=0>\n"; var outa=new Array(); var sep = "=|_|="; i = 0; for (k in sums) outa[i++] = (999999-sums[k]) + sep + k + sep + sums[k]; outa.sort(); var elem; for (i in outa) { elem = outa[i].split(sep); k = elem[1]; output += "<tr>" + "<td align=right>" + (Number(i)+1) + ".</td>" + "<td>" + elem[1] + "</td>" + "<td align=right>" + elem[2] + "</td>" + "<td>" + scores[k].replace(re_comma, "") + "</td>" + "</tr>\n"; if (i > 0) { oneline += ","; rawscores += ","; if (i % 4 == 0) {oneline += "<br>"; rawscores += "<br>";} oneline += "\n"; rawscores += "\n"; } rawscores += " &nbsp; "; rawscores += elem[1] + " " + elem[2]; var normscore = Math.round(elem[2]*adjfact); oneline += " &nbsp; " + elem[1] + " " + normscore; normsum += Number(normscore); } var avgplayersrounded = Math.round(100*avgplayers) / 100; var avgscore = Math.round(100*roompts/avgplayersrounded) / 100; output += "<tr>\n" + "<td>&nbsp;</td>\n" + "<td><b>Total Room Points</b></td>\n" + "<td align=right><b>" + roompts + "</b></td>\n" + "<td>&nbsp;</td>\n" + "<th colspan=5>" + tot_rounds + " rounds &nbsp; &nbsp; " + + avgplayersrounded + " Players/Round &nbsp; &nbsp; " + "Average score: " + avgscore + "</th>\n" + "</tr>\n"; oneline += "<br>\n(Total: " + normsum + ")\n"; output += "</table>\n"; var scoresummary = "<u><b>Total scores:</b></u><BR>\n" + rawscores + "<BR>\n"; var usenormalize = 0; if (usenormalize != 0) scoresummary += "<BR>" + "<u><b>" + "Scores averaging " + normalgame + ":</b></u><BR>\n" + oneline; oneline = scoresummary; if (errors != "") { errors = "<BR><HR>" + "<b>Final game scores not matching round totals</b><BR>" + errors + "<BR>" + "Possible causes: <BR>" + "-- \"voted for best acro\" points, without an acro<BR>" + "-- missing or incorrect lines in log file<BR>" + "<HR>"; } errors = ""; if (hof.length > 0) hof = "<BR><u><b>Hall of Fame Candidates</b></u><br><br>" + "<table cellpadding=\"2\" border=\"1\">" + hof + "</table><br>"; else if (other6s.length > 0) { hof = "<BR>No Hall of Fame Candidates<br><br>"; } if (other6s.length > 0) other6s = "<BR><u>Non-HOF Acros with 6 or more votes</u><br><br>" + "<table cellpadding=\"2\" border=\"1\">" + other6s + "</table><br>"; var newtext = document.getElementById("newtext"); newtext.innerHTML = errors + "<div class=bbstext11>\n" + "<center>" + output + "<BR>" + oneline + "<BR>" + hof + other6s + "<table>" + recap + "</table>" + "</center>" + "</div>"; output = output.replace(re_nonl, ""); oneline = oneline.replace(re_nonl, ""); recap = recap.replace(re_nonl, ""); hof = hof.replace(re_nonl, ""); other6s = other6s.replace(re_nonl, ""); output = output.replace(re_nobr,"\n"); oneline = oneline.replace(re_nobr, "\n"); recap = recap.replace(re_nobr, "\n"); hof = hof.replace(re_nobr, "\n"); other6s = other6s.replace(re_nobr, "\n"); var scoretable = document.getElementById("scoretable"); scoretable.value = output + "\n\n" + oneline + hof + other6s + recap; var Finish = new Date(); var timetaken = Number( (Finish.getSeconds()-Start.getSeconds()) * 1000 + (Finish.getMilliseconds()-Start.getMilliseconds()) ); if (timetaken < 0) (timetaken += 60000); } 