The blog of roncli blog
Houston, Texas, United States
CTG Music
Trax in Space Beta
Recent Posts
OTL's player disconnection issue
The Overload Teams League
Steak Burrito Recipe
The Descent DXX-Retro 1.4 Roadmap
Observing the Swiss
BlizzCon franchise roundup
Attention - Gullibility
AMD 16.5.2 error "Qt5Core.dll is missing from your...
The Observatory
Six Degrees of Confusion
February 2005
March 2005
April 2005
May 2005
June 2005
July 2005
August 2005
September 2005
October 2005
November 2005
December 2005
January 2006
February 2006
March 2006
April 2006
May 2006
June 2006
July 2006
August 2006
September 2006
October 2006
November 2006
December 2006
February 2007
March 2007
April 2007
May 2007
June 2007
July 2007
August 2007
September 2007
October 2007
November 2007
December 2007
January 2008
February 2008
March 2008
April 2008
June 2008
July 2008
September 2008
December 2008
February 2009
July 2009
August 2009
September 2009
October 2009
November 2009
February 2010
March 2010
April 2010
June 2010
July 2010
August 2010
September 2010
October 2010
November 2010
December 2010
March 2011
June 2011
July 2011
August 2011
September 2011
October 2011
December 2011
January 2012
February 2012
April 2012
July 2012
November 2012
July 2013
April 2014
July 2014
August 2014
November 2014
December 2014
March 2015
April 2015
May 2015
June 2015
July 2015
September 2015
January 2016
February 2016
May 2016
July 2016
November 2016
March 2017
January 2018
May 2018
June 2018
January 2019
Wednesday, January 30, 2019
OTL's player disconnection issue
Posted: 5:40:00 PM 0 comments
The Overload Teams League has started off fairly well. We've played 26 games in the first month, completed a small one-day tournament, and have had five teams play each other at least once. But there's one issue that's come up that's been really tough to call. There was a player disconnection issue that recently came up where a player BSOD'd and there was some confusion on what to do. I wanted to put something in writing before this happens again.

First, some background.

In Descent 3, Heat aside, all servers were private. Players could come and go as they pleased, and you could always rejoin a game after crashing out. Game parameters were also much more open. Kill goals and time goals were text entries, not selections from a menu.

Revival confusingly bucked this trend in Overload, removing server browsers and opting for monolithic servers that can run multiple games at once. However, the only way to access these games is if you have the password AND you join before the game starts. There's no way to see what games are running, and even if you had the password you can't join a game in progress.

The Descent 3 Teams League pretty much ignored any issues with disconnections. DCs could simply be met with a substitution (subs were common in D3TL matches!), or by playing shorthanded until the disconnected player returned. Only a full server crash would suspend a match (in the D3TL Tournament, this only happend once ever, but was in the semifinals!), but players would pretty much just restart from the prior score and amount of time left with little fuss.

Disconnections in the OTL cause bigger problems.

  • Players can't reconnect to a game in progress, leaving their team short-handed.
  • If you wish to suspend the match, you have limited options to select time parameters in game.
  • Because of the above, disconnections can be seen as gaming the system, depending on many factors.

In short, in Overload, we as a league have to deal with a situation that's less than ideal. We are aware of the fact that games online are not nearly as flexible as they were with Descent 3, and we have to adjust as a result.

In the OMG/PTMC Terminal match, PuDLeZ BSOD'd and disconnected with approximately 2:30 remaining in the match while his team led by 5. Teams immediately stopped playing and agreed on starting a new game from the current score and time remaining (they had suggested 5 minutes, until I stepped in and asked for 3 to more match the time remaining). The stats from both games were combined for the final match score.

From my standpoint, that was awesome. Both teams came together to finish out the match despite the circumstances. And, this is the kind of model I want to encourage... work out a solution that both teams can agree on. However, teams will have different ideas on how to do this, so I think it's good to have a set of guidelines available along with what to do should teams NOT agree on a way to go forward. Here's what I came up with:

Should a player disconnect or a game end prematurely due to a crash or network outage, every effort should be made to get the current stats from the game up to that point in the match. Teams should then agree on what to do next, within the following guidelines:

- Teams can agree to restart a Challenge if 10 minutes or more remained on the clock at the time of the issue, or if multiple issues happen within a single match.
- Teams can agree to end a game with the score as is if less than 3 minutes remained on the clock at the time of the issue.
- Teams can agree to play a 2nd game, combining the scores of both games for the final score of a single match. The second game's time limit should be as close to one of the time options available in game as possible to the amount of time remaining when the issue occurred. For instance, if there was 6:23 on the clock, teams could agree to play the 2nd game with either a 5 minute or 7 minute time limit.

