Log In  

I enjoy creating Escher-inspired ray-traced illusions, puzzles, designs for 3D printing, animations, games, and other software.

[ :: Read More :: ]

Cart #root_to_remain-0 | 2023-05-13 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA

Root to Remain is on the surface a game about planting seeds and growing trees. Ride the river of randomness to achieve your goal.

The rules and game play should be self-explanatory. Should things be unclear, let me know.

One tip for power players: holding X while moving the cursor lets you select fruits and trees, even when there is a seed in the given direction. This can be useful in situations where a fast rooting action is of critical importance.

P#129687 2023-05-13 12:14

[ :: Read More :: ]

Cart #where_to_root-4 | 2023-04-29 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA

Where to Root is a spin-off of this year's Global Game Jam, which had as theme "root".

The basic mechanics of the game are:

  • Trees grow, sprout seeds, drop seeds and disappear
  • Seeds travel in a fixed direction and can take root to grow into new trees
  • Each player can only decide when (and where) to root their seeds

It's an area control game with quite some randomness.
You will need a plan, skill, persistence and a bit of luck.
You cannot control where seeds sprout and the direction they move in.
However, you can decide which seeds to root and when and where to do so.
Are you able to get a tree in each of the target areas?

The game is still a work in progress but already features eleven levels.
I am keen to receive feedback on the overall game play.

Version 0.4

  • AI players
  • Another goal type
  • Stats screen
  • Seven more levels
  • Improve playability
    • Smoother selection
    • Tweak speeds

Version 0.3

  • Basic game play
  • New features: bridges and tiles
  • Levels: Intro, Walls, Tiles and Water
  • Level selection menu
  • Basic sound effects

Version 0.2

  • Improve rendering (objects obscure those behind/underneath them)
  • New features: walls and water
  • Animations for crushing, splashing and squashing

Version 0.1

  • Implement basic mechanics
    • Trees grow, blossom and die
    • Seeds drop, move and root
  • Animation for tree growth
P#126048 2023-02-19 14:18 ( Edited 2023-04-29 20:34)

[ :: Read More :: ]

Cart #pico_garden-5 | 2023-09-04 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA

Pico Garden is a slow-play, low interaction, screen-saver game.
It features a garden that evolves based on Conway's Game of Life.
There is some additional randomness and (minimal) player interaction.
It is a game for dreamers, grinders, slackers and thinkers.

The latest version adds an adaptive, evolving music track.

You do not have to do anything. Your garden will grow by itself.
However, you can occasionally tend your garden if you want to.
If you time this carefully, this will revitalise it so you can enjoy it for longer.

You can use the up and down keys to speed-up and slow-down time.
You can use the left and right keys to change the view.
There's even a fancy plot that shows how well your garden is doing.

Sit back, relax, and enjoy your garden.


My brother created the music. The sound track channels can be freely mixed to create 624 unique patterns.
In order to maximise performance, the Game of Life rules are implemented by performing bitwise operations. This is heavily inspired by rilden's Game of Life.
The game also uses Felice's 32-bit integer to string conversion code.


Version 1.3

  • Adaptive music
  • Brighter/happier color scheme

Version 1.2

  • Only activate decay and mutation on non-lively layers
  • Only play sound effects for visible layers
  • Also add sound effects to flower growth

Version 1.1

  • Improve visual revive feedback
  • Add separate auto-play hi-score
  • Improve Game Over screen
  • Skip over empty views
  • Improve color scheme
  • Improve flower animation
  • Slowly ramp up simulation speed

Version 1.0

  • Speed up decay (so that static gardens die more quickly)
  • Add mutation (to prevent endless life when only gliders remain)
  • Show visual feedback on revive action
  • Show biomass and number of revives on game over
  • Add more sound effects
  • Animate flowers in UI

Version 0.9

  • First release
P#107251 2022-02-19 16:04 ( Edited 2023-09-04 21:12)

