Stroller Simulator

This was a simple thing i made while learning how to use Unity.

It started out with a simple randomly generated path and a stroller that continually rolls along it.

The path was too rough so i replaced it with a randomly generated mesh.

Next, I added particles.

I used this little project in a presentation about Unity in one of my electives.

 

Raytracer

This was an academic group project for the computer graphics course i took. We had to write our own raytracer and implement several things such as shadows, motion blur and antialiasing.

Our final version had antialiasing with some basic supersampling, motion blur, randomly sampled soft shadows, refraction and more.

It started with a simple sphere being rendered.

Next, we added basic shadows and played around with reflectivity of surfaces.

Our shadows looked ugly so we refined them.

Next, we implemented motion blur.

We also wanted to import a 3D model so we grabbed a random trash can model online.

We also implemented a Cornell box and a few other things.

Overall it was an interesting project, ignoring the few sleepless nights we spent trying to get everything working before the submission date.

Tile-Based Untitled Game

This was another project I started in MonoGame. The goal was to make a gigantic grid-based 2D game. I don’t remember many other specifics, but the basic premise of the project was pretty ambitious.

The basic camera code and grid generation code were the first things i completed.

Once i had a simple grid generated, i wanted to take it a step further and create a grid of grids.

The grid became an 8×8 2D array of chunks which are 256×256 tiles. At most, there were 4 chunks active (within camera view). All other tiles were considered inactive until the camera moved within their visible range.

The tiles were colored to show where chunks begin and end.

After getting the grid generation sorted out, i doubled the size of the tiles and added a cursor (the white square). I also implemented some basic selection code. In this example, i could turn a tile yellow by clicking it.

In the top left corner i placed a basic player pawn entity as well.

Next I started work on my pathfinding for actor entities.

When you select an actor then click a tile, it runs a pathfinding function which computes a path to the tile (in the form of a queue consisting of tile objects). Then the actor starts de-queuing each tile and transitioning from tile to tile until it empties the queue. If a tile becomes impossible to traverse, then the actor will stop and re-call the pathfinding function, rebuilding the queue of tiles.

At this point i had also added an asynchronous load screen since generating all the world tiles took a bit of time.

This is where this project hit a dead end. In this case it was just a lack of direction.

 

Generic Zombie Game

Another game i wrote in Lua around 2011(?).

It is a round-based zombie survival game, with rounds typically lasting 15 minutes (although often ending much sooner when all human players die). You earn cash by killing zombies which can be spent on weapons and supply airdrops. If you die, you become a zombie.

Some notable features:

 

• Challenging gameplay. A strong emphasis on teamwork and inventory management.

• A dynamic weather system. Thunder, lightning, particle-based rain and wind. The weather is randomized each round.

• Random events. They happen over the course of the round. Some are good, like scientists and supply crates appearing. Some are bad, like temporary radio blackouts. There’s even an event which causes a wicked storm using the weather system.

• Intelligent zombie NPCs that hunt you down. They can also break through doors, breakable walls and windows.

• A bunch of scripted weapons which implement scopes, ironsights, bullet penetration and more.

• Melee weapons, including a hammer which can be used to build barricades using wood planks.

• An inventory system that is very modular. You can add your own items with ease.

• 4 human classes and 4 zombie classes, each with their own perks.

• Fancy effects. Motion blur, postprocessing, realistic drunkness/infection/etc, blood spatter on your HUD, and probably more.

• Lots of gore effects. Blow the torso off of a zombie with a winchester, create showers of guts with explosives, instantly fry zombies with laser weapons and blow the heads off of zombies with pretty much any gun.

• Ailment system. If you are attacked by certain zombies you will start to bleed. If you are hit by zombies you become infected. You can also become irradiated from certain things.

• Replayability. Never play the same match twice. The infection antidote spawns randomly around the map throughout the game, and the evacuation helicopter has multiple landing zones.

• Stats. At the end of the round awards are handed out to players who have accomplished great and not-so-great things. If you’re one of those fellows who hides in a corner while his teammates do all the work then you will get publicly humiliated. If you are a skilled player then you’ll get a pile of accolades.

