A modern Java remake of the 1984 ZX Spectrum classic Skool Daze, built on plain Java2D/Swing with one optional extra (JInput, for gamepad support — the game plays keyboard-only without it). It is now a complete, winnable game loop: Eric roams a scrolling, multi-floor school connected by staircases, alongside patrolling teachers and wandering pupils.
Objective (the real Skool Daze caper):
-
Jump up to flip all 18 wall shields (
SHIELDS x/18stays on the score bar all run, turning green when they're done). Fifteen fall to an ordinary jump; the other three are mounted too high — punch or catapult someone to knock them down, then jump from right beside the body for a boosted leap. (The smoke test audits all 18 every run and fails the build if any one becomes unreachable.) -
With the shields done, fire your catapult (
C) at Mr Wacker, Mr Withit and Mr Rockitt to daze them — each coughs up one letter of the safe code. -
Mr Creak is hypnotised and won't crack from a catapult. Get Creak's birth year out of a classmate — stand near one at break, or just thump one (
Xor a catapult pellet), which shakes it out of them every time whether you knew it already or not. Once you've been told, the year is pinned to the score bar asCREAK b.1937so you can't lose it. Go to the Science Lab blackboard, pressBand type the year — when Creak sees it he blurts out his letter (you'll be told even if you're across the school by then). -
With all four letters (
LETTERS …) the safe in Mr Wacker's study (top-left) starts pulsing — but it stays shut. Walk up to it and press UP to crack it open, then take your report card from inside. -
The alarm! Taking the report sets off the alarm and every shield reactivates. Lessons are abandoned — the whole school files out of the front door — but the The teachers stay on patrol, but they're marshalling an evacuation, not writing lines: catch one's eye and he bellows "GET OUT! USE THE EXIT!" rather than booking you, so you can jump for shields under their noses. Throw a punch or a catapult pellet in front of one, though, and he'll still do you for it — and he'll do the bully too if he catches him swinging.
And the bully doesn't leave: he hunts you down, taking the staircases between floors, and takes a dig at you every couple of seconds once he catches up, knowing full well you've got his report card. He's also the only body left to spring off for the three high shields — thump him, jump from beside him, and mind him getting up. Re-hit all 18 shields to silence the alarm...
-
...then leg it out of the front door — bottom floor, far left. It lights up green with a WAY OUT sign once the shields are done. Get through it and you've won.
A teacher only sees what's in front of him and within about 100 pixels — always close enough that you can see him on screen too, so you're never booked by someone you couldn't spot. Catch his eye while misbehaving (jumping or punching) and it's 250 lines — the flat rate for every offence, whether it's being spotted, being grassed up, being caught after a chase, being blamed for Boy Wonder, or skiving a lesson. Rack up too many and you're expelled. At playtime a teacher who spots you will give chase ("COME HERE!"); if he catches you it's a telling-off (frozen + extra lines), so leg it up the stairs to another floor. Catapulting a teacher (or loosing the mouse) also blinds them, handy for slipping past.
Find the mouse lurking in the school: pick it up, carry it to where the teachers are,
and release it (M) to send them leaping in terror — a frightened teacher freezes and
can't give you lines, so it's a handy escape.
Everyone in the playground wears a name badge — you included, so you can always spot
yourself in a crowd. The three troublemakers are flagged and colour-coded: the tell-tale
as EINSTEIN (SWOT) in orange, the shover as DIRTY DAVE (BULLY) in red, and the
tearaway as BOY WONDER (TEARAWAY) in purple. It isn't an all-boys school: Hayley and
Bridget are in the class too.
You aren't the only one who gets done for larking about. Angelface, Einstein and Dirty Dave scrap and let fly with catapults of their own at break, and any teacher who sees them at it gives them the lines — the swot very much included.
Watch out for the swot — one classmate is a tell-tale. Misbehave near him at playtime and he'll shout "SIR!" and summon the floor's teacher to chase you, even one who didn't see you. Learn who he is and don't show off in front of him.
There's also a bully who charges over and shoves you off course at playtime (he can
knock you straight into a teacher) — but a punch (X) or a catapult pellet (C) sends
him stumbling away. And keep clear of Boy Wonder, the tearaway: he fires his catapult
around the school, and if you're standing near him when he does, a teacher will blame
you for the mischief. Feeling cheeky? Stand at any blackboard and press B, then
type whatever you like — it appears in chalk as you go (BACKSPACE rubs out, ENTER or
ESC puts the chalk down). Just don't let a teacher catch you in the act: you count as
misbehaving the whole time you're stood there scrawling.
Finish a day — escaped or expelled — and if you kept out of enough trouble you'll be asked to sign the TEACHERS PETS board: the five best-behaved runs, ranked by fewest lines, showing whether you got out with the report or were sent home. It ships with five default entries (Tony, Triona, Aaron, Jack and Lily, all expelled on 5000 lines) waiting to be knocked off. It's saved the moment it changes. Cheated runs never make the board.
The title screen alternates between that board and a how-to-play / controls panel: each holds centre-stage for five seconds, then slides aside as the other slides in. When the game ends you're taken back to the title screen to start a fresh run.
Your music, sound and fullscreen settings are remembered between sessions (cheat
mode deliberately isn't — it's off every launch). Everything lives in ~/.skool_daze.
A bell/timetable clock ticks through lessons, playtime, dinner and PE. At dinner the bottom-floor lads troop into the kitchen to eat; at PE the middle-floor form (and you) head to the gym — get there or it's truancy lines, same as a lesson.
Six walled rooms are built into the school, each with its own wall colour, a doorway at either end for pupils and teachers to walk through, and a name sign hanging off the ceiling so you always know where you are: the Head's Study (top-left, with the safe) and the Science Lab on the top floor, the Map Room and the Gym (wall bars, vaulting horse, rope, hoop) on the middle floor, and the Blue Room and the Kitchen (cooker, worktop, fridge) on the bottom floor. The corridors between them are plain plaster, so rooms read at a glance.
The 18 shields are spread everywhere, including a couple inside the Head's Study and at the stairwell landings, so you'll need to explore the whole building. During a lesson the three classrooms (BLUE ROOM, MAP ROOM, SCIENCE LAB) fill up: the form teachers stand teaching at their blackboards and the pupils sit at their desks. A lesson is a proper lesson now. Each teacher rubs his blackboard clean at the bell (sweeping along it, your graffiti disappearing a letter at a time), then holds forth in a speech balloon with subject-appropriate patter that types itself out line by line — sums for Mr Wacker in the Blue Room, rivers and capitals for Mr Withit in the Map Room, dates for Mr Creak in the Science Lab. Every so often he'll bark at a daydreaming classmate by name ("PAY ATTENTION, EINSTEIN!") — and if you're stood about in his room instead of sitting, you'll get "SIT DOWN RIGHT NOW, ERIC!" with a 3-second countdown. Ignore it and it's 50 lines. Sitting down cancels it.
Sit at a desk and the camera pulls back to frame the whole classroom, so the teacher and the blackboard stay in view even from the back row. Desks are claimed one per pupil — take a classmate's usual seat and he'll find another rather than sitting on your lap.
Each lesson is timetabled to a room — when the bell goes, a flashing "GET TO …"
call appears in the middle of the screen with a 15-second countdown under it. While
that timer is running you're safe; the moment it hits zero it vanishes, a
"GET TO CLASS!" warning flashes instead, the teacher is alerted, and lines pile on until
you're sat at a desk. Meanwhile the sign of the room you're due in lights up in gold
and grows a second line — ENDS 25s — counting the class down, so you can see at a
glance both how long you have to get there and how long you're stuck once you arrive. At playtime everyone spills back into the halls (and the teachers
start patrolling) — that's your window to hunt shields. All sound effects are
synthesized at runtime (no audio files).
A gamepad works if one's plugged in (via JInput, vendored under libs/ and folded
into the app — no install needed). It's detected automatically; when one's connected the
title screen shows controller: <name>. The full mapping — keyboard keys and
PlayStation button symbols — is shown along the bottom of the title screen. Default
(PlayStation layout; an Xbox pad reporting named A/B/X/Y falls back to the Xbox scheme):
| Control | Does |
|---|---|
| Left stick / d-pad | move, use stairs (↑↓), sit (↓) |
| ✕ Cross | jump |
| □ Square | punch |
| ○ Circle | catapult |
| △ Triangle | chalk |
| R1 | release the mouse |
| Options | begin a run / pause |
No controller? The game is fully playable on the keyboard, exactly as before — JInput failing to load (wrong OS, no permission, no pad) just falls back silently. On macOS a gamepad may need Input Monitoring permission (System Settings → Privacy & Security) the first time.
Which physical button is which index can vary by pad; the on-screen symbols follow the DualShock convention. If a button doesn't match its symbol, it's a one-line fix in
Gamepad.java.
Just a JDK. Gamepad support uses the vendored libs/jinput-2.0.10.jar automatically.
./run.sh # compile + launch the game window
./run.sh --smoketest # headless self-check (no window; writes PNG frames)Or via Gradle (used for the jpackage app-build workflow):
JAVA_HOME=/Library/Java/JavaVirtualMachines/temurin-21.jdk/Contents/Home gradle run
gradle jar # -> build/libs/skool-daze-java.jar (self-contained, java -jar runnable)./package.sh # -> /Applications/Skool Daze.app (also appears in Launchpad)This builds the self-contained jar, generates an .icns icon from the game's own
sprites, and runs jpackage to produce a standalone .app with an embedded JRE (no
Java install needed to run it). It's ad-hoc code-signed; first launch may need
right-click → Open if Gatekeeper complains.
| Action | Keys |
|---|---|
| Move left / right | ← → or A / D |
| Use staircase | ↑ / ↓ (or W / S) at a stair end |
| Jump | Space |
| Punch | X |
| Fire catapult | Z |
| Release the mouse | Left Ctrl (once you're carrying it) |
| Sit at a desk | ↓ (next to a desk) |
| Crack the safe | UP (stood at the glowing safe) |
| Escape | walk into the glowing front door (bottom floor, far left) |
| Chalk on a blackboard | B (stood at a board), then just type |
| Rub out / finish chalking | BACKSPACE / ENTER or ESC |
| Toggle fullscreen | F |
| Toggle cheat mode (title screen) | NUMPAD 0 (or 0) |
| Start (title screen) | Space / Enter |
| Pause | P |
| Back to title (after win/lose) | Space |
| Give up (back to title) | Esc, then Y to confirm / N to carry on |
| Quit (from the title screen) | Esc |
The window is resizable and scales to fit (letterboxed); F toggles fullscreen.
Title screen plays a music track and has audio toggles: press M for music and S for sound effects. (Those two keys toggle audio only on the title screen — in game, S is move-down and the mouse is released with Left Ctrl.) The music plays on the title screen only, not during play.
Cheat mode — press NUMPAD 0 (plain 0 works too, for keyboards without a
numpad) on the title screen to toggle it. It shows on the title screen while it's on, and
as a CHEAT flag in the HUD while you play. With it on, nothing you do wrong adds to your
lines total, so you can't be expelled — handy for exploring the school or practising the
high shields. A cheated run never makes the Teachers Pets board, and the setting is never
saved: it's off again next launch.
Jump under each shield to flip it, then catapult the teachers (and solve Mr Creak's birth-year riddle) to extract the safe code, crack the safe, and beat the alarm. Get caught jumping or punching in a teacher's line of sight (or skiving a lesson) and you'll earn lines — the school currency of shame. Punch a pupil and they'll stumble.
- Controller: optional JInput (vendored jar + its universal macOS native,
unpacked from the jar at runtime and folded into the app image). All JInput access is
isolated in
Gamepad.javaand wrapped so any failure degrades to keyboard-only. - Engine: Java2D / Swing, no other dependencies. (The original plan called for LibGDX; Java2D was chosen for a guaranteed-runnable first build. The architecture — entities, world geometry, animation, camera — is framework-agnostic and could migrate to LibGDX later.)
- Graphics: original pixel art generated by
generate_graphics.py. The PySkool/ROM-extracted source assets referenced in the conversion docs are not present (and reproducing ROM art is legally murky); the asset docs themselves recommend creating original art in the same style. Sprites are laid out on the exact 16×16 grid thatgenerate_sprite_catalog.pydocuments, so the generatedanimations.json/SpriteConstants.javaline up with the pixels. - All world logic runs in unscaled "base" pixels; rendering multiplies by
Const.SCALE(3×) with nearest-neighbour filtering for crisp pixels.
pip install Pillow
python3 generate_graphics.py # -> assets/sprites.png, assets/school.png
python3 generate_sprite_catalog.py -o assets # -> metadata, animations.json, etc.src/com/schoolgame/
Const.java tuning constants (scale, floors, view size)
Input.java held-key snapshot
Game.java all state + update + render (Swing-free, headless-renderable)
GamePanel.java Swing host: game loop Timer + key handling
SkoolGame.java entry point (window launch / --smoketest)
SoundFX.java runtime-synthesized SFX (bell/jump/hit/lines), auto-silent
Music.java looping title track from a bundled WAV
Settings.java music / SFX on-off toggles
Particle.java short-lived visual flecks (sparks, dust, sparkles)
Scores.java persistent best score (save/load; ~/.skool_daze_highscore)
gfx/ Assets, Animation sprite-sheet slicing + named animations
world/ School, Staircase, Desk, Room floors, stairs, desks, walled rooms
entity/ Entity, Eric, Teacher, Pupil, Shield, Pellet player, NPCs, shields, catapult pellets
assets/ generated graphics + metadata (sprites.png, school.png, …)
generate_graphics.py original sprite + school generator
generate_sprite_catalog.py sprite metadata generator (from the plan)
Skool_Daze_Java_Remake_Plan.md the full design plan
Done so far: scrolling multi-floor school, stairs, animated Eric, patrolling teachers, wandering pupils, jump + punch (with knockback), teacher line-of-sight lines, a bell/timetable clock, synthesized audio, classrooms with lessons (named rooms, desks, sitting, pupils attending and teachers teaching at the blackboards), attendance enforcement (lessons, PE in the gym and dinner in the kitchen; truancy lines), the full authentic objective — flip all shields, then catapult the teachers to extract the safe-code letters, open the safe and win (too many lines → expelled; then back to the title), a polish pass (title + pause screens, particle feedback, drop shadows, an expulsion danger meter), scoring with a persistent high score (save/load, shown on the title and results screens), title music + audio toggles, the mouse (pick up & release it to frighten the teachers), teacher pursuit (get spotted at playtime and a teacher chases you down for a telling-off), pupil personalities (a tell-tale swot who summons teachers, a bully who charges and shoves you, and Boy Wonder the tearaway who gets you blamed), six walled rooms with doorways and ceiling name signs (Head's Study, Science Lab, Blue Room, Map Room, Gym with PE, Kitchen with dinner), a flashing class call with a 15-second countdown (and a lesson-end countdown on the target room's own sign) before truancy lines start, living lessons (board-wiping, speech-balloon patter, teachers shouting pupils — and Eric — by name, one desk per pupil, and a camera that frames the whole class when you sit), name badges over every pupil with the swot/bully/tearaway flagged (and Eric's own), girls in the class, pupils punished for their own mischief, a cheat mode (NUMPAD 0 on the title screen), and decorative props.
This now covers the core Skool Daze game loop plus its signature gags and a lived-in,
timetabled school. Natural follow-ons (see Skool_Daze_Java_Remake_Plan.md):
bribeable pupils and more named characters.
Reimagined by Tony Brice, based on the original ZX Spectrum game Skool Daze (1984) by David and Helen Reidy. Title music "Back to School" by Wavemaster via Pixabay.