In all cases where a match is suspended and resumed, the same pilots must fly for both teams, as substitutions are not normally supported in Overload games.

If teams cannot agree on what to do, an administrator can be asked to decide how to proceed, and they will make the decision. The administrator may also opt to adjudicate the match accordingly in extreme cases.

If one player is repeatedly having these kind of issues, they may be suspended from the league until their issues are resolved. If it is deemed that the player is acting maliciously, they may be banned from the league.

I don't want it to feel like I'm ignoring the momentum argument, so I'll address it here. Momentum is a very real thing, and it sucks to have it taken away by an extraordinary circumstance. However, examples of leagues or competitions that put extra time on the clock because of such an issue is exceedingly rare. In fact, more often than not, you end up LOSING time. Here are some examples of what other leagues do, where, surprisingly, many take place in the sport's biggest games of the year.

I'm sure there are plenty more examples to put forth, but overwhelmingly the concept of momentum is not given much thought in any of these cases. Either they drop the rest of the game, pick up where they left off later, or they start over. Nowhere is something arbitrary like 5 extra minutes given just to facilitate a possible comeback or to restore momentum. And I think this makes sense, especially in an environment like the OTL where we have individual stats and want them to mean something instead of having them skewed by stats where matches were far too short or too long.

In an extraordinary circumstance, you need to make a judgement call that someone somewhere is not going to like. As long as we deal with these circumstances with consistency and with good intentions, that should be all anyone can ask of the league. I also strongly like giving teams options, and them letting them agree on which option to take, only calling in help when they can't agree.

Hopefully this will address the situation, but leave it open to discussion for now over on the OTL Discord. Apologies for not thinking of this sooner... I had a lot of situations planned out, and this was definitely not one of them!

Labels: , ,

Friday, June 08, 2018
The Overload Teams League
Posted: 6:37:00 PM 0 comments
I wanted to put together a bunch of my thoughts regarding the possibility of creating the Overload Teams League.

Those who played Descent 3 might remember that I took over something called the Descent 3 Teams League from bash and Sirian, and ran it for a number of years. I kept it going until well into the second half of the aughts, with help from Matrix and IceHammer to keep things running smoothly. Eventually the game dried out, and with it the league was retired.

With Overload, the potential for Six Degrees of Freedom competitive team action returns. I've recruited Chilly Bus and MobMessenjah to bounce some ideas off of, and wanted to list out what we've come up with so far.

The Spirit of the OTL

The OTL "spirit" borrows a lot from from the D3TL. Essentially, teams get together to play competitive games against each other, and the system is there to facilitate the games with as little interference from administration as possible. However, we are planning on having a few notable differences for the OTL.

First, seasons are being planned. While there will be lifetime standings, we want to rotate out the standings every 6 months to keep the leaderboards fresh.

Second, we're going to want to keep big rosters down. The D3TL team NT was a unique idea, but we really don't need to have teams with 50+ players on it. This means that large clans would have to enter multiple teams on the D3TL, which means more people will be able to play, and even allow for intra-clan matches. Right now, we're looking at rosters being between 5 and 8 players, although we're leaning towards the higher end of that list.

Third, we're looking to keep the game time down. D3TL games averaged an hour in length. Overload right now only allows a MAXIMUM of 20 minutes, and that's the standard we're looking at adopting. If Revival raises that maximum, I don't think we're going to want to follow suit.

Fourth, we think map, opponent, and mode diversification is unnecessary in 2018. To keep teams from playing the same map over and over, we're likely going to borrow the "home map" concept from The Observatory. To keep teams from not wanting to play other opponents, we want to implement a ranking system that's more than just wins and losses. And, there's only 2 real modes in Overload right now, and both are team anarchy... one with friendly fire off, and one with friendly fire on.

Finally, we want to do frequent events. Three kinds of events we're thinking of:

  • Regular events, perhaps monthly, that are at different days and times, where people can get together and play a small Swiss tournament for a few hours. Similar to The Observatory's tournaments.
  • Mid-season events, a top 6-team invitational knockout tournament, perhaps with something on the line like a guaranteed spot in the knockout tournament of the end-of-season tournament.
  • End-of-season events where we pull out all the stops... qualifiers for people to get into groups, a group stage round robin, and concluding with a knockout tournament. You win this, you're the season champion!

Choosing Maps, Servers, and Colors

I mentioned using The Observatory as a way to determine what map to play, but I wanted to go into more detail on map selection, and other selections that may give advantages to one team and not the other.

