Pixel Poppy Pong (2026 showcase edition)
An original Sega Saturn game created for the SegaXtreme 30th annual homebrew competitionCurrently being ported from Jo Engine to Saturn Ring Library / C++
https://srl.reye.me
Introduction
It wouldn't be accurate to say that "Pixel Poppy Pong" is a game made by one person. I am the primary developer and did basically all of the work, but I couldn't have done anything myself without prior art. For example, the people who made and contributed to Jo Engine, where I learned C; the people who helped me with music, the inspiration for the background art, and the team who built SRL.
At its core, the concept is Pong - a ball, some paddles, two goals. But somewhere along the way it grew into something much more than that: physics, spin, items, seasons, unlockable characters, a story, four-player support, particle effects, and a custom sprite format. It's a lot for a game that started as a learning experiment on hardware that hasn't been commercially relevant for thirty years.
So why do it? The honest answer is that it's just what I like to do. I require a creative outlet. I don't expect many people to play this, and I definitely don't expect (or want) to make money from it. Some people might see that as a waste of time. That's fine. For me, the value was never really about cat-pong.
Pixel Poppy Pong was always meant to be a stepping stone. I started knowing basically nothing, I didn't even know how rasterization worked. Through making it, I learned how sprite animations work, how CRAM and palettes behave, how to manipulate Saturn resolutions, how to process and compress images and audio for faster loading, and how some of the Saturn's deeper hardware functions actually operate. That knowledge is what this was always really about. If the game also happens to be fun, that's just icing on the cake.
That said, I hope you like it!
A Note for Aspiring Saturn Developers
If you've ever thought about developing for the Saturn but felt intimidated by it, I want to say something directly: don't be. Old hardware can feel like an impenetrable wall of obscure documentation and arcane constraints. But it's really more like a puzzle. The pieces are all there, it just takes time to fit them together. And today, we have modern tools, modern languages, and a community of people sharing knowledge that simply didn't exist when the Saturn was a commercial product. The most difficult part isn't the hardware itself. The hardest part is deciding to actually try.
Manual & Technical Reference
Table of Contents
2026 Updates
- Technical Changes Since 2025 Competition
- Assets
- Graphics
- Particle Generator
How to Play
- Menus
- Gameplay
- Scoring
- Items
- Game Modes
- Characters & Unlocks
- User Interface
- Controls
- Audio
- Options
- Attract Mode
Engine & Platform
Rewritten in C++ using Saturn Ring Library
The game was fully ported from Jo-Engine/C to Saturn Ring Library/C++. The primary motivation was Jo-Engine's inability to support 4bpp graphics, limitations in TGA loading, and the pain of pure C implementations of fixed point math.
New backup memory module
I made a backup memory module from scratch, replacing sega_bup.h. Basic SMPC functionality required by this module was also implemented. This is currently available as a plugin module for SRL. It's working great for the game but consider it a work in progress.
New SRL wrapper for Ponesound
A new C++ wrapper was written for Ponesound (originally by Ponut64), along with the SMPC support it requires. This is also available as a plugin module for SRL - the only missing feature is real time streaming from the CD, which I plan to work on after the 2026 showcase.
Asset Pipeline & Format
TMSF: Tile Map Sprite Format (work in progress)
A custom sprite format developed for efficiently loading 2d assets. TMSF supports tilemaps and animations, with a compression ratio of around 4:1 (currently only supports paletted format). This enables roughly 2x as many individual sprite frames compared to loading individual TGA files, at significantly faster load times.
I made TMSF because the TGA format became burdensome; I couldn't pack all of the "paw" sprites into a single file for example. Instead, I loaded them individually, because the Saturn didn't have enough ram to process a TGA file that large. This also made loading slow, since the CD had to process and load individual files. Now, I can pack as many sprites as I want into a single file (as long as they fit decompressed in VRAM), which makes asset management easier, with faster loading times as a bonus.
In the future, I plan to integrate with SRL's delta-time system to enable frame-rate-independent animations without manual frame counting.
Compressed PCM audio samples
The same compression scheme used for sprites has been extended to PCM audio samples, contributing to the overall reduction in load times. This is built into the Ponesound-Srl module, with relatively easy to use tools to generate the necessary assets (feedback is appreciated).
Graphics
High-resolution display: 704x240p (non-interlaced)
VDP2 runs at 704x240, while VDP1 runs at 704x480, but effectively it's 240p. This seems confusing, but basically, VDP2 vertically doubles VDP1 pixels internally, so the output resolution is 704x240. However, all the "screen space" math on VDP1 is 704x480. These kinds of display modes are actually common on Saturn - VDP1 and VDP2 do not need to run at the same vertical resolution.
This gave me extra space to scale the physics I wanted. I have also tried running both chips at 704x480i. But on a CRT, in my opinion, fast moving 2d graphics look bad due to interlacing. So I chose to stick to non-interlaced, but half the vertical resolution, and 60fps.
4bpp background support
Switching to SRL unlocked 4bpp backgrounds which are not possible in Jo-Engine. Also, the Cubetile format (by 7shades) packs the background layers into a single .bin, so I can easily load/unload different backgrounds for the UI without the user being able to notice.
All New Artwork
I've improved asset quality wherever possible, made practical by the TMSF compression format, better tools such as Aseprite, and a faster loading pipeline.
Basically every sprite in the game was redrawn from scratch in Aseprite - this is not a regurgitation using last year's assets. Almost every animation has additional frames, a number of sprites are larger, and many new sprites have been added. I also worked a lot on the palette, trying to make things look good both on modern displays and CRTs.
Despite the increased content and asset quality disc footprint and loading times are smaller and much faster than the previous version.
Revised Backgrounds
Backgrounds have been reworked with updated colors and new compositions. Most of the work was tweaking palettes and adding new "seasons".
Seasons & Special Dates (top secret - shhh!)
Pixel Poppy Pong reads the Saturn's internal clock and alters the presentation accordingly. There are four seasons, each with their own effects and visual modes. A handful of special dates unlock additional content beyond the seasons. Players are encouraged to experiment with their Saturn's clock settings - try it out, there are secrets to find!
Aseprite to Saturn Tilemap Tool
A tilemap conversion tool by purist (saturn-aseprite) significantly reduced the effort involved in generating tilemaps for VDP2. Now I can easily draw assets directly in Aseprite, then convert them to a VDP2-friendly format with minimal friction.
I made a batch script so the workflow is as simple as dragging an Aseprite file onto it to produce the output .bin file. An SRL walkthrough by jae686 is also available that covers the tool and makes getting started easier.
This tool was instrumental in adding NBG2 backgrounds to the user interfaces. Previously, UI elements were drawn with VDP1, which created fillrate problems due to the resolution I chose. It was physically impossible to draw the UI I wanted to, and what I could do used mesh transparencies as an ugly workaround.
Moving that work to VDP2 tilemaps solved the problem entirely and opened up a much cleaner visual result. saturn-aseprite made experimenting with new ideas and iterating on assets dramatically faster.
VDP1 Particle Generator
A sprite-based particle system rendered with VDP1
I really had a great time making this, it's enabled effects I had long wanted to add to the game. A standalone demo was also submitted separately for the 2026 showcase. It's primarily designed as a tool - I used the demo to build and test effects for Pixel Poppy Pong. Compiling a small demo is much faster than compiling an entire game, and I could edit the effects in real-time to get the output I wanted.
How to Play
Menus
Menu layouts will feel familiar to the 2025 version, but they have been cleaned up with better presentation. New VDP2 backgrounds and a VDP1-rendered font give them a more polished look. All menu flows have been thoroughly tested, navigation should feel straightforward and reliable.
Gameplay
Physics
This is not a traditional pong game with axis-aligned bounding box collisions. Collisions are resolved based on the actual contact angle between objects, which feels way better (to me, at least). The ball - Poppy - has a spin value that curves her trajectory through the air. Friction is also modelled, meaning the feel of every rally is shaped by your inputs.
Player Interaction Matters
How you hit the ball has consequences. Swiping upward imparts spin, curving Poppy's path. The attack button adds extra speed. Playing for angles and bouncing the ball behind your opponent is a viable and rewarding strategy.
Power Meter
Attacks and blocking all draw from the power meter. It regenerates over time, but the rate depends on your position on the field. Inside your goal, it recharges at full speed. Moving outside your goal slows regeneration. Venture too far from your goal and it stops regenerating entirely. Running out while playing aggressively can leave you completely vulnerable until you retreat. Players who camp in the center spamming attacks and shields will find their power draining with no way to recover.
Scoring
Points are awarded based on two factors:
Poppy's mood: derived from her current velocity and spin. The faster she is moving and spinning at the moment of a score, the more points she is worth.
Score multiplier: increases each time you touch the ball or collect a special item, up to a maximum of 99x. It resets to zero if you are scored on, lose a life, or are blown up by a bomb.
Tip: For every 1,000,000 points earned, you gain an extra life. Playing well compounds your advantage: a high multiplier means more points, more points mean more extra lives, and more lives make the game easier to complete!
Items
Five items appear during play. All items award points on collection, except the Bomb.
| Item | Effect |
| Fish | Awards extra hearts (lives). Always beneficial. |
| Mushroom | Color-dependent. Touch the wrong color and your paw shrinks. Touch the right color and you grow, giving you a size advantage over your opponent. It's like identifying mushrooms in the wild: if you know, you know. |
| Bomb | Generally something to avoid. Using your shield lets you smash it toward your opponent, but be careful, this can backfire! |
| Craig Stadler | Grants a 2x power meter bonus. That's great, unless you already got the Garfield powerup. 😀 |
| Garfield | Grants a 4x power bonus and instantly applies a 10x score multiplier. The most powerful item in the game. |
Shield Interactions
The shield can be used to deflect mushrooms and bombs into your opponent. I kind of added this by accident, because you can also deflect Poppy when she is exploding, which was basically a bug I decided to incorporate into the game.
The upside is this introduces a risk/reward: a deflected mushroom could land favorably for your enemy, and a deflected bomb can come right back at you.
However, you have to time this perfectly, and it may distract you from being scored on by your opponent. Watch out!
Game Modes
Classic Mode
A stripped-back 2-player mode close to the original Pong concept. Players cannot leave their goal area and items do not appear, though the full physics and input system is still in effect. Useful as a practice mode or for a shorter, more focused match. Supports CPU or human opponents.
Battle Mode
A versus mode for up to 4 players using the Multitap peripheral. All gameplay mechanics are active, and players can move freely out of their goal to intercept the ball, collect items, or coordinate with whoever shares their side of the screen. The goal is to be the last player standing.
CPU opponents fill any unoccupied slots automatically, and mixed human/CPU configurations are supported.
The ideal way to play this is with other humans - my AI coding skills are not great (hah!). But I promise, Battle Mode is insanely chaotic fun.
Story Mode
The main single-player experience. Mechanics are identical to battle mode, but you face a ladder of 12 computer opponents, one at a time. It's somewhat inspired by 1v1 fighting games like Mortal Kombat or Virtua Fighter.
Each character is searching for a lost item they believe has been taken, eaten, or simply lost by Wuppy, a dog who has become the most feared figure among the cats. That is despite the fact that he loves cats and just wants to play!
Each character has their own individual dialogue and personality. Beating the game unlocks your name on the high scores list, saved to backup memory. Can you reach the top score?
Characters & Unlocks
Four characters are available from the start. Additional characters are unlocked as you progress and are available across all three modes once unlocked.
| Type | Details |
| Starter characters | 4 characters available from the beginning. |
| Story unlocks | Most opponents are unlocked by defeating them in story mode. |
| Special unlocks | 2 characters unlocked by completing story mode as Wuppy. |
| Hidden character | Cannot be unlocked through normal play, but the lucky may still find a way! |
User Interface
The game uses a single-screen layout in the tradition of the original Pong. The play field occupies the center of the screen. Goals run along the left and right edges. In 4-player mode, each side has two goals, one per player. Each goal is color-coded to its owner's team and flashes when that player is scored on.
Player Panels
Player stats are displayed in bars along the top and bottom of the screen. Each panel contains:
- Score
- Score multiplier
- Continue count
- Remaining hearts (lives)
- Character portrait
- Power meter (green to red as it depletes)
Panel position is determined by team assignment:
Code:
[ Team 1 ] [ Team 2 ]
<- play field ->
[ Team 3 ] [ Team 4 ]
In story mode and standard 2-player matches, only teams 1 and 2 are active. Up to four panels are populated in battle mode via the Multitap peripheral (2, 3 and 4 players are supported).
HUD Elements
Score: the score for the current round. In story mode, your total score is added up at the end of each round (you can see the total on the Pawsed screen).
Score Multiplier: displayed as *N alongside the score. Resets to 0 if you are scored on or get hit with a bomb, or otherwise die.
Hearts: a row of heart icons indicating remaining lives.
Continues: displayed as a Star next to Hearts. In story mode, losing all hearts costs a continue and restarts the current battle.
Character portrait: a picture of your favorite fuzzy friend. Or perhaps your frenemy..
Power meter: a thin horizontal bar directly below the character portrait. Starts green and shifts toward red as it depletes. Can be extended with special items.
Timer: displayed at the top center of the screen. In battle mode, expiry ends the match. In story mode, expiry costs a continue and restarts the current battle.
Controls
Menu Inputs
| Input | Action |
| D-pad | Navigate menu options |
| A / C / Start | Confirm / progress |
| B | Cancel / go back |
| A+B+C+Start | Reset to title screen, or to Saturn multiplayer screen if on the Pixel Poppy Pong logo screen |
The A+B+C+Start reset combination is always active for the controller connected to port 0.
Gameplay Inputs
Both digital and analog controllers are supported. With an analog controller, input sensitivity can be adjusted from the pause menu and is saved to backup memory.
| Input | Action |
| D-pad / Analog stick | Move your paw |
| A | Short attack: bounces the ball a little harder. Costs a small amount of power. |
| C | Hard attack: bounces the ball harder. Costs more power. |
| B | Block / shield: temporarily increases your hitbox size. Costs the most power. Can be used to deflect bombs and mushrooms into opponents, though deflected items can backfire. |
| Start | Pause / unpause (the game is "pawsed"). Opens a menu to continue, restart, or quit. |
| A+B+C+Start | Reset to title screen at any time. Only active for the controller in port 0. |
Audio
Big thanks to Random for his awesome compositions, based on samples from Virtua Racing.
You may notice that music doesn't play continually during gameplay: this was intentional - reflecting on how music played when you crossed a goal in Virtua Racing, something we both clicked on early in the project.
This version features two new tracks: an all-new boss theme composed specifically for Pixel Poppy Pong, and a previously unreleased match ending track recovered from an old hard drive.
Sound Test
A sound test is available from the options menu, with separate entries for music and sound effects.
| Input | Action |
| <- / -> | Select music track or sound effect |
| A | Play selected track or sound effect |
| C | Stop playback |
Options
All options (and high scores) are saved to backup memory automatically. If you have a BUP Cart, it will choose that first.
| Option | Description |
| Mosaic effect | Toggles the mosaic effect on or off. Leave on normally, turn off on emulators which do not render this effect correctly. |
| Background mode | Auto cycles through background color variations. RTC uses the Saturn's internal clock to display a background matching the current time of day. |
| Big Head Mode (unlockable) | Makes the ball twice its normal size. Purely for fun. |
| Music test | See Sound Test section. |
| Sound FX test | See Sound Test section. |
| Analog adjustment | Adjust input sensitivity for analog controllers. Also accessible from the pause menu during gameplay. |
Attract Mode
When left idle at the title screen, the game enters attract mode and cycles through the following sequence continuously:
- Pixel Poppy Productions logo
- Title screen
- Demo: 45 seconds of live CPU-vs-CPU gameplay (no pre-recorded sequences)
- High scores
- Credits
Press Start at any point during the attract cycle to return to the title screen.
High scores and game options are saved to the Saturn's internal backup memory, or the BUP cart if you have one installed.
Pixel Poppy Pong (2025 competition entry)
WARNING: before trying the latest version, make sure to delete your old save game (eventually that will settle but I'm still updating stuff)
Play as Macchiato, to save your friends who have been hypnotized by the (evil?) Wuppy (story is a WIP). Or, play in classic mode for an easy/fun time. Finally, battle up to 4 of your friends with a multi-tap and analog controls with the 3D control pad.
The AI is tough, but beatable, and I believe it is possible to rank highest on the score chart in story mode (medium or hard difficulty). However, classic and battle modes are definitely meant to be played with other people (try it!).
This was a complete re-write from scratch, utilizing a modified version of Jo Engine. Credits to Random for the original music (except the placeholder music in the name entry screen, that is from Sega Rally 2). The PPP logo sound is from the Master of Monsters soundtrack, composed by Hayato Matsuo.
All graphics are original. The background art is by Tatiana Sherbul, re-drawn by me (pixel by pixel) to work on the Saturn. Poppy field: pixel art - Tatiana Sherbul
Source code available here: GitHub - bimmerlabs/pixelpoppypong
Video:
Supports:
- Analog input with the Saturn 3D pad
- Multi-tap (up to 4 players)
- Save backup cart
Emulation:
Pixel Poppy Pong is designed for use on real hardware, utilizing special effects with non-interlaced high resolution graphics.
It plays best on a physical Saturn with a CRT. However, emulators have been tested, see below.
- Mednafen: all effects supported
- Retroarch (it's Mednafen, basically)
- Kronos 2.7: runs at 30fps, mosaic not supported, CD audio issues
- All other forks of Yabause/YabaSanshiro: completely broken, don't even try
Game options have been added to make emulators more useable (such as turning off the Mosaic effects).
Inputs:
- D-Pad/analog input:
- move your player
- options select
- attack forward
Options:
- Debug mode: cannot be turned off
- Debug display: you probably want this off
- Mesh Transparency: turn off if using emulators
- Mosaic Effect: turn off if using an emulator other than Mednafen
- Use RTC: Uses internal clock for background color and other special effects
- Big Head Mode: always use the scaled up version of the ball (disabled in 3-4 player mode)
- Analog Adjustment: adjust input sensitivity for the 3D control pad. (press left or right on the D-pad)
Gameplay (60% complete):
- All modes:
- Select from the list of 10 characters (in future versions, you will need to unlock them in story mode).
- each character has different power, speed, and acceleration attributes
- power: affects ball acceleration
- speed: the top speed your paw can move
- acceleration: how fast the paw accelerates
- These attributes affect the AI players as well!
- Play in story mode to unlock more playable characters for vs mode
- There are 2 "secret" characters to unlock - you'll have to figure out how!
- each character has different power, speed, and acceleration attributes
- Score is based on the velocity of the ball, the spin, and your multiplier.
- watch out, if you touch the ball while it is exploding, you will lose a life!
- basic 2 player back and forth, without special items
- Play as unlocked characters
- Select from the list of 10 characters (in future versions, you will need to unlock them in story mode).
- Note: AI will automatically take control over other players if nobody has selected them.
- story mode is only about 50% complete
- 3-4 player battle mode works, but you can't "win" yet (1-2 player works fine though)
- music is about 50% complete
- AI doesn't use shields, attacks, or move forward (unsure if I will implement)
- Difficulty balancing is preliminary
Pixel Poppy Productions Presents: Pixel Poppy Pong! (2024 competition entry/description)
Play as Macchiato or Jelly Bean, who are desperately in love with Poppy (or something like that). Battle each other to score goals, avoid bombs, eat fish, gain hearts, and learn the secrets of the universe. If you win, you will earn Poppy's affection forever. But if you lose, press start and try again!
Each player gets 9 lives (hah! get it?). When you lose all 9 lives, the other player wins the match, and gets a star. Whoever gets 3 stars first, wins the game.
The controls are fairly simple:
- Up/Down - move your paw up and down to block your goal
- When blocking your goal, hold down down the button to activate the attack:
- A - basic attack
- B - slow attack
- C - fast attack
- If you don't hold down a button, you will still block your goal
- When blocking your goal, hold down down the button to activate the attack:
- When the round is over, whoever wins gets a star. Press "B" to start the next round.
- When the battle for Poppy's affection is over, press Start to reset the game.
- press ABC+Start at any time to reset the game. (not currently working)
- Start when the game is running pauses the game.
Several items can appear on the field. The main 3 are hearts, bombs, and fish. Whoever touched Poppy last, gets the item. The other items, you will have to play to find out - one is super rare 😉
- Hearts give you an extra heart.
- Bombs take away a heart.
- Fish can give you either 3 extra hearts, or bonus points, depending on Poppy's mood. She's a cat, after all.
- The other ones? You'll have to find out..
This version is "playable" enough although not completely finished. I still plan on using as much time before the deadline to fix/add stuff.
It's definitely most fun played with a second person - the AI is probably too hard.
It's frantic and goofy with 2 humans though! I play tested with my son, it was actually pretty hilarious. I still need to tweak the goal hitboxes a bit and make some of the initial kickoffs less aggressive. But it was still fun enough.
Currently, there is no sound or music. I hope to get at least some sound effects into the game by the deadline. I intend to use Ponesound, although I'm not clever enough to add a cool logo on the game startup sequence yet!
I really want to add a title screen, but I probably don't have time to draw anything. At least I added a loading screen!
Video: