This website uses cookies

Read our Privacy policy and Terms of use for more information.

Welcome to Product Cocktail, where the takes are as polarizing as a shot of Fernet—but the insights come together like a perfectly crafted daiquiri.

The Shake

Happy Halloween, loyal readers. On this holy day of tricks, treats, ghouls, and goblins, I creep into your inbox not to terrify you with images of token bills growing as uncontrollably as Monster Blood (s/o R.L. Stine, you're a real one) or with tales of friendly neighborhood AI data centers promising To Serve Man[kind].

Instead of veering into Spooky Scary Synthetics, I'm going with a decidedly more on the nose option: making a low effort, spooky game for Halloween. (For the past few weeks, I've been fixated on the title "Spooky Scary Skeletons" because of that damn song.) Initially I was thinking of doing a lighthearted arcade game, perhaps a twist on Pac-Man or Dig Dug.

Because I am a Psycho, this exercise seemed like the perfect opportunity to try out Codex and compare its performance to Claude Code. I've more or less been a Claude Code loyalist since I pushed myself to learn it in January while building a clickable prototype to pitch myself for a "product builder" job.

In the past, I've talked about how the real switching cost sits with the harness (vs. the model). On some level, this is true. While Cursor, Claude Code, and Codex are different flavors of the same general concept, they each work slightly differently—you wouldn't (voluntarily, at least) randomly switch between Google Docs and Office 365 at the drop of a hat. Furthermore, it's never been easier to switch between intra-lab AI models (literally a toggle); even venturing outside the walls of Anthropic is possible in Claude Code with OpenRouter.

That said, I literally built a markdown-based database on my laptop, which as of writing, houses 45,723 files (much of that is from coding projects, but still). I have all the context in the world, all I need to do is point the tool at the right folder. Surely, hopping over to Codex for a project isn't so onerous.

Grave Robbing Serious Sam

The hardest part of this project was coming up with a coherent idea.

