It is TETRIS, and it is running inside one level COG. No mod, no DLL, no extended verbs, and not one thing on the board — the well is 200 wall surfaces and the game is 200 slots of the cog heap.
A COG can hold and run a whole game — state, rules, timing, failure and a score — inside a level, with no mod.
| project | p19-tetris |
|---|---|
| date | 2026-08-23 |
| package | P19.GOB, readme.txt, screenshot.jpg |
| build | 1 — 2026-09-05 |
| sha256 | ad89b3b6e1ec0f6aca964c522d3add3645eba8c7536b6be7983f0a4f5d73836e |
Installing it
- Unzip it.
- Drop the
.GOBinto theepisodefolder of a Jedi Knight install — the one that already hasJK1.GOBin it. - Pick it from the episode list. On a libretro frontend, load the
.GOBitself as content.
The GOB carries its own level, cogs, materials and sounds and
reads the stock resource/ for everything else. There is no
retail game data in the zip.
These are living projects, not finished releases. A level is rebuilt whenever something is learned — a lighting rule, a texture orientation, a whole detail pass — and it keeps its filename through all of it. The build number is how to tell which one you have: it is printed in the readme inside every zip, and it only moves when the level's bytes actually change.
Screenshots
Textures generated for this project
The readme that ships with it
========================================================================
Jedi Knight Level
P19.GOB
It's TETRIS, and it is running inside ONE LEVEL COG. No mod, no DLL,
no extended verbs, and not one thing on the board -- the well is 200
wall surfaces and the game is 200 slots of the cog heap.
[cogfactory / p19-tetris]
BUILD 1 -- 2026-09-05
sha256 ad89b3b6e1ec0f6aca964c522d3add36
This level is not made or distributed by LucasArts
Entertainment Co.
========================================================================
THIS PACKAGE
------------------------------------------------------------------------
P19.GOB the level
readme.txt this file
screenshot.jpg what it looks like
INSTALLATION
------------------------------------------------------------------------
Drop P19.GOB into the `episode` folder of a Jedi Knight install (the one
that already has JK1.GOB in it) and pick it from the episode list.
Nothing else needs to change: the GOB carries its own level, cogs,
materials and sounds, and reads the stock resource/ for everything else.
On a libretro frontend, point the core at the GOB itself. It needs a
folder beside it holding `resource/` from a real install -- that is
where the retail data lives and none of it is in here.
CONTROLS
------------------------------------------------------------------------
Walk into the orange arcade button until you are TOUCHING it,
then press SPACE. The camera cuts to the cabinet next door.
A / D move left / right (tap for one cell, hold to repeat)
W rotate clockwise
LEFT/RIGHT rotate anticlockwise / clockwise
S soft drop -- locks the moment it touches down
C HARD DROP -- and RESTART after a game over
G or 1-0 switch weapon: quits
SPACE quits (you are still standing at the button)
NOTES
------------------------------------------------------------------------
A piece that lands on its own rests for one fall tick before it
locks, so you can still slide it sideways under an overhang. Hold S
or press C and it locks immediately. That is deliberate and it took
two goes to get right.
There are NO WALL KICKS. A rotation that does not fit simply does
not happen. SRS kicks are five candidate offsets per rotation and a
table per piece; this is one collision test, and the whole point of
the exercise was how little a game needs.
THE PIECE ORDER IS FIXED, not random. It is a real 7-bag -- every
piece once per seven, which is what makes Tetris fair -- but the
order is baked in at 70 pieces long, because Jedi Knight's Rand() is
never seeded from the level and a random game cannot be tested. Play
it twice and you will notice at piece 71.
No hold piece and no next-piece preview.
Single player. The board lives in the cog heap, which is per
instance and never replicated, while SetWallCel DOES sync -- so two
people in one level would be two separate games fighting over one
screen. The cog is marked NOSYNC, which makes it a single-player
cabinet rather than multiplayer Tetris.
WHAT IS IN THE GOB
------------------------------------------------------------------------
88 episode.jk
52931 jkl\well.jkl
33646 cog\p19tetris.cog
43660 mat\p19aceil.mat
43660 mat\p19afloor.mat
43660 mat\p19awall.mat
2188 mat\p19ceil.mat
16972 mat\p19cell.mat
2188 mat\p19floor.mat
43660 mat\p19frame.mat
43660 mat\p19switch.mat
43660 mat\p19wall.mat
19888 sound\p19drop.wav
33118 sound\p19line.wav
13274 sound\p19lock.wav
4894 sound\p19move.wav
48554 sound\p19over.wav
4894 sound\p19rot.wav
26504 sound\p19start.wav
59578 sound\p19tetris.wav
580677 bytes in 20 entries
CREDITS
------------------------------------------------------------------------
Generated end to end by tools/cogfactory in the openjkdf2_libretro
tree -- level, cog, materials and sounds.
Sound effects generated with ElevenLabs and converted to 22050 Hz
mono 16-bit with tools/cogfactory/sfxlib.py.
Room textures generated with the jk-texture-sheet skill, shipped as
16-bit MATs so they carry their own colour and need no colormap.
It stands on p17 (the cog heap as an array that survives), p18
(every input channel a level cog can read), p16, p14, p12, p08 and
p06.
The readme format is styled after SM Sith Lord's cog headers,
because his are the ones everybody read.
========================================================================








