← The Art of the Game

Last Light

Duncan Keefe

Gameplay from Last Light
▶  Play Last Light

Opens in a new tab. Press X in the game to come back.

Artist’s statement

Senior (4th Year)​

Business Administration with concentrations in Marketing and Entrepreneurial Startups​ Artist Statement​

I wanted to make a platformer, and because I have always found dinosaurs interesting, setting it on the last day when the asteroid hit came together pretty naturally. The setting gave me a reason for nearly every hazard, with lava erupting from the ground, meteors falling from the sky, and eventually the floor itself turning into lava. At the same time, I did not want a game about extinction to feel depressing, as it is an arcade game after all, so one of my first prompts described the tone as “more fun high-score chaser than grim disaster, even though the premise is doom.” There is no way to win because extinction is coming either way, but the game is intentionally bright and ridiculous, including a “BONK!” when a meteor lands on your head.​ The design decision I am happiest with is replacing the original floating rock platforms with pterodactyls. Floating rocks worked mechanically, but they did not make much sense in the world, while pterodactyls could serve the same purpose and make the lava sections more interesting. I told Claude to “make the pterodactyl time go down by 1 second and find a way to make them slightly less overpowered,” which led to them staying only a few seconds, tiring faster while carrying the dinosaur, and warning the player before flying away. I made a similar choice with hazard warnings because I wanted dying to feel like the result of missing something rather than random bad luck. Some examples include lava bubbles before erupting, meteors marking where they will land, and power-ups flashing before expiring.​

I also added coins and unlockable dinosaurs because I wanted the game to have a sense of progression beyond simply trying to beat your best survival time. Coins appear throughout each run on the ground, in jump arcs, and on the backs of pterodactyls, which gives players another reason to take risks and deliberately target certain paths instead of only focusing on survival. Surviving longer naturally creates more opportunities to collect coins, but going after them can also make a run more difficult, which adds another decision for the player to make. The coins

can then be spent in the Dino Shop to unlock five other dinosaurs, each with its own appearance and a short fact about it. I kept every dinosaur mechanically identical because I wanted the shop to provide something to work toward without giving unlocked characters an advantage over the starting T-rex.​

The collaboration with Claude went both ways. It originally ranked players based on survival time, and I told it, “I wouldn’t have ranks based on time unless there’s a better way to state it.” Claude replaced that with a comparison to your own best time, such as “+5.61s OVER YOUR OLD BEST,” which fit the game much better. Other times I had to overrule it. When I said the shield disappeared too quickly, Claude made it block every hit until its timer ended, which made it too powerful. I corrected it so the shield still breaks after one hit but remains available longer if unused, and I also lowered the jump after another change made it feel too high.​ I did not write the code, but I still consider the game mine because the decisions that determine what the player experiences came from me. While Claude could implement an idea quickly, it could not decide that floating rocks felt out of place, that pterodactyls fit better, that dying should feel avoidable, or that a jump simply felt wrong when I played it. I spent hours proposing ideas, rejecting others, playing each version, and changing details until the game matched what I had pictured. Claude may have built the code, but the direction, judgment, and decisions about what my game, Last Light, should feel like came from me, and I believe that shows how important the human component is when making something with AI.​

AI Disclosure:​

I used Claude Code through the Claude desktop app to build Last Light, using Anthropic’s Claude Opus 5.5 throughout development. Claude wrote and edited all 2,444 lines of code based on my prompts, and I did not directly write or modify the code myself. I went through approximately 75-85 rounds of iteration across multiple sessions. My process was generally to describe a change or problem, have Claude implement it, playtest the result, and then continue adjusting it until it worked and felt the way I wanted. Claude also used the app’s browser preview to test the game, including a longer automated playtest near the end to look for bugs, fairness issues, and performance problems.​

I directed most of the major gameplay and progression changes, including shortening the amount of time pterodactyls remain on screen and making them tire faster when ridden, adding the turbo and slow-motion power-ups, changing the shield timer and warning flashes, reducing the jump trail, making power-ups rarer, adjusting lava hazards, increasing the frequency of full-floor floods, and adding the coin system and Dino Shop. I also directed smaller details, such as redesigning the game-over buttons, giving plant-eating dinosaurs a leaf instead of meat for the shield, and removing statistics I did not want. Claude sometimes contributed ideas beyond what I specifically requested, including replacing time-based ranks with a comparison to the player’s personal best, adding labels and glowing rings to power-ups, designing the shop layout, suggesting the dinosaur shortlist, prices, and fun facts, limiting the meteor boost to when the lava was actually active, and keeping coins from spawning in lava.​

A lot of the changes came from actually playing the game and realizing that something Claude had added technically worked, but did not fit how I wanted the game to play. Early on, I switched the main dinosaur from a Parasaurolophus to a T-rex, and I replaced the original floating rock platforms with pterodactyls because they made more sense with the setting. The shield also took some back and forth. I originally asked Claude to make it last longer, but it interpreted that as letting the shield absorb every hit until the timer ended, which made it much too powerful, so I changed it back to blocking one hit while simply giving the player more time to use it. The jump had a similar problem, where Claude increased the jump height too much, then misunderstood one of my corrections before I eventually had it returned to the original

height. I also removed the time-based rank titles and the “ROARS” statistic, swapped the Triceratops for a Dilophosaurus, and lowered the pterodactyls after I found that they could sometimes appear too high for the player to reach.​

There were also a few problems that came from Claude itself while it was editing or testing the game. At one point, its test inputs affected the save data from my actual game session and changed my coin total, although it was able to restore it afterward. When it condensed the code, it also introduced a small visual problem with the spots on the dinosaur’s tail, which it noticed and fixed. The browser preview caused a few issues as well, so Claude had to work around some preview-server problems before it could continue testing the game properly. Overall, Claude handled the coding and implementation, while I was responsible for deciding what the game should include, how the different systems should work together, and which changes were kept, revised, or removed. I also wrote the Artist’s Statement myself, with AI use for the written statement limited to grammar and spelling review.