First, here's what we're thinking for maps. Teams will have a pool of "home" maps, and when they are the "home" team, their opponent will choose one of those maps. Who gets to be home? That'll alternate every game between the two teams, with the first game being random. What if both teams want to play a map that's not their home map? Teams will be able to agree to play any map available, overriding the home team concept for one game.

Servers will work the same way. One team will be assigned to start the game, which allows them to pick the server of their choice, and the next game between the teams your opponent gets the choice. Every 2 games this resets. However, you can agree to play on a particular server (provided you have access to it) to override this behavior for one game.

Finally, colors will just be assigned in a similar way to servers. Unlike the servers, though, your team color shouldn't be something to agree upon. Sometimes you'll be orange, sometimes you'll be blue.

Game Rules

Overload has a lot of ways to play team games, but we obviously want to standardize them for fair competition. This is what we're thinking:

  • Time limit: 20 Minutes
  • Show Enemy Names: Team Only
  • Respawn Time: 2 to 4 Seconds
  • Respawn Shield: 2 Seconds
  • Powerup Overall Frequency: High
  • Powerup Initial Secondaries: Low
  • Powerup Super Frequency: Low

All powerups are allowed, largely because we can't disable anything non-weapon.

As for Friendly Fire, we're actually thinking of making that a separate "mode". If you recall, the D3TL had separate rankings for each mode, but there was an overall ranking as well. We'd probably do something similar for this.

The Ranking System

Let me come out and say NO ONE is going to like the ranking system. Regardless of what system we use, nothing's perfect. I am hoping that by using a combination of a ranking system and regular events, any decent ranking system will be accepted as long as it's not the final authority on "who is the best". With that said, I'm going say that naughty word: Elo.

Long story short, I want to have score ratio be a factor in Elo score changes, and have the rankings be somewhat volatile given that these are not lifetime ratings.

First, we have an idea to have the score ratio factor in the Elo "result" calculation. Normally, a win would give you a 1.0 result and a loss would give you a 0.0 result. In our version of the Elo formula, you'd only get 1.0 if you doubled your opponent's score, and 0.0 if your opponent doubled your score, with a logarithmic curve filling in the points in between. I came up with the "double" by examining the history of Team Anarchy scores in the D3TL Tournament. It maxed out at a ratio of 3.27 to 1. If you're beating your opponents 45 to 15, the team with 15 is going to need to improve dramatically to ever have a chance of winning. 45 to 30 feels more like that the team with 30 could eventually win. There's no real solid statistics on what exactly to use, but this feels like a good starting point.

Because we want a decent level volatility, K will need to be high. On top of this, because we're going to be using score ratio as the result, this requires us to have a higher K to keep things a bit volatile. I'm looking at experimenting with a K=50 for the first season.

Finally, we want to use a provisional rating so teams can't play 1 game and be ranked among the top teams. Teams that have 10 games in a season will have their full Elo as their rating. Outside of that, every game a team plays will give them access to 10% of their Elo. So, a team with an Elo of 1500 but has only played 2 games will have 20% of their Elo applied to their rating, so their rating will be 300.

We'll also have individual player stats, like total points, points per game, deaths per game, and efficiency.

Things We Want Revival To Do To Help

Revival has done a great job at making a game people want to play, but there's more that can be done to make this game really shine, as well as help out the OTL with doing what we want to do. To this end, we currently have a small list of ideas we'd like to pass on to them.

  • Overload NEEDS an observer mode. In 2018, it almost feels like an oversight to not have some kind of observer mode. Even Descent 3 had observing!
  • To keep games fair, all players need to be able to confirm the selected settings for a private match. Without this, the person starting the match could sneak in some setting that the other team won't be aware of.
  • Game stats from private games should be output to a text file. No funny key combination required, no UI element, just a way to always output private match results. It should include each players' score line (kills, deaths, assists, suicides), and each players' kills and deaths against each other. Again, something to take away from Descent 3.
  • Allow the player hosting to pick which region to start their game in. Right now it just defaults as the closest to them, but what if a bunch of US players want to play Germany players on a UK server?
  • Right now you can select which weapons to allow or disallow. Extend this to other powerups: Ammo, Energy, Armor, Invulnerability, Cloak, Overdrive... everything.
  • Make an option to disallow players from delaying their spawn in a private game. This would prevent cases where a team is in the lead, but the other team is making a comeback, except the team in the lead just stops spawning.

League Interface

The primary interface for the OTL will most likely be a Discord bot. I have a lot of experience with Discord bots as I've made 3 now, and having a bot to help out with managing things like rosters, game reports, and more will really make it easy to keep the league running without anyone getting involved unless there's a dispute that needs to be resolved.