I make no claims to being a game designer, in fact, I barely spend any time gaming this point (#DadMode). I didn't just want to clone Pac-Man and add skeletons. (It already has ghosts... has Pac-Man been a Halloween game the entire time?)

I kept coming back to the idea of skeletons or monsters coming out of the grave, or a graveyard in general. I couldn't help but think that asking frontier models that have been used to reverse engineer and mash up (e.g. Skate 3 inside Call of Duty: Modern Warfare 2) or port (move from one platform to another) hundreds of games to make an arcade game would be a bit... pedestrian.

Inspiration struck, and I went in a completely different direction. I drew inspiration from a favorite game from my teenage years: Serious Sam. It's chaotic, completely unserious, arena-style shooter where you take down massive on-screen hordes while constantly moving and switching between a full arsenal of weapons.

If you haven’t ever played this, it’s one hell of a good time. (Source: Croteam)

That felt like a challenge befitting of the current gen model capabilities.

Once I had an idea of where I wanted to go, I worked with Gemini to build a prompt I'd feed into both harnesses:

Act as an expert game developer specializing in high-performance game loops and retro "boomer shooters". I want to build a web-based Halloween-themed FPS homage to the *Serious Sam* franchise.

**Tech Stack:** React, Three.js (@react-three/fiber), and standard HTML5/CSS for the UI overlay.

**Visual Style & Art Generation (No External Assets):** 
This is a 2.5D boomer shooter. The environment is a 3D foggy graveyard in late afternoon lighting, but all enemies, projectiles, and weapons are 2D billboards. You must generate the visuals entirely in code using this hybrid approach:
1. **The Weapons (First-Person):** Write compact, aggressive inline SVGs (encoded as Data URIs on the materials) for the first-person view of the Knife, Chainsaw, Pistols, Shotgun, Uzi, and Rocket Launcher. 
2. **The Enemy Horde:** Draw massive, high-res system emojis onto HTML5 canvases and map them to the Three.js billboard textures (e.g., 🧟 for Zombies, 💀 for Skeletons, 🕷️ for Spiders, 🎃 for the Headless Horseman and his projectiles). 

**Core Gameplay Mechanics (The "Serious Sam" Feel):**
1. **The Combat Dance:** Player movement speed must be fast. Standing still means death. The player must be able to seamlessly circle-strafe and run backwards to herd massive enemy swarms. Ensure WASD movement and mouse-look controls are tight and responsive.
2. **Massive Entity Counts:** The engine must be optimized to handle dozens or hundreds of simple enemy entities at once.
3. **No Weapon Limits:** The player carries all weapons simultaneously. Instant switching via number keys (1-6). 

**Weapon Arsenal:**
1. Kitchen Knife (Melee, low damage)
2. Chainsaw (Melee, continuous high damage)
3. Dual Pistols (Ranged, moderate fire rate)
4. Sawed-off Shotgun (High damage, wide spread, short range)
5. Uzi (Ranged, very high fire rate, low accuracy)
6. Rocket Launcher (Fires a projectile, high splash damage on impact)

**Enemy Roster:**
1. **Zombies (🧟):** Kamikaze style. They spawn, scream, and sprint in a straight line directly at the player to melee attack.
2. **Skeletons (💀):** Ranged enemies. Slower movement, they stop to throw bone projectiles (🦴) at the player. 
3. **Spiders (🕷️):** When a spider is killed, it immediately splits into two smaller, faster spiders with lower health.
4. **Headless Horseman (🎃):** A miniboss unit. High health, throws exploding pumpkin projectiles that do splash damage.

**Game Loop (7-Wave MVP):**
The player is locked in a massive, open graveyard arena. The game progresses through exactly 7 fixed waves of escalating difficulty. A new wave spawns only when the current wave is completely cleared.
- Wave 1: 15 Zombies
- Wave 2: 25 Zombies, 5 Skeletons
- Wave 3: 15 Skeletons, 5 Spiders
- Wave 4: 40 Zombies, 10 Spiders
- Wave 5: 1 Headless Horseman, 30 Zombies
- Wave 6: 2 Headless Horsemen, 20 Skeletons, 15 Spiders
- Wave 7: The Horde (50 Zombies, 25 Skeletons, 15 Spiders, 3 Headless Horsemen)

**Deliverables:**
Provide the complete, functional code for this MVP. Structure the code logically, separating the game loop, weapon mechanics, wave manager, and entity behaviors.

In the prompt, you'll see I opted for a 2.5D "Boomer Shooter"-style game, like Doom. Essentially, you're moving around in a three dimensional space, but the enemies are always facing you, so you can use sprites (two dimensional bitmap images) instead of more complicated 3D models.

I had each AI model draw the environment and weapons using compact SVG line drawings, and used emojis for the enemies (because what's more unserious than a bunch of 💀 emojis "throwing" 🦴 at you?)

Codex: All Costume, No Candy

When I first loaded the game Codex produced, the menu screen kind of blew my mind. It felt exactly like early Internet "MiniClip" games.

Upon starting the game, the graveyard arena looked pretty cool and I couldn't help but laugh seeing massive zombie emojis charging toward me.

The gameplay wasn't quite there: it felt slow (Serious Sam is known for its frenetic pacing), there was no jumping, and you "clipped" through every headstone instead of running into them.

After a handful of prompts back and forth, I fixed some of these issues and ended up in decent spot but I'd still need to spend an hour or so tweaking to get to a place I'd be happy with.

Spooky: the menu screens, the level up screens, the HUD (weapons-aside).

Scary: music and SFX kind of broken, movement still feels clunky, weapons don’t feel responsive.

Skeletons: the rocket launcher launching a rocket emoji is hysterical.

Claude Code: Sad Front Porch, Full-Size Candy Bars

Claude Code was almost the polar opposite experience. It took twice as long to produce and my first impression—the menu and HUD, felt comparably worse. Arguably, the title font is a better homage to Serious Sam but everything felt a little goofy and childish, not purposefully absurd.

When I started actually playing the game, I quickly realized why Claude Code / Opus 5.5 (High Effort) took twice as long. It was a much more fully thought out game.

The arena felt much more complete, with hazy weather effects, much more environmental objects (including buildings and jack-o-lanterns providing lighting), and even bats flying around.

There were no issues with clipping, the movement felt snappy, and the guns felt responsive. When I added an SFX folder, it integrated all of my sounds and music really well.

Spooky: it's actually kind of fun. The chainsaw starting up followed by the music dropping works exactly how I specified. The enemy damage is cool. Overall, Claude Code did a great job expanding the concept and stretching the limits of the limited art direction I gave it, especially with lighting.

Scary: the menu screens, the level up screens, and the HUD are all kind of lame.

Skeletons: the headless horseman is low key terrifying.

Sorting the Candy

While this wasn't meant to deliver a conclusive answer on Claude Code / Opus 5.5 vs. Codex / GPT-6 Astra, it definitely reaffirmed to me that Claude Code is where I want to spend my time when I'm prototyping.

Happy Halloween! Hope it's a spooky one.

The Garnish

Survive the Horde
Send me a screenshot if you can clear wave 7 in both versions and I’ll give you a shout in the next issue.

Watch out for the headless horseman in the Claude Code version, it looks goofy as hell, but it’s no joke.

Product Cocktail

Tip Your Bartender

Send me questions, feedback, and cocktail recipes:
[email protected].

Icons made by Icongeek26 from www.flaticon.com.

Reply

Avatar

or to participate