• Parameters that give the server owner complete control over most gameplay aspects.

• A custom entity loading system for maps which do not officially support the game script.

I originally wrote this game several years ago, before the original Left4Dead game was released by Valve Software. There are a bunch of gameplay videos on youtube, search for “ReDead Gmod” or something along those lines if you want to see more.

There are plenty of gameplay videos on YouTube as well.

The scripts are freely available: https://www.assembla.com/code/redead/subversion/nodes

The Stalker

This is a game script i wrote a couple years ago in Lua for Garry’s Mod, a mod which exposes the Source Engine (the engine used by Half Life 2, among other things) to Lua. I wrote the game around 2011. It took roughly 3 months to complete. In that time I had to program the game and also made a few maps for it using the Source SDK which took longer than expected to finish.

Being able to script a game using Lua bindings in a pre-existing engine is good fun since it’s relatively easy to get a working prototype up and running.

Here is a general description of the game:

A team of soldiers must hunt down a powerful, nearly invisible creature known as The Stalker. The Stalker has a number of abilities:

Scream – A loud shriek that causes nearby soldiers to lose their hearing temporarily and disorients them. This attack uses 25% of your energy.

Mind Flay – This attack invades the mind of the targeted player. They are heavily disoriented and take some damage from the attack. Perfect for picking off stragglers or confusing players who are very good at figuring out where you are. This attack uses 50% of your energy.

Telekinesis – Control an object with your mind. You can choose the direction in which the object is thrown. A useful tool for distracting soldiers or causing damage with larger objects. This uses 75% of your energy.

Blood Thirst – Your attacks absorb health for a short duration. Uses 100% of your energy.

ESP – This ability is enabled/disabled by toggling your flashlight button as the stalker. When ESP is enabled, you can see where soldiers are through walls. However, while ESP is active, your energy will not replenish and your overall vision becomes darker.

The energy used by psychic attacks will slowly regenerate over time. In addition to having psychic abilities and being invisible, the Stalker is also very agile. It can jump to high areas, run faster than soldiers, and cling to walls. The Stalker’s health slowly drains over time but it regains health with each kill.

The soldiers have their own tools for hunting the Stalker. There are 4 different, equally balanced primary weapons to choose from, as well as 4 different secondary weapons and 4 utilities. Their flashlight runs off battery power and if your battery reaches 0% charge then there is a small delay before it starts recharging. The recharge rate for the battery is slower than its drain rate so you have to manage your flashlight use.

Primary Weapons:
• SG 552 – A highly accurate scoped rifle. Magazine holds 20 rounds.
• FN P90 – A SMG with a large magazine and a high rate of fire. Magazine holds 50 rounds.
• SPAS 12 – A powerful close range semi-automatic shotgun which can fire 6 rounds before reloading.
• FAMAS G2 – A 3-shot burst rifle. Magazine holds 30 rounds.

Secondary Items:
• Portable Sensor – A laser tripwire alarm which can be planted on any solid surface.
• USP Compact – A backup pistol with unlimited ammo.
• Seeker Drone – An autonomous drone which floats around and sounds an alarm if it detects the Stalker.
• Optic Range Scanner – A handheld scanner which augments your vision.

Utilities:
• Automedic System – An integrated morphine injector for your armor which heals you automatically when you are injured.
• Laser Module – A laser pointer attachment that fits any weapon.
• Extra Ammunition – Additional ammunition for your primary weapon.
• Dual Cell Battery – An improved battery which recharges faster and augments your flashlight.

Some screenshots:

Plenty of people have recorded videos of the game in action.

You can check out the code on assembla: https://www.assembla.com/code/the-stalker/subversion/nodes

Learning MonoGame

It’s important to keep a log of the stuff you work on, even if it doesn’t pan out. I blogged about this game i was working on back in 2013 while i was in university, the following post is an amalgamation of everything i wrote pertaining to this game, edited for brevity and clarity.

This project started out in VS2010 using XNA and an open-source 2D physics engine called Farseer Physics but then VS2012 came along and Microsoft stopped developing XNA. XNA still works but it’s officially deprecated, so I migrated to Monogame which is basically a port of XNA that works on every platform (and works with VS2012 unlike XNA).

I didn’t really get any work done on this when i was messing around in VS2010. I had no idea what i was doing so most of my time was spent learning C# (which is a cool language) and figuring out the architecture of the Farseer Physics test samples. When I finally got around to installing VS2012 i had to figure out how to make Monogame work with Farseer Physics. After a while i sorted out the physics engine. The solution was trivial, just had to replace the XNA references with Monogame references and it built without any problems. So after I got that out of the way i hit my second road block. I couldn’t do anything with XNA content projects in VS2012. Monogame will soon support content projects but for now I have to use a separate content project in VS2010 and build that every time i add new assets (textures, etc) to my game.

So, once i got those two things out of the way i could actually start writing the game. I kind of cheated and used the Farseer Physics samples project as a reference when I started working on my game. So far I’ve implemented a similar screen management system (most games use multiple “screens” – menus and pause screens, etc.). And then there’s a lot of stuff behind the scenes that goes into actually setting up the “world” and spawning the low-gravity orange box you see in the first screenshot. It bounces around if you drag it with your mouse.

I guess my next task is to work on making the player object controlled by the WASD keys and make it so the player isn’t just a box that tumbles around (I assume i can just max out the damping on the box so it can’t rotate, or even just disable rotation). Then after that i suppose i’ll have to work on making the player object an animated entity with bones and joints and stuff.

In the picture there are 4 buttons in total, they support images and text (and a combination of both) but for now i’m just trying to get them to actually function like buttons. I think i’m just going to make my own text system using images for individual letters so i’m not actually drawing any actual text to the screen.

It’s hard to choose a starting point when you start from square 1, there are so many things to do and it’s hard to judge which features should take precedence. So for now I’m just going to try and get the basics of the interface sorted out and worry about everything later.

With some work I got the main menu and buttons working exactly how i wanted them to. Right now only the New Game and Exit buttons work. If you click New Game, it transitions to the game screen and spawns a player object. And the exit button speaks for itself. I think i’ll worry about getting a proper font and making the buttons look nice when it really matters. For now i want to flesh out the more important things.

This isn’t very exciting to look at but there’s a lot of stuff behind the scenes being completed! I wrote a basic EntityFactory and EntityManager class. Now i can go wild creating new entities.

I’ve also been working on a entity hierarchy. In my previous blogs i wasn’t actually using entity factories or my own entity classes so it took like 30 lines of code to just create one object, and then i had to write the code that renders the object on the screen. Now i can create an object in one line of code and I don’t have to worry about how it renders.

I need to figure out how to go about properly deleting entities. Right now, my EntityManager keeps a list of all the objects I’ve spawned into the world. If i delete an object then i also need to remove it from the EntityManager’s list (and if it’s a physics entity then i need to delete its physics object too).

Next, I finished an input helper component which should come in handy for several things. I can’t see how anyone can program a game without using a component-based architecture… It’s messy enough with everything compartmentalized, I can’t imagine how much of a mess it would be if it weren’t.

And here is more progress with player movement. Those two orange rectangles you see covering the blue bouncing rectangle are actually not colliding with anything, they are sensor bodies that tell me whether the player object is on the ground or touching a wall (which is why i can bounce off walls, that was intended). Normally they would be invisible, i’m just drawing them because i want to be sure they’re scaling properly based on the size of the physics entity they’re parented to.

I wrote an attribute system for entities and made them serializable. My next order of business is making a simple level editor. Instead of making a separate modding toolkit for this game i figure i might as well just build it in as a menu of its own.

I finished some concept art.

I Frankenstein’d the final product from several different sketches. I don’t own a scanner (i had to hold my webcam steady and take top down photos of each drawing) which explains the differences in color. If this looks like it was inspired by Earthworm Jim or something similar then that’s probably because it was.

For some reason i can’t draw normal hands to save my life. I also can’t draw hands directly from an arm, i have to draw them separately then splice them in and re-scale them using Photoshop. The gun in his left hand was also drawn like twice the size it needed to be.

