Fractal Block World

Fun Facts

Back
Here are some fun facts about the game and the making of it.

Only One Block Texture

Originally, there was only one block texture (the grey concrete one) and I thought it would be cool to keep it that way.

However, blocks where shaded depending on what level they were on. As you went deeper, blocks would gradually change to green, and then to yellow, then to orange, then to red, then to purple etc. Then they would go back to grey and the colors would repeat again.

I ended up adding more block textures because I realized I had no clue where I was when I played the game.

Copyrighted Sounds

There was lots of copyrighted media I wanted to use, but did not. Here is a partial list.

When starting a new game (classic, not genesis) on the Torture Mode difficulty, the following audio clip would play: the part of Dredd (2012) where Dredd is asking his gun for ammo, but he only has a high ex round, and then he shoots a bad guy in the head with it.

When starting a new game (classic, not genesis) on the Pain Addiction difficulty, the following audio clip would play: the part of Total Recall (1990) when he guy says "don't do it... the dome will crack".

When starting a new game (classic, not genesis) on the Caustic Eutopia difficulty, the whole clip of Filthy Frank saying it is time to stop would play.

When starting a new game (classic, not genesis) on the difficulty beyond Caustic Eutopia (called something like silly mode) the "you never go full retard" clip from Tropic Thunder (2008) would play.

The credits song after the Inner Core ("Final Boss") was "Rainbow Blood" by Sadsic.

The credits song after the Omega Core ("Final Final Boss") was "The Sea" By DJ Contacreast.

When entering the Hell Flower (in classic, not genesis), in the big battle before the final boss, the music would be "Causic Disco" by VAC, the mindless faith remix.

Other songs that I thought fit the atmosphere of the Fractal Block World:

C++ and "Fun" With Memory and Pointers

The console (which you can open by pressing ~) was written from scratch, along with the command system. Commands are Lisp style S-expressions. I wrote most of this for Block Arena. That is one of the many reasons that project was never finished.

This program was written in C++ (and scripts are in Lua).

Pointer bugs resulting in memory corruption are scary. To help avoid these memory issues, in some places I use my own pointer class. I am not sure what is the official name for my type of pointer. I have not had luck finding it on the internet.

Let us call these pointers "John Wick" pointers. Many John Wick pointers can point to the same object. From any John Wick pointer, you can delete the object, which will result in all the John Wick pointers to the object being set to null. Also, if the last non-null John Wick pointer to an object is destructed, the program exists outputting the error that there is a leak.

John Wick always releases memory when he is done with it. If not, he dies.

One downside to these pointers is that the throwing of exceptions does not work so well. A second downside is that these pointers are not thread safe (at least not in the way they are implemented). A third downside is they take too long to be copied. For these reasons, sometimes we use C++ shared pointers instead.

Games That Influenced This One


Overpowered Ammo Boxes

In an earlier version of the game (classic, not genesis), ammo boxes would refill your ammo a certain percentage. For example, there was a 20% rocket ammo box, which would give you N rockets, where N is 25% of the maximum number of rockets you can have.

I removed this because I thought it made the game too easy. Note that health boxes work this way.

There were also special ammo boxes that give you ammo beyond your 100% limit.

One Way Walls

One-way walls were added late in development.

Before this, there was a gadget that was a tube with green rings, then a plug, then red rings which would allow you to go through an anti-plug.

Projectiles Spawning Projectiles Spawning Projectiles

I wanted monsters to launch a rocket at the user. And then the user might shrink, but the enemy rocket would spawn a smaller rocket which would home in on the user. Then that smaller rocket may launch an even smaller rocket, etc.

This never really worked out, but it was one of the reasons for having time move slower on coarser levels.

Having levels have time travel at different speeds turned out to be a headache for development.

Battle Before Final Boss Was Too Hard

I wanted the battle just outside the Inner Core final boss to be very epic. However, it took many many hours to get powerful enough to get through it. I ended up making the final battle significantly easier that way the game can be beaten in a few hours.

While making the world, I wanted it to be difficult for someone to figure out how to route a good speedrun. My goal was for there to be several very different strategies for how to speedrun the game.

Where The Idea Came From

If you are curious, here is where the idea for Fratal Block World came from: At RPI Zach Barth and I were walking around the "86 Field" talking about Infinifrag 2 and he asked if that game should have a level of detail system. I said that I thought it didn't make sense to have that in a block based game. But his comment stuck in my mind.

Years later I was thinking about how in a world where most blocks are of a certain type, you only need to store the blocks that are not of that type. But how do we have efficient memory storage in a world where certain regions have their own default block type, but these types change from region to region?

The idea for this game was a reasonable way to try to kill these two birds with one stone. Chunks from a distance are rendered as blocks, and chunks only store the blocks of non-default type (each chunk has a default child block type).

Also, either in 2012 or slightly before I had this trippy dream which was basically like flying through the "Burlington" area in this game, shrinking and shrinking. When I woke up, I thought "let's do this thing", and I committed to coding it up. Close to this was when I had the a-ha moment that the system in this game was the most practical way to get both level-of-detail and efficeint storage of non-default type blocks.

The a-ha moment caused me to stay up almost all night, which was the night before going to Cedar Park with some friends!