Running SoF in Wine on Linux, BSD or Mac OS X
SoF version 1.07f runs pretty well in Wine. A few issues / tips are listed below. You should also check the Soldier of Fortune entry in the Wine AppDB.
- Audio lag
- SoF crash - 1
- SoF crash - 2
- Enable SoF in-game console
- Unhide the SoF window
- Increase multiplayer framerate
- Decrease (limit) single player framerate
- autoexec.cfg
- Dedicated server
Audio lag
Audio sometimes lags after changing graphics settings. To fix it, you can use any of the following solutions:
- Restart SoF
- Click on the 'Apply changes' button in the audio settings menu
- Execute the 'snd_restart' command in the SoF console
SoF crash - 1
SoF may fail to start if the user directory is missing. You can create it manually:
$ mkdir ~'/.wine/drive_c/Program Files/Raven/SOF PLATINUM/user'
SoF crash - 2
Note: The SoFplus client fixes this problem.
On recent hardware, the GL_EXTENSIONS string may become so big (a little over 4000 characters) that it triggers a buffer overflow bug in SoF. SoF will crash when you try to start it (also on MS Windows). My GL_EXTENSIONS string looks like this:
GL_AMDX_debug_output GL_AMDX_vertex_shader_tessellator GL_AMD_conservative_depth GL_AMD_debug_output GL_AMD_draw_buffers_blend GL_AMD_name_gen_delete GL_AMD_performance_monitor GL_AMD_sample_positions GL_AMD_seamless_cubemap_per_texture GL_AMD_shader_stencil_export GL_AMD_texture_cube_map_array GL_AMD_texture_texture4 GL_AMD_vertex_shader_tessellator GL_ARB_blend_func_extended GL_ARB_color_buffer_float GL_ARB_copy_buffer GL_ARB_depth_buffer_float GL_ARB_depth_clamp GL_ARB_depth_texture GL_ARB_draw_buffers GL_ARB_draw_buffers_blend GL_ARB_draw_elements_base_vertex GL_ARB_draw_instanced GL_ARB_explicit_attrib_location GL_ARB_fragment_coord_conventions GL_ARB_fragment_program GL_ARB_fragment_program_shadow GL_ARB_fragment_shader GL_ARB_framebuffer_object GL_ARB_framebuffer_sRGB GL_ARB_geometry_shader4 GL_ARB_half_float_pixel GL_ARB_half_float_vertex GL_ARB_imaging GL_ARB_instanced_arrays GL_ARB_map_buffer_range GL_ARB_multisample GL_ARB_multitexture GL_ARB_occlusion_query GL_ARB_occlusion_query2 GL_ARB_pixel_buffer_object GL_ARB_point_parameters GL_ARB_point_sprite GL_ARB_provoking_vertex GL_ARB_sample_shading GL_ARB_sampler_objects GL_ARB_seamless_cube_map GL_ARB_shader_bit_encoding GL_ARB_shader_objects GL_ARB_shader_texture_lod GL_ARB_shading_language_100 GL_ARB_shadow GL_ARB_shadow_ambient GL_ARB_sync GL_ARB_texture_border_clamp GL_ARB_texture_buffer_object GL_ARB_texture_compression GL_ARB_texture_compression_rgtc GL_ARB_texture_cube_map GL_ARB_texture_cube_map_array GL_ARB_texture_env_add GL_ARB_texture_env_combine GL_ARB_texture_env_crossbar GL_ARB_texture_env_dot3 GL_ARB_texture_float GL_ARB_texture_gather GL_ARB_texture_mirrored_repeat GL_ARB_texture_multisample GL_ARB_texture_non_power_of_two GL_ARB_texture_query_lod GL_ARB_texture_rectangle GL_ARB_texture_rg GL_ARB_texture_rgb10_a2ui GL_ARB_texture_snorm GL_ARB_timer_query GL_ARB_transform_feedback2 GL_ARB_transform_feedback3 GL_ARB_transpose_matrix GL_ARB_uniform_buffer_object GL_ARB_vertex_array_bgra GL_ARB_vertex_array_object GL_ARB_vertex_buffer_object GL_ARB_vertex_program GL_ARB_vertex_shader GL_ARB_vertex_type_2_10_10_10_rev GL_ARB_window_pos GL_ATI_draw_buffers GL_ATI_envmap_bumpmap GL_ATI_fragment_shader GL_ATI_meminfo GL_ATI_separate_stencil GL_ATI_texture_compression_3dc GL_ATI_texture_env_combine3 GL_ATI_texture_float GL_ATI_texture_mirror_once GL_EXT_abgr GL_EXT_bgra GL_EXT_bindable_uniform GL_EXT_blend_color GL_EXT_blend_equation_separate GL_EXT_blend_func_separate GL_EXT_blend_minmax GL_EXT_blend_subtract GL_EXT_compiled_vertex_array GL_EXT_copy_buffer GL_EXT_copy_texture GL_EXT_direct_state_access GL_EXT_draw_buffers2 GL_EXT_draw_instanced GL_EXT_draw_range_elements GL_EXT_fog_coord GL_EXT_framebuffer_blit GL_EXT_framebuffer_multisample GL_EXT_framebuffer_object GL_EXT_framebuffer_sRGB GL_EXT_geometry_shader4 GL_EXT_gpu_program_parameters GL_EXT_gpu_shader4 GL_EXT_histogram GL_EXT_multi_draw_arrays GL_EXT_packed_depth_stencil GL_EXT_packed_float GL_EXT_packed_pixels GL_EXT_pixel_buffer_object GL_EXT_point_parameters GL_EXT_provoking_vertex GL_EXT_rescale_normal GL_EXT_secondary_color GL_EXT_separate_specular_color GL_EXT_shadow_funcs GL_EXT_stencil_wrap GL_EXT_subtexture GL_EXT_texgen_reflection GL_EXT_texture3D GL_EXT_texture_array GL_EXT_texture_buffer_object GL_EXT_texture_buffer_object_rgb32 GL_EXT_texture_compression_latc GL_EXT_texture_compression_rgtc GL_EXT_texture_compression_s3tc GL_EXT_texture_cube_map GL_EXT_texture_edge_clamp GL_EXT_texture_env_add GL_EXT_texture_env_combine GL_EXT_texture_env_dot3 GL_EXT_texture_filter_anisotropic GL_EXT_texture_integer GL_EXT_texture_lod GL_EXT_texture_lod_bias GL_EXT_texture_mirror_clamp GL_EXT_texture_object GL_EXT_texture_rectangle GL_EXT_texture_sRGB GL_EXT_texture_shared_exponent GL_EXT_texture_snorm GL_EXT_texture_swizzle GL_EXT_timer_query GL_EXT_transform_feedback GL_EXT_vertex_array GL_EXT_vertex_array_bgra GL_IBM_texture_mirrored_repeat GL_KTX_buffer_region GL_NV_blend_square GL_NV_conditional_render GL_NV_copy_depth_to_color GL_NV_explicit_multisample GL_NV_float_buffer GL_NV_half_float GL_NV_primitive_restart GL_NV_texgen_reflection GL_SGIS_generate_mipmap GL_SGIS_texture_edge_clamp GL_SGIS_texture_lod GL_SUN_multi_draw_arrays GL_WIN_swap_hint WGL_EXT_swap_control
The easiest fix is to patch the ref_gl.dll file in your SoF directory (download pre-patched ref_gl.dll). This patch disables the print statement that results in the buffer overflow:
$ echo "909090909090" | xxd -r -p -seek 0x000f772 - ref_gl.dll
MD5 hashes:
- Original ref_gl.dll: 6b0fc21a80c703fb9af271a23c7914f5
- Patched ref_gl.dll: c2128565b5ba3b657ac7ede3803434cf
Another way is to disable some extensions to make the GL_EXTENSIONS string smaller. SoF will still work if you disable all extensions, but the graphics will show a few glitches. SoF can use these extensions if they are available, so it's best to keep them enabled:
- GL_ARB_multitexture
- GL_ARB_texture_compression
- GL_ARB_texture_compression_rgtc
- GL_EXT_compiled_vertex_array
- GL_EXT_texture_filter_anisotropic
- GL_S3_s3tc
- WGL_EXT_swap_control
Here's an example from my wine registry. I disabled everything, except those extensions that are used by SoF:
[Software\\Wine\\OpenGL]
"DisabledExtensions"="GL_AMDX_debug_output GL_AMDX_vertex_shader_tessellator GL_AMD_conservative_depth GL_AMD_debug_output GL_AMD_draw_buffers_blend GL_AMD_name_gen_delete GL_AMD_performance_monitor GL_AMD_sample_positions GL_AMD_seamless_cubemap_per_texture GL_AMD_shader_stencil_export GL_AMD_texture_cube_map_array GL_AMD_texture_texture4 GL_AMD_vertex_shader_tessellator GL_ARB_blend_func_extended GL_ARB_color_buffer_float GL_ARB_copy_buffer GL_ARB_depth_buffer_float GL_ARB_depth_clamp GL_ARB_depth_texture GL_ARB_draw_buffers GL_ARB_draw_buffers_blend GL_ARB_draw_elements_base_vertex GL_ARB_draw_instanced GL_ARB_explicit_attrib_location GL_ARB_fragment_coord_conventions GL_ARB_fragment_program GL_ARB_fragment_program_shadow GL_ARB_fragment_shader GL_ARB_framebuffer_object GL_ARB_framebuffer_sRGB GL_ARB_geometry_shader4 GL_ARB_half_float_pixel GL_ARB_half_float_vertex GL_ARB_imaging GL_ARB_instanced_arrays GL_ARB_map_buffer_range GL_ARB_multisample GL_ARB_occlusion_query GL_ARB_occlusion_query2 GL_ARB_pixel_buffer_object GL_ARB_point_parameters GL_ARB_point_sprite GL_ARB_provoking_vertex GL_ARB_sample_shading GL_ARB_sampler_objects GL_ARB_seamless_cube_map GL_ARB_shader_bit_encoding GL_ARB_shader_objects GL_ARB_shader_texture_lod GL_ARB_shading_language_100 GL_ARB_shadow GL_ARB_shadow_ambient GL_ARB_sync GL_ARB_texture_border_clamp GL_ARB_texture_buffer_object GL_ARB_texture_cube_map GL_ARB_texture_cube_map_array GL_ARB_texture_env_add GL_ARB_texture_env_combine GL_ARB_texture_env_crossbar GL_ARB_texture_env_dot3 GL_ARB_texture_float GL_ARB_texture_gather GL_ARB_texture_mirrored_repeat GL_ARB_texture_multisample GL_ARB_texture_non_power_of_two GL_ARB_texture_query_lod GL_ARB_texture_rectangle GL_ARB_texture_rg GL_ARB_texture_rgb10_a2ui GL_ARB_texture_snorm GL_ARB_timer_query GL_ARB_transform_feedback2 GL_ARB_transform_feedback3 GL_ARB_transpose_matrix GL_ARB_uniform_buffer_object GL_ARB_vertex_array_bgra GL_ARB_vertex_array_object GL_ARB_vertex_buffer_object GL_ARB_vertex_program GL_ARB_vertex_shader GL_ARB_vertex_type_2_10_10_10_rev GL_ARB_window_pos GL_ATI_draw_buffers GL_ATI_envmap_bumpmap GL_ATI_fragment_shader GL_ATI_meminfo GL_ATI_separate_stencil GL_ATI_texture_compression_3dc GL_ATI_texture_env_combine3 GL_ATI_texture_float GL_ATI_texture_mirror_once GL_EXT_abgr GL_EXT_bgra GL_EXT_bindable_uniform GL_EXT_blend_color GL_EXT_blend_equation_separate GL_EXT_blend_func_separate GL_EXT_blend_minmax GL_EXT_blend_subtract GL_EXT_copy_buffer GL_EXT_copy_texture GL_EXT_direct_state_access GL_EXT_draw_buffers2 GL_EXT_draw_instanced GL_EXT_draw_range_elements GL_EXT_fog_coord GL_EXT_framebuffer_blit GL_EXT_framebuffer_multisample GL_EXT_framebuffer_object GL_EXT_framebuffer_sRGB GL_EXT_geometry_shader4 GL_EXT_gpu_program_parameters GL_EXT_gpu_shader4 GL_EXT_histogram GL_EXT_multi_draw_arrays GL_EXT_packed_depth_stencil GL_EXT_packed_float GL_EXT_packed_pixels GL_EXT_pixel_buffer_object GL_EXT_point_parameters GL_EXT_provoking_vertex GL_EXT_rescale_normal GL_EXT_secondary_color GL_EXT_separate_specular_color GL_EXT_shadow_funcs GL_EXT_stencil_wrap GL_EXT_subtexture GL_EXT_texgen_reflection GL_EXT_texture3D GL_EXT_texture_array GL_EXT_texture_buffer_object GL_EXT_texture_buffer_object_rgb32 GL_EXT_texture_compression_latc GL_EXT_texture_compression_rgtc GL_EXT_texture_compression_s3tc GL_EXT_texture_cube_map GL_EXT_texture_edge_clamp GL_EXT_texture_env_add GL_EXT_texture_env_combine GL_EXT_texture_env_dot3 GL_EXT_texture_integer GL_EXT_texture_lod GL_EXT_texture_lod_bias GL_EXT_texture_mirror_clamp GL_EXT_texture_object GL_EXT_texture_rectangle GL_EXT_texture_sRGB GL_EXT_texture_shared_exponent GL_EXT_texture_snorm GL_EXT_texture_swizzle GL_EXT_timer_query GL_EXT_transform_feedback GL_EXT_vertex_array GL_EXT_vertex_array_bgra GL_IBM_texture_mirrored_repeat GL_KTX_buffer_region GL_NV_blend_square GL_NV_conditional_render GL_NV_copy_depth_to_color GL_NV_explicit_multisample GL_NV_float_buffer GL_NV_half_float GL_NV_primitive_restart GL_NV_texgen_reflection GL_SGIS_generate_mipmap GL_SGIS_texture_edge_clamp GL_SGIS_texture_lod GL_SUN_multi_draw_arrays GL_WIN_swap_hint"
Enable SoF in-game console
Note: The SoFplus client will automatically enable the in-game console.
The in-game console can only be enabled on the commandline by specifying '+set console 1'. Example:
$ wine SoF.exe +set console 1 +set logfile 3
Press the '~' or ESC key to toggle the console window. Some commands to remember:
- cmdlist
- cvarlist
Unhide the SoF window
When playing in windowed mode (not full screen), the SoF window sometimes jumps to a position outside your desktop area. Your window manager may have a way to put it back on the desktop, but if not, there are other ways. Choose one of the following solutions:
- Restart SoF
Set the vid_xpos and vid_ypos cvars in the SoF console (Press '~' to lower the console and then you can type in the console, even when you can't see the window):
] set vid_xpos 50
] set vid_ypos 50It's even easier if you create a key bind for it, because you'll only have to do this once. You can simply press F12 afterwards to fix the window position:
] bind F12 "set vid_xpos 50; set vid_ypos 50"
Use an external program to change the window properties. I use wmctrl (on Debian: apt-get install wmctrl)
List windows:
me@neon:~$ wmctrl -l
0x02600003 -1 neon Bottom Expanded Edge Panel
0x0260002b -1 neon Top Expanded Edge Panel
0x0240001d -1 neon x-nautilus-desktop
0x04402378 0 neon bash
0x05400001 0 neon SoFChange the window X and Y coordinates (showing two methods):
me@neon:~$ wmctrl -r "SoF" -e 0,50,50,-1,-1
me@neon:~$ wmctrl -i -r 0x05400001 -e 0,50,50,-1,-1
Increase multiplayer framerate
Set the cl_maxfps cvar to something higher than the SoF default of 30 to get better framerates. Example in SoF console:
] set cl_maxfps 60
Set the cl_showfps cvar to 1 to make SoF print your current framerate and set the cl_showfps back to 0 to disable it
Decrease (limit) single player framerate
Note: The SoFplus client has a cvar _sp_cl_frame_delay to limit the single player framerate. The default setting of 7 should usually work.
On fast hardware, your framerate may be so high that the game starts acting weird. You may notice a red flickering icon at the top of the screen, when that happens. This patch will limit the framerate to cl_maxfps:
$ echo "9090" | xxd -r -p -seek 0x000d955 - SoF.exe
$ echo "9090" | xxd -r -p -seek 0x000d973 - SoF.exe
MD5 hashes:
- Original SoF.exe: a533f1cf07a41ebffac17de66617375c
- Patched SoF.exe: 6dbe25deb3a4973c78a1f102a4ea9924
autoexec.cfg
You can create a file named 'autoexec.cfg' in the SoF base directory. It's executed when SoF starts. Example:
set logfile 3 // Append console log to sof.log set shownames 1 // Show names of other players in multiplayer games set cl_run 1 // Always run set cl_maxfps 60 // 30 is the default, above 150 most servers will autokick you set netgraph 1 // Show network graph
Dedicated server
Normally, you'd start a SoF dedicated server like this:
$ wine SoF.exe +set dedicated 1 .....
Depending on your wine version, an error may be displayed and the server will fail to start:
Couldn't create dedicated server console
This patch will disable the error message to allow the server to start with the broken console:
$ echo "9090909090" | xxd -r -p -seek 0x006578e - SoF.exe
When you quit the server, it will crash because of the broken console:
wine: Unhandled page fault on read access to 0x0000000c at address 0x200fa9b7
This can be patched too:
$ echo "9090909090" | xxd -r -p -seek 0x0065601 - SoF.exe
$ echo "9090909090" | xxd -r -p -seek 0x006560d - SoF.exe