The final product, converted in Photoshop and colorized without shading.

 

This is essentially all I really was able to complete on this little project before I lost interest. Around this time, Unity was growing in popularity and my university switched from MonoGame to Unity for all game development courses. Switching from MonoGame to Unity definitely helped highlight some of the things i disliked about MonoGame. Pretty much everything has to be programmed from scratch. This isn’t terrible if you know what you’re doing (I didn’t) and you want maximum control over every aspect of your game (I didn’t).

To say that I simply quit working on this solely because I lost interest would probably be an oversimplification. It was a combination of dislike for the game engine, lack of vision/direction for the game i wanted to make, and a lack of free time due to coursework. It was a good starting point for learning the architecture of games and figuring out how game engines really work under the hood.

 

Taming Random Numbers

Imagine you have a 120×120 grid of tiles. A tile can either be empty or solid. You want to procedurally arrange the grid such that the empty tiles form an interesting complex of caverns. You also want to be able to generate a near-infinite amount of different styles and variations of caverns, because variety is nice.

 

First, the basic concepts need to be set up. Every tile in the grid needs to know about the tiles that surround it. What is the X and Y position of the tile? How many tiles around it are solid? How many are empty? Is the tile to the left of this one solid or empty? Is this tile on the edge of the grid? All of these questions need to be answerable by an individual tile.

 

You also need to come up with a solution for how you’re going to tweak all of these tiles to get your result. This is where the concept of a filter (for lack of a better name) comes in. Every time the entire grid is modified, a filter will be handling the logic. By chaining several filters, you get your end result. A filter can be very simple. You could make a filter that finds every tile on the edge of the grid and makes it solid, or a filter that swaps all empty tiles to solid and vice-versa. You can also incorporate several commonly used tools in procedural generation into your filters, such as cellular automata. And so-on.

 

First, you start by randomizing the tiles. This gives you a rough starting point for shaping your caverns. Next, you apply some simple cellular automata rules to transform the noise into something more manageable. The cellular automata rule is simple: if a tile has 4+ solid tiles directly neighboring it (including diagonals), then it becomes solid. The same logic applies for empty tiles with 4+ empty surrounding tiles. In all other cases, the tile remains as it is.

In the animation you can see that step 1 is the random collection of tiles, while in the following steps a cellular automata rule is applied. The effect of the filter diminishes after the second or third step, so for practical purposes you just need to run that filter 3 times to smooth things out.

 

One obvious issue is that there are caverns that get generated with no way to move from one to another. What if the solid tiles are unbreakable?

Starting with a nicely smoothed out set of caverns, you could then add a filter which reduces the number of caverns to something more manageable. You could keep the 8 largest caverns and take all remaining caverns and make them solid. To maintain the same number of empty tiles, you could convert random solid tiles from the larger caverns to empty tiles based on how many empty tiles the now-removed caverns had. Now you have a guaranteed collection of 8 or less disconnected caverns and your grid has the same ratio of solid tiles to empty tiles. How can you make sure the caverns are all connected? One solution is to connect every cavern to the largest cavern by digging a trail to the large cavern. Now you can be certain that every empty tile on the grid can be reached by the player.

 

What if you aren’t satisfied with the distribution of caverns? What if you want to guarantee that the majority of the map has caverns of a specific width (more or less)? You could make a filter which finds every solid tile that has 5+ solid tiles in every cardinal direction, and make it empty. The same logic would conversely apply to empty tiles.

Step 3 on this image illustrates the outcome of applying this new filter. Solid masses of tiles suddenly have hollow interiors and large empty spaces suddenly have solid chunks of tiles filling them up. This filter seems to make a mess of the grid, however, so you would need to re-apply some other filters to clean it up. Reducing the number of caverns to something manageable then connecting all the caverns with another filter would give you desirable results.

 

Maybe you want the caverns to be more rectangular and less blob-shaped. You could add a filter that fills in small gaps and removes bumps.

Your options are limitless when you have control over the set of filters applied, and the ordering of these filters. The filters can even be fed different parameters to give much different results. Maybe you want to reduce the number of caverns in the grid to 5 instead of 8. This would use the same cavern reduction filter used previously, just with different criteria.