[ :: Read More :: ]

Martian Dice is an online multi-player dice game. It lets you:

  • Play with your friends
  • Play with strangers or
  • Play against a bot

This is a reproduction of the physical dice game Martian Dice.

Unfortunately, this game cannot be played from the BBS. For different clients to talk to each other the game needs to connect to a cloud-hosted service, which requires additional Javascript code. You can play the game from my homepage though. The in-game QR code also takes you there.

Cart #martiandice-5 | 2024-01-21 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA


This PICO-8 game really evolved by accident. After playing Martian Dice with friends I wondered what the optimal play was and how much points you can expect to score each turn. So I built a bot in Python that maximises the expected score each turn. Next I figured it would be a good vehicle for me to try out WebSockets. As I also wanted some experience with React, I first built a React client. Then I started dabbling with sprites for the die faces and realized it's a good fit for PICO-8. And here we are...

Version 1.0 - 21 Jan 2024

  • Make handling of delayed/dropped moves more robust
  • Add "chop" to chat message vocabulary
  • Add basic chat-spam restrictions
  • Do not allow leading/trailing whitespace in client ID
  • Let bot player consider what to score to win
  • Fix: Single turn defeat caused assert failure
  • Tweak logo
  • Update QR for new hosting location

Version 0.9.3 - 16 May 2021

  • Allow player to resign game
  • Let player win immediately after all other players have left the game
  • Let other client take on host role when host does not trigger bot moves
  • Suppress play reminders when playing against a bot
  • Recover from network problems by handling WebSocket disconnects
  • Fix: Also show winning bot avatar when observer joined
  • Fix: Stop die roll sounds when exiting room
  • Fix: Room label was not always showing correctly
  • Fix: Occasional wrong room join message was shown
  • Fix: Rejoin room with ghost client fails
  • Fix: Ranking fails when number of clients is one

Version 0.9.2 - 9 May 2021

  • Improved color palette (by using colours from the secret palette)
  • Various minor UI improvements
  • Fancier celebration animation

Version 0.9.1 - 2 May 2021

  • Handle unresponsive/slow players. Options: Wait/Skip/Remove
  • Track results of players in room and show ranking
  • Fancier text editing and chat selection
  • Add dialogs
  • Improve stability

Version 0.9 - 27 Apr 2021

  • Initial release

Implementation details

The backend is an AWS-hosted lambda service in Python. Clients connect to this via WebSockets. The client-side communication is managed by Javascript code. This code interfaces with PICO-8 via GPIO.

For those interested, all source code is available on github. This includes:

  • The PICO-8 game
  • The client-side Javascript code that interfaces with the backend
  • The server-side Python code, which runs as a lambda service on AWS
  • The AWS CDK script for deploying the service stack
  • The earlier HTML client built using ReactJS
P#91199 2021-04-27 19:14 ( Edited 2024-01-21 19:31)

[ :: Read More :: ]

On Firefox and Safari, the PICO-8 screen can go beyond the bottom boundary of the div that encloses it. When this happens, the bottom part of the PICO-8 screen can be masked/covered by elements below the player. On Chrome it always renders okay.

This screenshot shows what goes wrong:

This is the HTML template as exported by PICO-8 (0.2.0e). I only changed it to add some text below the player, and changed the background color of the "p8_frame_0" div to red.

The page is accessible here for anyone who wants to quickly try and reproduce it. Whether or not the problem occurs depends on the size of the view port. You may have to resize your browser window.

P#77253 2020-05-27 17:16

[ :: Read More :: ]

I'd just like to share that I implemented a tracker for the Gamebuino inspired on PICO-8's tracker. It is a bit more primitive, as the Gamebuino console only supports 10-bit audio. Furthermore to keep CPU load acceptable, some pragmatic choices had to be made in generating the audio samples. For example, all calculations are integer-based and only 8-bit multiplications are used. Custom instruments are also not fully supported. In particular, you cannot layer effects, e.g. apply a Vibrato effect on top of a Slide, or vice versa.

