Please sign in to access this page

Terminal Velocity

Terminal Velocity

20 devlogs
38h 54m
•  Ship certified
Created by sugo14

I built a 3D software rasterizer (renderer) and game engine that runs in the terminal from scratch, and a space navigation game built in it. Low-dependency and a simple build (and even simpler to run precompiled), but no online demo due to it requiring a fast terminal and significant resources. The project was started before Summer of Making, so by the first devlog the project was already pretty far along.
---
The year is 2525. You're yet another expendable contractor, assigned to one of the deadliest jobs in the galaxy: crystal extraction from unstable asteroid belts deep in space. Armed with only your teleportation blasters, you'll have to harvest as many alien crystals as possible before the asteroids accelerate faster than you can react. One collision, and it's over...

Timeline

Ship 2

1 payout of shell 375.0 shells

sugo14

about 1 month ago

sugo14 Covers 9 devlogs and 15h 22m

Added fragment shaders. Like everything else in this project, it's done on the CPU, so I don't know if shader is exactly the right term. The main reason I added this is to modify the distance fog to work horizontally as well. I also put together everything to be good for another github release!

Update attachment

Ignore the messed up devlogs earlier, the Summer of Making site was freaking out. Anyways, I finally turned my precompilation for GitHub Releases into a Makefile option. Now I don't need to spend like 30 minutes manually putting releases together! I also decided to add another zip archive that includes the source code WITH LIB INCLUDED, so that people can build it easier without needing to manually find miniaudio. I also made debugging a make flag instead of a hardcoded variable in debug.cpp.

Update attachment

Added a starfield that rotates with the player! Also implemented it as a post-processing layer, which required me to add some features to post processing.

Update attachment

Added a nice vignette as another post-processing layer!

Update attachment

Added post-processing, and as a form of post-processing, distance fog! I chose to lerp by distance to calculate the fog amount, looking pretty good and making it easier to set the bounds of the fog. Post-processing is still kind of limited ATM, as post processing layers don't have access to each pixel's original object or mesh yet, but they do have access to distance, hence why the fog works.

Update attachment

Finally figured out the segfault and memory corruption issues! I was accidentally creating then copying the AudioEngine instance after it was automatically initialized, which means the destructor was called which affected the used instance because of shallow copying (i think). Basically this meant that I had to disable the copy constructors of the class, and as a result just constructed it in the initializer list of the GameEngine. I also moved the instance to the heap instead of the stack which fixed a bunch of issues, but I can't begin to explain why that helped.

The attachment is a screenshot of my now memory-safe (i think) AudioEngine class.

Update attachment

Added audio with the MiniAudio library, but dealing with some insane bugs while doing so. Check out this video of my audio system corrupting the program's memory! You can see that some object's rotation speed is way too high, and some crystal vertex colors get majorly messed up. Honestly this is the coolest looking bug I've ever seen, it's what I think non-programmers would imagine bugs look like after seeing hacker movies

Added some basic particle effects to crystals when destroyed. Looks pretty good IMO and isnt that costly because each particle is just 4 tris. Looking to add it to more things now!

Update attachment

Finally took the leap and added fixed updates! It actually wasn't that hard, partially because my scripts are responsible for mainly physics stuff anyways. This is also generally the direction I want to take for my next ship: primarily engine improvements, because it's honestly rough at the moment.

This fixes a ton of issues with my engine previously regarding frame safety. Notably, the hud would behave super weirdly, flying further away from the camera at low framerates and looking super stiff at high framerates. This makes it so I don't need to do actual math to fix this, and can just throw it in FixedUpdate instead!

Update attachment

Ship 1

1 payout of shell 615.0 shells

sugo14

2 months ago

sugo14 Covers 11 devlogs and 23h 31m

Spent way too much time creating a release. I tried to make an online demo with Emscripten compiling to webassembly and using online terminal simulators, but that ended up being just way too complicated. Then, I decided to just add a precompiled binary to the GitHub release and call it a day, but I needed to compile with an old version of glibc to ensure compatibility on old OS's, so I needed to make a Docker script to simulate an old OS with an old glibc just to compile. Overall way too much hassle, but at least I know how to go about it now.

Update attachment

The project is finally in a first-shippable state! As for the changes I made, I just fixed a bad attempt at frame safety that caused the HUD to jitter, and did a few other adjustments to difficulty scaling. In the future, I'm looking to change the way the score text is displayed (unify it with the rest of the physical HUD), add more visuals to make the world feel alive (like stars), and implement multithreading to improve performance and add true frame safety.

Here's a cool GIF I put together that showcases the game:

Update attachment

Finally added this game over screen, it looks decent IMO and ends the game as expected

Started working on Game Over text. I'm implementing it a little differently than the start text, in part because it has a specific destination rather than just move to the side, but also because I wanted to try something a little different. I also improved organization a bit by moving all assets to a resources folder, and did some other minor adjustments to improve gameplay.

Update attachment

Updated the title text and prepared to add game over text. Also other misc polish in preparation for shipping

Update attachment

Finally got some decent text working, just chose to make it in the image buffer rather than separately printing. This approach is ultimately way easier, keeps the screen modular, and allows usage of many different fonts

Update attachment

Added numeric text rendering thats highly sketchy at the moment. ASCII art is cool, and if I'm making a terminal engine, I need to have support for it, so I wrote code to make working with actual text (rather than my pseudo-screenbuffer) easier

Update attachment

Spent some time on maintenance, cleaning up terrible code, commenting it, and so on. One of the most notable things I did was fix an extremely major issue with the crystal collisions: when a crystal was hit, it would not necessarily delete the crystal that was hit, but rather the oldest (or newest? not 100% sure) crystal in the scene.

Update attachment

Added a cool little title screen, which took a while to make as I needed to improve my image support. Also, I made some much-needed clean-ups, with many more likely to come.

Added some variance to the crystals' color, rotation, and spawn rate.

Update attachment

Finally got a functional version of the game working! Harmful asteroids spawn in, and occasionally crystals spawn that the player must shoot and collect. I used a trick to make the asteroid spawn rate increase with the player's forward movement, as though there are asteroids evenly spaced throughout z-space. It also ended up being a more fun experience than I initially expected, which is a pleasant surprise.

Update attachment