• Log InLog In
  • Register
Liquid`
Team Liquid Liquipedia
EDT 15:31
CEST 21:31
KST 04:31
  • Home
  • Forum
  • Calendar
  • Streams
  • Liquipedia
  • Features
  • Store
  • EPT
  • TL+
  • StarCraft 2
  • Brood War
  • Smash
  • Heroes
  • Counter-Strike
  • Overwatch
  • Liquibet
  • Fantasy StarCraft
  • TLPD
  • StarCraft 2
  • Brood War
  • Blogs
Forum Sidebar
Events/Features
News
Featured News
Classic wins Code S Season 2 (2025)15Code S RO4 & Finals Preview: herO, Rogue, Classic, GuMiho0TL Team Map Contest #5: Presented by Monster Energy6Code S RO8 Preview: herO, Zoun, Bunny, Classic7Code S RO8 Preview: Rogue, GuMiho, Solar, Maru3
Community News
Esports World Cup 2025 - Final Player Roster5Weekly Cups (June 16-22): Clem strikes back0Weekly Cups (June 9-15): herO doubles on GSL week4Firefly suspended by EWC, replaced by Lancer12Classic & herO RO8 Interviews: "I think it’s time to teach [Rogue] a lesson."2
StarCraft 2
General
Esports World Cup 2025 - Final Player Roster The SCII GOAT: A statistical Evaluation Nexon wins bid to develop StarCraft IP content, distribute Overwatch mobile game Classic wins Code S Season 2 (2025) Weekly Cups (June 16-22): Clem strikes back
Tourneys
EWC 2025 Online Qualifiers (May 28-June 1, June 21-22) RSL: Revival, a new crowdfunded tournament series Monday Nights Weeklies WardiTV Mondays Sparkling Tuna Cup - Weekly Open Tournament
Strategy
How did i lose this ZvP, whats the proper response Simple Questions Simple Answers [G] Darkgrid Layout
Custom Maps
[UMS] Zillion Zerglings
External Content
Mutation # 479 Worn Out Welcome Mutation # 478 Instant Karma Mutation # 477 Slow and Steady Mutation # 476 Charnel House
Brood War
General
BGH Auto Balance -> http://bghmmr.eu/ Soma Explains: JaeDong's Defense vs Bisu StarCraft & BroodWar Campaign Speedrun Quest bonjwa.tv: my AI project that translates BW videos BW General Discussion
Tourneys
[Megathread] Daily Proleagues [BSL20] ProLeague Bracket Stage - WB Finals & LBR3 [BSL20] ProLeague Bracket Stage - LB Round 4 & 5 [ASL19] Grand Finals
Strategy
I am doing this better than progamers do. Simple Questions, Simple Answers [G] How to get started on ladder as a new Z player
Other Games
General Games
Stormgate/Frost Giant Megathread Nintendo Switch Thread Path of Exile What do you want from future RTS games? Beyond All Reason
Dota 2
Official 'what is Dota anymore' discussion
League of Legends
Heroes of the Storm
Simple Questions, Simple Answers Heroes of the Storm 2.0
Hearthstone
Heroes of StarCraft mini-set
TL Mafia
Vanilla Mini Mafia TL Mafia Community Thread
Community
General
US Politics Mega-thread Things Aren’t Peaceful in Palestine Russo-Ukrainian War Thread UK Politics Mega-thread Echoes of Revolution and Separation
Fan Clubs
SKT1 Classic Fan Club! Maru Fan Club
Media & Entertainment
Anime Discussion Thread [Manga] One Piece [\m/] Heavy Metal Thread Korean Music Discussion
Sports
2024 - 2025 Football Thread TeamLiquid Health and Fitness Initiative For 2023 NHL Playoffs 2024 Formula 1 Discussion
World Cup 2022
Tech Support
Computer Build, Upgrade & Buying Resource Thread
TL Community
The Automated Ban List
Blogs
How Pro Gamers Cope with Str…
TrAiDoS
StarCraft improvement
iopq
Heero Yuy & the Tax…
KrillinFromwales
I was completely wrong ab…
jameswatts
Need Your Help/Advice
Glider
Trip to the Zoo
micronesia
Customize Sidebar...

Website Feedback

Closed Threads



Active: 30290 users

Votecount Formatter (Google Spreadsheet)

Forum Index > TL Mafia
Post a Reply
cakepie
Profile Blog Joined November 2012
985 Posts
Last Edited: 2017-03-14 23:22:19
November 16 2016 08:34 GMT
#1

Votecount Formatter
                                                                                     powered by Google Sheets

▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁
│       About       │       Download       │       Changelog       │       User Guide       │       Technical       │
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔

[image loading]
Fill in three columns, and spreadsheet magic will take care of the rest.


◈ About
  • Three-column vote input
  • Validated usernames — dropdown list + tab-completion
  • Automatically determines who was unvoted
  • Supports no-lynch (can be disabled)
  • Supports mid-phase replacements

  • Fully formatted votecount — copy-paste, no bbcode wrangling
  • Automatically sorted wagons with built-in tiebreaking
  • Customizable votecount header and message
  • Sequential list of votes for EoD votecount
  • URL backlinks to vote/unvote posts

  • Site-agnostic links — players remain where they are logged on (i.e. teamliquid.net, liquiddota, liquidlegends)

  • Magic cells are protected against inadvertent changes and will warn if you try to edit them

Accolades
this is awesome!
                        ― phagga
what phagga said :D
                        ― [UoN]Sentinel
Sexy work with the url tracks. Under appreciated.
                                                                        ― Mocsta
Those vote counts were beautiful
                                                      ― kitaman27
i may want to steal your template in all honesty lol ><
                                                                              ― rsoultin


Acknowledgements
Huge thanks goes out to the hosts/cohosts of games where in-development versions of the spreadsheet were tested, especially those who were subjected to the frequent breakages, bugfixes and new features of the very earliest versions.
  • Thug Life: [UoN]Sentinel, phagga
  • Hogwarts: Ange777, FirmTofu, Corazon
  • Newbie Student 9: kitaman27, rsoultin
  • Newbie Student 10: -Celestial-, KelsierSC

△ Back to Page Top

◈ Download
Hit the link below to grab a copy of the latest template to work with.
You must be logged in to your Google account; this will make a copy of the spreadsheet in your Google Drive space.

Make sure that you read the manual first!
✱ Seriously, RTFM. Don't be that PEBKAC who failed to follow instructions.

▶▶▶▶▶ GET A COPY ◀◀◀◀◀
current version: 2016-11-15 RC1


Help / Support
First and foremost, RTFM!

If you have questions or encounter problems that have not already been covered in the manual, post in this thread for help.
Please do not send me tech support questions by PM or email.

License

[image loading]
 CC-BY-NC-SA 4.0


This spreadsheet template is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 License.
+ Show Spoiler [Additional Specifics] +
Additional Specifics
  • Don't be a dick.

  • No warranties. Always check the votecount output!

  • If you modify the template, or use a modified version of the template, don't expect me to help you if it breaks.

  • Modifying for use on TL: it is preferable to maintain a single version of the template for the whole community, than to have a confusing multitude of modified versions. Talk to me first, or if I'm not around, sort it out by consensus.

  • Modifying for use on other sites: please do me a courtesy and let me know in advance.

  • If you publicly release a modified version, please provide clear attribution and include a link back:
          TL Mafia Google Spreadsheet Votecount Formatter by cakepie
          http://www.teamliquid.net/forum/mafia/516417-votecount-formatter-google-spreadsheet



△ Back to Page Top
cakepie
Profile Blog Joined November 2012
985 Posts
Last Edited: 2017-03-14 23:22:24
November 16 2016 08:34 GMT
#2
◈ Changelog

Current Version:
2016-12-06 Documentation completed
2016-11-15 Release Candidate 1

+ Show Spoiler [Older] +
Previous Versions
2016-11-10 No-lynch handling, site-agnostic absolute-path URLs
2015-05-23 Bugfix for non-voters
2015-05-21 New tiebreak rules, customizable output
2013-10-17 Closed Beta
2013-10-06 Multiple vote changes in single post
2013-10-03 Added auto-sorting, non-voters, spoilered details
2013-09-27 Initial alpha: count votes, format wagons


△ Back to Page Top
cakepie
Profile Blog Joined November 2012
985 Posts
Last Edited: 2017-03-14 23:22:35
November 16 2016 08:34 GMT
#3
◈ User Guide

✱ A basic understanding of how to edit/share/use Google Drive/spreadsheets is assumed.


Contents
  1. Important Notes READ ME FIRST!
          1.1  Tiebreaking rules
          1.2  Things that will break the spreadsheet
          1.3  Common mistakes

  2. Routine Operations
          2.1  Before game start
          2.2  At start of each day phase
          2.3  Regular votecounts
          2.4  Mid-phase replacements
          2.5  Final votecount

  3. Unusual Situations
          3.1  Multiple vote changes in single post
          3.2  Self-voting where not permitted

  4. Fixes / Workarounds
          4.1  Undo/revert
          4.2  Omitted votes/unvotes (copy-and-paste is safe)
          4.3  Votes/unvotes not in sequential order (use another spreadsheet)

△ Back to Page Top

1. Important Notes
This section contains important information and instructions that are critical to correct usage and error prevention.
Make sure that you read and understand!


1.1 Tiebreaking rules
The tiebreak rule used by the spreadsheet is as follows:
If there is a tie for most votes, whoever most recently had more votes than the other(s) is the person who is up for the lynch.

Explanation
Suppose two players are tied at N votes at the end of the day.
The crux is, which wagon was ahead just before they became tied.
All possible cases can be broken down as follows:
  • Both wagons were at N-1 votes, and reached N votes by being voted up.
    The player who was voted up earlier will be lynched.
    + Show Spoiler [example] +
    Vote Count: ...(more votes)..., Y:N-1, Z:N-1, ...(less votes)...

    ...(votes and unvotes not involving Y or Z)...
    ##vote:Z
    ##vote:Y
    ...(votes and unvotes not involving Y or Z)...

    Vote Count: Z:N, Y:N, ...(less votes)...

    Player Z will be lynched: just before they became tied, Z already had N votes whereas Y was still at N-1.


  • Both wagons were at N+1 votes, and reached N votes by being unvoted down.
    The player who was unvoted down later will be lynched.
    + Show Spoiler [example] +
    Vote Count: ...(more votes)..., Y:N+1, Z:N+1, ...(less votes)...

    ...(votes and unvotes not involving Y or Z)...
    ##unvote (Y)
    ##unvote (Z)
    ...(votes and unvotes not involving Y or Z)...

    Vote Count: Z:N, Y:N, ...(less votes)...

    Player Z will be lynched: just before they became tied, Z still had N+1 votes whereas Y was already at N.


  • One wagon was at N-1 votes before being voted up. The other was at N+1 votes before being unvoted down.
    The player who had N+1 votes will be lynched.
    + Show Spoiler [examples] +
    Vote Count: ...(more votes)..., Z:N+1, ..., Y:N-1, ...(less votes)...

    ...(votes and unvotes not involving Y or Z)...
    ##unvote (Z)
    ##vote:Y
    ...(votes and unvotes not involving Y or Z)...

    Vote Count: Z:N, Y:N, ...(less votes)...

    Player Z will be lynched: just before they became tied, Z already had N votes whereas Y was still at N-1.

    Vote Count: ...(more votes)..., Z:N+1, ..., Y:N-1, ...(less votes)...

    ...(votes and unvotes not involving Y or Z)...
    ##vote:Y
    ##unvote (Z)
    ...(votes and unvotes not involving Y or Z)...

    Vote Count: Z:N, Y:N, ...(less votes)...

    Player Z will be lynched: just before they became tied, Z still had N+1 votes whereas Y was already at N.
It is fairly straightforward to extend the rule to cases with more than two players tied for most votes.
If you have trouble with it, simply consider each pair and eliminate players until one remains.


1.2 Things that will break the spreadsheet
While every effort has been made to protect sensitive magical parts of the spreadsheet from inadvertent modification, it is still possible in some cases for the spreadsheet to be broken due to incorrect use.
Follow these rules at all times to avoid breaking the spreadsheet!
  • Do not touch shaded or colored cells. Only edit white cells.

  • Do not add or remove rows. Spreadsheet formulas don't adjust automatically for that.

  • Do not move data around within the spreadsheet. This means:
          - do not cut-and-paste from one part of the spreadsheet to another
          - do not drag-and-drop a selection of data within the spreadsheet
    The spreadsheet will try to be too clever and update formulas to reflect the new location of the moved data.
    This defeats whatever purpose you had intended by moving the data!
    Pasting stuff copied from elsewhere is okay.

  • If you messed up during vote input and need to fix something, consult the section on Fixes / Workarounds.


1.3 Common mistakes
Not spreadsheet-breaking disasters, but these mistakes may cause the spreadsheet output to be incorrect or inaccurate.
Most of these have to do with ensuring that tiebreaking rules function correctly.
  • Votes must be entered in sequential (chronological) order!
    If you've missed a vote somewhere, do not simply tack it on later in the sheet!

  • Even if an ##Unvote is not accompanied by a new vote, it must still be entered into the sheet in sequential
    order alongside other voting activity. Input the post URL and voter, but leave the votee blank.
    Do not skip/defer it and wait until the next time the player casts a vote.

  • Multiple vote changes in single post must all be entered into the sheet in sequential order.
    Do not elide all but the last vote! See here for how to handle this, and why this matters.

  • If you messed up during vote input and need to fix something, consult the section on Fixes / Workarounds.


▲ User Guide Contents
△ Back to Page Top

2. Routine Operations
This section covers how to use the spreadsheet for all routine situations over the course of a game.


2.1 Before game start
  • Check this thread for news/updates, and familiarize yourself with any changes since last time.

  • Ensure that you have specified the correct tiebreak rules in your game thread.

  • Grab a fresh copy of the spreadsheet template and rename it, e.g. "Imaginary Mafia Votecount Template"

  • Configure the template for your game. On the "Config" sheet:

    • Set the EoD deadline time (Cell B2). We'll change the date later.

    • Customize the votecount header (Cell B1) and error message (Cell B5) if desired.

    • If your game does not allow no-lynching, turn it off (Cell B6).

    • (not recommended)
      If you insist on using a separate voting thread, toggle Cell B3 and specify the voting thread URL (Cell B4).
      Unhide Cell B7 and turn off URL backlinks — no point having them if they don't point to meaningful context.

      Please reconsider: using this spreadsheet without a separate voting thread is tremendously helpful to players for finding the context of where and when each vote was made, and the reasoning given for the vote.

  • Once you have your full roster of players, go to the "Player List" sheet and fill their names into Column A.


2.2 At start of each day phase
  • Start with your template, i.e. "Imaginary Mafia Votecount Template", and do the following:

    • On the "Config" sheet, set the deadline date for the new day phase (Cell B2).

    • On the "Player List" sheet, delete the names of players who were killed since the previous daypost.
      It is okay to leave gaps where you've deleted names; there is no need to pack/tidy the list.

    • Replacements — do not use Column B of the "Player List" sheet at this point.
      If a player has already been replaced at or before day start, just update the name in Column A.
      If you're still looking for a replacement, leave the old player name as-is — it is still a valid vote target.
      Basically, Column A should reflect the up-to-date player roster at day start.

  • Make a copy of your template and rename it for the new day, e.g. "Imaginary Mafia Votecount Day X"
    Use this copy (not the template!) for your votecounts.


2.3 Regular votecounts
  • You should be working with the votecount sheet for the day, i.e. "Imaginary Mafia Votecount Day X"

  • Enter all voting activity on the "Vote Input" sheet, in sequential (chronological) order.

    • Column A: post link
      This is the URL which points directly to the post where the vote/unvote occurred.
      You can obtain this either by:

      • Right-click on the timestamp shown at the upper right of the post, and select "Copy Link Location"
        (or something similar, depending on your browser). You can then paste the link, it should look like:
              http://www.teamliquid.net/forum/viewpost.php?post_id=26181643

      • Click on the timestamp, then manually copy the URL from your browser's address bar.
        It should look something like this:
              http://www.teamliquid.net/forum/mafia/516417-votecount-formatter-google-spreadsheet?page=1#3

      Either version of the link will work just fine. However, it is advisable choose one and stick to it consistently
      ― this permits checking at a glance that the post numbers are in increasing order. (It also looks nicer.)

    • Column B: voter
      Straightforward: this is the name of the player who made the vote/unvote.
      Pick from the dropdown list, or type in the name. You can type in part of the name and hit tab to autocomplete.

    • Column C: votee
      The person who got voted. Again, pick from the dropdown, type it in, or use autocomplete.
      A new vote will automatically cancel the last vote cast by the same voter; you can verify Column D: unvotee.
      For an explicit ##Unvote that is not accompanied by a new vote, fill in the post link and voter as per above,
      but leave the votee blank. Again, verify the unvotee shown in Column D.

    • Always double check to make sure you haven't accidentally omitted any vote/unvote.
      If you messed up during vote input and need to fix something, consult the section on Fixes / Workarounds.

  • Obtain the votecount output from the "Output" sheet.

    • For regular votecounts, there is no need to include the spoiler with the complete list of votes.
      Just copy everything up to the line that reads "If you see any vote out of place".

    • After pasting into TL, there is one small bit you have to edit by hand.
      Find the part that reads "XX hours from this post" and edit it accordingly, e.g. "12 hours" for a T-12h votecount.
      Note that this should be a static number ― there is already a live countdown included on the next line.

    • Always preview the post first to make sure everything is perfect before posting up.

  • PROTIP: Each time you post a votecount, add a border under the last vote in the "Vote Input" sheet.
    Then, as new votes are added, you can easily see at a glance how many changes there have been.
    Few changes = you can wait on the next vote count; many changes = another votecount soon.


2.4 Mid-phase replacements
  • You should be working with the votecount sheet for the day, i.e. "Imaginary Mafia Votecount Day X"

  • Do not make changes to Column A of the "Player List" sheet once the day phase is underway!

  • If you need to replace someone, but don't have a replacement player yet, leave the original player's name as-is.

  • When you have secured confirmation from your replacement player that they are ready to play
    Fill in the replacement's name in Column B of the "Player List" sheet, next to the original player's name.
    (Also: don't forget to update Column A at the start of the next day phase.)


2.5 Final votecount
  • The final votecount is slightly different from regular votecounts, and requires a bit more editing:

    • Select the whole "Output" sheet (Ctrl-A), then copy and paste it into TL.

    • Edit the heading so that it reads "Final Vote Count" (or whatever you want to call it).

    • Remove the notices regarding the voting deadline, leaving the bit about "person is set to be lynched!"

    • This time, include the spoiler with the complete list of votes, for players who want to do VCA.

  • WARNING: This is your last chance to double check everything!
    There is no turning back once the nightpost is up with the flip.

  • Once done, you can file the votecount spreadsheet away, you'll be using a fresh new one next dayphase.


▲ User Guide Contents
△ Back to Page Top

3. Unusual Situations
Because weird things happen sometimes.


3.1 Multiple vote changes in single post
On occasion, you might encounter a player who makes multiple vote changes within the same post, like this.
Such behavior may be an attempt by the player to create a particular scenario with tied wagons and/or tiebreaking rules.
In order to ensure that tiebreaking functionality of the spreadsheet works correctly, it is imperative that all of the vote changes must be entered into the sheet in sequential order. Do not simply count the last vote and ignore the rest!

Example:
A: ##Vote: X      (post #124)
Y: ##Vote: Z      (post #129)
Z: ##Vote: Y      (post #135)
Vote Count
X (1): A
Z (1): Y
Y (1): Z
In this three-way tie, X will be lynched over Z, then Y.
X: ##Vote: Y      (post #141)
B: ##Vote: Z      (post #148)
Vote Count
Y (2): Z, X
Z (2): Y, B
X (1): A
Now Y and Z are tied; Y will be lynched.
A:      (post #157)
No. Y is town. X is scum.
Z might be scum with X, but it's X we really need to lynch today.

##Unvote
##Vote Z
##Unvote
##Vote X
Vote Count
Z (2): Y, B, A
Y (2): Z, X
X (1): A, A
Player A will want to keep trying to convince both B and Y to switch onto X.
But, if neither budges, the tiebreak will see Z lynched over Y.

Failing to properly count/input player A's post #157 here will result in Y being lynched over Z.

The correct way to input this example into the spreadsheet looks like this:
post link                                     voter   votee   unvotee
---------------------------------------------------------------------
/forum/mafia/000-imaginary-mafia?page=7#124 A X
/forum/mafia/000-imaginary-mafia?page=7#129 Y Z
/forum/mafia/000-imaginary-mafia?page=7#135 Z Y
/forum/mafia/000-imaginary-mafia?page=8#141 X Y
/forum/mafia/000-imaginary-mafia?page=8#148 B Z
/forum/mafia/000-imaginary-mafia?page=8#157 A Z X
/forum/mafia/000-imaginary-mafia?page=8#157 A X Z
Note how player A's post #157 occupies two rows with the same post URL (corresponding to two unvote-vote pairs).


3.2 Self-voting where not permitted
Some games allow players to vote themselves, others don't.

By default, it is possible to input a self-vote into the spreadsheet; however, it has no mechanism for detecting or rejecting self-votes. Therefore, if self-voting is not permitted in your game, it is up to you to detect self-votes and reject them accordingly, i.e. by not inputting them into the spreadsheet.

Caution!
If self-voting is not permitted, it is recommended that your game rules require players to explicitly ##unvote before casting a new vote.

If you are lax about it and allow a new vote to be treated as automatically unvoting an older vote, something like this could happen:
Show nested quote +
Bufoon: ##Vote: YouSoScum
Show nested quote +
Bufoon: ##Vote: Bufoon
It is clear that the self-vote is not permitted, but in the absence of an explicit ##unvote it becomes ambiguous whether
- the player's earlier vote stands (automatic unvote only if new vote is valid), or
- the player is now considered to be not voting (automatic unvote always)



▲ User Guide Contents
△ Back to Page Top

4. Fixes / Workarounds
The rules that prevent breaking the spreadsheet tend to constrain available options for dealing with many common mistakes.
Here are some suggestions for getting around the problem (as long as you haven't already broken the spreadsheet).


4.1 Undo/revert
If you mess up slightly, undo is your friend. If it's just minor thing, it's often simpler to just go back and do it over.

If you mess up big time, you can use the revision history feature, which allows you to roll back the spreadsheet to a version from before you messed up:
  • Select File -> See revision history

  • This brings up the "Revision history" bar on the right side of your screen, showing a list of earlier versions, with timestamps and information about who made the edits.

  • When you select one of the earlier revisions, a link for "Restore this revision" will show up; clicking this will take you back in time to that version of the spreadsheet.

  • If the "Show chages" checkbox at the bottom of the bar is checked, changes made in the selected revision will be highlighted in the spreadsheet view on the left.

  • There is another button at the bottom that toggles between more detailed revisions (almost each individual edit) and less detailed revisions (groups a bunch of changes from one editing session together) — this allows you to find a more specific point in time to travel back to.


4.2 Omitted votes/unvotes (copy-and-paste is safe)
Suppose you've entered a whole bunch of vote changes into the spreadsheet before realizing that you've omitted one that should have been several rows ago. Your first instinct might be to insert a row there, or you might consider cut-and-paste the more recent entries to make room for the missing one. But you shouldn't!

That sucks; you don't want to undo all your work just to fix one row. Well, you don't have to!
It is actually safe to copy-and-paste within the spreadsheet, you just have to be cautious about it:
  • Select the entries (Cols A-C only!) that you need to move down to make room for the omitted one.

  • Copy the selection, and paste it into its new home, one row below its original position.

  • There is now a duplicate entry where your omitted one should be. Clear the contents of those cells (Cols A-C only!).

  • Fill in the missing entry!


4.3 Votes/unvotes not in sequential order (use another spreadsheet)
Someone messed up really badly with the vote input; stuff is all out of sequential order. You'd like to just rearrange the entries rather than have to input them all over again, but that's disallowed!

Well, you're only disallowed to do that within this spreadsheet. It's perfectly okay to copy the votes into another spreadsheet, sorted them out there, then paste them back in:
  • Select the entries (Cols A-C only!) that you need to rearrange/reorder.

  • Copy the selection, and paste it into a new, blank spreadsheet.
    You can use another Google spreadsheet, or MS Excel or OpenOffice Calc or whatever you have should work too.

  • Rearrange to your heart's content in that other spreadsheet.
    Tip: in Google spreadsheet, you can move entire rows by dragging the row number (on the left) into the desired position.

  • Once done, copy and paste the entries back into the template (Cols A-C only!).


▲ User Guide Contents
△ Back to Page Top
cakepie
Profile Blog Joined November 2012
985 Posts
Last Edited: 2017-03-14 23:22:45
November 16 2016 08:34 GMT
#4
◈ Technical Documentation
A brief technical breakdown for people who want to dive into the code. Tinker at your own risk.
✱ Spreadsheet proficiency is assumed; array forumlae and query language are used.


Contents
  1. Config
  2. Player List
  3. Player Dropdown
  4. Vote Input
          4.1  Inputs
          4.2  Canonize names, resolve unvotes
          4.3  Formatting
          4.4  Counting & tiebreaking
          4.5  Info & debug
  5. Compute
  6. Output
  7. Todo List

△ Back to Page Top

1. Config
Nothing interesting worth documenting here, just a bunch of self-explanatory inputs for configuration/customization.


▲ Technical Documentation Contents
△ Back to Page Top

2. Player List
Player roster management. Nominally accommodates up to 49 player slots.

Col A: <input> player roster at start of day phase.

Col B: <input> mid phase replacements.

Col C: "Current" player — canonical list of current player names; used for computation purposes.
C2 =IF(LEN(B2)=0,A2,B2)
If no replacement, use original player name (A2), else use replacement player name (B2)

Col D: "Display" — for presentation purposes, wagon will display as "ReplacementName (OriginalName)".
D2 =IF(LEN(B2)=0,A2,B2&" ("&A2&")")
If no replacement, just use original player name (A2), else concatenate text as per format described above


▲ Technical Documentation Contents
△ Back to Page Top

3. Player Dropdown
This is a hidden sheet; generates the list of player names used for data validation in the vote input sheet.
Dropdown lists for voter/votee are populated/validated against here.

Cell A1: "no-lynch" if permitted by config, else empty.
A1 =IF(Config!$B$6="Yes","no-lynch","")

Cell A2 (up to A99):
A2 =SORT(UNIQUE(FILTER({'Player List'!A2:A;'Player List'!B2:B},NOT(ISBLANK({'Player List'!A2:A;'Player List'!B2:B})))))
Agglomerates nonempty cells in Cols A & B of the player list, removes duplicates as a precaution, sort alphabetically.

Cell A100: never used. The theoretical extreme case of 49 original players and 49 replacements will only occupy A2:A99.


▲ Technical Documentation Contents
△ Back to Page Top

4. Vote Input
Besides being the primary point of input, this sheet also does a lot of the heavy lifting.
Nominally accepts up to 499 vote changes.

This section is organized by functional/logical order, so do not be alarmed that columns are not in alphabetical order.


4.1 Inputs

Col A: <input> post URLs.

Col B: <input> voter.
Populated from / validated against the "Player Dropdown" sheet (A2 onwards).

Col C: <input> votee.
Populated from / validated against the "Player Dropdown" sheet — including A1: no-lynch appears if permitted by config.


4.2 Canonize names, resolve unvotes

Col E: row number.
Used as unique identifier. This is necessitated by the possibility of multiple vote changes in single post, which means that post URL / post number are not suitable for UID purposes.

Col F: stdB: canonical voter name.
F2 =IF(LEN(B2)=0,"",  QUERY('Player List'!A$2:C,"select C where A='"&B2&"' or B='"&B2&"'",FALSE)   )
The voter username in Col B may be the original player, or a replacement — standardize against the canonical list of current player names for computation purposes.

Col G: stdC: canonical votee name.
G2 =IF(LEN(C2)=0,"", IF(C2="no-lynch",C2,   QUERY('Player List'!A$2:C,"select C where A='"&C2&"' or B='"&C2&"'",FALSE)   ))
Similar to Col F above, except that "no-lynch" may also be an option.

Col K: unvote post row number.
K2 =IF(OR(ISBLANK(C2),ISNA(MATCH(F2,F3:F,0))),"",   E2+MATCH(F2,F3:F,0)   )
Check to see if this voter (F2) cast an unvote or a different vote later on (F3:F), thereby cancelling this vote.
If so, compute the row number where the unvote occurs.

Col L: unvote post link.
L2 =IF(LEN(K2)=0,"", INDEX(A:A,K2))
Grab the post URL of the unvote post, where applicable.

Col D: unvotee.
D2 =IF(OR(ISBLANK(A2),ISNA(MATCH(E2,K:K,0))),"",   INDEX(C:C,MATCH(E2,K:K,0))   )
Col K detects unvotes. To see if this row causes an unvote, look for the current row number (E2) in Col K.
If a match is found, then this row causes an unvote. The player who gets unvoted on this row is the player who got voted in the earlier row that has this row as its unvote post.

Col H: stdD: canonical unvotee name.
H2 =IF(LEN(D2)=0,"", IF(D2="no-lynch",D2,   QUERY('Player List'!A$2:C,"select C where A='"&D2&"' or B='"&D2&"'",FALSE)   ))
Like Col G above.


4.3 Formatting

Col M/N: formatted vote for wagon.
N2 =IF(ISBLANK(C2),"",     IF(LEN(L2)=0,"","[s]") & "[url="&REGEXEXTRACT(A2,"/forum/.*$")&"]"&B2&"[/url]" & IF(LEN(L2)=0,", ","[/s][url="&REGEXEXTRACT(L2,"/forum/.*$")&"][small] (X)[/small][/url], ")    ) 
Voter name (B2) is wrapped in bbcode for display in the votecount wagon, with link to vote post URL (A2).
Strikeout and unvotepost link added if this vote was later cancelled by an unvote or a different vote.
URLs are canonized to absolute-path URL format using regex.

Col X: formatted vote for EoD vote list.
X2 =IF(ISBLANK(A2),"",   "[*][url="&REGEXEXTRACT(A2,"/forum/.*$")&"]"&B2&" -> "&IF(LEN(C2)=0,"--",C2)&"[/url]"   )
Generates formatted "Voter -> Votee" bbcode list item for EoD spoilered list;
URL canonized to absolute-path URL format using regex.


4.4 Counting & tiebreaking

Col O: active vote.
O2 =IF(LEN(L2)=0,G2,"")
If this vote is active (not cancelled by an unvote), put the votee name here, else leave blank.
This is used by the "Compute" sheet to count the number of active votes on each wagon.

Col P: votee - find prev vote.
P2 =IF(LEN(C2)=0,"",   IFERROR(QUERY(E:H,"select max(E) where G='"&G2&"' and E<"&E2&" label max(E) ''"))   )
Get the row number of the most recent row (max(E)) before this one (E2) in which the votee of this row (G2) was voted (G).

Col Q: votee - find prev unvote.
Q2 =IF(LEN(C2)=0,"",   IFERROR(QUERY(E:H,"select max(E) where H='"&G2&"' and E<"&E2&" label max(E) ''"))   )
Get the row number of the most recent row (max(E)) before this one (E2) in which the votee of this row (G2) was unvoted (H).

Col S: unvotee - find prev vote.
S2 =IF(LEN(D2)=0,"",   IFERROR(QUERY(E:H,"select max(E) where G='"&H2&"' and E<"&E2&" label max(E) ''"))   )
Get the row number of the most recent row (max(E)) before this one (E2) in which the unvotee of this row (H2) was voted (G).

Col T: unvotee - find prev unvote.
T2 =IF(LEN(D2)=0,"",   IFERROR(QUERY(E:H,"select max(E) where H='"&H2&"' and E<"&E2&" label max(E) ''"))   )
Get the row number of the most recent row (max(E)) before this one (E2) in which the unvotee of this row (H2) was unvoted (H).

Col R/U: votee/unvotee wagon size.
R2 =IF(LEN(C2)=0,"",   IF(ISBLANK(P2),1,   IF(P2>Q2, INDEX(R$1:R1,MATCH(P2,E:E,0))+1, INDEX(U$1:U1,MATCH(Q2,E:E,0))+1)   )   )
U2 =IF(LEN(D2)=0,"", IF(S2>T2, INDEX(R$1:R1,MATCH(S2,E:E,0))-1, INDEX(U$1:U1,MATCH(T2,E:E,0))-1) )
Number of votes on the votee/unvotee respectively, up to and including this row.
In the case of the votee (R2), start the count at 1 if no previous vote exists (ISBLANK(P2)).
Otherwise, for both votee/unvotee, get their previous wagon size (INDEX into R$1:R1 / U$1:U1) based on whether they were most recently voted or unvoted (P2>Q2 ; S2>T2), and update the count accordingly (+1/-1).

Col V/W: tiebreaking value for votee/unvotee.
V2 =IF(LEN(C2)=0,"",   -COUNTIFS(R$2:R2,"="&R2, C$2:C2,"<>''")   )
W2 =IF(OR(LEN(D2)=0,U2=0),"", COUNTIFS(U$2:U2,"="&U2, D$2:D2,"<>''") )
The COUNTIFS returns a number which means "this is the nth time that someone attained the wagon size (R2/U2) by being (voted/unvoted)". For the votee, make the number negative. Recall the tiebreaking rules. Between wagons of equal size:
- if both got there by being voted, lynch the earlier one
- if both got there by being unvoted, lynch the later one
- if one was voted up and the other unvoted down, lynch the unvoted one
All of which translates into simply picking the one with the largest tiebreaker value as calculated here.


4.5 Info & debug

Col I/J: running tally.
I2 =IF(LEN(C2)=0,"",   G2&" ("&R2&")"   )
J2 =IF(LEN(D2)=0,"", H2&" ("&U2&")" )
Information at-a-glance: display the wagons affected by this vote/unvote as a running tally with updated number of votes.
Debugging aid: sanity check against votecount output, as it is calculated using a different approach (Compare Col O).


▲ Technical Documentation Contents
△ Back to Page Top

5. Compute
A misnomer; the function that this sheet serves is really closer to "collate" than "compute".

Col A: canonical player list.
A2 ={SORT(UNIQUE(FILTER('Player List'!C2:C,NOT(ISBLANK('Player List'!C2:C)))));IF(Config!$B$6="Yes","no-lynch",IFERROR(1/0))}
Canonical list of current player, sorted alphabetically, plus no-lynch if allowed.

Col B: player name for display.
B2 =IF(ISBLANK(A2),"", IF(A2="no-lynch",A2,   VLOOKUP(A2,'Player List'!C$2:D, 2, FALSE)   ))
"Display" version of player name

Col C: Had votes?
C2 =IFERROR(IF(ISBLANK(A2),"",   NOT(ISNA(MATCH(A2,'Vote Input'!G$2:G,0)))   ))
Search the vote sheet to determine if the player has ever had any votes on them.
Still returns TRUE after being unvoted back to zero votes.
Determines if player will show up as a wagon in votecount.

Col D: Votes.
D2 =IF(C2,   COUNTIF('Vote Input'!O:O,A2)   ,"")
Number of active votes on the player (current wagon size).

Col E: Last change.
E2 =IF( OR(D2="",D2=0) , "" ,   QUERY('Vote Input'!E:U,"select max(E) where (G='"&A2&"' and R="&D2&") or (H='"&A2&"' and U="&D2&") label max(E) ''",0)   )
Get the row number of the most recent row (max(E)) where the player was voted or unvoted.

Col F: Tiebreak value.
F2 =IF( LEN(E2)=0 , "" ,   IF( INDIRECT("'Vote Input'!G"&E2)=A2 , INDIRECT("'Vote Input'!V"&E2) , INDIRECT("'Vote Input'!W"&E2) )   )
With row number of last change (E2) in hand, grab the associated tiebreak value (V/W) based on whether that last change was a vote or unvote.

Col H: Votelist.
H2 =IF(C2,   CONCATENATE(FILTER( IF(Config!$B$7="Yes",'Vote Input'!N:N,'Vote Input'!M:M) ,'Vote Input'!G:G=A2))   ,"") 
Collate all the votes ever cast on the player from the vote input sheet.

Col G: Wagon text.
G2 =IF(C2,   "[b]"&B2&"[/b] ("&D2&") : "&MID(H2,1,LEN(H2)-2)   ,"")
Put the whole wagon text together for the player.

Col J: Vote active.
J2 =IF(ISBLANK(A2),"",   IFERROR(QUERY('Vote Input'!A:L,"select F where A!='' and F='"&A2&"' and G!='' and L='' limit 1",false))   )
Player name shows up here if they are currently voting, i.e. it is possible to find an entry in the vote input list where they (A2) are the voter (F) with non-empty votee (G) — not an explicit ##unvote — that has not been subsquently cancelled by another unvote (L).

Col I: Not voting.
I2 =IFERROR(IF(OR(ISBLANK(A2),A2="no-lynch"),"",   IF(EXACT(A2,J2),"",A2&", ")   ))
If player name doesn't show up exactly in Col J, then they are not voting, so player name shows up here instead and will later be collated into the non-voter list. Some extra handling for "no-lynch" who isn't actually a player that can vote.


▲ Technical Documentation Contents
△ Back to Page Top

6. Output
Everything is concatenated together in one huge formula to produce the output text.

1| A1=TRANSPOSE(SPLIT( 
2| REGEXREPLACE(Config!B1,"(?m)^$"," ") &CHAR(10)&
3| JOIN(CHAR(10),IFERROR(SORT( FILTER(Compute!G2:G,Compute!C2:C), FILTER(Compute!D2:D,Compute!C2:C),0, FILTER(Compute!F2:F,Compute!C2:C),0 ))) &
4| IFERROR(IF( COUNTA(Compute!I2:I)=0,"", CHAR(10)&" "&CHAR(10)&"[b]Not voting[/b] (" & COUNTIF(Compute!I2:I,"?*") & ") : " & MID(CONCATENATE(Compute!I2:I),1,LEN(CONCATENATE(Compute!I2:I))-2) )) &CHAR(10)&" "&CHAR(10)&
5| "[blue][b]Currently, " & ARRAY_CONSTRAIN(IFERROR(SORT( FILTER(Compute!A2:A,Compute!C2:C), FILTER(Compute!D2:D,Compute!C2:C),0, FILTER(Compute!F2:F,Compute!C2:C),0 )),1,1) & " is set to be lynched![/b][/blue][hr][blue][b]The day phase will end at [u][date]"&Config!B2&"[/date][/u], about XX hours from this post."&CHAR(10)&"[big][b][countdown]"&Config!B2&"[/countdown][/b][/big] remain as you are reading this." &CHAR(10)&" "&CHAR(10)&
6| "Remember, voting is mandatory! Place your votes " & IF( Config!B3="game thread", "in this thread.", "in the [url="&REGEXEXTRACT(Config!B4,"/forum/.*$")&"]voting thread[/url]." ) &CHAR(10)&" "&CHAR(10)& "If you see any vote out of place, "&Config!B5&"[/b][/blue]" &CHAR(10)&" "&CHAR(10)&" "&CHAR(10)&" "&CHAR(10)&
7| "[hr][spoiler=Details][list]" &CHAR(10)& JOIN(CHAR(10),'Vote Input'!X2:X) &CHAR(10)& "[/list][/spoiler]"
8| ,CHAR(10)))


Line 2: Votecount header.
The regex replace quashes any stray blank lines above/below the header.

Line 3: Wagons are sorted and displayed here.
Wagons (Compute!G2:G) taken from the "Compute" sheet for display if they ever had any votes (Compute!C2:C).
Sort primary by number of votes (Compute!D2:D), secondary by tiebreak value (Compute!F2:F).

Line 4: Non-voting list.
Grab, count, and format the list of non-voters (Compute!I2:I).

Line 5: Footer text.
Get the player scheduled for lynch by sorting wagons (similar to Line 3) and grabbing first player.
Display they deadline and countdown text.

Line 6: Voting instructions.

Lines 1+7:
Takes the single huge multi-line string of text, and chunks it out into one cell per line (SPLIT on line feed).
This is a workaround for preventing stray quotes around the text when copied.


▲ Technical Documentation Contents
△ Back to Page Top

7. Todo List
Roadmap of things I might work on
  • documentation: workaround for skipping post link input if backlinks are not in use
  • feature: improved support for majority lynch & instant majority lynch games
          (additional configuration options & appropriate footer text)
  • optimization: replace tiebreak value with +/-rownum to reduce unnecessary calculations


▲ Technical Documentation Contents
△ Back to Page Top
beentheredonethat
Profile Joined May 2016
2934 Posts
November 16 2016 11:08 GMT
#5
I love you.
"Micro tricks like marine splitting, blink stalker micro, and ling/baneling wars were the apex of the game’s achievements; nothing in the world takes your breath away like watching a pro player split marines like a god."
Lunaticman
Profile Joined November 2007
Sweden1097 Posts
Last Edited: 2016-11-16 11:52:49
November 16 2016 11:52 GMT
#6
This is an amazing tool for mafia, very nice effort.

It seems to be absolutely wonderful!

<3
Failure is not an option
Half the Sky
Profile Joined May 2014
Germany9029 Posts
November 16 2016 13:55 GMT
#7
Much <3 cakepie.
The phoenix must burn to emerge. - Janet Fitch
kitaman27 *
Profile Blog Joined April 2009
United States9245 Posts
November 16 2016 14:13 GMT
#8
Sweet :D
I'm better than dirt. Well, most kinds of dirt. I mean not that fancy store bought dirt. That stuffs loaded with nutrients. I... I can't compete with that stuff.
Coagulation
Profile Blog Joined July 2006
United States9633 Posts
November 16 2016 17:41 GMT
#9
This is really solid looking
Blazinghand *
Profile Blog Joined December 2010
United States25551 Posts
November 17 2016 20:50 GMT
#10
you are very cool
When you stare into the iCCup, the iCCup stares back.
TL+ Member
Rels
Profile Joined August 2008
France13467 Posts
November 18 2016 09:19 GMT
#11
So this is how these awesome votecounts are created!
Is it possible to interface it with Xatalos' automatic vote counter to create the ultimate lazy-host setup ?
cakepie
Profile Blog Joined November 2012
985 Posts
Last Edited: 2016-11-18 19:47:22
November 18 2016 19:36 GMT
#12
<3 <3 <3 y'all.


On November 18 2016 18:19 Rels wrote:
Is it possible to interface it with Xatalos' automatic vote counter to create the ultimate lazy-host setup ?

Not interested, won't support. I don't condone lazy hosting.
The auto vote counter is a good effort but still not infallible.
Lazy host + automatic tool = unacceptable hazard.
Shapelog
Profile Joined November 2015
United States5184 Posts
November 18 2016 22:05 GMT
#13
On November 16 2016 17:34 cakepie wrote:

Votecount Formatter
                                                                                     powered by Google Sheets




Sorry TT, apparently your scum. VC tool says so :/
"Subsequently clicking post is like launching a doomsday's worth of nukes' equivalent in dopamine." -RB
gonzaw
Profile Joined December 2011
Uruguay4911 Posts
November 21 2016 04:39 GMT
#14
Awesome!
Xatalos
Profile Joined January 2011
Finland9675 Posts
November 24 2016 06:52 GMT
#15
On November 19 2016 04:36 cakepie wrote:
<3 <3 <3 y'all.


Show nested quote +
On November 18 2016 18:19 Rels wrote:
Is it possible to interface it with Xatalos' automatic vote counter to create the ultimate lazy-host setup ?

Not interested, won't support. I don't condone lazy hosting.
The auto vote counter is a good effort but still not infallible.
Lazy host + automatic tool = unacceptable hazard.


It wasn't meant purely for lazy hosting though, but also for double-checking results and for help if the host(s) had unexpected real life events leading to difficulties in vote counts. But yeah, I can see that it might lead to some extreme laziness too

Interesting tool, by the way. Hopefully it can make for better host/player experiences.
"The opportunity to secure ourselves against defeat lies in our own hands, but the opportunity of defeating the enemy is provided by the enemy himself." - Sun Tzu
cakepie
Profile Blog Joined November 2012
985 Posts
November 24 2016 09:01 GMT
#16
On November 24 2016 15:52 Xatalos wrote:
It wasn't meant purely for lazy hosting though, but also for double-checking results and for help if the host(s) had unexpected real life events leading to difficulties in vote counts. But yeah, I can see that it might lead to some extreme laziness too

Interesting tool, by the way. Hopefully it can make for better host/player experiences.

I'm sure you had the best intentions — I saw that you too wanted to encourage voting in game thread rather than separate voting thread, better player experience, etc. But I think you do see that from an end user behavior perspective, users tend to place too much trust/reliance on technology. A lazy host who chooses to use a fully automatic tool out of convenience is less likely to check the output thoroughly.

This wouldn't be a problem if the program could be made infallible. But I didn't think I could write a program that would be sufficiently robust against players typing in strange things, which is why I chose to create a spreadsheet instead of an automatic vote counting program (context: in Sep 2013).

Likewise, I think your app is a commendable effort — especially love the use of fuzzy set matching to handle typos — but IIRC it still depends on a curated lookup list to resolve abbreviations and nicknames. That entails continuing maintenance to update new players and new nicknames.

OTOH this spreadsheet primarily reduces the burden on hardworking hosts. It shines when used without a separate voting thread, so that the backlinks point back to meaningful context — where and when the vote was made, and reasoning given. This delivers a better experience for players, if hosts are willing to parse their game thread for votes.

The spreadsheet removes the need for error-prone bbcode wrangling and vote tabulation — these are tasks for which we can write infallible algorithms. It is not a substitute for human care and effort — human error may occur when inputting votes into the sheet, so it's not possible to simply abdicate all responsibility to a computer program here.
Xatalos
Profile Joined January 2011
Finland9675 Posts
November 24 2016 09:43 GMT
#17
On November 24 2016 18:01 cakepie wrote:
Show nested quote +
On November 24 2016 15:52 Xatalos wrote:
It wasn't meant purely for lazy hosting though, but also for double-checking results and for help if the host(s) had unexpected real life events leading to difficulties in vote counts. But yeah, I can see that it might lead to some extreme laziness too

Interesting tool, by the way. Hopefully it can make for better host/player experiences.

I'm sure you had the best intentions — I saw that you too wanted to encourage voting in game thread rather than separate voting thread, better player experience, etc. But I think you do see that from an end user behavior perspective, users tend to place too much trust/reliance on technology. A lazy host who chooses to use a fully automatic tool out of convenience is less likely to check the output thoroughly.

This wouldn't be a problem if the program could be made infallible. But I didn't think I could write a program that would be sufficiently robust against players typing in strange things, which is why I chose to create a spreadsheet instead of an automatic vote counting program (context: in Sep 2013).

Likewise, I think your app is a commendable effort — especially love the use of fuzzy set matching to handle typos — but IIRC it still depends on a curated lookup list to resolve abbreviations and nicknames. That entails continuing maintenance to update new players and new nicknames.

OTOH this spreadsheet primarily reduces the burden on hardworking hosts. It shines when used without a separate voting thread, so that the backlinks point back to meaningful context — where and when the vote was made, and reasoning given. This delivers a better experience for players, if hosts are willing to parse their game thread for votes.

The spreadsheet removes the need for error-prone bbcode wrangling and vote tabulation — these are tasks for which we can write infallible algorithms. It is not a substitute for human care and effort — human error may occur when inputting votes into the sheet, so it's not possible to simply abdicate all responsibility to a computer program here.


Yeah, I share the dislike for voting threads. I think the ideal solution would always be to vote in the actual game thread, but to also have a separate view for vote history (including links to the vote posts). That way the players can easily follow the votes in-thread while still being able to easily see the voting history in one place.

It's always good to have more attempts at the same goal, since no system will ever be perfect I'll definitely try this thing if possible when I have the time to play again.

On the other hand, I'm not sure if it can completely replace the automatic votecount tool. For example, there seem to have been several cases where things got busy for the host and they "couldn't have done it" without the tool. In addition, it's a very easy way to double-check if your own counts have been correct.

(There's indeed a static list of player name abbreviations that's used there, and if nothing is found on that list, fuzzy matching is used to find the "closest" name from the given player list. The only problematic scenario would be one where there's a new player - so not on the static list - with a confusing nickname that isn't close to the actual name, whereas another player has a closer match with the nickname. Then it might lead to the wrong conclusion.)
"The opportunity to secure ourselves against defeat lies in our own hands, but the opportunity of defeating the enemy is provided by the enemy himself." - Sun Tzu
N0
Profile Blog Joined October 2016
154 Posts
November 24 2016 12:46 GMT
#18
N0[T] trying to step on your toes cakepie baby, honey, gorgeous. But if you can't achieve lazy hosting with this then what good is it?

Lazy hosting take two: Players themselves could snowball votecounts whenever they want to vote or change their vote. Just quote the previous votecount and add their changes to the mix. That way the votecounts are superlatively recent and their amount as many as they get. Additionally, if people add links to the previous post containing the explanation for the vote change, then that amounts to superlative oversight. Watch out for ninjas though..

Hosts can finally be free to tend to their flavor, and hopefully win the nobel prize for literature someday.
Signups for [T]Define [b][blue][N#][/blue][/b]ormal Code Mafia now open!
Xatalos
Profile Joined January 2011
Finland9675 Posts
November 24 2016 14:20 GMT
#19
Hmm.... Player-made votecounts.... Filler posts taken to the next level
"The opportunity to secure ourselves against defeat lies in our own hands, but the opportunity of defeating the enemy is provided by the enemy himself." - Sun Tzu
cakepie
Profile Blog Joined November 2012
985 Posts
December 06 2016 14:03 GMT
#20
Documentation is now pretty much complete.
Please log in or register to reply.
Live Events Refresh
Monday Night Weeklies
16:00
#19
RotterdaM1692
TKL 680
IndyStarCraft 341
BRAT_OK 161
Liquipedia
[ Submit Event ]
Live Streams
Refresh
StarCraft 2
RotterdaM 1692
TKL 680
mouzHeroMarine 669
IndyStarCraft 341
BRAT_OK 161
StarCraft: Brood War
firebathero 180
Dewaltoss 169
TY 155
Backho 8
Shine 5
Noble 4
Dota 2
qojqva3719
Pyrionflax98
League of Legends
JimRising 624
Counter-Strike
pashabiceps1307
flusha511
Heroes of the Storm
Liquid`Hasu554
Other Games
FrodaN3470
Grubby2932
summit1g2748
Beastyqt830
C9.Mang0549
Fuzer 142
Mew2King87
Trikslyr76
ZombieGrub33
Chillindude32
Organizations
Other Games
BasetradeTV16
StarCraft 2
Blizzard YouTube
StarCraft: Brood War
BSLTrovo
sctven
[ Show 18 non-featured ]
StarCraft 2
• kabyraGe 280
• davetesta36
• Adnapsc2 1
• IndyKCrew
• sooper7s
• Migwel
• AfreecaTV YouTube
• LaughNgamezSOOP
• intothetv
• Kozan
StarCraft: Brood War
• STPLYoutube
• ZZZeroYoutube
• BSLYoutube
Dota 2
• masondota21231
• WagamamaTV592
League of Legends
• Jankos3432
• TFBlade1340
Other Games
• imaqtpie1087
Upcoming Events
Replay Cast
14h 29m
PiGosaur Monday
1d 4h
Replay Cast
2 days
The PondCast
2 days
Replay Cast
3 days
HomeStory Cup
3 days
HomeStory Cup
4 days
BSL: ProLeague
4 days
SOOP
5 days
Sparkling Tuna Cup
5 days
[ Show More ]
HomeStory Cup
5 days
BSL: ProLeague
5 days
Liquipedia Results

