I’ve released a few projects I’m using for managing projects and games on itch.io.
itchpack
The first is itchpack, commandline, preconfigured wrapper around webpack with some extra utilities.
Itchpack provides a local development environment for game, gamejam, and profile pages on itch.io.
It downloads your current page markup and styles, can render templated data from a data file, prefixes custom- in front of your HTML classes, handles sass/scss compilation, and provides live reloading when working locally.
itch_client is a ruby library for interacting with itch.io. There are some functions I needed for the next project which are unavailable in the itch API.
itch_client is a screenscraping client and provides authentication, updating and fetching reward information, as well as purchase and reward redemption logs.
itch-rewards
itch-rewards is a commandline application based on itch_client, meant for automating available game page rewards, especially for community copies.
itch-rewards allows a game developer to set a minimum number of copies that are always available, or to have the number update based on sales (for instance: “Every copy of my game sold makes a community copy available!”), or based on tips above the game price (configurable).
itch-rewards can also update the reward content itself, to show the number of copies that have been made available, or progress to the next copy.
I’m using this in concert with the script used for my desk bell notifications to update available rewards after purchases.
An itch.io project of mine has been getting a little attention recently, and I wanted to get alerts for new purchases, instead of obsessively checking the website. I saw this kickstarter alert desk bell project a few years ago, and thought
it would work great.
Here’s my finished project:
It runs a web server waiting for a JSON payload, and then rings the bell the appropriate number of times.
Build
Parts list:
$3 Wemos D1 clone arduino board
$5 5v mini solenoid. This is perfect for this use case
To mount the solenoid to the bell frame I 3D printed a small mount. The solenoid frame had two M2 threaded hole that made mounting easier.
The mount clips onto the frame, but ought to sit a few mm lower.
The nice thing about this design is that the bell can still be used normally if needed… Not sure when I’d need that.
3D printed mount attached to desk bell
I did a bunch of tests on a breadboard since I’m still new to electronics projects, first with just the solenoid to make sure it would ring clearly and later with the arduino. I did most of the design with a NodeMCU but switched to the smaller Wemos D1 when I ran out of space.
Testing the circuit on a breadboard
One thing I didn’t anticipate when I started is that the clapper (the part of the bell that swings) sits low into the the bottom base in its resting position. This reduced the available space underneath by about half, so I made a paper template and then cut an arc into one side of the (previously square) perfboard with a jewelers saw.
I also 3D printed this simple mount, mostly to keep any of the circuit from contacting the metal frame. The board holds to it nicely, but I haven’t designed a good mount for it, so I just hotglued it in place for now.
Small mounting plate for the boardBoard done solderingMounted inside bell
There’s more stuff I’d like to do:
3D print the whole base for better mounting points and more space
LEDs (I have an LED ring that fits really nicely in the diameter of the bell, but there isn’t really enough room for it right now)
Proper outlet mounting instead of just sneaking a thin cable underneath the base
Software
For the firmware, I’m using arduino fsm to handle state changes and delays, since I want the solenoid to activate for about 150ms and then wait a couple of seconds before it can activate again. I need this to be non-blocking, so that I can also respond to web requests and later do some LED animation. The webserver and wifi code is mostly taken from the default ESP8266 examples.
For some reason, the D1 etc. pin constants did not work for me when using the Wemos D1 board profiles, using the correct GPIO pin instead did, so I didn’t investigate further.
It waits for a request with valid basic auth credentials, and a JSON body with a count value, ex:
curl -s-i-u username:password \--header"Content-Type: application/json"\--request POST \--data'{"count": 2}'
The copy button will save your song to your clipboard so that you can keep and share them.
To import a song, just paste it in.
Shorter songs fit in a tweet, so if you make something you like, please share
it with me!
I picked up PICO-8 in the enormous Itch.io bundle recently, and have been having a lot of fun with it. Sequence8 is my first PICO-8 game.
The platform’s built-in limitations help ensure that games stay small and (roughly) within scope. They can’t be too large in code length, or lexical tokens, nor in sprites, sound, or music. Audio is limited to four channels, the screen is 128px square, there are 16 colors.
Sequence8 is based on another project I never finished, built with Ruby and Gosu.
There, I was able to use several full sized audio samples of real instruments, and dynamically pitch them up.
Visual effects could be handled with transparencies and complex masks. I used C libraries for fast quadtree performance
for mouse events. Can’t really do any of that in PICO-8 (at least, I can’t).
Here’s some of the build process
Getting started
This is the first prototype. It can play sounds. The current beat scrolls by.
Initial prototype
Here I’ve started adding the sprites for the background, scrub bar, and selected notes, and one of the only sprite animations.
I found this post invaluable when trying to work with PICO-8’s color palette.
Adding sprites
UI
Without the ability to bind a bunch of arbitrary keyboard shortcuts, I actually had to build out the UI for this as well,
which took the vast majority of the project’s development time.
Challenges here were:
Adding mouse support and mapping screen pixels to UI elements,
having logical controller navigation for an irregular grid,
switching between mouse and controller input without breaking something
having a different number of notes for some instruments,
adding and removing bars of music (which also adds and removes UI elements)
I probably rebuilt the whole UI system 3 or 4 times, and I’m still not happy with it.
UI as tabs
I think this didn’t work well because the tab as a UI concept implies nesting content underneath the tab, but I wanted to have more
information about the other instrument tracks visible at once.
Here’s the mouse support. It’s mostly built on top of the controller support, so while the mouse has a pixel position, it also
maintains a position within the UI grid, identical to controller handling.
Mouse support
Lighting
I went through a few iterations for lighting effects. Originally, the song progress bar was represented by a full column of sprites, as well as
some smaller sprites to both sides that would overlay the background to fake a glowing effect.
In this version, the notes light up for a moment after they’re played. This is handled with a palette swap, and redrawing pixels surrounding each note. It’s wildly expensive, but it looks nice, and fixes issues with static overlays on top of animated images.
In the end, I used a simpler approach, using one level of lighting off to the sides of the
Particles
I started on some particle effects to make the visuals a little more engaging, but ran into further performance issues there. I put together a
simple profiler to help track down the specifics.
Profiler
PICO-8, as a virtual console, has it’s own CPU limits distinct from the host system, and applies extra CPU cost to some operations.
The biggest takeaway here for me was: Limit expensive redrawing, limit deeply nested loops, limit overall particle counts (and make sure that
count is up to date, and not from the last animation frame. Whoops)
I think these look nice still, but they’re big, slow and floaty, like each note is shaking down snow. Still nice, but I wanted a more explosive feel.
Big slow particles
Here’s a less colorful, and more conservative version. Particles have more starting velocity, and fade faster.
Smaller particle effects
Here’s the final version. Notable changes here:
Notes are always in front of the particles, and have a bit of an opaque outline around them,
making them much more visible when a lot is happening on screen.
Two or three contrast frames at beginning of the particle burst, making it more distinct and poppy.
While working on some other projects, I mocked these guys up real quick to help
organize some of the tools and accessories I’m using with my CNC right now.
The design is simple, and they’re just carved in scrap 3/4” plywood, so recreating
them if when tools change won’t be a big deal.
Eventually, I’m planning to have these in drawers instead, but it’s a good start.
Tool holderWorkholder holder
To make an accurate profile for complex (mostly two-dimensional) parts, I
took a photo zoomed in at a distance (to minimize perspective distortion), with a ruler visible.
This photo can be imported into Fusion 360 as a canvas, and the ruler used to calibrate it.
There are lots of different versions of these floating around, but most use big box store five-gallon buckets,
or larger garbage cans, but I wanted one that would fit comfortably underneath my CNC table and still have
some capacity.
The lid and is made of 1” plywood, cut with a 1/4” endmill and a 90 degree chamfer bit. The baffle just redirects airflow, so only uses 1/2” plywood. It was also cut with a 1/4” endmill, but the extended section that contacts the wall of the bucket was tapered with a 1/4” ball end mill to match the slope of the bucket.
Lid after cutting on the CNCBaffle profile cutAfter trimming off tabs on the router table
I’m using readily available schedule 40, 2” PVC pipes and fittings and 3d-printed this fitting
to allow the pipe to pass through the lid at a 45° angle.
3D printed fitting
I installed the fitting using wood screws and caulk to seal it, and added a bead of caulk in the lip and smoothed it down. It kind of works, but a softer silicone caulk would have worked better.
3D printed fitting
I held the lid and baffle together with dowels, screwed in from the top and bottom. Here’s the assembled lid with baffle (upside down).
Lid assembledFully assembled separator
To connect the separator to my shopvac and hoses, I used 2” PVC, heated (agonizingly slowly) with a (tiny) heatgun until they could be formed over my hose fittings.
PVC vacuum hose adapter
It works well, but I haven’t measured its efficiency. I’m not really seeing anything in the shopvac now though.