However, my tracker supports all instruments and effects available in PICO-8. With that, it is able to reproduce most PICO-8 songs. At least, I successfully managed to render all the songs that I tried to port.

In particular, I want to thank the following PICO-8 users for sharing their carts/music under a Creative Commons license:

Your music has been used to test the tracker and to show off its capabilities in a Music Demo:

For those interested, the source of my tracker can be found on github

P#76984 2020-05-21 16:07

[ :: Read More :: ]

Cart #bumble_bots_re_pair-3 | 2020-05-23 | Code ▽ | Embed ▽ | No License

Bumble Bots Re-Pair is a difficult action puzzle game. In the game you need to re-unite (re-pair) bots by fixing the paths they traverse. Can you complete all ten levels?


The idea for this game was created during this year's Global Game Jam, where the theme was "repair". It's a spin-off of the Robo Re-Pair game that we created during the jam.

The music was created by my brother and first used in my original Bumble Bots game (Low Rez).


The tiles that you are offered are randomly selected. However, you will always be offered tiles that fit somewhere on the grid. Furthermore, the tiles on offer will be unique. The order in which you place tiles and where you place them therefore matters. Exploit this to increase the odds that you get favourable tiles.

It helps to hedge your bets. Have a fallback plan in case you do not get tiles that match your perfect route.

At the start you may want to keep many open ends, so you can place "undesired" tiles somewhere. Towards the end you may want to reduce the number of open ends, to increase the probability that you are offered the tiles that you still need to complete your route.


23 May 2020 - Version 1.0

  • Added two new levels
  • Added hi-score tracking
  • Fancier title screen
  • Fancier Help screen
  • Penalty points for open ends
  • Enable toggling music on/off
  • More juicy animations

18 Feb 2020

  • Added two new levels, both with two pairs of bots
  • Score remaining lives at end of game
  • Improved title screen
  • Improved pair animation

16 Feb 2020

  • Added three new levels
  • On completing a level gain a life
  • Added tiny bots to title screen
P#73101 2020-02-14 19:58 ( Edited 2020-05-23 19:14)

[ :: Read More :: ]

Cart #57841 | 2018-10-11 | Code ▽ | Embed ▽ | No License

No points for originality here, but it's a fun programming exercise. I plan to port this to my Gamebuino device next.


  • Solved celebration
  • "Reset" menu option
  • "New puzzle" menu option
  • Fancier graphics

v 0.1
The basic functionality is all there:

  • Generation of random puzzles
  • Ability to solve it

Still pending

  • Final touches


  • "Hint" menu option
  • Difficulty indication
P#57701 2018-10-08 17:25 ( Edited 2018-10-11 20:50)

[ :: Read More :: ]

Cart #bumble_bots-0 | 2022-04-23 | Code ▽ | Embed ▽ | License: CC4-BY-NC-SA

Less is more!
Here's a low resolution version of my Bumble Bots game. Fewer pixels, but a better game.

When porting the game to Gamebuino I had to reduce the resolution. Doing so forced me to remove some screen clutter as every pixel counts at 80x64. Also, I had to zoom into the levels. On the one hand, this made the game play slightly harder, as you cannot always see all enemies. On the other hand, it made the game play more immersive. In the original game, more than half of screen was black pixels. I actually like the game better at the lower resolution, so decided to revamp the original PICO-8 version. This is the result.


  • Sixteen levels, with a lot of variation!
  • Isometric 3D views
  • Wave animations
  • Enemies
  • Pick-ups, boxes, teleports and gaps
  • Tracking of level progress, hi-score and level hi-scores
  • Level selection menu
  • Four musical tracks (by my brother)
  • Supports touch controls (see Bumble Bots for touch devices)

Changes in v2.1

  • Added support for custom touch controls
  • On game completion score remaining lives
  • Simplified title screen
  • Bug fix: Restored last level (v2.0 included a debugging variant)

