20 KiB
FLICTEST usecode investigation
Verdict
FLICTEST is real shipped usecode, and it is absolutely movie-related.
The strongest current reading is:
FLICTESTis a movie playback helper/jukebox class, not a normal authored world-object class that maps place directly on maps.- It is reachable through other shipped usecode classes.
- Reachability differs by game: Remorse keeps a much larger movie-browser helper, while Regret keeps a smaller helper and uses it through a handful of specific caller scripts.
- In Regret specifically, the strongest surviving route is not just a generic helper call. It sits behind a hidden
KEYPADNSmenu path that explicitly exposes both aCheaters Menubranch and aVIDEO PLAYERbranch.
I did not find evidence that any placed map item or egg resolves directly to the FLICTEST class itself. The evidence instead points to FLICTEST being spawned as a helper from other classes.
Core class evidence
Remorse extracted class metadata:
USECODE/EUSECODE_extracted/class_event_index.tsventry_index = 402,object_index = 0xA22,class_id = 0x0A20,class_name_hint = FLICTEST- only slots
0x20and0x21are populated - slot
0x20: body0x00E0..0x279F, length9919 - slot
0x21: body0x279F..0x4E4C, length9901
Regret extracted class metadata:
USECODE/REGRET/REGRET_USECODE_extracted/class_event_index.tsventry_index = 456,object_index = 0xA0C,class_id = 0x0A0A,class_name_hint = FLICTEST- only slots
0x20and0x21are populated - slot
0x20: body0x00E0..0x0CA4, length3012 - slot
0x21: body0x0CA4..0x0CAF, length11
That already looks less like an ordinary object family and more like a dedicated helper with anonymous high-slot entry points.
What the bodies do
Remorse
map_renderer/.cache/usecode/remorse/EUSECODE/pseudocode/FLICTEST/slot_20_slot_20.txt is a keypad-driven movie browser.
- It calls
KeypadGump.showKeypad(0). - It switches on the entered number.
- Nearly every case calls
playFlic(...)with a short movie name such as01a,04h,m03,mva01,o01,t02,test,z1, orwec. - The helper includes special names such as
hideoutx, manymva*clips, and an explicittestclip.
map_renderer/.cache/usecode/remorse/EUSECODE/pseudocode/FLICTEST/slot_21_slot_21.txt is a second movie dispatcher that takes the movie selector from arg_10 instead of reading a keypad itself. In other words, Remorse ships both:
- an interactive movie-picker entry point in
slot_20 - a parameter-driven dispatcher in
slot_21
That is consistent with a general movie test or movie browser utility.
Regret
Regret still ships FLICTEST, but the helper is cut down.
slot_20remains a real body.slot_21is only:
function flictest_slot_21()
{
set_info(1, *(arg_06));
return;
}
So Regret preserves the helper class but no longer keeps the large second dispatch body that Remorse has.
Where it is used
Remorse: EVENT::equip
The clearest Remorse use is inside the shipped EVENT controller family.
Evidence:
USECODE/EUSECODE_extracted/class_event_index.tsvshowsEVENTslot0x0Aas the single large active body.docs/map_renderer/trigger-usecode-links.mdalready treatsEVENTas a shipped controller family and maps shape0x0361toEVENT::equip.map_renderer/Catalogs/usecode_shape_catalog_remorse.csvnames shape0x0361asEVENT_CONTROLLER.
Direct caller snippet from map_renderer/.cache/usecode/remorse/EUSECODE/pseudocode/EVENT/slot_0A_equip.txt:
case 0x00fa:
spawn FLICTEST.slot_20(pid, flicMan);
suspend;
return;
This is strong evidence that Remorse's event-controller ecosystem can launch FLICTEST as a helper, using an event-local flicMan value as the selector.
Current best read: Remorse uses FLICTEST as a generic movie-playback utility behind at least some EVENT-driven scripted situations.
Remorse: current access status
The newer comparison pass makes Remorse look much less recoverable than Regret.
- The only confirmed Remorse
spawn FLICTEST.slot_20(...)call found in the extracted pseudocode is theEVENT::equipcase 0x00fabranch above. - Remorse
KEYPADNS::useis only the standard keypad wrapper. It has noVIDEO PLAYERorCheaters Menustring path. - Remorse
DATALINK::usedoes not spawnFLICTEST. Instead it plays the campaign MVA clips directly withplayFlicsomething(...)and then shows mission-objective text.
That means the current best No Remorse answer is:
FLICTESTexists and its keypad browser body is real.- But I did not find a shipped player-facing keypad, monitor, or datalink route that opens that browser directly.
- The only current workspace evidence for launching the browser in Remorse is the generic
EVENTcontroller case0x00fa, and I do not yet have a verified placed world route for that case.
The latest map pass strengthens that answer with actual KEYPADNS placement data:
- In the generated Remorse scene export, the only placed
shape:1099(0x044b,KEYPADNS) records I found are all on map 1. - Those three records are ordinary
frame 0keypad objects with full quality values267,832, and41997. - Their local low bytes are therefore
0x0b,0x40, and0x0d, not the Regret-style hidden selector values0/1. - Remorse
KEYPADNS::usehas noVIDEO PLAYERorCheaters Menubranch anyway, so these map-1 placements currently read as normal gameplay keypads rather than hiddenFLICTESTterminals. - A broader exported-map scan also found no placed
shape:1236(0x04d4,DATALINK) records in the rendered Remorse map exports, which fits the usecode-side picture that the shipped datalink path is inventory/startup-facing rather than a placed world terminal route. - The exported
shape:865(0x0361,EVENT_CONTROLLER) placements I found are also all on map 1, and sampled controllers are not colocated with the threeKEYPADNSobjects above.
So, unlike Regret, No Remorse currently looks like movie-browser helper present in data, but no confirmed shipped user-facing access path.
Remorse datalink hack-in patch
The minimal reversible Remorse hack is a 2-byte EUSECODE.FLX edit, not an executable rewrite.
Why the patch moved out of CRUSADER.EXE
The first executable-side Item_Use hook was functionally plausible, but it changed too many bytes in a relocation-sensitive path and the user reported that build crashed on startup.
That made the right bar much stricter:
- avoid
CRUSADER.EXEentirely if possible - avoid far-call rewrites
- change the smallest stable token already present in shipped data
The better target turned out to be the tail of Remorse DATALINK::use inside USECODE\EUSECODE.FLX.
Why I did not use a direct class-event row swap
I checked the raw Remorse EUSECODE.FLX class-event rows directly.
DATALINK slot 0x01 userow bytes areB4 13 01 00 00 00FLICTEST slot 0x20row bytes areBF 26 01 00 00 00
Those are not global cross-class code pointers. The extracted parser and raw headers show they are class-local metadata:
- each row is parsed as
<u16 raw_event_entry_word, u32 raw_code_offset> - the code body is resolved relative to the current class chunk
- copying a
FLICTESTrow intoDATALINKwould still resolve inside theDATALINKchunk
So a row swap would not produce a real DATALINK -> FLICTEST redirect.
Final patch shape
The validated patch site is the final spawned callee token in Remorse DATALINK::use.
Pseudocode evidence from the extracted Remorse cache:
spawn TEXTFILE.slot_20(pid, textFile, arg_06);
suspend;
Raw file evidence from the installed retail USECODE\EUSECODE.FLX near the end of the DATALINK body:
04 59 41 FE 40 06 57 02 02 17 0A 20 00 65 00 6E FE 5E 54 01 01 12 53 5C
The important token is the class id in the final spawn:
17 0A=TEXTFILE(0x0A17)20 0A=FLICTEST(0x0A20)
So the effective patch is simply:
- file:
USECODE\EUSECODE.FLX - installed retail offset resolved by signature scan:
0x1FF55 - retail bytes:
17 0A - patched bytes:
20 0A
That preserves the existing slot_20 dispatch and only swaps the target class.
So the effective behavior becomes:
- normal Remorse datalink tail:
spawn TEXTFILE.slot_20(...) - patched Remorse datalink tail:
spawn FLICTEST.slot_20(...)
This exposes the shipped keypad-driven FLICTEST movie browser with only a 2-byte usecode-file change.
Raw hex patch
At the resolved installed retail site:
Offset 0x1FF55
Retail : 17 0A
Patched: 20 0A
Or with surrounding context:
Retail : 57 02 02 17 0A 20 00 65 00 6E FE
Patched: 57 02 02 20 0A 20 00 65 00 6E FE
Patcher integration
I updated Crusader-Map-Viewer/patch_crusader_map_load.ps1 so the Remorse-only movie-browser option now patches USECODE\EUSECODE.FLX instead of the executable.
- CLI enable:
-Choice flictest-enable - CLI restore:
-Choice flictest-default - interactive enable:
6 - interactive restore:
7
The script resolves the site by scanning for the full DATALINK tail signature, then applies only the 2-byte token swap. It refuses to write if the current bytes are neither the expected retail bytes nor the already-enabled bytes.
Current validation state
The rewritten PowerShell script was copied into the installed No Remorse folder and validated with -Choice status.
Current retail detection from the live install:
CRUSADER.EXEstartup selector resolved normally- both editor-visibility sites resolved normally
- Remorse datalink movie-browser site resolved at
USECODE\EUSECODE.FLXoffset0x1FF55 - current state reported as
Retail default
So the signature-scan and offset-resolution logic for the minimal patch is now confirmed against the installed retail files.
Regret: DATALINK::use
Regret has a shipped, clearly reachable DATALINK path into FLICTEST.
Direct caller snippet from map_renderer/.cache/usecode/regret/EUSECODE/pseudocode/DATALINK/slot_01_use.txt:
else {
spawn FLICTEST.slot_20(pid, global[0x0001], local_02);
suspend;
}
This branch sits at the tail of the normal DATALINK::use body, after the map-specific mission/objective text handling.
Why this matters for reachability:
docs/scummvm-crusader-reference.mdnotes thatgames/start_crusader_process.cppseeds inventory with shape0x4d4datalinkat game start.- That means
DATALINKis not hypothetical leftover content. It is part of the live shipped startup flow.
So even if the exact branch condition still needs fuller runtime narrowing, FLICTEST is attached to a definitely shipped and definitely player-facing object family in Regret.
Regret: KEYPADNS::use
Regret also has an even more explicit movie-browser route through KEYPADNS.
This is also where the strongest hidden/debug-style evidence lives. Unlike Remorse, whose KEYPADNS::use is just the normal keypad wrapper that either spawns KEYPAD.slot_20 or forwards to TRIGGER.slot_20, Regret adds two special map-gated branches ahead of the ordinary keypad logic.
Direct caller snippet from map_renderer/.cache/usecode/regret/EUSECODE/pseudocode/KEYPADNS/slot_01_use.txt:
local_06 = "VIDEO PLAYER^_____________^^Mission video 0-72^Mission MVAs 73-89^Game Flicks 90-102";
ComputerGump.readComputer(local_06);
local_02 = KeypadGump.showKeypad(0);
...
spawn FLICTEST.slot_20(pid, local_02, local_04);
This is the single strongest semantic clue in the whole pass. KEYPADNS literally presents a VIDEO PLAYER menu and then hands the user-selected number to FLICTEST.slot_20.
The same body also contains a second literal branch:
local_06 = "Cheaters Menu^_____________^^Select a mission^number (1-10)^and Col. Shepherd^will assign it to you.";
That changes the interpretation materially. In Regret, KEYPADNS is not just a generic keypad helper that happens to call a movie routine. It preserves an overt hidden-menu path with both mission-cheat and movie-browser behavior.
That makes FLICTEST look less like a purely abandoned developer test and more like a retained hidden utility that still sits behind shipped object logic, at least for this Regret keypad/computer path.
Recoverability status
This is where the evidence gets better than the first pass.
- Remorse contrast:
map_renderer/.cache/usecode/remorse/EUSECODE/pseudocode/KEYPADNS/slot_01_use.txthas noCheaters MenuorVIDEO PLAYERbranch. It is only the standard keypad wrapper. - Regret demo persistence:
map_renderer/.cache/usecode/regret-demo/EUSECODE/pseudocode/KEYPADNS/slot_01_use.txtstill contains both theCheaters Menustring and theVIDEO PLAYERstring. So this was not a one-build accident unique to one retail extract. - Shape alignment: Regret extracted metadata gives
KEYPADNSclass id0x044b, and the Regret shape catalog also has a placed but unnamed base entry at0x044b. - Map placement: a structured scan of the Regret scene cache found an actual placed
shape:1099(0x044b) object on map 26 at world position(32746, 32798, 48)withquality = 1andframe = 1. - Stable locator: in the viewer, that map-26 object resolves to fixed scene id
fixed:123and runtime iditem:757:fixed:1099:1:32746:32798:48. - Adjacent-state persistence: the same visible keypad also exists on Regret map 27 at the same world coordinates with the same
quality = 1/frame = 1signature, so this is not unique to a single cache variant.
That last point matters because the hidden movie-browser branch checks for the exact pair Actor.getMap(...) == 26 and Item.getQLo(arg_06) == 1 before showing VIDEO PLAYER and spawning FLICTEST.slot_20.
So the movie-browser route is no longer just semantically plausible. There is concrete shipped placement evidence for the exact object signature that the branch expects.
The remaining gap is narrower now:
- I did not find a matching base
shape:1099object withquality = 0in the map-26 scene cache, so theCheaters Menubranch is still not proven to be exposed by a shipped interactable in the same way. - I did find a
shape:1099helper-geometry record withquality = 0on map 26, but it is flagged invisible in the scene cache, so it is not strong enough to claim a player-facing cheat terminal without more runtime or map-authoring evidence.
Practical locator
For the visible Regret movie keypad route, the current best locator set is:
- Map 26 placed item:
fixed:123 - Map 26 runtime id:
item:757:fixed:1099:1:32746:32798:48 - World coordinates:
(32746, 32798, 48) - Disk coordinates used by the built-in warp path:
(16373, 16399, 48) - Direct debug warp into map 26:
-warp 0 16373 16399 48 -mapoff 26
Because map 27 is a base mission map in the executable warp table and carries the same keypad placement, there is also a second practical route:
- Map 27 runtime id:
item:755:fixed:1099:1:32746:32798:48 - Direct mission warp into the same keypad position on the adjacent state:
-warp 14 16373 16399 48
Current best access read:
VIDEO PLAYER/FLICTESTkeypad: plausibly reachable from shipped content, and now backed by a visible placed keypad record.Cheaters Menukeypad: branch definitely exists, but I have not found a matching visiblemap 26 + QLo 0placement. The only current map-26QLo 0sibling is invisible helper geometry, so normal-player access to the cheat branch is still unproven.- If someone wants to force-test the cheat path, the cleanest current experiment would be to duplicate or retag the visible
0x044bkeypad so its local quality byte is0instead of1, then use that object on map 26.
Runtime confirmation
A live runtime test now closes the practical behavior:
- Warping to map 26 and using the visible
QLo 1keypad does open theFLICTESTmovie browser. - Talking to the nearby mission-giver NPC instead produces cheat-menu instructions and accepts mission numbers for the mission-assignment warp behavior.
- Warping to map 27 does not reproduce that movie-browser route: the matching keypad placement there is nonfunctional for
FLICTEST, and the nearby cheat-menu interaction is absent in that state.
So the Regret hidden branch is no longer only static-analysis evidence. The visible movie keypad behavior is runtime-confirmed, and the map-27 comparison now suggests that the hidden menu path is state-gated rather than broadly enabled on every neighboring camp variant.
Is map 26 reachable without warp codes?
Current best answer: probably not through the normal campaign flow.
The strongest reasons are:
- Regret map 26 scene metadata marks the map as
offset-only-or-unmapped, while map 25 and map 27 are the neighboring campaign-facing camp states. - The live No Regret mission table uses base maps
0, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 40; map 26 is absent from that table. - The local map-25, map-26, and map-27 scene files all expose the same two local teleport-destination eggs (
teleport-id30and250), but I did not find any teleporter helper or destination record in those scenes that explicitly names map 26 as the player-facing destination. - A broader Regret scene-cache search for
mapNum 26does return many hits, but sampled hits resolve mostly to family-4 usecode-trigger egg records whoselabelIdhappens to be26, not to a confirmed cross-map destination lane into map 26.
That does not prove there is no obscure script-only handoff anywhere in the executable, but the current workspace evidence favors debug or offset-only camp variant rather than normally entered campaign map.
Regret: ELEVATOR::slot_20
Regret also contains a smaller scripted launch from an elevator body.
Direct caller snippet from map_renderer/.cache/usecode/regret/EUSECODE/pseudocode/ELEVATOR/slot_20_slot_20.txt:
if (arg_12 == 6) {
...
setUnkFlagA4();
spawn FLICTEST.slot_20(pid, 19, local_15);
suspend;
clearUnkFlagA4();
}
This path fades to black, stops SFX, sets a temporary flag, and then spawns FLICTEST. That looks like a cutscene or scripted transition, not a debug-only leftover.
What I did not find
- No direct evidence that map placements instantiate the
FLICTESTclass itself. - No direct shape-catalog or egg-subtype crosswalk that points a placed object straight at
FLICTEST. - No ScummVM engine-side special case named
FLICTEST; it looks like data-driven usecode, not a hardcoded engine mode. - The remaining uncertainty is now concentrated in the
Cheaters Menuside of RegretKEYPADNS, not theVIDEO PLAYERside. The movie-browser branch has stronger placement evidence than the cheat branch.
That absence matters. The current evidence is much stronger for helper class spawned by other scripts than for standalone world object that level designers placed directly.
Engine-side movie context
The ScummVM Crusader reference supports the general movie interpretation.
docs/scummvm-crusader-reference.mdnotes that Crusader intro playback requires theFLICSdirectory.- The same note lists
MovieGump::I_playMovieOverlayamong the Crusader-side USECODE bridge intrinsics. - It also notes that Crusader movie playback uses assets under
flics/.
That does not prove every playFlic signature detail in the original DOS binary, but it does support the high-level claim that FLICTEST is using the normal Crusader movie subsystem rather than a separate hidden debugger subsystem.
Current best answer
Yes: FLICTEST really is a movie-test/movie-browser style usecode class.
More specifically:
- In Remorse it looks like a fairly full-featured movie selector/dispatcher helper.
- In Regret it survives in reduced form, but one surviving route is a clearly hidden
KEYPADNSmenu that still advertisesVIDEO PLAYERandCheaters Menubehaviors. - It is not obviously placed directly on maps as its own authored class.
- It is used indirectly by shipped content.
- The hidden
VIDEO PLAYERroute in Regret is plausibly recoverable from shipped content because map 26 contains a placed0x044bobject with the exact local quality value the branch checks. - The hidden
Cheaters Menuroute is still only partially proven. The branch exists, but I did not yet find a matching player-facingmap 26 + QLo 0object.
Most defensible live uses found in this pass:
- Remorse:
EVENT::equipcan spawnFLICTEST.slot_20. - Regret:
DATALINK::usecan spawnFLICTEST.slot_20. - Regret:
KEYPADNS::useexposes a literalVIDEO PLAYERUI and then spawnsFLICTEST.slot_20. - Regret:
ELEVATOR::slot_20has at least one cutscene-style spawn ofFLICTEST.slot_20.
So the answer is not just dead test script. The better reading is retained movie helper that still participates in shipped scripted flows, even if its original name probably came from development/test usage.