Alice is my toy OCaml build system| gridbugs
Alice is an experimental OCaml build| gridbugs
Back in 2012 I took an Operating Systems course, the main assessment of which| gridbugs
I got my OCaml music synthesizer working on Windows. Here’s all the things that went wrong in the process.| gridbugs
Scope Creep is a short first-person| gridbugs
The game is finished. Play it on itch.io.| gridbugs
After tonight I have the full game loop working. The dungeons are populated| gridbugs
Tonight I added a map mode (still rendered with oscillographics of course). It| gridbugs
I added text to my engine to enable rendering a HUD and labels on items. This| gridbugs
I added a quick and dirty implementation of collision handling for the player| gridbugs
Today I completed the renderer, fixing several major bugs and adding the| gridbugs
This year my plan is to make a game that can be rendered using purely oscillographics.| gridbugs
I’ve used the same game engine for all the roguelikes I’ve made since 2019 and I| gridbugs
I learnt today that Windows has a built-in package manager. I’m setting up a| gridbugs
In Part 2 I| gridbugs
In Part 1 I| gridbugs
I’m going to attempt to repair my family’s old Macintosh LC575. Some of my| gridbugs
At the time of writing I'm employed by Tarides to work on the Dune| gridbugs
Electric Organ is a traditional roguelike with an emphasis on ranged| gridbugs
It’s the end of day 7 and my game is complete. I stayed up all night finishing it and managed to complete all the features and content I intended and still had a few hours for delirious playtesting and bugfixing. This was by far the largest scope for any 7DRL I’ve done in the past in terms of features as well as content. This game has procedurally-generated music and sound effects, 10 types of enemy each with their own unique abilities (not including shopkeepers), 14 items, an equipment s...| gridbugs
One day left! Tonight I implemented the equipment system. Weapons can be equipped from the inventory to the hands. Some weapons require both hands while others require only one. This is important as the “Claw” organ takes up a hand; you can’t use a two-handed weapon if one of your hands is a claw (and you can’t use a one-handed weapon if both of your hands are claws). Getting the logic and error handling for equipping, unequipping and reloading weapons was trickier than I expected. Es...| gridbugs
Tonight I added items. This includes the logic for picking up and dropping objects, the UI control flow for displaying menus allowing the playing to drop or use an item, and the item descriptions. The most complicated part is dealing with what happens when a user drops an item while standing in a cell that already contains an item. The game engine does not allow multiple items to exist at the same location, so when a collision would occur the game searches for the nearest cell that doesn’t ...| gridbugs
The main focus of the day was the combat system. This involved setting up the control flow so that when the player presses the fire button the UI lets them aim, and then commits the fire action after the user confirms their target.| gridbugs
I had a productive evening working on Electric Organ. Firstly I implemented an animated main menu. I’m spending a lot of time up front working on aesthetics as I find that if the game is pretty I’m more motivated to work on it later in the week. Hopefully there’s enough time to implement all the mechanics I have planned. See the animation along with the music on youtube.| gridbugs
I mostly spent the day working on dynamically-generated synthesizer music. There are currently two songs - one for the main menu and another that plays during levels. If I get time I will add more.| gridbugs
It’s the end of day 1 of 7DRL2024. So far I’ve got a level generator for an| gridbugs
This page will list pinouts of some electronic components I commonly find myself using, as well as some notes on using them that might not be obvious from reading the datasheets.| gridbugs
This is a guide I wrote mostly for my future self on how to set up an ergonomic development environment for writing Arduino programs in c without any Arduino-specific tools and using an Arduino to make a simple circuit with some flashing LEDs. I’ll also discus options for powering the Arduino from a 12v DC power supply.| gridbugs
One problem with using the rust programming language for game development is the notoriously slow compile times. For my recent 7DRL project Boat Journey an incremental debug build takes about 6 seconds on my main development machine. This is frustratingly slow when making many minor gameplay tweaks during playtesting.| gridbugs
The sun is peeking beneath my curtains and another 7DRL draws to a close. Today I implemented the passenger mechanic, the trading mechanic, collectable junk (the game’s currency), the combat system via abilities gained from passengers, and added 7 different passengers you can pick up, each granting you a unique ability. The game is playable and downloadable on itch.io at gridbugs.itch.io/boat-journey. During playtesting I found some interesting emergent mechanics.| gridbugs
Boat Journey is a turn-based game where you drive a boat through a procedurally-generated landscape on a voyage along a river destined for the ocean. Accept passengers to have them help you on your journey. Fight monsters, collect junk, trade the junk for fuel, use the fuel to travel to the ocean. You can play it in a web browser or download the game from gridbugs.itch.io/boat-journey. The source code for the game is at github.com/gridbugs/boat-journey.| gridbugs
Today I drew a bunch of background images for menus and the victory screen.| gridbugs
I added stats like health, fuel, and daylight and display them in the game’s UI. There’s a hinting system that displays hints based on what tiles are currently on the screen.| gridbugs
Yet another day of working on procedural generation and I think I’m finally finished (the procgen - not the game!). I added a generator for the starting town, a swamp area, a flooded city area, and dungeons which are accessible from the city.| gridbugs
Another day of mostly working on procedural generation. This game is by far the most complex procgen project I’ve done. I’ve integrated the river generator into the game engine and added a couple of pools along the river which I’ll populate with settlements. There is also a small lake at the beginning of the river and an ocean where the game ends.| gridbugs
I spent this evening making a procedural generator for the shape of river and choosing points along the river to place settlements. While I iterate on procedural generation I’m working in a separate project to the main game so I don’t need to deal with the complexities of integrating the generated levels into the game while I’m also figuring out how level generation will work at all. Here’s the debug output of the terrain generator so far showing the shape of the river and the points ...| gridbugs
It’s the end of my first day of hacking on this year’s 7DRL. My game will be called “Boat Journey”. It’s about driving a boat along a river with the goal of reaching the ocean without running out of fuel or otherwise becoming stranded, while picking up passengers who give you additional abilities. I’m intentionally going for a very minimal graphical style this year since the past few years I’ve found I spend more time on fancy graphics than I would like, and less time working on...| gridbugs
Games on the Nintendo Entertainment System play audio using a handful of tools within the device’s Audio Processing Unit (APU). The Delta Modulation Channel (DMC) is the most expressive such tool as it can play arbitrary audio data. Any sound you’ve heard come out of a NES other than variations on square and triangle waves, and noise, was played using the DMC. As its name suggests, the DMC can play delta modulated audio data, where a signal is represented by a sequence of relative changes...| gridbugs
Floating points are a way of representing numbers based on the idea that the larger the magnitude of a number, the less we care about knowing its precise value. If you’re anything like me (until recently) you use floating points regularly in your code with a rough understanding of what to expect, but don’t understand the specifics of what floats can and can’t represent. For example what’s the biggest floating point, or the smallest positive floating point? Or how many times can you ad...| gridbugs
For most of my life I took for granted that programs begin executing at an address denoted by the symbol _start (a single underscore, followed by the word “start”). Turns out it’s not so simple. Take this x86 assembly program that prints “Hello, World!” on Linux: .global _start .text message: .ascii "Hello, World!\n" _start: # print the message mov $1, %rax # syscall 1 is write mov $1, %rdi # file descriptor 1 is stdout mov $message, %rsi # pass address of messsage mov $13, %rdx # p...| gridbugs
Rain Forest is a roguelike game about spending a few days in a forest, in the| gridbugs
I added a win condition, implemented an equipment system, and did a bunch of play testing and balancing. The game is finished and submitted to the 7drl jam. Play it in a browser, or download binaries from it’s itch.io page. The source code is on github.| gridbugs
I implemented most of the gameplay tonight. Gameplay consists of performing simple daily tasks like making tea or placing a flower on an altar.| gridbugs
Tonight I added the motivation system. It’s a number which gradually ticks down, and if it gets to zero, you lose. It ticks down faster when you’re uncomfortable, such as when you’re standing in the rain or flood water. Various things can restore your motivation, like sleeping, or visiting the lake.| gridbugs
Tonight I added the concept of time to the game. Each day, as time progresses, the light and visibility systems respond to the passage of time, simulating a sunrise and sunset, and making it dark at night. There are three different rain modes (light, medium, heavy) and a randomized (ahem, “procedural”) schedule that makes the rain get heavier over time (on average). Also each day the flood level rises, and when you walk into the flood water the ‘@’ sign is partially submerged!| gridbugs
I spent the day adding assets. There’s a large lake one one side of the map with a pier. Lamp posts, grass, and rocks are randomly placed around the forest. There are patches of flowers and tea plants. In addition to looking nice, the grass serves the purpose of showing players where they have been, as when you walk on the grass it gets trampled and its sprite changes.| gridbugs
The aspect I care most about this year is setting the mood of being inside (or outside) on a rainy day in the woods. I spent most of today building the rain and mist systems.| gridbugs
I spent most of the day bootstrapping the project. Unlike the last few years, this year I’ve elected to start from scratch rather than from an existing project, though I am copying code aggressively from last years entry. The reason for doing this is to prevent needing to prevent the technical debt from accumulating over multiple game jams hacking on the same code base.| gridbugs
Tetris for the NES is one of my favourite versions of Tetris. My only complaint is that it lacks the ability to “hard drop” - instantly dropping the current piece and locking it into place. Let’s change that! This post describes a modification I made to NES Tetris so that pressing the “up” button causes the current piece to hard drop, and so that the game renders a “ghost piece” - a dotted outline of the current piece showing where it will land.| gridbugs
Orbital Decay is a traditional roguelike where you fight zombies on a space station. It features destructible terrain, an air pressure system, and ranged combat. Try not to shoot the hull, or you may find yourself sucked out into space! In keeping with the traditions of the genre, graphics are made entirely of text, though each tile is made of 3x3 characters. There is a soundtrack of 6 songs, and about 10 different sound effects. It’s playable in a browser, or a standalone graphical program...| gridbugs
Firstly, here’s a screenshot of my first organic encounter with the final level of Orbital Decay:| gridbugs
Tonight I added a range of enemies, a message log, and made the space background a gradient. The game is now feature-complete! I also added placeholder sound effects so when I get my hands on real sound effects I can just slot them in. Tomorrow I’ll be adding music and sound effects, play-testing, polishing, and fixing bugs.| gridbugs
Tonight I added weapons. This screenshot shows the game’s arsenal. Other than art, most of the work was setting up interactions like displaying a prompt before picking up a new weapon that would replace the weapon in its destination weapon slot.| gridbugs
Today I implemented the upgrade system. You collect credits which can spent at an upgrade store. The store presents a menu from which one of three upgrades can be chosen. There are three upgrade tracks with two levels each. Each level unlocks a new passive character upgrade. The menu includes a description of the currently-selected upgrade.| gridbugs
I spent the day getting depressurisation working. When the hull gets pierced, the area of the station exposed to space is depressurised. Any characters in that part of the station are pulled towards the breach for several turns until the pressure is equalised. The red warning light indicates that an area is being depressurised. Once the pressure equalises, a blue warning light indicates that an area has no air. The oxygen meter will start draining, and when it runs out the health meter will s...| gridbugs
I got through a good amount of core gameplay mechanics today including NPCs, projectiles and destructible terrain. I also spent some time focussing on flair, such as special first and last levels, animations in the game menu, death screens, and smoke trails on bullets.| gridbugs
Orbital Decay You tape over the flashing warning light. An overheating engine is the least of your worries. Gotta focus. The space station looms ahead. It's out of fuel, and about to come crashing down to Earth. Unless you get to it first. Special delivery: 1 hydrogen fuel cell with enough juice to kick the station out of this pesky atmosphere and back into space where it belongs.| gridbugs
This year’s 7DRL is days away. Over the last few weeks I’ve dusted off my game engine and come up with a plan for the jam. I’m going to revisit the idea behind my first 7DRL - Skeleton Crew - which was a game about fighting zombies in a space ship where shooting the hull caused the ship to decompress.| gridbugs
This is a look at some of the things I’ve worked on in my spare time during 2020. I started branching into new areas this year such as hobby OS dev, writing, and music theory, as well as continuing to work on roguelike games and supporting libraries.| gridbugs
Here’s a guide for myself on how to format and mount an NTFS partition on FreeBSD.| gridbugs
Here’s a guide for myself on how to format and mount an NTFS partition on FreeBSD. These examples were run on FreeBSD 12.2-RELEASE. List disks: # geom disk list ... Geom name: da1 Providers: 1. Name: da1 Mediasize: 1000204886016 (932G) Sectorsize: 512 Stripesize: 4096 Stripeoffset: 0 Mode: r0w0e0 descr: HGST TOURO S lunid: 5000000000000001 ident: 21001410170002100173 rotationrate: unknown fwsectors: 63 fwheads: 255| gridbugs
One of the programs I’ve made that most directly benefited my life is| gridbugs
Of all the programs I’ve written, perhaps the one that has most directly benefited me is this little bash script in my dotfiles repo which runs the application launcher dmenu showing the most-frequently-used programs first. The typical way to run dmenu is to pipe the output of dmenu_path into dmenu. Both commands come in the dmenu package. The former simply prints a list of all programs in the user’s path: $ dmenu_path [ 2to3-2.7 2to3-3.7 aafire aainfo aalib-config aasavefont aatest ac ac...| gridbugs
After just over 100 daily posts, I’m going to relax the constraint that they be written each day.| gridbugs
While preparing to implement a disk image creation tool I built a few tools for| gridbugs
I finally mustered to motivation to get some work done on my| gridbugs
I’m trying to fix a bug in the rb-kqueue gem which occasionally| gridbugs
In lieu of a file listing configuration settings, the image viewer feh does something| gridbugs
I spent some time over the weekend trying to reproduce a bug where| gridbugs
The program irb is an interactive ruby shell.| gridbugs
Unless configured otherwise, shells running in tmux panes are login shells.| gridbugs
This is a jekyll site, which means that it’s composed of a bunch of markdown files,| gridbugs
On FreeBSD and Linux I start X with startx. I don’t use a display manager, instead electing to| gridbugs
Unix processes run in an environment consisting of string values assigned to named environment variables.| gridbugs
This is a follow-up to Why you need a .bashrc and .profile Unix processes run in an environment consisting of string values assigned to named environment variables. Some processes such as a shell or window manager are responsible for launching additional processes. By convention, new processes inherit the environment variables of the process that created them.| gridbugs
I want to find some time to debug a problem with chargrid_graphical| gridbugs
I’ve been doing this wrong my whole life.| gridbugs
I’ve been doing this wrong my whole life. For as long as I can remember I’ve included some version of the following line in my .bashrc: export PATH="$HOME/bin:$HOME/.bin:$HOME/.local/bin:$HOME/.local/sbin:$PATH"| gridbugs
Every so often I update the deps of my rust libraries. This is so that crates| gridbugs
I’m going to start occasionally posting lists of non-technical things I did on particular days| gridbugs
I updated my laptop to FreeBSD 12.2 and could no longer start X.| gridbugs
I enjoy the safety of typescript, and the ease with which one can| gridbugs
Just for fun I implemented a simple 3D renderer using the technique employed in Wolfenstein 3D.| gridbugs
Just for fun I implemented a simple 3D renderer using the technique employed in Wolfenstein 3D. The world is procedurally generated using the technique described here. The renderer works by finding the depth of walls for each row of pixels on the screen, and drawing a vertically-centered vertical wall-coloured strip whose length is inversely proportional to the wall depth at that point. Wall colour has brightness inversely proportional to the square of the straight-line distance from the eye ...| gridbugs
A while back I wrote about| gridbugs
While working on a totally unrelated project, I accidentally implemented a procedural| gridbugs
I’ve started a git repo where I write down the definition of words that I encounter for the first time.| gridbugs
Today I completed my first successful run of Jupiter Hell - a traditional roguelike which is the spiritual successor to DOOM the Roguelike. As a traditional roguelike, gameplay is turn-based, and levels are abstracted as 2D square grids of tiles. Another property that tends to be true of roguelikes is that most turns are uninteresting - walking down a corridor, or attacking a single standard enemy. There are meaningful strategic decisions to be made from time to time, such as choosing whether...| gridbugs
Today I completed my first successful run of Jupiter Hell -| gridbugs
Rust 1.47 broke backtraces on FreeBSD. Backtraces are now handled by gimli| gridbugs
Tonight I set up a raidz zpool on 3 4TB external hard drives.| gridbugs
Tonight I ran into an issue where when a rust program panics on my FreeBSD| gridbugs
Digging through an old hard drive I found a game I forgot I made.| gridbugs
I bought some new SSDs to install FreeBSD on a media server I’m setting up.| gridbugs
Today I updated the permalinks for these daily posts to be based on title of the post rather than the date.| gridbugs
A few months ago I swore off the nodejs and ruby version managers,| gridbugs
Here’s a little experiment I did to familiarise myself with ZFS on FreeBSD 12.1.| gridbugs
Recently I changed the server config for this site such that| gridbugs
The other night, by a string of coincidences, I had an experience where| gridbugs