June 16, 2025
Made the theme button actually change themes! I have 4 for now including the default one. Also moved GoatCounter GET requests to site generation so that it's not blocked by adblockers.
Started to set up some more things on the header, including a view count and site theme button. View count via GoatCounter but I'm not a fan of the current impl
Fixed up a ton of mobile spacing! Made the footer smaller on mobile, resized navbar spacing on different widths, removed some elements on smaller screens. Changed UL and OL margins, main content widths, and so much more. Honestly forgot how cancerous formatting for mobile is, especially for a site like this. Overall though I'm pretty happy about how the site looks on mobile now
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!
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.
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.
Added a nice vignette as another post-processing layer!
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.
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.
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!
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!
Finished up my first complete blog! Should be about ready to ship for the first time.
I added a ton of stuff, basically finished the first draft of the site. I added a secondary color, the about and projects pages, and started on a bunch of features for the next version. Also did more funnies with the font including straight up modifying the font file lmao
I did a ton of stuff over the past couple days. Mainly, I did a couple reworks to the font, switched to JetBrains Mono, improved static generation, added a list of blogs, generalized ASCII font generation for use on the front page, started on my first blog, and got started on a text-based gif thing much like my project Terminal Velocity.
Did much more work to make the 11ty static generation work consistently on GitHub Pages. I also added a footer to all pages and got started on a home page.
Switched the blogs from using manually written html to statically generated html from markdown. The markdown is much simpler to write, and it automatically colors code, deals with text styling and all of that (using 11ty for anyone wondering). This is a much more maintainable way to create the website without nearly as much hassle.
I spent a lot of time collecting cute small ASCII art, which I planned to display on either side of my username header, but that plan ultimately didn't work out. It just didn't look purposeful or as clean as the rest of the page, even though it was theoretically a really good idea I think... hopefully I can find somewhere else to use all of the art I compiled, because it really was a lot. I also started working on page stubs and the organization of the rest of the website, as well as working more on modifications to the ASCII font for readability.
Got the site automatically resizing pretty well, with the main thing I implemented being word wrapping for the title text. Remember, the title text consists of multiple smaller box-drawing characters for each glyph, so automatic wrapping like with normal text wasn't an option. So, I had to manually code a word wrapping algorithm, which was actually not super bad once I got down to it (just took a bit of thinking). Also I don't think I made it clear before, but the horizontal bars above and below the navbar are also box-drawing characters that resize.
Spent so much time turning old C++ code into functional JS code for ASCII font generation. Thankfully it does finally work, and I made a few modifications to the original font to better suit the site's aesthetic. It's surprisingly tricky to handle Unicode multiple-byte characters and such, and more work is needed later to have it wrap properly and so on
Did a couple of notable things with the site. I added the horizontal bar below the SUGO14 logo and centered some things. I also added some placeholder text that is an example of a blog (taken from int0x80.ca) to test out fonts. I settled on this ASCII title font after some messing around as it was a stylistic match and not super big. I do definitely want to make some adjustments to how it looks though, and I need to actually implement dynamic generation of it.
Got started on the site after lots of planning. It was surprisingly easy to create a very close match to a terminal in vanilla HTML/CSS/JS, as shown in the image. I created some figma designs as well to see what the site could look like as it progresses as well. The font is chosen, the general aesthetic has started, and overall I'm excited to see where this goes.
My unique personal portfolio site (I SWEAR ITS NOT SLOP) designed so that it could be exactly reproduced in a standard terminal emulator (theoretically). This meant I had to do a bunch of cool stuff to get different regular elements working, so please check it out!
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.
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:
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.
Optimal matching now works, and a simple version of the match score rating script is also done (rating all combinations of tutors and tutees based on interpersonal compatibility). This is the core of the suite so I'm happy its done and appears to work
A collection of useful CLI programs that automate parts of running a tutoring club. Primarily includes optimal tutor-tutee matching and a monthly newsletter script, as well as other supporting scripts.
Updated the title text and prepared to add game over text. Also other misc polish in preparation for shipping
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
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
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.
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.
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.
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...
This was widely regarded as a great move by everyone.