Here's my thoughts as I'm trying briefly to make the german rom work.
What doesn't work? Most obviously, the footsteps.
We hook 0x292c. So we look at that in the english rom:
Now load the german one. It's something different. So, we'll take a guess and start at 2900.
at 2916, we see the call, ret nz, ld. We know two things.
1. The address we need for this one is 2916.
2. The ram address of d4e4 hasn't changed.
So, I'll open pokemon.lua and change 292c to 2916. My footsteps now work.
Next, the options menu.
There are two parts to this.
1. The code we hook at 2d63 to tell us whether we're in the options menu,
and 2. ram address cf81 for the menu header.
So, I take note of the code at english address 2d63:
Let's try 2d40 in the german rom. One instruction too far, so we'll go to 2d3e.
Change 2d63 to 2d3e and try it, still doesn't work, but closer.
Maybe the bank address changed? Nope, speak in there, it doesn't get called when I press options.
There's another one, 2d4d right after it. Change that value again and now the options menu works.
What about the keyboard? Well, there's a line of code in the keyboard_showing function:
if screen.lines:match("DEL END") ~= nil then
We'll change that to
if screen.lines:match("SCH ENDE") ~= nil then
Now the keyboard works.
I still don't know how to make this automatically detect what rom we're running and patch. IF I could, I could simply include a patch file for these 3 variables.