Files
llamamod/notes/mod-devmode.md
T

3.4 KiB
Raw Blame History

Developer mode (devmode, CHEATS)

mods/devmode/DevModeMod + DevModePatch – two groove.exe patches, no data changes. Background and the full list of what the switch unlocks: mod-cheats.md, "Developer switch (property 258)".

Options

Key Default padAux bit Effect
flyKey F1 0x800 held Llama (also from standing), LlamaChase, bunny rise while held; frog after a jump
heartKey F2 0x400 (pressed edge) +1 heart, +5 purple fruit
idolKey F3 0x200 held pink idols +1 per frame, max 99
coinKey F11 0x100 held coins +1 per frame
flyToggle off – fly key toggles bit 0x800 instead of hold

Keys are Hotkeys.option choices (cross-mod conflict check); defaults avoid practice F5/F8, freecam F7/F9 and the game's F4/F6/F10. The developer switch itself has no option (always on with the mod). Two equal keys → apply fails with a message.

Patches (German / English addresses, all via Site)

  1. Property 258 = 1.0. PROP_GET (0x550E60 / 0x550B80) is the strat property getter; its jmp [eax*4 + table] has the table address at +21 (0x552684 / 0x552390, in .text). Entry 0x102 (0x552A8C / 0x552798) pointed at the shared push 0 handler (0x55231B / 0x55198F; the patch checks its bytes) and now points at a cave: mov eax,[esp+14h]; push 0x1000; push eax; call <push result>; add esp,8; add esp,10h; ret. The other ids of the shared handler (de: 0x75, 0x9E, 0xC1, 0xEE; en: 0xC1, 0xEE) stay 0. The table entry has a .reloc entry; the exe always loads at its image base, so the absolute cave address is fine.
  2. padAux from keys. PAD_POLL_END (0x425B88 / 0x425A08, tail of the pad poll FUN_004256c0: mov eax,[padCount]; pop ebx; cmp eax,1; jbe; mov [padAux],0; add esp,8; ret, 25 bytes) → jmp cave + NOPs. Cave: pop ebx, ecx = OR of the bits whose DIK slot in KEY_STATE (0x58226C / 0x5818FC, s32[256] frames held, all 0 while Alt is held) is > 0, 0 while DEMO; mov [PAD_AUX],ecx (0x5FCF58 / 0x5FC5E8); mov eax,[padCount] (keeps the old return value); add esp,8; ret. The edge detection padAuxPressed (FUN_00425c00, start of each tick) is untouched and works as before. Toggle mode: 8 data bytes (previous key state, on flag).

Hotkey names → DirectInput scan codes in DevModePatch.DIK (test: covers every Hotkeys.VK key).

Verified in game (apptest devmode-a, :25, German exe, village 1-1, defaults)

  • A+S three times: three different warp points (img/mods/devmode_teleport.jpg).
  • F2 twice: fruit 0 → 5 → 10, energy bar refilled.
  • F1 held 2.5 s: the llama rises above the village, falls back after release.
  • F3 held 1.5 s: idols 46; F11 held 1 s: coins 1 → 32 (img/mods/devmode_keys.jpg).
  • No crash; game starts normally with the mod (one crash in a Wine DLL at 68E9306B on the very first start of a fresh session prefix, not reproducible in 3 later starts with the mod).

Not checked in game: English exe (unit tests only), toggle mode, river log Space, 8-6 Space+Z, frog/bunny, LlamaChase.

Limits

  • Level-skip/music debug menu needs property 0 ≠ 0 as well (also hard-wired 0, used by 131 strat reads incl. cameras) – deliberately not touched.
  • Toggle state survives level changes (flying continues in the next level until pressed again).
  • With the switch on, CheatTeleport stays alive in 22 levels; A+S (camera left+right together) is the warp combo, so pressing both camera keys at once now teleports.