We'd still have a website, but its primary focus would be to show standings, results, and more. All other communication would take place on Discord.

What's Next?

Discussion, of course! I am posting this on a Friday to give everyone some time to read it over and form their own opinions as to what might be fun in an Overload Team League. On Monday, I'm going to do an Overload stream at and hold an AMA regarding the league. I'm looking for your questions and suggestions, so be sure to add your questions on the Reddit OTL AMA comments thread so that I don't miss them.


Overload is pretty well-suited for a teams league like this, and I think that having an organized teams league will get people playing multiplayer, and especially team games. Additional support from Revival will allow the league to do more, drawing even more interest from players who would not otherwise play multiplayer.

Labels: , ,

Tuesday, May 08, 2018
Steak Burrito Recipe
Posted: 1:06:00 AM 0 comments
Presented with only this comment... if AI is going to take over the world, it ain't coming from New Zealand.


Tuesday, January 02, 2018
The Descent DXX-Retro 1.4 Roadmap
Posted: 5:46:00 PM 0 comments
For some time now, I've been a Collaborator on the DXX-Retro project. Originally I just started helping out on various odds and ends, but lately my focus has been on the observer mode of the game.

Over the past two years, I've essentially been waiting on the project owner, Drakona, to work up the networking code to send client ship status to the observers. It's one thing to see the ships flying around in observer mode, but another entirely to know everything about those ships. That is, shields, weapon loadout, what weapons you're about to fire, etc. Unfortunately, her last commit to the project was February. Of 2016.

I get that priorities in life change, especially when you become a two-time parent. :) The Descent community, however, hungers for more, and as a result I've decided to finish off observer mode in Drakona's absence. There's actually quite a lot to make that happen, so I've created the v1.4 Roadmap. In this post, I discuss the rationale behind the roadmap, and what to expect from Retro in the future.

DXX-Retro has largely served its purpose to the competitive community, but two outstanding features remain to be added. Both of these were promised by Drakona to the late JinX. One of these features, observer mode, was even kind of named after him, "JinX Mode". The other feature was specific for Descent 2, and that is Capture the Flag Classic, which brings D3-style CTF play to D2.

In February of 2016, Drakona and I released an early version of DXX-Retro v1.4X5, which gave us a taste of observer mode. This only gave us the visuals. While we could see ships flying around, we didn't know anything about those ships other than what their opponents knew. This was always wanted, but we never really came up with a plan to do it. And, in the past 2 years, nothing has been worked on to support this. Unfortunately, Drakona just hasn't had time to work on it, and my work has therefore stalled.

While it hasn't been a great situation, the community has gotten a lot of mileage out of observer mode. So much so that a Twitch show was made out of it which continues to enjoy success among the community. However, there's a lot that we miss on the broadcasts because we don't have those shield numbers, the weapon loadouts, and whatnot. And after two years, the time has come to just get it done.

So, I'm getting it done. The roadmap includes 5 future releases along the 1.4 line. The first will be v1.4X6, which I'm hoping to finish this week. This will include the shield numbers appended to the pilot names under the ship. I want to also include a way to indicate damage, and will be working on ideas for that.

The second release will be v1.4X7, which will get the rest of the ship status in the game and make any necessary upgrades to the observer mode UI that we want to change from previous versions. I'm *considering* adding my custom-made Observatory UI to Retro, but am not sure that's needed.

The third release will also be v1.4X7, but this time for Descent 2! Once I know what I'm doing in D1, I can apply that to D2, and we can have an observer mode for both games.

The fourth release will be v1.4X8, also only for Descent 2. This will include Capture the Flag Classic, where instead of the "egghunt" style game where flags are worth 5 and kills are worth 1, we'll instead make the flags spawn in the base, only have teams be able to score if their flag is in their base, and have team points be based on flag captures only.

And finally v1.4 will be the final release for the 1.4 line, which will include any bug fixes, documentation updates, and any other housecleaning duties we need to do for a proper release.

After that, the future for Retro is murky at best. There are no less than 50 open issues on GitHub for Retro right now which vary from essential to nice-to-have to outright silly. Also to keep in mind, the DXX-Rebirth is nearing a v0.60 release that is essentially a codebase refactoring in addition to a ton of other updates. I would love to see a Retro v2.0 not only based on Rebirth v0.60 but something that can also follow that version as well, instead of being a complete fork that forgets where it came from. This in and of itself would be a monumental task.