Having more filters at your disposal means you have more control over the end result, and also more interesting combinations to try.

 

What this conceptual grid of solid and empty tiles will be used for will be the topic of a future post.

Modern Politics

I decided to write this post as a way of organizing my own thoughts and hopefully educating people who might not share my viewpoints, if even a little bit. In any case, I would like this to be my first and final post about politics.

My political bias will probably be obvious by the time you finish reading all of this. I’ll try to keep things as objective as possible.

Much of this post will focus on American politics, though the broader ideas i present are not necessarily tied only to American politics. The political situation in America has become so cartoonishly exaggerated that it makes for a good case study. A strong understanding of American politics is vitally important given that America has been the de facto leader of the global order for quite some time now. What happens in America ripples to the rest of the world.

Your consent is being manufactured

In order to properly discuss politics we first need to understand the nature of our political ecosystem, which most importantly includes mass media. I would argue that the Chomsky model of propaganda is likely the most vital tool for making sense of contemporary politics. Here’s an entertaining short video that summarizes his book:

If you understand the role of corporate media in the greater political ecosystem, it makes it much easier to see that your consent is being manufactured. Those talking heads on television are not your friends. They don’t work for you. It would take you multiple lifetimes to amass the money these people make in one year. It’s a big club… And you ain’t in it.

There was a time where the media could have been considered the fourth estate, a neutral (or at least less biased) observer with a duty to inform the public. Nowadays, roughly 90% of the media you see daily is produced by 5 mega-corporations.

  • NBC, MSNBC, CNBC, and Telemundo are under NBC Universal and owned by Comcast, one of the most hated companies in America.
  • ABC is owned by The Walt Disney Corporation. They also own ESPN, Marvel, Disney Studios, and A&E networks.
  • CNN is owned by Turner Broadcasting which is owned by Time Warner. They also own HBO and Warner Brothers.
  • Fox News is under 21st Century Fox (renamed from News Corp) and controlled by Rupert Murdoch. They also own Sky News and National Geographic Partners.
  • CBS is owned by the CBS Corporation but the majority control is owned by National Amusements under owner billionaire Sumner Redstone.

These outlets stylize reality and inject their own flavor of bias into the information they present. It’s important to understand that all content these outlets produce has been filtered, chopped, screwed and scrutinized under a microscope so that it’s advertiser-friendly, brings in viewers, and doesn’t stray too far off message.

Good journalists with functioning moral compasses still exist, though they are few and far between.

The generational divide

The internet is slowly beginning to disrupt the propaganda system in place. Televised news is becoming less and less influential, at least with young voters. This is a double edged sword. Fake news, pseudo-intellectual dreck, and extremism are on the rise now.

The generational political divide has never been more obvious:

Based on this recent poll, over 80% of democrats aged 30 and younger voted for Bernie Sanders in their state primary. This massive difference is likely due to several factors.

Younger people are generally less reliant on traditional news media for their information. The indifference (or in some cases, outright hostility) that these media institutions show for Sanders doesn’t reach these voters. If they aren’t indoctrinated, it becomes that much easier for them to notice the often outrageously biased content these media networks produce. This is probably an unintended side effect of the internet (i’m sure these media conglomerates are not happy about their declining influence), but it has created a fractured voter base.

This isn’t the only reason young people support Sanders.

The younger generations know better than any other that the economy is becoming more and more oppressive. Companies are offering less competitive salaries at entry level positions, unpaid internships are becoming more commonplace, and the rich continue to get richer. Trickle down economics began with Reagan and never stopped. We are seeing the result of decades of austerity and corporate welfare. The social safety net is extremely underfunded, infrastructure is crumbling, and public institutions like schools are starved for funding. Healthcare is a distant dream for many who can’t afford insurance. Families are balanced on the edge of a razor blade, only one expensive bill away from bankruptcy.

