THE 90 MINUTES
Sensible Soccer played from behind the goal, on the gantry, or from the dugout. Written from nothing in C++ — own simulation, own renderers, own animation. There is not a single imported model, texture or sound file in it: every player, kit, crowd, raindrop and whistle is drawn or synthesised while the game runs.
What it is
A football game that plays like the ones I grew up with — you steer one man, the ball is loose, and a mis-hit shot is your fault — but in a real 3D world with a camera you can put anywhere.
The whole match is a fixed 60 Hz simulation that never touches the renderer. It produces a snapshot of the world and a queue of sounds; something else turns that into pixels. That one rule is why the game can replay any moment through the same code that draws it live, run a whole season headless with no window at all, and be drawn by three completely different renderers.
Everything a football match does is in there: throw-ins, corners, offside, advantage, the wall, penalties, the back-pass rule, deflections, bookings, injuries, substitutions, added time. Twenty-six attributes per player decide how each one of them behaves.
Wind, rain and woodwork
Football is played outdoors, and the weather is not decoration. The wind acts on the difference between it and the ball, which is why a clearance hit into a gale dies and one hit with it runs forty yards. It gusts, so a high ball is never quite where you thought it would be.
A wet pitch is a quick pitch: the ball skids off the surface instead of sitting up, and studs let go when a man turns at pace. Snow is the opposite — a bog that kills a pass stone dead. Clear, overcast, rain, storm or snow: pick one in the options, or let the day bring what it brings.
The goal frame is now four real cylinders — two posts, the bar, and the junction where they meet. Each rebounds properly, spin drags the ball off the post the way it should, and a shot that clips the top corner can go anywhere. And bend is a skill worth having: below forty-five on the curve attribute a player hits it straight, above it the ball starts to move, and a specialist really does whip one round a wall.
The touchline
In a manager career you do not steer anybody. You drag a box round your own players with the mouse and shout at them — push up, sit back, close him down, calm down, well done — and then they decide.
A professional in good heart takes it on. One who is knackered and has been bawled at twice already shrugs. A hothead argues with the bench, and a quiet one lets his head drop and plays inside himself for the next twenty seconds. Morale moves on its own too: scoring lifts a side, conceding flattens it, a booking knocks the man who got it.
And you cannot stop a football match. You can ask the referee for a break, and get it at the next throw-in, free kick or goal kick — then make your changes.
Features
⚽The whole match
Offside, advantage, the wall, penalties, the back pass, cards, injuries, subs and stoppage time — refereed by a man who runs the diagonal with two assistants flagging.
●Crossing from anywhere
A cross is solved backwards from the target: pick the man, decide the hang time, then work out the ball. Play one from forty metres and it still arrives at his head.
⛈Weather that plays
Wind that gusts and moves the ball in flight, a wet pitch that skids and a snow-covered one that deadens, and men who lose their footing when they turn.
▣Five cameras
Overhead, television gantry, a broadcast director that cuts between shots, over the shoulder of your man, and the view from the dugout at pitch level.
⚑Eight leagues
England, Spain, Italy, Germany, France, Poland, the Netherlands and Portugal — 150 clubs, squads named for their country, fixture lists of the right length.
✎Everything is a text file
Clubs, squads, leagues, tactics, settings and the credits are plain text you can edit. There is an in-game editor for the ones you would rather not type.
♬Nothing imported
No meshes, no textures, no audio files. The players are jointed figures, the kits are painted at start-up, the crowd and the whistle are synthesised.
Screenshots
Three renderers, one game
Because the simulation cannot see the renderer, the game can have several. It has three, and F4 cycles them in the middle of a match without missing a step.
Shaders and buffers
Vertex buffers, GLSL, matrices worked out on the CPU. Written against the subset that WebGL can use, so the browser build is a port and not a rewrite.
Fixed function
Immediate mode, the old matrix stack, GLU quadrics. The one that must never break: it runs on anything with a driver, down to a software TinyGL.
The classic view
Straight down on the pitch, players as discs with their numbers on. Costs almost nothing to draw, and it is how the game this one is modelled on actually looked.
Under the bonnet
- C++ on GLUI, SDL2, CMake, no engine and no third party middleware.
- The one rule: the simulation never touches the renderer, the audio or the window. It emits a world snapshot and a queue of sounds.
- Fixed 60 Hz simulation on an accumulator, decoupled from the frame rate.
- Procedural everything: jointed figures with hand-written animation clips, kits painted into textures at start-up, a spring-simulated goal net, a crowd built into one vertex buffer, audio synthesised into PCM at boot.
- Headless mode:
--simplays a whole match with no window and prints what happened;--seasonruns a full league. That is how the gameplay is tuned — by measuring, not by watching. - Data driven: clubs, squads, leagues, tactics, settings and credits are hand-editable text.
Where it stands
Every club, player and badge in it is invented — the game generates them. Real squads can be brought in from a file you own, but nothing here is scraped from anybody's database.