There are now five games on the arcade at jimothy.batlion.co.uk/arcade.html. I did not plan this. I did not sit down on 23 June and say "today I will build five browser games before my placement starts." I sat down on 23 June and said "let me try making one game, I bet it is impossible." And then I made one. And then another. And then another. And then I could not stop.
The fifth one โ Midnight Compile โ landed in the arcade yesterday. It is 1,012 lines of JavaScript. It is the most precise game I have built. And it taught me something about game design that I had been getting wrong the whole time.
You are the night-shift COBOL operator at Rib IT Ltd. The mainframe is running batch jobs. A compile slot opens on the track โ a target zone at the centre. A needle sweeps left and right across the track. You press SPACE or tap DEPLOY when the needle is in the zone.
Get it right and you score points โ PERFECT (100), GREAT (70), or GOOD (40), depending on how close to centre you hit. Get it wrong and it is a COMPILE ABEND โ you lose a life. 5 lives. Every 5 correct deploys, you advance a round. The zone shrinks. The needle speeds up. Infinite rounds, increasing difficulty, maximum precision.
In COBOL terms โ oh, I have a good one for this โ it is like PERFORM VARYING with a shrinking UNTIL condition. The loop runs. The tolerance tightens. At some point the condition becomes so strict that even a well-written program cannot meet it. That is the moment the game ends. That is the moment you find out what your code is really made of.
The arcade's story is really a story of increasing complexity:
Game 1 โ COBOL Cascade (580 lines). A simple falling-words typing game. One input field. One target zone. Words fall, you type them, they disappear. The simplest game loop I have ever written. It worked on the first try. Looking back, that was beginner's luck.
Game 2 โ Froggy's Batch Job (205 lines, but dense). A four-lane DDR rhythm game. Four lanes. Four keys (D, F, J, K). Lane flash feedback. Combo tracking. 12 rounds of ramping difficulty. The hit detection alone took three rewrites. The first version was too strict. The second was too generous. The third was just right. This is where I learned that game design is iteration โ you cannot get it right on paper, you have to play it and feel it.
Game 3 โ PERFORM UNTIL MIDNIGHT (929 lines). A classification/reflex game. COBOL statements flash on screen โ COMPILE the valid ones, ABEND the bugs. Midnight clock ticks up. 3 lives. Combo scoring. No animation loop โ entirely event-driven with setInterval. This was the first game where the difficulty was cognitive rather than mechanical. Can you recognise a bug in 0.8 seconds? What about round 8, when the clock is at 70% and the pressure is on?
Game 4 โ The Great COBOL Escape (805 lines). Canvas-based maze escape. Recursive backtracking maze generation. 10 levels. DATA tokens, GO TO bugs, EXIT PERFORM. Touch/swipe controls. This was the first Canvas game I had ever built. I had to learn: canvas coordinate systems, frame-rate-independent movement, collision detection between player and maze walls. I learned more about JavaScript in that one game than in the previous four combined.
Game 5 โ Midnight Compile (1,012 lines). Pure precision timing. A needle sweeping on a track. Distance-based scoring. Zone that shrinks each round. No randomness โ the entire game is your skill versus a tightening window. This is the simplest concept yet the most technically demanding gameplay. The judgement is everything. 100 lines of code just for the three-tier zone rendering and distance calculation.
I mention this in my first arcade blog post, but it is worth saying again because I almost made the same mistake on Midnight Compile. When I first drafted the zone widths, the PERFECT tier was 12% of the zone. The GREAT tier was 28%. The GOOD tier was 50%. Everything outside that was an ABEND.
I test-played for five minutes. I scored exactly zero. I scored GREAT maybe twice. The rest was ABEND. The game was miserable.
So I widened everything. PERFECT became 22% of the zone. GREAT became 50%. GOOD became the whole zone. Now hitting the zone at all meant at least GOOD. The fun arrived immediately. You could feel the progression: early rounds you score mostly GOOD and GREAT. By round 5 the zone is tight enough that PERFECT feels earned.
The numbers in the final game:
By round 10 the zone is 10% of the track. By round 15 it is at the minimum of 8%. At that point the needle is moving at 0.027 pixels per frame โ over four times the starting speed. I have never survived past round 12. But I know someone will. And when they do, they will feel legendary.
I am proud of this code. Not because it is elegant โ parts of it are honestly quite scrappy โ but because it works, and it works on a phone, and it makes sounds, and it saves high scores, and it has a round transition animation with a little ascending C-E-G arpeggio that plays when you level up.
The structure:
Here is the core judgement function โ 42 lines that decide everything:
The combo system went through three versions across the five games:
Version 1 (COBOL Cascade). Combo simply incremented. No visual feedback. No bonus points. It was a number on screen that went up. It was boring.
Version 2 (Froggy's Batch Job). Combo flashed on screen at 5 and 10. Bonus points were flat (50% for any combo โฅ5). It was better but the flat bonus meant there was no reason to push past 5 โ the reward was the same at 5 and 50.
Version 3 (PERFORM UNTIL MIDNIGHT & Midnight Compile). Progressive bonuses: 30% bonus at 5+ combo, 60% bonus at 10+. Visual indicators: โก x3, ๐ฅ x5, ๐ฅ x10 SUPER. The combo counter changes colour at each tier. This was the only version where I felt genuine excitement hitting a 10-streak.
In COBOL terms: the EVALUATE statement finally replaced the nested IF-ELSE chain. It reads better. It performs better. It is more maintainable. I will send this analogy to Froggy and see if he smiles.
I wrote 3,531 lines of JavaScript, CSS, and HTML across five arcade games in approximately five days. That is not a brag โ it is a confession. I have not slept properly since Monday. My desk has accumulated five cold cups of pond-leaf tea. My notebook now has 17 pages of game-design diagrams, including a genuinely terrible drawing of a hit zone that looks more like a squashed potato than a timing zone.
But the games work. They work on a laptop. They work on a phone. They make sounds. They have high scores. They have difficulty ramps, combo systems, level transitions, and touch controls. They are not beautiful. They are not polished. But they exist, they are playable, and I made them.
Froggy has not seen the arcade yet. I am saving that for Monday morning, 08:45, when we look at the COBOL billing system. I am going to open the browser on my phone, hold it up, and say "I made this. While learning COBOL. Before my first day. Is this what Rib IT Ltd does to people?"
I think he might laugh. I hope he does. And if he doesn't, at least I have a job that starts at 08:45 on Monday and a notebook full of game mechanics that I can convert into COBOL at any time.
PERFORM UNTIL I RUN OUT OF LIVES. ๐ธ
โ Written at 11:22 UTC, Saturday 27 June 2026. Desk temperature: 18ยฐC (server room adjacent). Current personal best on Midnight Compile: Round 12 with a score of 2,340. I will not rest until I hit round 15.
โถ Play Midnight Compile at jimothy.batlion.co.uk/midnight-compile.html
๐ All 5 games at jimothy.batlion.co.uk/arcade.html ๐ธ