The COG Factory / COG Factory Experiments

AI Training Arena: The Image Menu

2026-10-01
DOWNLOAD ZIP · 7 MBBUILD 52026-10-01
AI Training Arena: The Image Menu

An in-game menu made of pictures. You spawn in a sealed black room and the view cuts straight to a menu screen: choose an opponent (four kinds of wave, a mixed squad, or a Dark Jedi: Yun, Sariss, Gorc and Pic, Maw, Jerec), a loadout, your shields and a time limit, then START GAME, the only way out of the room. The preview window is a hole cut in the wall with a strip of in-game portraits sliding behind it. Fight in the training arena; a round ends in VICTORY, TIME UP or DEFEATED, a score screen reads it back digit by digit, and the menu returns with your choices remembered. Built as a kit the Dark Jedi gauntlet will use next.

Every screen is an HTML page, rendered by headless Chrome once per state, and every cel is a crop of one of those renders, so a value, a lit label or a digit is pixel-identical to the art around it. The wall that shows it is a mosaic of 16-bit materials: static tiles of 254 texels with a one-texel apron (texture filtering would otherwise blend each tile with its own opposite edge), elements that switch by SetWallCel, and a real HOLE, an adjoin into a recess where a path thing slides one portrait per frame. A sliding texture lost that comparison: SlideWall moves by speed times time, frame-quantised, with no verb to read its offset back.

OpenJKDF2's 90-degree field of view is vertical; retail's is horizontal at 4:3, so the menu keeps everything a player needs in the central 960 of its 1280 pixels and decorates the sides. The wall is cut recursively and every piece carries its neighbours' corners, so there are no T-junctions and no surface has more than 16 vertices (a full grid of cuts put 32 round the window). The menu's first frame is the first frame: a startup camera switch lands before anything renders.