Completed

Rose Open S1
2025 GSL S2
Heroes 10 EU

Ongoing

JPL Season 2
BSL 2v2 Season 3
BSL Season 20
Acropolis #3
KCM Race Survival 2025 Season 2
CSL 17: 2025 SUMMER
Copa Latinoamericana 4
Championship of Russia 2025
RSL Revival: Season 1
Murky Cup #2
BLAST.tv Austin Major 2025
ESL Impact League Season 7
IEM Dallas 2025
PGL Astana 2025
Asian Champions League '25
BLAST Rivals Spring 2025
MESA Nomadic Masters
CCT Season 2 Global Finals
IEM Melbourne 2025
YaLLa Compass Qatar 2025
PGL Bucharest 2025

Upcoming

CSLPRO Last Chance 2025
CSLPRO Chat StarLAN 3
K-Championship
uThermal 2v2 Main Event
SEL Season 2 Championship
Esports World Cup 2025
HSC XXVII
BLAST Open Fall 2025
BLAST Open Fall Qual
Esports World Cup 2025
BLAST Bounty Fall 2025
BLAST Bounty Fall Qual
IEM Cologne 2025
FISSURE Playground #1
TLPD

1. ByuN
2. TY
3. Dark
4. Solar
5. Stats
6. Nerchio
7. sOs
8. soO
9. INnoVation
10. Elazer
1. Rain
2. Flash
3. EffOrt
4. Last
5. Bisu
6. Soulkey
7. Mini
8. Sharp
Sidebar Settings...

Advertising | Privacy Policy | Terms Of Use | Contact Us

Original banner artwork: Jim Warren
The contents of this webpage are copyright © 2025 TLnet. All Rights Reserved.