Until then, however, we'll keep Retro focused on what we need to release v1.4, and if I can keep it going without the need for added help, perhaps that will be much sooner on the horizon than expected. Here's to some better Descent in the near future!

Labels: , , ,

Tuesday, March 07, 2017
Observing the Swiss
Posted: 2:29:00 PM 0 comments
Running The Observatory is super fun. Being a self-proclaimed 6 degrees of freedom junkie, watching pilots pull off incredible moves just to avoid taking an extra 10 points of damage here or there is fascinating.

The format of The Observatory is largely inspired by CoNDOR, the racing league for the game Crypt of the NecroDancer. Over there, they have their main commentator and several referees who work in the background to ensure that everything goes smoothly. However, on The Observatory, I am afforded no such luxury.

Therefore, I've tried to automate as much as I can to ensure that I can spend time focusing on the action rather than on administering of the tournament. To this end, drawing on my experience from making SixBotGG for Six Gaming, I created FusionBot for The Observatory.

This bot takes care of a number of fun (and not so fun) admin tasks, but the one thing I wanted to highlight was the algorithm I created to create a Swiss pairing system for the qualifier tournaments. In a Swiss tournament, everyone plays a round every game, with the idea being that as the tournament progresses you will play opponents who are closer and closer to your skill range.

A manually-ran Swiss tournament often will have the tournament director throwing players who have the same number of wins in a pile, and randomly determining from that pile who plays who. There are ways to ensure people don't play each other twice, and even ways to govern who gets a bye round.

For The Observatory, I had added constraints that required some custom programming. For instance, players can't play each other if neither of them can host a multiplayer game. But as a general algorithm, here's how I managed to get a working Swiss algorithm in node.js.

1) Get a sorted list of players

This part's pretty easy. You want a list of players sorted by their performance.

var eventPlayers = Object.getOwnPropertyNames(event.players).filter((id) => !event.players[id].withdrawn).map((id) => {
    return {
        id: id,
        eventPlayer: event.players[id],
        ratedPlayer: ratedPlayers.find((p) => p.DiscordID === id) || {
            Name: obsDiscord.members.get(id).displayName,
            DiscordID: id,
            Rating: 1500,
            RatingDeviation: 200,
            Volatility: 0.06
        points: event.matches.filter((m) => !m.cancelled && m.winner === id).length,
        matches: event.matches.filter((m) => !m.cancelled && m.players.indexOf(id) !== -1).length
}).sort((a, b) => b.points - a.points || b.ratedPlayer.Rating - a.ratedPlayer.Rating || b.matches - a.matches || (Math.random() < 0.5 ? 1 : -1));

Here, I get all of the players in the tournament that haven't withdrawn and return an array that includes the player's ID (which for a Discord bot is simply their Discord ID), their player information for the tournament, their ELO, the number of wins they have in the match, and the number of matches they play. We then sort this so that the people with the most points are on top, and break ties on ELO, least number of matches played, and in the case that everything is even we just flip a coin.

2) For each player, match them to a potential opponent

Here, we create a recursive function that attempts to match players based on a set of criteria. In that function, we get the players that have yet to be matched up, and find potential opponents for the first player in that list.

var remainingPlayers = eventPlayers.filter((p) => matches.filter((m) => m.indexOf( !== -1).length === 0),
    firstPlayer = remainingPlayers[0],
    potentialOpponents = remainingPlayers.filter(
        (p) =>
   !== &&
            event.matches.filter((m) => !m.cancelled && m.players.indexOf( !== -1 && m.players.indexOf( !== -1).length === 0 &&
            (firstPlayer.eventPlayer.canHost || p.eventPlayer.canHost)

You see here that the list of remaining players can't exist in my "matches" array. We get the first player and a list of potential opponents. Opponents cannot be yourself, cannot have been already played, and as is a special case either you or your opponent must be able to host a game. Inside the recursive function, if there is only one player in "remainingPlayers", we check to make sure that the player hasn't had a bye before. That is, if they've played as many matches as there have been rounds in the tournament, the bye is okay. If not, we fail attempt at making a matchup. Failed attempts get interesting, and we'll get to that in a moment.

if (remainingPlayers.length === 1) {
    if (firstPlayer.matches >= event.round) {
        return true;
    } else {
        return false;

Now we start a loop through potential opponents. As long as there is a potential opponent available, we will try to assign them the match until we run out of opponents. How we determine who to match an opponent up is where the fun math comes in:

let index = Math.floor(potentialOpponents.length / Math.pow(2, event.round + 1));

With this formula, in an 8-person tournament, the top player will play the 5th seed in round 1, the 3rd seed in round 2, and the 2nd seed every round thereafter (assuming all other conditions for being a potential opponent have been met). This is far better than throwing names into a pile and drawing randomly. Since it uses math, it makes later round matches more meaningful, and allows for earlier matches to be scheduled fairly. Here's the loop in its entirety:

while (potentialOpponents.length > 0) {
    let index = Math.floor(potentialOpponents.length / Math.pow(2, event.round + 1));
    matches.push([, potentialOpponents[index].id]);
    if (remainingPlayers.length <= 2) {
        return true;
    if (matchPlayers()) {
        return true;

    potentialOpponents.splice(index, 1);
return false;

We push the match onto the matches array, but if we don't ever return true because we run out of remaining players or we can't match future players, we basically back the match out of the matches array and try again until we run out of matches to try. The "matchPlayers" function is our recursive function this resides in.

3) Determine who's home

In chess, there's a concept of determining who gets the white pieces. In Descent, it's about whose home level you're playing in. Here in The Observatory, we don't want people playing home or away too many times in a row, so we have a way to make sure that happens as infrequently as possible:

match.sort((a, b) => (
    (event.matches.filter((m) => !m.cancelled && m.home === a).length - event.matches.filter((m) => !m.cancelled && m.home === b).length) ||
    (event.matches.filter((m) => !m.cancelled && m.players.indexOf(b) !== -1 && m.home !== b).length - event.matches.filter((m) => !m.cancelled && m.players.indexOf(a) !== -1 && m.home !== a).length) ||
    (Math.random() < 0.5 ? 1 : -1)
eventMatch.home = match[0];

The "match" is the array of players, and we sort the array in a way that makes it so that the player who has played home the least gets it next. In the case they've both played home and away identically, we flip a coin.


Putting together a Swiss algorithm for pairings wasn't too hard, and in fact was more about getting all of the nuances of a Swiss tournament just right. A lot of trial and error was had, and the first two seasons of the Observatory resulted in some pretty spectacular failures. But the code is pretty solid now, and you can find the whole function under "generateround" in fusion.js. I would like to break this algorithm out of the bot and into its own NPM module at some point, perhaps that's something for a future CodeShare episode!

Labels: , , , ,

Sunday, November 06, 2016
BlizzCon franchise roundup
Posted: 11:16:00 PM 0 comments
BlizzCon was as amazing this year as it has ever been. From the Sombra announcement to Weird Al closing out the show, there was more than enough to do this year. What I wanted to do with this post is roundup the six game franchises and give some commentary on their current state, going from best to worst.


Everyone was expecting the release of the new champion Sombra, and sometimes when you're expecting something you really don't get too hype for it. Sombra's reveal was definitely NOT one of those times, because the hype was real. They started the opening ceremony with a retrospective video of Overwatch's release. I thought it was pretty fake, with a ridiculously setup war room, some equally ridiculous lines, and in general a lot of small things that tipped off "this was not real". Sure enough, the video started glitching out, and eventually blacked out entirely before playing the reveal video. Everyone loved it, and it was as amazing as I had hoped it to be.

Overwatch has taken off in popularity since its release, and the main reason is that it makes a genre that was previously associated with hardcore gamers accessible to casual gamers, while at the same time making sure not to lose the hardcore crowd. The Overwatch World Cup was played at BlizzCon, complete with their own mini-stadium built inside of one of the halls. Overwatch is turning into a juggernaut that is continuing to gain momentum with things like arcade mode, new maps, and new game modes. They are constantly tweaking their matchmaking algorithms, improving their server technology to make the game smoother, and listening to fan feedback.

World of Warcraft

While Overwatch has all the hype, World of Warcraft is an established brand that has endured for over 10 years. However, their last expansion, Warlords of Draenor, hmm... sucked. No really, it was awful. They lost a ton of players, released very little content, and seemed to have no plan for the future.

Legion, on the other hand, has been an amazing expansion, with the new artifact weapons, a world quest system to replace the daily quests, other systems inspired by Diablo III, Hearthstone, and Heroes of the Storm, and a ton of content. So, it was pretty telling when on the first day, Ion Hazzikostas took the main stage and spent an hour talking about what was coming to future patches, and did so by himself. He went over the next two patches, 7.1.5 and 7.2, the raid content we'd see in it, and even gave a teaser for a 7.3 patch. This expansion is simply blowing the last one out of the water - not that it would be too hard to do so - and it's clear there isn't going to be any kind of content drought for the foreseeable future. Right now, WoW is pressing all the right buttons, and backing up their words with new content. If you've been wondering whether to get back into WoW after the failure of Warlords of Draenor, the answer is clearly yes.

Heroes of the Storm

Heroes is an oddity in the Blizzard world. It draws upon all of their franchises to take on giants such as League of Legends and DotA2. And to be fair, it does a good job. Again, it's another case of bringing a genre of gaming that is more associated with the hardcore gamers to casual gamers. They announced adding Varian Wrynn and Ragnaros to the game at BlizzCon, and continue to add more variety to the way you can play the game.

What I find odd, though, is that unlike a first person shooter, having all these different ways to play Heroes of the Storm just doesn't appeal to me as much as it could. It lacks player progression, and compared to Overwatch is significantly more difficult to pick up the cosmetics. Not to mention that with as many heroes as there are in the game, the learning curve is really huge when it comes to trying to figure out what each hero does, and how to successfully play against them. Having multi-class heroes like Varian is only going to make the curve grow. On the flip side, there is a plethora of things to do in Heroes of the Storm, so if you enjoy the game you're going to continually have more to do.


Hearthstone is a fun, lighthearted game that tries not to take itself too seriously. However, I personally find that the game tends to move too fast, with multiple expansions per year and a constantly changing meta game. The speed of the meta changing is not a new complaint, but with the new expansion announced at this BlizzCon, that speed doesn't seem to be slowing down any time soon.

To me, Hearthstone is an incredible time sink if you choose to play it. Not only do you have to stay current on the meta, but you spend time analyzing your cards and assemble decks with hopes that you will put together something that will be useful. Not to mention the investment - either time or money - required to get the cards you need to be competitive. Hearthstone can be amazing fun, but to remain competitive you really have to be ready to make the commitment.


Starcraft II is definitely waning in terms of new things happening. Sure, the modding scene is pretty active, but there were no announcements related to Starcraft II, if you don't count the DeepMind announcement. They have completed the story with the 3 chapters of the game but do occasionally add new mission packs to the game which are fairly popular. However, this won't sustain the game forever, and unless they're thinking about moving along to the next chapter in the Starcraft series, there isn't going to be much to talk about when it comes to Starcraft any time soon. At least their e-sports scene is thriving.


Where there is little to talk about for Starcraft, there is much to talk about with Diablo, and it's not very good. Diablo III has become a stale game, with the meta being exactly the same for the past 4 seasons. While they are adding some nice feel good elements such as the annual Diablo I event or the Necromancer, it really isn't clear what they have planned to allow the game to remain relevant. Challenge Rifts were a good thought, but even that will become stale after some time.

Diablo III almost seems like the red-headed stepchild of Blizzard. They have no e-sports scene, the content that gets added to the game tends to pale in comparison to other games, the meta has become stale, and they're even losing some of their top players to boredom. Are they doing enough to keep fans of the game playing it?

On the flip side, this sure feels awfully familiar. It's a long content drought, like those we'd get at the end of an expansion for World of Warcraft. Blizzard isn't dumb, they know when a game they've made is losing its appeal, and they tend to do something about it. They already did it with Reaper of Souls. Perhaps the next expansion or game is just around the corner?

Labels: , , , , , , ,

Tuesday, July 12, 2016
Attention - Gullibility
Posted: 10:05:00 AM 0 comments
Back in 2000, I used to have this completely silly thing on this site called "Letting Off Steam". Back then, I was a programmer and admin with Trax in Space, and I used to field a wide variety of absolutely ridiculous email. You can probably still find some of these out there on the Wayback Machine if you look hard enough. Mind the color contrast if you do.

And color contrast happens to segue perfectly into this email I received at around 3:30 this morning from, apparently, someone named Lily from The Humanity Campaign. It was so good (and by good I mean bad), I pretty much went all "Letting Off Steam" on it. The email should be rather self-explanatory. Enjoy.

Labels: , ,

Wednesday, May 11, 2016
AMD 16.5.2 error "Qt5Core.dll is missing from your computer"
Posted: 11:58:00 PM 15 comments
Sometimes software pisses me off. I mean, really. How hard is it to copy a file to a location on your hard drive?

Apparently, it's too much for AMD. I spent an hour tonight trying to fix an issue with my wife's laptop, and decided getting the latest video drivers would be the best way to do it. After wrestling with AMD's installer, which was stuck at "Analyzing System" until I ran their cleanup utility, I finally got everything installed. On reboot, when trying to run AMD Settings, the laptop got the error "Qt5Core.dll is missing from your computer".

Turns out, the installer fails to install most of the required files, and no one on the Internet knew how to properly resolve this. I went looking for the file myself in the package AMD provides, when I came across this gem:


This is the actual executable file that AMD uses to install AMD Settings. Simply double clicking on this executable and repairing the installation fixed the problem.

I don't know what AMD is doing with their installer, but the person who put it together should probably QA their stuff more, and save me from much frustration.


Labels: ,

Thursday, February 11, 2016
The Observatory
Posted: 11:41:00 AM 0 comments

I'm starting a new Twitch show tomorrow, February 12th at 7 PM Eastern, called "The Observatory". This will feature the original Descent game, with 1v1 DCL matches being played. I will be observing the game using a brand new observer mode, and will be commentating the matches along with co-casters Entropy and Morfod.

Not sure what to expect? Check this out for a visual of observer mode, along with the neat custom HUD that will be used for the event.

Want to learn more? Check out my information page on The Observatory.

Labels: ,

Six Degrees of Confusion
Posted: 12:10:00 AM 0 comments
Note: I come down pretty harshly on a few titles here that probably don't deserve it. Every title listed here is a good title in their own right, and deserves to at least be played through. The point is, nothing, yet, compares to Descent.

As you may know, I'm a pretty big Descent fan. I would even go as far as to say I'm a pretty big fan of the whole Six Degrees of Freedom genre. Really, if you want me to buy your game, make it a first person, Six Degrees of Freedom shooter. I'll buy it.

With that said, I have been a bit confused by the rash of 6DoF titles that have come out claiming they want to be as close to Descent as possible, and yet are doing things that... well, aren't very Descenty.

The Pretenders

There's Descent: Underground. This title seems to be doomed with poor net code that micro-repositions your ship just enough to throw your aim off, and a confusing scoring system that they are stubbornly sticking to. They have the name, but in my opinion they seem to be making their own 6DoF game.

There's Geocore, which I can best describe as a project lacking direction. Its single player mode has changed up literally half a dozen times since I've seen I started paying attention to it, and lacks the polish of other titles. It has a slogan of "competition grade", which is shown in its well-done net code, but honestly the original Descent has much better-looking weapons, and the game taxes my GPU like no other.

There's Sol Contingency, the game that originally was going to be Descent but got yanked from under them. While it has a very polished look, there are definitely some contrast issues that make it difficult to see what kind of action is happening in the game. I am also not a fan of the slow startup on its vulcan-like weapon.

There's Overload, the game made by the original Descent developers, who want to give us a modern version of Descent. Except, they have no initial plans for multiplayer, which is very much a core part of the Descent experience to me.

There's Retrovirus, a Descent-like game with a beautiful single player story, but horribly bad multiplayer play. The MOBA game mode was poorly done, and the spaces feel so large that it feels like it's impossible to properly aim. Not to mention the tech trees that let the king of the hill continue to be the king by granting well-performing players extra powers. Descent was a game that already had a wide skill gap, why make it wider?

While each of these titles are very good in their own right, as a fan of the Descent series, all of these titles miss the mark in one way or another. I am beginning to wonder if the experience of Descent can actually be recreated at all. Did Parallax happen upon some kind of magic formula for success that made the original game still the best game of the genre, even 21 years later? Is this 6DoF revival period just a bunch of pretenders trying to recreate the perfect Descent experience?

Or maybe am I overshooting my expectations?

The New Originals

Take Sublevel Zero. I had no expectations that this would be Descent, or anything like it. However, it is probably my favorite of the modern 6DoF games because of its rogue-like replayability, its crafting system that allows you to play the game the way you want to, and some AI that, while it could be smarter, does just enough to be dangerous if you're not paying attention. It has no multiplayer, but it never claimed to be Descent, so I don't expect it.

Take NeonXSZ. One of the few 6DoF games without inertial dampening (in English: your ship continues to move in the direction you moved it even after you stop moving in that direction), this game takes elements from puzzle games, action RPGs, and of course the 6DoF genre and brings it into an engaging environment where, again, you can play the game the way you want to. I didn't expect this to be Descent-like, and therefore was pleased with the polish of the game, as well as the action that came out of it.

And how about little-talked about Kromaia, the 6DoF bullet hell? This is about as far from the original Descent gameplay as you can get, because you want to kill as LITTLE as possible, or else the difficulty ramps up FAST. It's a different way to play a 6DoF, but it was still a fun game.

It seems the games that I have the LEAST expectation of being Descent are the ones I have the MOST fun playing.

Maybe I should cut my expectations short with these new games and take them for what they are, rather than having them try to be the old experience in new clothes, but I tell you what, that can be really hard to do.

Labels: , , , , , , , , ,