Only one democratic candidate has consistently promised to actually deal with these issues. The problem is that his solution, however reasonable it is, conflicts with the goals of the powers that be. Medicare4All would mean that private insurers and the pharmaceutical lobby would become defunct overnight. Investing in infrastructure and erasing student debt would mean there’s less money available for the next round of corporate handouts. Re-instating the fairness doctrine would mean that corporate media would have more stringent guidelines to follow. Taking on the prison industrial complex and the military industrial complex means several other big players are at risk of losing their goose that lays golden eggs. Strengthening environmental regulations means the energy sector has more bothersome rules (and potential fines for breaking those rules).

These monolithic entities aren’t going to passively accept that Bernie Sanders, who threatens their business-as-usual, could seriously become the democratic nominee. The media narrative is carefully manipulated in subtle ways (though sometimes, if you pay attention, the mask slips off and it becomes very clear what their goals are). Sanders and his rallies are outright ignored most of the time. Many far-flung scandals, like the mythical “Bernie Bro”, are cooked up to stir controversy. If Bernie Sanders is mentioned on a network like MSNBC (something exceedingly rare), it’s often done in a way that downplays his policy positions and instead focuses on superficial issues, like how he sometimes seems grouchy. This has a profound effect on how Bernie Sanders is perceived by a large subset of the voting populace.

The notion of shared truths does not exist anymore. People live in different realities depending on the media they consume and their capacity for critical thought. This phenomenon isn’t only applicable to Americans who rely on Fox News for all of their information.

The manufactured window

The Overton window frames the range of policies that a politician can recommend without appearing too extreme to gain public office given the climate of public opinion at that time. In reality, often this window doesn’t actually coincide with public opinion. In America, roughly 70% of the populace agrees that Medicare4All would be a good thing. Why is it that every presidential candidate other than Bernie Sanders opposes it? Why is it that news outlets, regardless of political leaning, scaremonger about Medicare4All?

If consent is being manufactured and public opinion is being manipulated, then logically it follows that the Overton window is effectively being controlled. Even if public opinion is overwhelmingly in favour of a common sense policy like Medicare4All, the political discourse can be poisoned and the policy can be made to seem “radical” or “irresponsible”.

The discrepancy between the real Overton window and the manufactured Overton window in America helps explain why so many people have fallen for the “Bernie simply isn’t electable” argument. By making his policies seem outlandish and radical, it’s possible to convince many people that he’s simply not a viable contender even when the evidence points to the contrary.

Of course, the Overton window can shift both directions. Given the massive support for Bernie’s policies, it’s evident that he’s managed to broaden the window in the left direction (even if the political establishments and media conglomerates refuse to acknowledge it). At the same time, Trump has managed to do the same in the opposite direction. The difference is that Trump has been given a platform by those who control the dissemination of information in America, while Bernie is a political outsider that rarely receives coverage (let alone good coverage) from supposedly left-leaning outlets like MSNBC.

What does this all mean? It means that the Overton window in America will continue to slide to the right while progressive politicians will struggle to pull it in the other direction. Over time you can expect to see even more ideas and policies previously considered radical and outrageous (for good reason) becoming mainstream. Expect to see more and more voters, especially youth voters, becoming disenfranchised. If the American political establishments can’t indoctrinate them, they will outright ignore them and suppress their votes.

2020 and beyond

It is currently April 8, 2020. Bernie Sanders has just dropped out of the race and it looks like Joe Biden will become the democratic nominee. I am unhappy with this outcome but not at all surprised. Bernie went up against a machine designed to crush candidates like him, and he managed to become one of the strongest contenders for the nomination. It took an entire clown car full of democratic candidates coalescing against him before Super Tuesday (something that has never before happened in history) with the aid of corporate media to blunt his momentum.

If I had to guess at who will win the 2020 election, my gut tells me it will be Trump again. He’s a sitting president, which history has shown to be an advantage. Joe Biden’s cognitive health is rapidly deteriorating and it’s looking like the democratic party may opt to replace him once he wins the nomination. This would be decidedly un-democratic since his replacement may be someone who never partook in the primaries or debates at all. If Biden is incapable of even debating Bernie Sanders, who lobs softballs at him, then how can he expect to go up against Trump? His rap sheet is near endless and his closet is full of skeletons. Many people only know Joe Biden as the VP from the Obama years, and this is the main reason he’s done quite well in the primaries thus far. Once Joe Biden actually faces real scrutiny, the reality will begin to sink in: democrats backed a losing horse… Again.