Changes in v2.0

  • Changed resolution to 64x64
  • Smoother bot movement
  • More immersive gaming experience:
    • Zoomed-in-view with camera following player
    • Replaced message boxes with fancier text
    • Added more sound effects
  • New title screen
  • New end screen
P#52898 2018-05-21 09:31 ( Edited 2022-04-23 09:36)

[ :: Read More :: ]

Recently I have been busy porting my PICO-8 Bumble Bots game to the Gamebuino game console. Gamebuino resembles PICO-8 in that it is also a console for making and playing retro-games with the emphasis on making them. Unlike PICO-8, the Gamebuino is a physical console based on an Arduino board. Here is a picture of a Gamebuino featuring my Bumble Bots game. (Btw, I "shopped" the picture to increase the brightness of the screen, but it's not a mock-up. This is a picture of the game actually running).

Porting my game has been a fun project. So far, I have ported all the game-play elements, and re-created nine of the sixteen levels. The coding is effectively done. The main work pending is porting the last seven levels. I am sharing my experiences here, as I hope that some of you find them interesting.

Gamebuino's resource limitations follow from its physical implementation and are mostly more tight than PICO-8's artificial limitations. The screen resolution of the Gamebuino is 80x64. Although it also supports 160x128, this resolution is not recommended. The details would be too small and drawing to the screen would require more CPU. CPU speed is anyhow a limiting factor. Just drawing an empty screen of 80x64 pixels at 25 FPS loads the CPU for 50%. On the PICO-8 I had no problem achieving 30 FPS, but realizing 25 FPS on the Gamebuino (with a more limited resolution) required a few optimizations. Also, unlike PICO-8, RAM-memory is scarce and you cannot really dynamically allocate memory. You are effectively restricted to global variables and the stack. This requires you to be more conscious of memory usage while you develop. Similar to the PICO-8, there are also limits to the size of the program, but Gamebuino games can be a bit larger. My game is near PICO-8's token limit, but will be less than 50% of the maximum size on the Gamebuino.

I found it very useful to first have created the game on the PICO-8 and then port it to the Gamebuino. For prototyping the PICO-8 is a much more friendly environment. PICO-8's code-run-debug cycle is faster. Lua is also a friendlier language than C/C++ which you need for the Gamebuino. A silly mistake in the C/C++ code can easily lead to a crash or (undetected) memory corruption. Also PICO-8's built-in sprite, sound and music editors make it easy and quick to create and adapt graphics and sounds. Creating images and sounds on the Gamebuino is more cumbersome. Fortunately, it was quite easy to port PICO-8 images to the Gamebuino. I was also able to port the sound effects I created, although this required a bit more work as Gamebuino's sound effect support is a bit more primitive.

In short, I found PICO-8 and Gamebuino to nicely complement each other. PICO-8 is an excellent environment to quickly prototype and evolve a game idea, and to get it out on the web. However, after that, it's great to port it to a physical device that you can hold in your hands and hand-over to friends to let them try it out.

See my post on the Gamebuino site for more details about the porting process.


P#51607 2018-04-14 15:07 ( Edited 2018-06-13 22:23)

[ :: Read More :: ]

Cart #46244 | 2017-11-13 | Code ▽ | Embed ▽ | No License

Bumble Bots is a difficult puzzle action game. It features sixteen levels, ranging from pure action to challenging puzzles and anything in between.

The game is self-explanatory. You will encounter new elements and learn new tricks as you go along.

Be warned, this is a tough game. I expect only few players to reach the end. Are you one of them?


  • Complete all 16 levels
  • Beat the hi-score
  • Beat the virtual hi-score
  • Complete all 16 levels in one go

Did you reach the end? If so, feel free to share a screenshot of the end screen to proof it.

P#46245 2017-11-13 15:03 ( Edited 2018-09-13 21:26)

[ :: Read More :: ]

Cart #45248 | 2017-10-15 | Code ▽ | Embed ▽ | No License

After wetting my toes in the Pico-8 pool with my Tile Swap game, I figured I should try a bigger game. It's still a WIP, but playable already, so I thought I'd share it.

The game is called Bumble Bots. The idea of the game is "stolen" from the Rolmops game developed by the team that I was part of in this year's Global Game Jam. The Jam's theme was "waves".

v0.1: The game is still basic. Each level has an identical, tiny map. I am planning to add much larger levels, with other building blocks and enemies. Nevertheless, the game is quite fun to play already. I especially like the emergent dynamics of the game that follow from the waves in combination with the enemy AI. Even though the level looks fully symmetrical, as you start to play, you will notice that one of the four spheres is much harder to pick up than the others. Level two with only two enemies is already tricky. I have not managed to finish the levels with three or more enemies. Are you able to?


  • Support large tile height differences: improved rendering and player/enemy move logic accordingly
  • Define levels from maps
  • Created various different tiles including: bridge, pillar and tower
  • Added level 2, "Pillar Maze" (now: "Barsaman")
  • Added level 3, "Bridge and Channel" (now: "Gutter and Stage")
  • Made level start, player death, and level end fancier
  • Let pick-ups block enemy movement


  • Added teleports
  • Added Level 4, "Telerium"
  • Added score and high score
  • Added name for each level
  • Improved title screen and label
  • Added support for large maps, with auto-scroll
  • Bug fix: Fixed possible null-pointer exception when falling of the map
  • Minor improvements to tile rendering


  • Added Level 5, "The Race"
  • Added movable boxes
  • Added fillable gaps
  • Added Level 6, "Mind the Gap"
  • Added (fancy) level menu so you can start at any level you have reached
  • Storing high score and level reached in cart data


  • Added three new levels, each revolving around a new game mechanic:
    • Added Level 7, "Beam me Up"
    • Added Level 8, "Tea Party"
    • Added Level 9, "Besieged"
  • Added fall interactions: a box or enemy is now destroyed if something falls on top of it
  • Improved player control by adding instant retreat
  • Improved "Drop in gap" animation
  • Improved "Caught" interaction. Enemy needs to be at similar height as player
  • Improved Enemy AI to avoid it getting stuck
  • Improved level resume. Allow restart at new levels after upgrade
  • Added hard reset for levels where continuing does not make sense
  • Fixed isoline-based drawing code


  • Added new box type and associated level-ending condition
  • Added three new levels, with some fancy new tiles:
    • Added Level "Down the River"
    • Added Level "Boxing Day"
    • Added Level "IC Trouble"
  • Pimped message box
  • Added Auto-Destruct menu item
P#44246 2017-09-16 17:25 ( Edited 2017-10-15 18:05)

[ :: Read More :: ]

Cart #43811 | 2017-08-31 | Code ▽ | Embed ▽ | No License

I'd like to share my first PICO-8 project. It's a puzzle game of my own design. You need to restore the puzzle by swapping pairs of tiles. The difficulty is that not all tiles can be swapped. It's up to you to discover which tiles can be swapped. Figuring this out is only the first step. The real challenge has then only just begun!

v0.2 After solving the puzzle (within a reasonable amount of moves) you now get a solve key, which grants you entry into the game's Hall of Fame. Capture it. You can reply to this thread with the screen capture. The keys are unique, so don't "re-use" the key of someone else. Furthermore, you really need to solve the puzzle. You cannot cheat by inspecting the source code either.

v0.1 This cart was hacked together in a weekend. It's already playable and quite polished at places, but is not yet finished.

Still on my TO DO list:

  • A celebration tune after solving the puzzle. This will be tough, given that my musical skills are quite limited. I may need to call in the help of my brother here.
P#43688 2017-08-27 14:15 ( Edited 2017-08-31 21:35)