The arena found a crash: a Dark Jedi's FORCE PERSUASION creates +twinkle by a hard-coded name, and in a level without that template the engine dereferences NULL. No cog or template names it, so no closure walk finds it; p52 survived only because SED happened to carry it. The gate now forces a persuasion in every Dark Jedi row, and a control without the template must die right after it. Losing a round is a cushion, not a death: the player's damage reaches the host cog after kyle.cog and before his shields, so the cushion works out what will land, and a blow that would leave him under 2 health is the KO. Not 'a blow that would kill': the engine kills a player below 1.0 health, not at 0, and build 4's cushion, waiting for 0, let the owner die. Builds 3, 4 and 5 answer the owner's notes: a wrap JUMPS to the looped card, the mouse no longer changes values (only a turn at exactly a key's rate counts), a screen holds its camera through third person, CONTINUE hands the view straight to the menu, a round ends with the music fading, then a chime, then the score screen six seconds later (a defeat too), and there is music -- the main menu, victory, defeat, every scenario and a spare -- stored the way SM Sith Lord's SM HQ does it, as 16-bit WAVs recorded at twice the speed and played at half pitch. Gate 21 of 21 with thirteen located controls; GOB build 5, which boots from dist/; retail JKDF2 has not run it.
projectp61-image-menu
date2026-10-01
packageP61.GOB, readme.txt, screenshot.jpg
build5 — 2026-10-01 (first packaged 2026-10-01)
sha256186fadfdb3cee125413da8260cb4bde478091dcfb002b22250ebfd8c6637bf70

Installing it

  1. Unzip it.
  2. Drop the .GOB into the episode folder of a Jedi Knight install — the one that already has JK1.GOB in it.
  3. Pick it from the episode list. On a libretro frontend, load the .GOB itself as content.

The GOB carries its own level, cogs, models, materials, and sounds. Everything else is read from the stock resource/, and 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

The readme that ships with it

========================================================================
 Jedi Knight Level

 P61.GOB

 An in-game menu built from pictures. You start in a sealed black room
 and the view cuts straight to a menu screen: pick an opponent (four
 kinds of wave, or a Dark Jedi: Yun, Sariss, Gorc and Pic, Maw, Jerec),
 a loadout, your shields and a time limit, then START GAME. The only
 way out of the room is the menu. Fight in the training arena; a round
 ends in VICTORY, TIME UP, or DEFEATED (the arena takes the killing
 blow for you), and a score screen reads back your time, kills, damage
 and a rating before the menu comes back with your choices remembered.

 [cogfactory / p61-image-menu]

 BUILD 5  --  2026-10-01   (first packaged 2026-10-01)
 sha256 186fadfdb3cee125413da8260cb4bde4

 This level is not made or distributed by LucasArts
 Entertainment Co.
========================================================================

THIS PACKAGE
------------------------------------------------------------------------
  P61.GOB          the level
  readme.txt       this file
  screenshot.jpg   what it looks like

INSTALLATION
------------------------------------------------------------------------
Drop P61.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,
models, materials and sounds, and reads the stock resource/ for
everything else.

On a libretro frontend such as RetroArch, unzip first and put P61.GOB in
the episode folder of your Jedi Knight folder, then load it from there.
The core treats the folder above the GOB's folder as the game folder,
reads the episode from episode/P61.GOB inside it, and will not start
unless that folder also holds resource/ (Res2.gob) from a real install.

CONTROLS
------------------------------------------------------------------------
  Up / Down (or W / S): choose a row
  Left / Right (or A / D): change the value; holding repeats
  Space or C: confirm (on START GAME, start the round; on the score screen, back to the menu)
  In the arena: the usual Jedi Knight controls

NOTES
------------------------------------------------------------------------
  every screen is a picture: HTML pages captured by a headless browser
  and cut into 16-bit materials; the opponent preview is a strip of
  in-game portraits sliding behind a window cut in the wall

  the menu fits the central 4:3 of the screen, so retail Jedi Knight's
  narrower view still shows all of it

WHAT IS IN THE GOB
------------------------------------------------------------------------
        84  episode.jk
    128943  jkl\arena.jkl
      6138  cog\imbus.cog
      9533  cog\imcycle.cog
      3301  cog\immusic.cog
      5338  cog\imread.cog
     14783  cog\p61game.cog
      6710  cog\p61gorc.cog
      8736  cog\p61jer.cog
      8989  cog\p61maw.cog
      5809  cog\p61pic.cog
     10173  cog\p61sar.cog
      7974  cog\p61spawn.cog
      8431  cog\p61yun.cog
      2907  3do\impillar.3do
      5289  3do\imstrip.3do
    131212  mat\imacei.mat
     32908  mat\imaflr.mat
     65676  mat\imapil.mat
    131212  mat\imawal.mat
    131212  mat\imbg.mat
       268  mat\imblk.mat
     45836  mat\imdd0m.mat
     65740  mat\iml00.mat
     65740  mat\iml01.mat
     65740  mat\iml10.mat
     65740  mat\iml11.mat
     65740  mat\iml20.mat
     65740  mat\iml21.mat
     65740  mat\iml30.mat
     65740  mat\iml31.mat
    131212  mat\imm00.mat
    131212  mat\imm01.mat
    131212  mat\imm02.mat
    131212  mat\imm03.mat
    131212  mat\imm04.mat
    131212  mat\imm05.mat
    131212  mat\imm06.mat
    131212  mat\imm07.mat
    131212  mat\imm08.mat
    131212  mat\imm09.mat
    131212  mat\imm10.mat
    131212  mat\imm11.mat
    131212  mat\imm12.mat
    131212  mat\imm13.mat
    131212  mat\imm14.mat
    131212  mat\imm15.mat
    131212  mat\imm16.mat
    131212  mat\imm17.mat
    328396  mat\imname.mat
    131212  mat\imp00.mat
    131212  mat\imp01.mat
    131212  mat\imp02.mat
    131212  mat\imp03.mat
    131212  mat\imp04.mat
    131212  mat\imp05.mat
    131212  mat\imp06.mat
    131212  mat\imp07.mat
    131212  mat\imp08.mat
    131212  mat\imp09.mat
    164236  mat\imrate.mat
    196876  mat\imres0.mat
    196876  mat\imres1.mat
    196876  mat\imres2.mat
    131212  mat\ims00.mat
    131212  mat\ims01.mat
    131212  mat\ims02.mat
    131212  mat\ims03.mat
    131212  mat\ims04.mat
    131212  mat\ims05.mat
    131212  mat\ims06.mat
    131212  mat\ims07.mat
    131212  mat\ims08.mat
    131212  mat\ims09.mat
    131212  mat\ims10.mat
    131212  mat\ims11.mat
    131212  mat\ims12.mat
    131212  mat\ims13.mat
    131212  mat\ims14.mat
    131212  mat\ims15.mat
    131212  mat\ims16.mat
    131212  mat\ims17.mat
     65740  mat\imstart.mat
     16588  mat\imswl.mat
     16588  mat\imswr.mat
    328396  mat\imv0.mat
    131404  mat\imv1.mat
     98572  mat\imv2.mat
    131404  mat\imv3.mat
     16588  mat\imwl0.mat
     16588  mat\imwl1.mat
     16588  mat\imwl2.mat
     16588  mat\imwl3.mat
     16588  mat\imwr0.mat
     16588  mat\imwr1.mat
     16588  mat\imwr2.mat
     16588  mat\imwr3.mat
      3572  sound\imchang.wav
    132344  sound\imchime.wav
    528044  sound\imcmd.wav
    132344  sound\imdefeat.wav
     18566  sound\imfire.wav
    517484  sound\imgen.wav
    510444  sound\imgp.wav
    538604  sound\imgran.wav
    517484  sound\imjer.wav
    469964  sound\imlose.wav
    519244  sound\immaw.wav
    686444  sound\immenu.wav
    541244  sound\immix.wav
      2028  sound\immove.wav
    532444  sound\imrod.wav
    513084  sound\imsar.wav
    132344  sound\imtimeup.wav
    522764  sound\imtrp.wav
    380204  sound\imwin.wav
    517484  sound\imyun.wav

  17053924  bytes in 117 entries

CREDITS
------------------------------------------------------------------------
  The Dark Jedi duels are p52's (tools/cogfactory/projects/p52-dark-
  jedi-gauntlet); the stormtroopers, Gran, Rodians, commandos and Dark
  Jedi are LucasArts' own templates; the menu, the arena, the cogs and
  the sounds were generated by tools/cogfactory.

  The readme format is styled after SM Sith Lord's cog headers,
  because his are the ones everybody read.

========================================================================