http://bugs.winehq.org/show_bug.cgi?id=9154
Anastasius Focht focht@gmx.net changed:
What |Removed |Added ---------------------------------------------------------------------------- Status|REOPENED |NEW CC| |focht@gmx.net Summary|Balls of Steel fails to |Balls of Steel demo v1.3 |start |fails to start a game | |(ddraw7_WaitForVerticalBlan | |k stub too fast, needs real | |implementation)
--- Comment #23 from Anastasius Focht focht@gmx.net --- Hello folks,
confirming.
You need to start the game in virtual desktop mode (wants 8 bpp). This also allows to see the error message box.
Seems this is an old DirectDraw game.
Relevant part of trace log:
--- snip --- $ pwd /home/focht/.wine/drive_c/Program Files/Pinball Wizards/Balls of Steel DEMO v1.3
$ WINEDEBUG=+tid,+seh,+relay,+ddraw wine ./bos.exe >>log.txt 2>&1
0029:Call KERNEL32.CreateProcessA(00000000,008499d0 "C:\Program Files\Pinball Wizards\Balls of Steel DEMO v1.3\darkside.DDP",00000000,00000000,00000000,00000000,00000000,00849a24 "C:\Program Files\Pinball Wizards\Balls of Steel DEMO v1.3",0033f858,0033f848) ret=00455988 ... 0039:Call KERNEL32.__wine_kernel_init() ret=7bc5a402 0029:Ret KERNEL32.CreateProcessA() retval=00000001 ret=00455988 ... ... 0039:Call advapi32.RegCreateKeyExA(80000002,003b1be0 "Software\Wildfire Studios\Balls of Steel\Display profile",00000000,00478484,00000000,000f003f,00000000,0033f7f4,0033f7dc) ret=0040bd33 0039:Ret advapi32.RegCreateKeyExA() retval=00000000 ret=0040bd33 0039:Call advapi32.RegQueryValueExA(000000c4,003b1c24 "Refresh rate",00000000,0033f7d8,0033f6ac,0033f7d4) ret=0040be3d 0039:Ret advapi32.RegQueryValueExA() retval=00000002 ret=0040be3d 0039:Call KERNEL32.SetThreadPriority(fffffffe,0000000f) ret=00433152 0039:Ret KERNEL32.SetThreadPriority() retval=00000001 ret=00433152 0039:trace:ddraw:ddraw2_WaitForVerticalBlank iface 0x13f210, flags 0x1, event (nil). 0039:trace:ddraw:ddraw7_WaitForVerticalBlank iface 0x13f208, flags 0x1, event (nil). 0039:fixme:ddraw:ddraw7_WaitForVerticalBlank iface 0x13f208, flags 0x1, event (nil) stub! 0039:Call KERNEL32.GetTickCount() ret=0043315e 0039:Ret KERNEL32.GetTickCount() retval=01dac739 ret=0043315e 0039:Call KERNEL32.GetTickCount() ret=00433167 0039:Ret KERNEL32.GetTickCount() retval=01dac739 ret=00433167 0039:Call KERNEL32.GetTickCount() ret=00433170 ... 0039:Call KERNEL32.SetThreadPriority(fffffffe,00000000) ret=004331a1 0039:Ret KERNEL32.SetThreadPriority() retval=00000001 ret=004331a1 0039:Call user32.GetDC(000100f0) ret=004331fb 0039:Ret user32.GetDC() retval=00020042 ret=004331fb 0039:Call gdi32.SetBkColor(00020042,00000000) ret=00433207 0039:Ret gdi32.SetBkColor() retval=00ffffff ret=00433207 0039:Call gdi32.SetTextColor(00020042,00ffffff) ret=00433214 0039:Ret gdi32.SetTextColor() retval=00000000 ret=00433214 0039:Call gdi32.TextOutA(00020042,00000000,00000000,0047a8fe "Profiling display, please wait a moment...",0000002a) ret=00433238 0039:Ret gdi32.TextOutA() retval=00000001 ret=00433238 0039:Call user32.ReleaseDC(000100f0,00020042) ret=00433247 0039:Ret user32.ReleaseDC() retval=00000001 ret=00433247 0039:Call KERNEL32.SetThreadPriority(fffffffe,0000000f) ret=00433263 0039:Ret KERNEL32.SetThreadPriority() retval=00000001 ret=00433263 0039:trace:ddraw:ddraw2_WaitForVerticalBlank iface 0x13f210, flags 0x1, event (nil). ... 0039:Call KERNEL32.GetTickCount() ret=004332b1 0039:Ret KERNEL32.GetTickCount() retval=01dad067 ret=004332b1 0039:Call KERNEL32.SetThreadPriority(fffffffe,00000000) ret=004332c4 0039:Ret KERNEL32.SetThreadPriority() retval=00000001 ret=004332c4 0039:Call advapi32.RegCloseKey(00000080) ret=0040bd54 0039:Ret advapi32.RegCloseKey() retval=00000000 ret=0040bd54 0039:Call advapi32.RegCloseKey(0000007c) ret=0040bd54 0039:Ret advapi32.RegCloseKey() retval=00000000 ret=0040bd54 0039:Call user32.DestroyWindow(00010124) ret=00411fc7 ... 0039:Call user32.MessageBoxA(00000000,004928f8 "Couldn't determine the refresh rate of the display\n",00478a8e "",00012030) ret=00412e52 --- snip ---
Looks like some stop-watch approach using DirectDraw's "WaitForVerticalBlank".
The first timeGetTime() calls (seen as GetTickCount() in log) are probably to stabilize measurement.
The game code uses a specific number of ddraw2_WaitForVerticalBlank()/ddraw7_WaitForVerticalBlank() calls = "x" full refreshs to calculate vertical sync frequency using stop-watch.
Since ddraw7_WaitForVerticalBlank() is a stub it's probably too fast :)
$ sha1sum bossw13.exe 7fb8de385592dd70cedb8102726c50c3602aa3fa bossw13.exe
$ du -sh bossw13.exe 13M bossw13.exe
$ wine --version wine-1.7.18
Regards