So... I've been looking into making this game run in widescreen mode without stretching. Oddly enough, GOG version seems to be really easy to get running just fine (although with Vert- FOV), by finding 1.33333 in float in EXE file and changing it to other aspect ratio.
Steam version however doesn't seem to stand any changes in its EXE file, even if it's like a latter in a string and outright results in Steam error if you try to hex edit it.
So I went and played a bit with CheatEngine. I have some limited knowledge of assembly and some theoretical knowledge about video games, but still lacking in many areas. Anyway...
I played a bit, I found 1.33333, turned out it affects aspect ratio (but sadly instructions can not be broken in a way that would prevent them to writing into that address at all, cause this way you'd break the zoom function.
So I went and analysed the instruction and wrote a code injection script. Didn't help, cause it turned out, it was crashing during cutscenes. Fortunately it turned out, there is other value which is responsible for displaying aspect ratio. So I analysed the instruction that writes to it. And wrote a script around it. Turned out, this time it wasn't crashing the game (although it had a downside of FOV scaling being Vert-).
However I also stumbled upon a way to scale the FOV, so I wrote other script which would increase it. And it worked.
So here's my monster of a creation:
Code:
[ENABLE]
//scalesFOV, cause aspect ratio scaling is vert-
alloc(fovscaling,2048)
label(returnfromfov)
label(exitfovscaling)
fovscaling:
push eax
movd xmm0,eax
mov eax,3FAAAAAB
movd xmm1,eax
pop eax
mulss xmm0,xmm1
movd [ecx+0C],xmm0
mov [ecx+10],edx
exitfovscaling:
jmp returnfromfov
"Aqua.exe"+149CB1:
jmp fovscaling
nop
returnfromfov:
//Fixes aspect ratio
alloc(aspectratio,2048)
label(returnfromaspect)
label(exitaspect)
aspectratio:
repe movsd
push edi
sub edi,C
push edi
movd xmm0,[edi]
mov edi,3FAAAAAB
movd xmm1,edi
mulss xmm0,xmm1
pop edi
movd [edi],xmm0
pop edi
mov ecx,[Aqua.exe+26D100]
exitaspect:
jmp returnfromaspect
"Aqua.exe"+44874:
jmp aspectratio
nop
nop
nop
returnfromaspect:
[DISABLE]
dealloc(fovscaling)
"Aqua.exe"+149CB1:
mov [ecx+0C],eax
mov [ecx+10],edx
dealloc(aspectratio)
"Aqua.exe"+44874:
repe movsd
mov ecx,[Aqua.exe+26D100]
Notice lines:
mov edi,3FAAAAAB
movd xmm1,edi
Basically, I move 1.3333334 to xmm1 and multiply original aspect ratio by it (I do a similar thing for FOV).
This is however something only for 16:9 aspect ratio. For other aspects you'll probably need to calculate another one. I'm not completely certain if this is the way of doing it, but, here's how I calculated 1.3333333.
The original value is 1.0, so:
1.0 divided by 1.3333333 (4:3) = 0.75
0.75 * 1.7777778 (16:9) = 1.3333333
I hope I made it clear enough.
If anyone has any way how to convert this into an easier fix, please go ahead. I would write a fix for Flawless widescreen, but I get completely lost in its code. Plus this is still a really half-assed way of making it run in widescreen mode.
Since why I don't have an Eyefinity set-up (or a good PC, while we're at it), here's my attempt at a screenshot in eyefinity aspect ratio (using my 2 screens) just to see if it works. It kinda does, although there are some glitches: