My big video game
Any Journey is an unfinished video game that I worked on for around 8 months.
What kind of game is it? Bare with me here. Any Journey is a procedurally generated open world role-playing game.
What that means:
- procedurally generated: the world, levels, factions, loot, and much of the content of the game is generated by the computer so that every playthrough is different.
- open world: you can write your own adventure, choose what type of character you play as, your combat strategy, your faction allegiance.
- role-playing game: you play as a character in a fictional setting and can make decisions that impact the world
In this article I’ll cover how I made the game, my experience uploading a weekly dev log video to YouTube, why I didn’t finish it, and the lessons I learned.
At the end you’ll find a link to download the (very buggy) game and a full changelog with over 14000 words.
Table of Contents
Where did I get the idea to make a game like this? I can’t tell you where ideas come from, but I can tell you that I used to play a lot of Skyrim as a kid.
There’s a meme that goes around in the game development community that every beginner wants his first game to be some variation of Skyrim. And who can blame them? Skyrim is one of the most incredible RPGs ever made. It’s 11 years old now and is still getting re-releases
My dream game is a combination of Skyrim and Microsoft Flight Simulator X. 🙂– An aspiring game developer… probably
Stardew Valley is a game about farming. On first glance it has absolutely nothing to do with Any Journey. But this game was made by one man: Eric Barone. He spent four years developing the game. During this time he taught himself the skills he needed in game design, programming, art, and even music. Within two months after release he had already sold 1 million copies.
If that’s not inspirational crack to a young indie developer, I don’t know what is.
Any Journey didn’t become a procedural variation of Skyrim in the end, but I did come pretty close.
The main feature of Any Journey that sets it apart from other RPGs is that many of the features of the RPG are generated randomly by the computer.
Features generated in the game include:
- world geography: mountains, sea, and land
- factions: their ideology; city, towns, and camps; geo-political relations
- enemies: equipment, levels, attributes, and look
- loot: weapons, armor, jewelry, qualities, materials
- NPCs: look, quest locations, quest items, merchant’s inventory
Of course, a huge problem with procedural generation is that the stories or quests that you generate are hard to stand up to hand-crafted ones. And generating them without re-using pre-made parts is nearly impossible if you want a consistent result.
So the game is more about figuring out the mechanics and increasing your skill level, familiarizing yourself with the political landscape to increase your rank and influence. With the end goal to become the most powerful agent in the land.
In RPG games, as you level up you get to use or equip proportionally better items. Inspired by games such as Borderlands, I made my own loot generation system where weapon and armor materials, enchantments, qualities and types are generated for every item based on your level and the level of the dungeon you’re in.
you found a chest
The different weapon types have attributes such as physical- or magical damage, swinging speed and weight which can impact the combat strategy you choose. Qualities such as sharp or blunt add percentage bonuses to physical damage, for example.
Weapon and armor types
You can choose to focus on ranged combat with short bows, long bows, and crossbows. Or choose any of the melee weapons depicted on the right.
Bigger weapons have longer swinging speeds and weigh more, increasing their stamina cost to use. Some weapons are two-handed, which means you can’t use a shield at the same time.
weapons sprite sheet
The world you inhabit is one of power struggles and war. You can choose which faction you support and increase your reputation by completing quests for the general or fighting in the arena.
empire politics overview
world map with faction borders enabled
When factions start to dislike each other, it could eventually lead to war. They may also form alliances and there is no in-game check that prevents anyone from taking over the world.
In the version linked below, wars are sadly disabled.
In addition to leveling your gear, you can also level up yourself by choosing skills along the skill tree.
This way you have to specialize your character into a style of play.
part of the skill tree
A loot system is great and all, but what if you have too much of the good stuff? Sell it and buy other stuff which you do need.
You can even sort and filter your items, and have a preview screen on the bottom right where you can inspect the items you’re trading.
In addition to the features mentioned, there are also arenas where you can battle foes to gain influence. There are ruins with skeletons, cultists hiding in caves, raging barbarians, and taverns. You can check out the download link below or the YouTube series for more.
I had many other ideas for features to add. If I could’ve worked on this forever with no issues, I would’ve added an enchanting system, an upgrade system, etc. The scope for this project was far too large, which I’ll address later.
First, let’s talk about what goes on behind the scenes of the game.
How I made it
Any Journey started out as an experiment to see if I could make a game using nothing but stock Java. Most games are made in a pre-existing engine, such as Unity, Construct, or Unreal Engine. Java is a programming language. Just a programming language.
My own engine
I made my own engine: my own input handling, my own rendering pipeline, my own everything.
I followed a lot of tutorials and read a lot of Stack Overflow posts. Sadly, Java is not the most efficient language. Most game engines are optimized in their graphic rendering and mathematics functions to make the game run as fast as possible. My engine wasn’t.
I ran into performance issues after a few months. So I had to learn how to use OpenGL, the Open Graphics Library, to handle my rendering. Understanding OpenGL is a difficult task, but if anyone reading this has inclinations to try what I did and make their own engine, please do use OpenGL from the start. It will save you the headache later on.
The exact implementation I used is called JOGL, which stands for Java OpenGL.
To actually code all this stuff I had some help from the Eclipse IDE, an integrated development environment, which provides features such as autocomplete, code suggestions, dependency management, and debugging.
So the whole game is made with Java 1.8 and JOGL in the Eclipse IDE.
I didn’t start out making this game from scratch. It actually existed in a way smaller form as a GameMaker project. GameMaker is exactly what it sounds like: an engine and function-based programming language that allows you to make games with relative ease.
2018 GameMaker version of the game
2020 Java version of the game
Half a year of daily work later, it looks like the picture on the right. Of course, it’s easy to show graphical improvement, but harder to communicate the programming work that I put in behind the scenes. Maybe if I didn’t record weekly videos, the look would’ve stayed similar to the 2018 version.
Problems and Solutions
Game development is addictively fun for those of us who enjoy creative problems solving. It’s all just a bunch of puzzles that require you to expand your knowledge and skill in order to solve them.
During the making of Any Journey I faced many fun problems. The satisfaction of thinking up and implementing your own solution might just keep you going until you complete your game.
If you can’t relate to the game developer high, let me introduce an example problem: you have a system that procedurally generates enclosed levels made up of rooms and hallways. But, they’re all empty and boring. How do you furnish your level?
Solution 1: Just spawn furniture in random places
Well alright, let’s try that. You draw a bed and a barrel, give them some collision properties and make a FurnitureManager class to spawn them in.
But when you spawn them in random places, you find that they block many hallway entrances between your rooms. They also obstruct the combat. Moreover, there’s not telling if the player can make it to the end of the level.
a bed and a barrel
Solution 2: Okay, just run a path-finding algorithm to see if you can make it to the end and re-furnish if not.
Let’s try that.
Oh no, why doesn’t the level load?
It would seem that your computer is stuck running the resource-intensive algorithm, refurnishing, running algorithm, refurnishing, etc. This solution is incredibly inefficient.
Maybe you can somehow tell the computer not to place a table before an entrance.
Solution 3: Rules for furniture
Eventually, I implemented rules dictating where furniture can be placed by adding colored lines to the four sides of every piece of furniture in its sprite sheet. A FurnitureManager class would split up the tileset into individual pieces, read the rules from the pixels on each side, and pass a list of furniture sprites with their respective rules to the LevelGenerator class to be placed in the level.
And this is just one way to solve the problem. Try think up a different one as an exercise.
final furniture tileset
I suppose you want to know what the colors mean, so here you go.
- Green: adjacent tile must be empty
- Yellow: adjacent tile may be a wall or empty or a piece of furniture
- Orange: adjacent tile may be a wall or empty
- Red: adjacent tile must be a wall
Very cool! The furniture feature is really interesting and quite unique!Bearded Beanie, YouTube comment section
Thank you, Bearded Beanie.
Where are the tables?
Some parts of the sheet are purple. These are handled with an extra step. I didn’t want every table in the game to be furnished in the same way, so I made three versions which the game randomly chooses between. They exist on their own sheet.
final furniture tileset
Alright, now let’s move on from the internals of the game to the externals.
The Asset Pack
I never finished the game, but I did spend a lot of time on the pixel art. I don’t want all of that effort to go to waste as images rotting away on my hard drive. So I made an Asset Pack which you can download from itch.io.
The YouTube Series
In addition to putting in the hours on the game, I also made a YouTube Devlog series. (devlog = dev + log) Every week I would upload a new video detailing the progress I made on the game.
So every week I would write a script, record the video, edit it, and publish the devlog to YouTube. This part, whilst being a bit stressful at times, was really fun. I can recommend logging your progress online to anyone who wants to make their own video game or any other big project for that matter.
The fun part
If you set out to make something fun, people want to see you succeed. I got so many positive and encouraging comments, and I found fellow indie game developers who were making their own projects. We had a small support network going, and I didn’t want to disappoint them by not showing up for my weekly video.
Getting weekly feedback and encouragement serves as a boost to your motivation. I can definitely recommend it. But make sure don’t prioritize the content over the work, otherwise you may never finish your projects because the boring parts to fix will become unsurmountable in the end.
I’ve added three of my favorite comments to give you a feel for the vibe on my channel.
“Dude that’s insane! This inspires me to start with game development.”
“Man, really set the fire of will in my heart“
محمد خلف حمد
“This looks like a fantastic game really looking forward for it. Opened my eyes for what can be done with stock java libraries”
Comments such as these would make anyone want to continue a project.
The not-so-fun part
At some point, to make substantial progress to show at the end of the week, I started cutting corners. Over time, this made the project very buggy and unworkable. It was just a matter of time until I had to abandon it.
What I learned
Reduce your scope
If you’re gonna make a game from scratch, make sure it’s not too big. I’m all for making big projects if you have a defined scope.
Take your game idea and find out what the essential elements are that your player will engage with for the majority of their playtime. This is called the main game loop. Try to implement this in an engine first. Show your friends. See if it’s actually fun.
Once you have a barebones fun product, you can expand on it in logical steps.
No amount of gilding can make a rotten flower bloom.
You need a good game loop.
Maybe just use a game engine
You might have some cool mechanics or a cool story in your head for your game. But if you make the engine from scratch, you will have to make all the stuff you’re not thinking about right now:
Don’t put progress before product
Sometimes, during development you have those days where you break your brain on a particular bug that eats up all of your time. Maybe it takes you three days to finally discover that you forgot to delete one line of code during testing which was causing the bug.
It’s okay to have those days. It’s to be expected. Yes, on good days, you work has meaning in the progress you make towards your goals. But not all days are good days, and cutting corners to just pushes the badness into the future.
Eventually you will have so much bad that you won’t want to touch your project.
Eliminate the problems you discover as soon as possible.
Because I left the project so abruptly, it’s littered with bugs that “I’ll fix later.” Still, I owe it to the people who rooted me along to provide them with something. It would also be a shame for the project to sit on my hard drive collecting dust.
You can press the button below and download Any Journey. Know that it will crash, and it will crash often. You cannot save your game either. It’s barely playable. Enjoy.
I have a ton of material over from the project, sitting on my hard drive. When I started writing this post, I found this document and remembered that I kept a log of my daily work on the game. It’s 14000 words long, and you can check it out below.
Maybe you can get a bit of inspiration out of it. Or perhaps you’ll find an embarrassing entry. Have fun.
Any Journey was very fun to work on, and I learned a lot. I got crazy good at Java. And there are many skills that I leveled up during those months of development including pixel art, sound design, game design, photoshop, video editing, and marketing.
You don’t have to use a game engine to make your game. You don’t have to do what everybody else is doing. Just do what you think is fun. Creation should be fun.
I don’t think I’ll ever touch Any Journey again. I’ve forgotten the code structure; it would take me a long time to remember how the game worked internally.
I hope that this article might inspire any up-and-coming game developers out there to give it a shot and to not make the same mistakes I did.
If you want to see more by me, you can subscribe to the Newsletter.
Now go make that game.