Znax is a remake of a game by Nick Kouvaris. It is a sort of puzzle / arcade game where you as the player need to select 4 blocks of the same color as the corners of rectangles as big as you can.
The browser build, at twice the game’s own 128x128:
| Title screen | In game |
|---|---|
![]() |
![]() |
Every release has a build for every device. releases/ is where a build of your own puts them, it is not part of the repository:
| Device | File | How to install |
|---|---|---|
| ESPboy | ESPboy_Znax.bin | flash it, the board is a LOLIN(WEMOS) D1 mini |
| Gamebuino META | GamebuinoMeta_Znax.bin | copy it into a folder on the SD card, the .hex is for flashing it directly |
| Adafruit PyBadge | PyBadge_Znax.uf2 | double press reset and copy it onto the drive that appears |
| Adafruit PyGamer | PyGamer_Znax.uf2 | same as the PyBadge |
| Pimoroni PicoSystem | PicoSystem_Znax.uf2 | hold X while switching on and copy it onto the drive that appears |
| Pimoroni Explorer | Explorer_Znax.uf2 | hold BOOT while pressing RESET and copy it onto the drive that appears |
| Pimoroni Tufty 2350 | Tufty_Znax.uf2 | hold HOME while pressing RESET and copy it onto the drive that appears |
| TinyCircuits Thumby Color | ThumbyColor_Znax.uf2 | put it into bootloader mode and copy it onto the RPI-RP2 drive that appears |
| Playdate | Playdate_Znax.pdx.zip | unzip it and sideload Znax.pdx, the same pdx runs in the Playdate simulator |
| Libretro / RetroArch | Libretro_Znax.zip | copy znax_libretro.dll into RetroArch’s cores folder and znax_libretro.info into its info folder, then Load Core and Start Core |
| Game Boy Advance | GBA_Znax.gba | put it on a flash cart or open it in an emulator, the high scores are saved in the cartridge’s SRAM |
| Nintendo DS | NDS_Znax.nds | put it on a flash card or open it in an emulator, the high scores are saved next to it in Znax.sav |
| Nintendo 3DS | 3DS_Znax.3dsx | copy it into /3ds/ on the SD card and start it from the Homebrew Launcher, or open it in an emulator, the high scores are saved in sdmc:/3ds/Znax/ |
| Nintendo 64 | N64_Znax.z64 | put it on a flash cart or open it in an emulator, the high scores are saved in the cartridge EEPROM |
| PlayStation | PSX_Znax.exe | open it in an emulator or send it to a console that runs unsigned code, the progress is not saved yet |
| PlayStation Portable | PSP_Znax.PBP | rename it to EBOOT.PBP and put it in ms0:/PSP/GAME/Znax/ on the memory stick, or open it in PPSSPP |
| PlayStation Vita | Vita_Znax.vpk | install it with VitaShell on a Vita with homebrew enabled, or open it in Vita3K |
| Windows | Windows_Znax.exe | runs on its own, the high scores are saved next to it in Znax.sav |
| MS-DOS | DOS_Znax.zip | unzip ZNAX.EXE onto a DOS machine or into DOSBox and run it, the high scores are saved next to it in ZNAX.SAV |
| Browser | Web_Znax.zip | upload it to an itch.io HTML project, or unzip it and open index.html from a web server, the high scores are saved in the browser |
python tools/build_releases.py builds all of them, python tools/convert_skins.py turns the images in assets/skins into the headers the game includes. The Playdate build also needs the Playdate SDK, see platforms/playdate/CMakeLists.txt, the libretro core libretro-common, see platforms/libretro/CMakeLists.txt, the Game Boy Advance build devkitARM and libgba, see platforms/gba/CMakeLists.txt, the Nintendo DS build devkitARM, libnds and calico, see platforms/nds/CMakeLists.txt, the Nintendo 3DS build devkitARM and libctru, see platforms/3ds/CMakeLists.txt, the PlayStation build PSn00bSDK, see platforms/psx/CMakeLists.txt, the Nintendo 64 build the mips64-elf toolchain and libdragon, see platforms/n64/CMakeLists.txt, the PSP build the pspdev toolchain, see platforms/psp/CMakeLists.txt (pspdev has no Windows build, so on Windows it is built from WSL), and the Vita build VitaSDK, see platforms/vita/CMakeLists.txt, the browser build Emscripten, see platforms/web/CMakeLists.txt, and the MS-DOS build DJGPP, see platforms/dos/CMakeLists.txt.
The game’s buttons on every device:
| Device | D-pad | A | B |
|---|---|---|---|
| ESPboy | d-pad | ACT | ESC |
| Gamebuino META | d-pad | A | B |
| Adafruit PyBadge | d-pad | A | B |
| Adafruit PyGamer | joystick | A | B |
| Pimoroni PicoSystem | d-pad | A | B |
| Pimoroni Explorer | A up, C down, B left, Y right | X | Z |
| Pimoroni Tufty 2350 | UP up, DOWN down, A left, C right | B | HOME |
| TinyCircuits Thumby Color | d-pad | A | B |
| Playdate | d-pad | A | B |
| Libretro | d-pad | A | B |
| Game Boy Advance | d-pad | A | B |
| Nintendo DS | d-pad | A | B |
| Nintendo 3DS | d-pad or circle pad | A | B |
| Nintendo 64 | d-pad | A | B |
| PlayStation | d-pad | Cross | Circle |
| PlayStation Portable | d-pad or the analog stick | Cross | Circle |
| PlayStation Vita | d-pad or the left stick | Cross | Circle |
| Windows | arrow keys | X | C |
| MS-DOS | arrow keys | X | C |
| Browser | arrow keys | X | C |
On the Tufty 2350 a tap of HOME is B when it is let go. It has no speaker, the game is silent there. Holding RESET until the rear LEDs are dark puts it to sleep, a front button wakes it up again, with UP and DOWN held as well it goes into shipping mode instead.
The Thumby Color’s display is 128x128, the game’s own size, so it is shown 1:1 over the whole screen. That build has not been tried on the device itself yet.
The Playdate shows the black & white skin, scaled up in the middle of its display.
The Game Boy Advance shows the game scaled to 160x160 in the middle of its screen, with black bars at the sides.
On the Nintendo DS the game is scaled to 192x192 in the middle of the top screen, with black bars at the sides, and the bottom screen stays dark. What the game saves goes into Znax.sav on the card it was started from, so a card that libfat can not write to (or an emulator without one) plays the game but forgets it afterwards. Its tones are square waves played as a sample: the DS’s own tone channels count their frequency in a 16 bit timer and can not go below about 256 Hz.
On the Nintendo 3DS the game is scaled to 240x240 in the middle of the top screen, with black bars at the sides, and the bottom screen stays dark. What the game saves goes into sdmc:/3ds/Znax/Znax.sav. Its tones play through the console’s DSP when the DSP firmware has been dumped to the SD card (sdmc:/3ds/dspfirm.cdc), and through CSND when it has not: on hardware either one plays, in an emulator only the DSP one does.
On MS-DOS the game runs in VGA mode X, 320x240 in 256 colours, blown up to 240x240 in the middle of the screen with black bars at the sides. That mode rather than the usual 320x200 one because its pixels are square, where 320x200 is stretched over the same screen and would show the game a fifth too tall. The 256 colours are set to the RGB332 cube, which is exactly what the game’s 8 bpp screen buffer holds, so a frame reaches the card without a colour being worked out. Its tones are a square wave on the PC speaker, the high scores are saved next to the program in ZNAX.SAV, and Escape quits. The program is 32 bit and carries the CWSDPMI host inside it, so it needs nothing beside it on the disk.
In a browser the game is drawn into a canvas of its own 128x128 pixels, which the page stretches to whatever room it is given while keeping it square and keeping the pixels sharp. The high scores are saved in the browser’s localStorage under the game’s name, so a private window plays it but forgets it afterwards. The zip holds index.html, index.js and index.wasm and is what an itch.io HTML project takes as it is.
On the Nintendo 64 the game is drawn into memory in the colours the RDP takes and the RDP shows it scaled to 240x240 in the middle of its 320x240 screen, with black bars at the sides. Its tones are a square wave written into the buffers the sound hardware plays from. The high scores are saved in the cartridge EEPROM, which the ROM says it has, so a cartridge or an emulator without one plays the game but forgets it afterwards.
On the PlayStation the game is drawn into memory in the colours the GPU takes, handed to it as a texture and shown scaled to 240x240 in the middle of its 320x240 screen, with black bars at the sides. Its tones are a square wave the SPU plays from a single looping block. The memory card is not written yet, so what the game saves is gone when the console is switched off.
On the PlayStation Portable the game is doubled to 256x256 in the middle of the display, and the high scores are saved next to the EBOOT.PBP in Znax.sav.
On the PlayStation Vita the game is blown up four times to 512x512 in the middle of the display, and the high scores are saved in ux0:data/Znax/Znax.sav.
On the Gamebuino META holding HOME for a second goes back to its loader.
You as the player need to select 4 blocks of the same color of the corners of rectangles as big as you can. By doing so you will erase all blocks in this rectangle and they will be replaced by new blocks. You keep on doing this untill the time runs out, and try to gain your highest score possible.
There are two game modes, Relative Timer and Fixed Timer.
In this mode you don’t get extra time for deleting blocks but just points added to your score so here you try to get the highest amount of points in the given time period.
In this mode you will gain extra time for deleting blocks and points added, you try to keep gaining time so you can play longer and gain higher scores.
| Button | Action |
|---|---|
| Dpad | Select menu’s, Move cursor during game play |
| A | Confirm in menus, Select a block |
| B | Back in menu, gametype selector and game |
| (A) + Left + Down | Show or hide the debug info |
Game Remake Created by Willems Davy, Original game by Nick Kouvaris. The original flash game is still available on wayback machine
All Graphics were made by Willems Davy initially for the gp2x version in jasc paint shop pro 7. The graphics have been adapted for the espboy handheld resolution using gimp.