Even with Sanders endorsing Biden and campaigning for him, the real issue is that Biden hasn’t budged an inch to draw in voters from the left. At best, voters can expect some sort of band-aid solution for ObamaCare. His campaign is bankrolled by billionaires and private interests so of course he is going to toe whatever line they draw for him. Bernie Sanders tried extremely hard to get some concrete concessions from the Biden campaign and it looks like he’s been given nothing to work with. As the saying goes, democrats fall in love and republicans fall in line. Expecting the left wing of the democratic party to go against their own morals back a candidate who is only marginally better than Trump on paper is ludicrous. It would, in the best case, be a short-lived reprieve from America’s decline.

Surely the voters who have been pushed to the margins and ignored will circle the wagons when the time comes… Right? The scorched earth smear campaign against Sanders will be forgiven and forgotten… Right?

The most common argument I see in favour of Biden is that “he would get rid of Trump and return America to normalcy”. This argument ignores that Biden is a part of the reason we have Trump in the first place. If the political environment in America allowed for a crass reality TV show host to beat a career politician in 2016, what does that say about both parties? How has the bar been lowered so far down that people are willing to vote for a democrat with a terrible track record as long as they aren’t as bad as Trump? The republican party has managed to transform age-old norms and control the political narrative in America while the democrats limp along and offer nothing of substance to make voters interested in their ineffective brand of centrism. Party apparatchiks and “vote blue no matter who” partisans are completely oblivious (or just in denial) as to how truly worthless the Democrats have been as an opposition party. If the democrats are so fuckin’ smart, how come they lose so goddamn always?

Many people seem to forget this, but the reason Obama won in 2008 was that he built a grassroots movement that engaged with disenfranchised voters and gave people the impression that real change was possible (remember hope and change?). If you compared his 2008 campaign to the Sanders campaign in 2016 or 2020 you’d find a lot of similarities. The real issue is that once Obama took office, he quickly dismantled his grassroots network and then went about business as usual. By the end of his second term it had become clear that he wasn’t the revolutionary that people had hoped for. Obamacare was just a re-branded republican concept that didn’t go far enough, the criminals from the Bush era were let off the hook without even a slap on the wrist, drone bombings with many civilian casualties increased under his watch, Guantanamo Bay remained open, the PATRIOT act was renewed, the notorious cages for kids we hear so much about nowadays were built, and a deteriorating America remained unchanged. Obama had charisma and his public speaking was, in my opinion, unparalleled. Unfortunately these are tertiary traits that don’t really mean anything in the grand scheme of things. It’s lipstick on a pig.

If we ignore the dangerously lacking enthusiasm for Biden, there are still several other factors that will make a 2020 victory difficult. The electoral college should have been abolished ages ago. Many states use unreliable (and likely rigged) voting machines and engage in other undemocratic practices like purging voter rolls, gerrymandering, removing hundreds of polling stations, and so-forth. America has not been a functional democracy for a long time. Only a democrat that energizes people and brings voters out in large numbers can actually win anymore. To beat Trump you need to counter his brand of fraudulent populism with genuine populism and this is something only Bernie Sanders is capable of.

For many (myself included), Bernie suspending his campaign signalled the beginning of the end. A new generation of voters are demanding real progressive change and this is something the democratic establishment refuses to deliver, even partially. Ignoring a large subset of the democratic voter base in order to continue business as usual is a foolish short term gamble which hasn’t paid off (and likely never will). In the long term we will see democratic party rapidly lose relevance as progressive voters continue to become radicalized by their exclusion from the political process. Maybe the accelerationists, as batshit crazy as they may seem, were right all along.

I don’t want to sound like a pessimist. I want to see Trump be a one term president even if that means exchanging him with a mediocre democrat with his brain leaking out of his ears. It’s plain to see that there’s a long way to go from here, regardless of what the outcome is.