Post

Windows Game-Specific Fixes on macOS

Specific tweaks I've made to optimize my playing experience with certain games, including Skyrim Special Edition, Schedule I, Palworld, Far Cry 3, and more!

Windows Game-Specific Fixes on macOS

This is a companion to my article How to Run Windows Games and Programs on Mac.

This article is still a work in progress!

Palworld

I’ve tested with DXMT v0.61 (Wine 10.13) and GPTk 3.0 Beta 3 (Wine 7.7), and out of the two DXMT generally performed better than GPTk. The latter crashed on 2 separate occasions (which was annoying + required restarts) while the former played quite smoothly (no stuttering, v v rare lag) with minimal (fan) noise. This was tested without MetalFX tho. For DXMT, disable NVEXT (aka set DXMT_ENABLE_NVEXT=0). If enabled, in-world game in Palworld doesn’t appear (just a black screen and overlaid HUD, etc.).

This is if you want to convert/transfer a dedicated server to single-player (while keeping the same data, i.e. pals, items, character, etc.).1

  1. Create a conda environment with Python 3.9 or higher and palworld-save-tools

    1
    
     conda create -n "palenv" python=3.12 palworld-save-tools
    
  2. Activate new conda environment

    1
    
     conda activate palenv
    
  3. Navigate to your server save, usually found in $HOME/Games/drive_c/users/crossover/AppData/Local/Pal/Saved/SaveGames/YOUR_STEAM_ID/#### (#### is the save filename, which is a random 32-character string of letters and numbers; YOUR_STEAM_ID is your 17-digit Steam ID)

    1
    
     cd $HOME/Games/drive_c/users/crossover/AppData/Local/Pal/Saved/SaveGames/YOUR_STEAM_ID/####
    
  4. Make sure the aforementioned folder contains Level.sav and Players folder with .sav data

    1
    
     find -f Level.sav || find ./Players -name "*.sav"
    
  5. Back up your save folder and store it in a safe place, just in case

  6. Convert Level.sav to .json

    1
    
     palworld-save-tools --to-json Level.sav
    
  7. Open the newly created Level.sav.json into your preferred text editor with a find and replace function (I use VSCode)

  8. Use + F (i.e. CMD + F) to locate your server characters name; it’ll look similar to this:

  9. Find where your name is and copy its player_uid value

  10. Use + F (i.e. CMD + F) again to find the player_uid value you copied earlier and replace it with the following:

    1
    
    00000000-0000-0000-0000-000000000001
    
  11. Save the .json

  12. Convert the .json back to .sav

    1
    
    palworld-save-tools --from-json Level.sav.json
    
  13. Go to Players folder

    1
    
    cd Players
    
  14. Convert the .sav file that matches the player_uid value you copied earlier (PLAYER_UID_NO_HYPHENS is the player_uid value without hyphens) to .json

    1
    
    palworld-save-tools --to-json PLAYER_UID_NO_HYPHENS.sav
    
  15. Open the newly created .json file into your preferred text editor with a find and replace function (I use VSCode)

  16. Use + F (i.e. CMD + F) to replace all instances of your player_uid value with the following:

    1
    
    00000000-0000-0000-0000-000000000001
    
  17. Save the .json

  18. Convert the .json back to .sav (PLAYER_UID_NO_HYPHENS is the player_uid value without hyphens)

    1
    
    palworld-save-tools --from-json PLAYER_UID_NO_HYPHENS.sav.json
    
  19. Rename the converted file to ensure that the game recognizes this .sav as the player’s (PLAYER_UID_NO_HYPHENS is the player_uid value without hyphens)

    1
    
    mv PLAYER_UID_NO_HYPHENS.sav 00000000000000000000000000000001.sav
    
  20. If it isn’t there already, put the server save folder into your actual saves folder (i.e. $WINEPREFIX/drive_c/users/crossover/AppData/Local/Pal/Saved/SaveGames/YOUR_STEAM_ID (YOUR_STEAM_ID is your 17-digit Steam ID)

  21. Deactivate your conda environment

    1
    
    conda deactivate
    
  22. Optional: Delete your conda environment

    1
    
    conda env remove -n "palenv" -y && rm -rf "$(conda info --base)/envs/palenv"
    
  23. Optional: If you’ve tested Palworld and everything runs fine, delete your backup save folder

The Elder Scrolls V: Skyrim Special Edition

You may encounter some launch issues/bugs with Game Porting Toolkit on Steam Client relating to window size, full-screen, and/or display resolution.

  1. Open Windows version of Steam

  2. Navigate to Skyrim Special Edition in your library

  3. Click settings icon, then Properties

  4. Enter the following in Launch Options (modify path if needed):

    1
    
     "C:\Program Files (x86)\Steam\steamapps\common\Skyrim Special Edition\SkyrimSE.exe" %command%
    
  5. Close window

  6. Open SkyrimPrefs.ini

  7. Set these variables in SkyrimPrefs.ini:

    1
    2
    3
    4
    
     bBorderless=1
     bFull Screen=0
     iSize H=1080
     iSize W=1920
    
  8. Update iSize H and iSize W (i.e. integer variables representing 1920x1080 resolution) with your display’s height and width respectively

  9. Save and close SkyrimPrefs.ini

Schedule I

I’ve tested with DXMT v0.6 (works well but sometimes – once you quit the game – you get a grey screen), GPTk 3.0 Beta 3 (best option + most stable ime; no crashes or weird glitches/bugs, compared to the others), and DXVK + MoltenVK (works well but I think there’s a memory leak somewhere since it crashed. When I checked Activity Monitor, I found out 2 separate wine processes used 404+ GB of memory EACH (i.e. 808+ GB combined), iTerm was taking 404+ GB of memory and increasing to the point where they all paused, which doesn’t make sense. There’s more than just those 3. Terminal logging/debugging showed messaged [myk-warn] VK_ERROR_OUT_OF_POOL_MEMORY: VK_ERROR_OUT_OF_POOL_MEMORY: VkDescriptorPool exhausted pool of 6144 VK_DESCRIPTOR_TYPE_UNIFORM BUFFER_DYNAMIC descriptors, Allocating descriptor dynamically., so it’s presumably a MoltenVK bug).

Enable Retina (high resolution) mode

1
wine reg add 'HKEY_CURRENT_USER\Software\Wine\Mac Driver' /v 'RetinaMode' /t REG_SZ /d 'Y' /f

Adjust DPI scaling level (to offset/adjust high resolution-mode)

1
wine reg add 'HKEY_CURRENT_USER\Control Panel\Desktop' /v 'LogPixels' /t REG_DWORD /d 216 /f

Use/enable the following environment variables before running Steam

1
2
3
4
D3DM_SUPPORT_DXR=1
ROSETTA_ADVERTISE_AVX=1
WINEESYNC=1
WINEDLLOVERRIDES="dinput8=n,b;d3d11,d3d10,d3d12,dxgi=b"

Far Cry 3

Add to command line arg:

  • Skip intro videos : -skipintro
  • Max 60 FPS: -RenderProfile_MaxFPS 60
  • Prevent crashes: WINE_LARGE_ADDRESS_AWARE=1
  • Performance gain?: WINECPUMASK=0xff
  • Possible audio fix: export WINEDLLOVERRIDES="xaudio2_7=n,b"
1
WINE_LARGE_ADDRESS_AWARE=1 -skipintro -RenderProfile_MaxFPS 60 %command%

Info: Use DXMT v0.61. Audio is messed up. With maxed out settings: Super bad FPS (~5 FPS) + laggy during cutscenes / vids. Gameplay FPS (~20 FPS) is kinda better, but it still sucks.

Trying to fix Audio with this:

  • Check Audio troubleshooting in Play Windows Games FC3 (App ID: 220240) now requires Install mfc100.dll, which can be installed with protontricks: protontricks 220240 mfc100. Might affect other games with Ubisoft Connect.

Mods

  • Disable server msgs: https://www.nexusmods.com/farcry3/mods/276
  • Restore Ubisoft Connect: https://www.nexusmods.com/farcry3/mods/234
  • Solo offline co-op: https://www.nexusmods.com/farcry3/mods/262?tab=description

Enhancements

// todo Exit all Windows based programs.

Click Start, type regedit in the Search box, and then double-click regedit.exe from the results above. If you are prompted for an administrator password or confirmation,
type the password or provide confirmation.

Browse to and then click the following registry subkey:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\GraphicsDrivers On the Edit menu, click New, and then select the following registry value from the drop-down menu specific to your version of Windows (32 bit, or 64 bit):

1
2
3
4
5
6
7
8
9
For 32 bit Windows
Select DWORD (32-bit) value.
Type TdrDelay as the Name and click Enter.
Double-click TdrDelay and add 8 for the Value data and click OK.

For 64 bit Windows
Select QWORD (64-bit) value.
Type TdrDelay as the Name and click Enter.
Double-click TdrDelay and add 8 for the Value data and click OK.

Close the registry editor and then restart your computer for the changes to take effect.

Enable retina mode:

1
2
wine reg add 'HKEY_CURRENT_USER\Software\Wine\Mac Driver' /v 'RetinaMode' /t REG_SZ /d 'Y' /f
wine reg add 'HKEY_CURRENT_USER\Control Panel\Desktop' /v 'LogPixels' /t REG_DWORD /d 254 /f # Calc PPI: https://dpi.lv I use 254dpi for my 3024x1512 res monitor.

Disable Wine border decoration: wine reg add 'HKEY_CURRENT_USER\Software\Wine\Mac Driver' /v 'Decorated' /t REG_SZ /d 'N' /f

Anti-aliased fonts (???).

Modify + lock GamerProfile.xml (in $HOME/Documents/My Games/Far Cry 3) to adjust game settings

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
<GamerProfile>
    <SoundProfile
        MusicEnabled="1"
        MasterVolume="100"
        MicEnabled="1"
        IncomingVoiceEnabled="1"
        Language="English"
    />
    <RenderProfile
        MSAALevel="4"
        AlphaToCoverage="2"
        SSAOLevel="1"
        SDSM="0"
        ResolutionX="3024"
        ResolutionY="1964"
        Quality="custom"
        QualityEditor="editor_ps3"
        Fullscreen="1"
        Borderless="1"
        UseD3D11="1"
        D3D11MultithreadedRendering="1"
        WidescreenLetterbox="0"
        UseWidescreenFOV="1"
        FOVScaleFactor="1"
        EnableSubResolution="0"
        SubResolutionX="960"
        SubResolutionY="540"
        VSync="1"
        RefreshRate="0"
        DisableMip0Loading="0"
        GPUMaxBufferedFrames="3"
        ShowFPS="0"
        Brightness="1"
        Contrast="1"
        GammaRamp="1"
        AllowAsynchShaderLoading="1"
        Bloom="1"
        MaxFPS="60"
        GrassWindMin="0.4"
        GrassWindMax="2"
        DisableParticles="0">
        <CustomQuality>
            <quality
                ResolutionX="2560"
                ResolutionY="1600"
                EnvironmentQuality="high"
                AntiPortalQuality="default"
                PortalQuality="medium"
                PostFxQuality="low"
                TextureQuality="high"
                TextureResolutionQuality="high"
                WaterQuality="high"
                DepthPassQuality="high"
                VegetationQuality="high"
                TerrainQuality="high"
                GeometryQuality="high"
                AmbientQuality="high"
                DeferredAmbientQuality="high"
                ShadowQuality="high"
                EditorQuality=""
                Hdr="1"
                HdrFP32="0"
                ReflectionHdr="1"
                EnableVertexBinding="1"
                id="custom"
            />
        </CustomQuality>
        <Post>
            <quality
                id="high"
                GameDepthOfField="0"
                MotionBlur="1"
                FXAALevel="1"
                CinematicDepthOfField="0"
                SSAOMaxDistance="150"
                CloudShadows="0"
                DepthDownsample="1"
            />
        </Post>
        <Environment>
            <quality
                id="high"
                RainNumSplashesPerSecond="15"
                DisableRain="0"
            />
        </Environment>
        <Texture>
            <quality
                id="high"
                TextureFilteringQuality="0"
            />
        </Texture>
        <Water>
            <quality
                id="high"
                WaterReflectionQuality="4"
                ReflectionTextureSizeX="2048"
                ReflectionTextureSizeY="2048"
                OceanRealReflection="1"
            />
        </Water>
        <Geometry>
            <quality
                id="high"
                LodScale="0.5"
                KillLodScale="0.5"
                ClustersLodScale="1.0"
                RealTreesLodScale="0.7"
            />
        </Geometry>
        <Shadow>
            <quality
                id="high"
                ShadowMapSize="2048"
                SoftShadows="1"
                CascadedShadowMapSize="2048"
                DisableShadow="0"
                DisableShadowGeneration="0"
                DisableShadowGenTerrain="0"
            />
        </Shadow>
        <Terrain>
            <quality
                id="high"
                TerrainLodScale="0.5"
                TerrainDetailViewDistance="512"
            />
        </Terrain>
    </RenderProfile>
    <NetworkProfile
        VoiceChatEnabled="0"
        CustomMapMaxUploadRateInBitsOnline="10240000"
        OnlineEnginePort="9000"
        OnlineServicePort="9001"
        FileTransferHostPort="9002"
        FileTransferClientPort="9003"
        LanHostBroadcastPort="9004"
        LanClientBroadcastPort="9005"
        ScanFreePorts="1"
        ScanPortRange="1000"
        ScanPortStart="9000"
        SessionProvider=""
        MaxUploadInbpsOnline="10240000">
        <Accounts />
    </NetworkProfile>
    <GameProfile
        Hour = "16"
        Minutes = "40"
        Seconds = "0"
        TimeScale = "1"
        WindForce = "80"
        WindDir = "0"
        DelayShadowMovement = "180"
        IgnorePlayer = "0"
        GatherEntitiesForMap = "0"
        ShowAIInMap = "0"
        ShowDiamondsInMap = "0"
        DifficultyLevel = "1"
        Machete = "0"
        UseAimingHelpers = "0"
        HelpCrosshair = "1"
    />
    <ProfileSpecificGameProfile
        Sensitivity="1"
        Invert_x="0"
        Invert_y="0"
        DefaultFlickFireDirection_y="0"
        UseMouseSmooth="1"
        Smoothness="0.2"
        Smoothness_Ironsight="0.2"
        HelpCrosshair="1"
        Gamepad_vibration="1"
        UseRoadSignHilight="1"
        UseSubtitles="1"
        TaggingEnabled="1"
        WikiUpdatedEnabled="1"
        CollectibleUpdatedEnabled="1"
        TutorialUpdatedEnabled="1"
        ObjectiveReminderEnabled="1"
        CraftingTipsEnabled="1"
        DisplayXPEnabled="1"
        DetectionIndicatorEnabled="1"
        HitIndicatorEnabled="1"
        GrenadeIndicatorEnabled="1"
        UseAmbx="0"
        UseGamePad="1"
        GamepadAnswered="1"
        Autosave="1"
        Machete="0"
        IronsightToggleMode="1">
        <FireConfig
            QualitySetting="High"
	/>
    </ProfileSpecificGameProfile>
    <RealTreeProfile
        Quality="High"
    />
    <EngineProfile>
        <PhysicConfig
            QualitySetting="High"
        />
        <QcConfig
            GatherFPS="1"
            GatherAICnt="1"
            GatherDialogs="0"
            IsQcTester="0"
        />
        <InputConfig />
        <ZoneConfig />
    </EngineProfile>
    <UplayProfile
        LockString=""
    />
</GamerProfile>

The Elder Scrolls IV: Oblivion Remastered

Warning: System OS is older than Windows 10 20H2

Continue reading this section if you get a popup like this when launching a game

1
2
3
Sorry, your system does not meet the minimum requirements to play TESIV: Oblivion (Remastered). Click OK to proceed the launch, but it could run with issues.

- OS (Your system OS is older than Windows 10 20H2, please consider to upgrade your system)
  1. Switch architecture

    1
    
     arch -x86_64 /bin/bash
    
  2. Open regedit

    1
    
     WINEPREFIX=$HOME/Games wine regedit
    
  3. Navigate to HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion

    regedit.png

  4. Make sure ProductName says Microsoft Windows 10
  5. Make sure CurrentVersion says 10.0
  6. Double-click CurrentBuild to change its value
  7. Under Value data:, enter 19045, then click OK

    regedit_currentbuild.png

  8. Double-click CurrentBuildNumber to change its value
  9. Under Value data:, enter 19045, then click OK
  10. Right-click anywhere that isn’t a key (i.e. right-click anywhere in the white space) and navigate to New

    regedit_new_string.jpeg

  11. Click String Value
  12. Input ReleaseId, then press Enter to save its name

    To rename a key, right-click it and click Rename

  13. Double-click ReleaseId key to set its value
  14. Under Value data:, enter 22H2, then click OK
  15. Right-click and navigate to New

    regedit_new_string.jpeg

  16. Click String Value
  17. Input DisplayVersion, then press Enter to save its name
  18. Double-click DisplayVersion key to set its value
  19. Under Value data:, enter 22H2, then click OK
  20. Right-click and navigate to New
  21. Click DWORD Value
  22. Input UBR, then press Enter to save its name
  23. Double-click UBR key to set its value

    regedit_ubr.png

  24. Select Decimal under Base
  25. Under Value data:, enter 2965, then click OK
  26. Close regedit

The popup should no longer appear since we’re spoofing the OS version to 21H2 (i.e. its minimum requirement).

Crashing during initial shader compilation

Upon first startup, there’s a really common bug where the game will crash during initial shader compilation. This can be pretty annoying, but there are some tweaks you can make, depending on your hardware.

  1. Quit Steam once Oblivion Remastered crashes

  2. Clear its D3DMetal shader cache

    1
    
     rm -r $(getconf DARWIN_USER_CACHE_DIR)/d3dm/OblivionRemastered-Win64-Shipping.exe/shaders.cache
    
  3. Restart your computer

  4. Delete your Engine.ini file, if you modified it

  5. Relaunch Steam with raytracing disabled

    1
    
     WINEPREFIX=$HOME/Games WINEDEBUG=-all WINEDLLOVERRIDES="d3d11,dxgi=n,b" MTL_HUD_ENABLED=0 WINE_LARGE_ADDRESS_AWARE=1 D3DM_SUPPORT_DXR=0 WINEESYNC=1 wine "C:\Program Files (x86)\Steam\steam.exe"
    
  6. Navigate to Oblivion: Remastered

  7. Add the following to the launch options

    1
    
     %command% -safemode -noshaders -windowed -batchmode -nographics
    
  8. Close launch options and launch game

Miscellaneous

Edit Engine.ini to disable Lumen/Nanite (i.e. hardware-accelerated ray tracing)

1
2
3
[SystemSettings]
r.Lumen.DiffuseIndirect.Allow=0
r.Nanite.MaxPixelsPerEdge=0

Ghost of Tsushima

IMPORTANT: As of macOS Sequoia 15.4+, Apple added support for F16C and BMI instructions in Rosetta 2. As such, this patch may no longer be necessary (for those with this update). Before running the original (i.e. non-patched) version, include ROSETTA_ADVERTISE_AVX=1 in the launch parameters to activate the instructions.

Error when launching the game via Steam that says:

This game requires a CPU that supports F16C instructions.

  1. Download patch for 1053.7.809.1937 game version to the directory containing GhostOfTsushima.exe (e.g. ~/Games/drive_c/Program Files (x86)/Steam/steamapps/common/Ghost of Tsushima DIRECTOR'S CUT)

  2. Rename the original GhostOfTsushima.exe file to something else (e.g. GhostOfTsushima_original.exe)

  3. Rename the recently downloaded patch to GhostOfTsushima.exe

References

This post is licensed under CC BY 4.0 by the author.