Hey all!
I've revamped the voting spreadsheet after the return from the long hiatus. I've taken the last Survey feedback into account for this, and think it's the right path forward for the system, as it simplifies everything. In addition, I've rebuilt all of the voting commands from the ground up to fix some bugs related to the DeepBot 2018 New Year's Update, and to automate most voting system updates going forward. Here are the details:
As always, we're going to allow two more games from what used to be the two categories (Short & Long) to win the vote under the old rules before all of these changes take effect.
I'm officially calling the vote deadline for one Short (<=20 Hour) Game & one Long (>20 Hour) Game; these will be decided by Midnight PST Friday, 01/12/18.
After this vote is decided, the new changes will take effect and outstanding hiatus SP will be disbursed. The voting spreadsheet has already mostly been updated to reflect the rules of the new system, but I've temporarily highlighted <20 Hour & >20 Hour games in green and red (hours column) so you can clearly tell which is in the lead for both categories.
Depending on which games win, I may try to fit one or both into the schedule during the upcoming Substravaganza to change things up a bit, and so we can dive directly into the new Voting System once everyone's Sub Block banks have been emptied.
Voting System Changes
- Vote Cost = Hours to Beat
- No minimum or maximum cost. If a game takes 1 hour to beat it will cost 1 SP. The theory is if a game really is that short, it will win quickly, draining SP from the system and having barely any effect on the schedule.
- Games played on Sub Block will continue to discount the vote cost if these games are also on the spreadsheet. As there is no longer a cost maximum, there is no longer any downside to this feature.
- No Categories -- All Games Compete with Each Other
- The short vs. long category system has been dying a slow death since we deployed it back in August of 2015. The original idea was to keep specific, very long genres (namely, JRPGs) from totally dominating the schedule, but as the system has evolved and the vote commands have become more complex, we have other tools to help with that. I'm just going to make this easy and allow myself to make a fiat judgment call to defer a winning game for a cycle or two if it will make the schedule stagnant. See Deferrals, below.
- While this does mean a bunch of whale viewers can keep pumping ultra-short games to win the vote, there's a significant cost to doing this, and a minimal impact to the schedule. It should increase schedule churn while the big, long games continue to slowly climb to the top. Remember that as people keep voting up a long game toward the top of the sheet, it will get increasingly expensive to quickly pump a short game to the top.
- Two Games at a Time
- As with the old system, we'll continue to have two games running at once, and spend at least two days a week on voting system games (once the Substravaganza ends).
- If a game wins and is shorter than ~5 hours long on HLTB, we'll immediately draw the next winning game as well and schedule them back-to-back.
- Deferrals
- Most of the complexity of the old voting system stemmed from me wanting to design a perfect system that could balance the schedule and keep the channel from stagnating playing two 90-hour JRPGs at the same time. As we've thought about this together for nearly 3 years now, I really don't think there's an elegant algorithmic solution to this problem. The solution is a lot simpler -- I'll just make a judgment call to occasionally defer a winning game if I feel it will not be a good fit in the current schedule.
- If a game wins and I decide to defer it, it still won the vote, and is queued to be played at the earliest possible opportunity, when it fits best into the schedule. In the meantime, the next-place game will be drawn immediately and will be played if it fits better.
- With the extreme reduction in vote cost for short games and their advantage competing against longer titles, I don't think it's likely we'll see more than 1 deferred game in queue to be played, but if that does happen for some reason, I'll try to figure out the best and fairest way to handle it.
- Stagnant Game Removal
- Games that have been on the voting spreadsheet for a very long time without a lot of voting activity will become candidates for removal from the sheet, to open up their slots for auctions. Rather than try to determine this programmatically, I will again handle this via judgment call.
- If I feel a game has been on the sheet for too long without any real attention, I will announce that it will be removed unless it reaches a certain voting threshold within a certain time frame. I'll try to calibrate the target vote threshold based on the total votes out there.
- If the game ends up being removed, all SP spent voting for the game will be refunded to the original viewers. Any auction costs paid will also be refunded.
- Permanent Game Slots will never be affected by this.
Other than those changes, all other past voting system rules (e.g. rules for Extended playthroughs) will remain in place.
DeepBot Voting System Rewrite
I was inspired to rewrite the entire DeepBot voting system from the ground up after a conversation in the new #behindthescenes Discord channel about DeepBot commands. Most of these changes will not affect anyone on the front end, but they will make it much easier for me to update games when a title wins in the future. (If you've followed along, errors in the voting system were plentiful, as it would take me a lot of time to add a new game into DeepBot). Importantly, I was able to fix a longstanding bug with large vote totals, and luckily discovered & fixed a new gamebreaking bug introduced in DeepBot's 2018 New Year update.
- Bug Fix: Vote Totals >999 now work correctly. Vote with confidence!
- For some reason, when DeepBot does math, it insists on using comma separators (e.g. 1000 votes becomes 1,000 votes). This breaks a ton of systems, even inside DeepBot itself.
- For example, my vote log is a *.csv file, so commas separate each piece of data I store in the log. Previously, if a game exceeded 999 votes, the comma in "1,000" would break the log file, shifting all the other data after the "1," to the right.
- If you're interested to see how I fixed this, check out the #behindthescenes channel. It was challenging!
- Bug Cleanup: Past votes for games with vote totals >999 have all been manually corrected
- This bug was preventing me from sharing vote trend data for Hollow Knight & Alien: Isolation, as both games received >1000 votes and my log was broken because of it.
- I've manually corrected every entry in the log; this issue should not present itself again.
- Bug Fix: It is now impossible to enter illegal votes. Critically, you can no longer cast NEGATIVE votes!
- While I was regression testing the voting system, I discovered something awful -- the 2018 DeepBot release made some internal change that stopped my error catching system from preventing NEGATIVE votes.
- In other words, you could type "!game01 -100" and actually reduce the vote total of !game01 by 100 votes. In addition, you'd steal 100 votes worth of SP from it!
- Fortunately, I keep strict vote logs and no one has ever cast a negative vote.
- Part of my fix also guaranteed that only integers are accepted as votes. Words, fractions, symbols, and decimals will not work. (In fact, the system will simply delete "."s, so if you try to vote 1.5 times, it will make you vote 15 times. Be careful!)
- Major Backend Improvement: All vote commands now use text file "variables" instead of having all of the game data hardcoded.
- DeepBot doesn't support custom variables, so when I designed the voting system, I wasn't able to write anything elegant like @game01Name@ for the commands to retrieve. Instead, if you saw the game's name displayed somewhere, it meant I typed it manually in about ~20 different locations. This applied to the game's vote cost, hours -- everything unique to a game required me to go the hundreds of lines of vote code and manually update. It was a very tedious, error-prone process.
- I've given up holding out for DeepBot to add custom variables. Instead, I've made my own system of custom variables using an elaborate directory of text files. It makes the commands really ugly and even harder for a human to parse (Check #behindthescenes for some examples), but it also means all of these values are now stored in easy to access, easy to update, one-change-affects-all text files.
- In the future, if I have to replace the game data for !game01, I only need to edit one text file and all of the related commands will automatically update. It'll significantly reduce opportunities for me to make a mistake--and boy did I catch a bunch of mistakes when I was converting to the new system! There should no longer be a long wait for me to get these new games added to the system and ready for voting--they should be ready within minutes of me getting the auction winner's game choice.
Upcoming Changes: Once we call the new vote, I would like to look again into finding a way to write a chat command that will display the top 5 games on the voting spreadsheet, without having to navigate to it. It turns out this is really hard to do in DeepBot--I'm basically writing a sort algorithm from scratch in a system that is not fun to code in--but it should be made less complicated by the lack of vote categories. I'll start thinking about it this week and try to have a finished command by next weekend.
*****
Thanks everyone! We might not see the fruits of these changes for awhile because of the upcoming Substravaganza, but I'm excited to see how the system behaves. I'd like this to be the Voting System's Final Form. You've all be really patient with the constant quarterly iteration on it as we've been trying to find the perfect, balanced system, but I think I've been pretty good at reasoning things out with everyone when something falls through the cracks of the system. Keeping the rules simple and offloading wonk into streamer fiat is the right way to go. Further changes will likely be procedural on my part (How do I handle weird situations, what sorts of judgment calls do I make, how are SP being awarded at the source) and I'd like to avoid further iterative system changes, unless if something is REALLY broken.
-Dylan ("Marstead")