From f76d116ff2fdaca4ef658954b8946fbac04dfdc9 Mon Sep 17 00:00:00 2001 From: RebeccaNod1 Date: Sat, 24 Oct 2026 08:12:13 -0600 Subject: [PATCH] Add Crystal Maze Proton setup scripts, configs, and documentation --- README.md | 79 +++++++++- SKUInfo.ini | 11 ++ crystal_maze_setup.reg | 151 +++++++++++++++++++ dgVoodoo.conf | 334 +++++++++++++++++++++++++++++++++++++++++ setup_prefix.sh | 49 ++++++ wt3d.ini | 14 ++ 6 files changed, 636 insertions(+), 2 deletions(-) create mode 100644 SKUInfo.ini create mode 100644 crystal_maze_setup.reg create mode 100644 dgVoodoo.conf create mode 100755 setup_prefix.sh create mode 100755 wt3d.ini diff --git a/README.md b/README.md index 5ac79ca..882cd87 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,77 @@ -# CrystalMazeProton -patched Crystal Maze that works with Proton on linux +# Crystal Maze (WildTangent) - Modern Proton & Linux Fix 🎮 + +A pre-configured, patched setup to run the classic 2000s WildTangent 3D casual game **Crystal Maze** (starring Lily) on modern Linux distributions and the Steam Deck using **Proton / Wine** (via Heroic Games Launcher, Lutris, or Steam). + +--- + +## 📥 Download + +Grab the complete pre-patched release package from the **[Releases Page](https://github.com/RebeccaNod1/CrystalMazeProton/releases/latest)**: +- **`Crystal-Maze-Proton-Ready.zip`** + +--- + +## 🛠️ What Was Fixed? + +Out of the box on modern systems and Wine, Crystal Maze suffered from multiple game-breaking incompatibilities: + +1. **Infinite 100% CPU Lockup on Modern GPUs**: + - `WebDriver/dx7drv.dll` originally performed signed 16-bit integer texture size checks. Modern GPUs with large VRAM caused this loop to overflow and hang indefinitely. + - **Fix**: Patched `dx7drv.dll` at offsets `0x8dbc` and `0x8dc7` (`0f bf` ➔ `0f b7`, `movsx` ➔ `movzx`) and clamped maximum texture dimensions. +2. **Missing ActiveX / COM Registration (Silent Black Screen & No Audio)**: + - `MAZE-WT.EXE` is an ATL host application that instantiates the 3D engine via ActiveX CLSID `{FA13A9FA-CA9B-11D2-9780-00104B242EA3}` (`WTDriver`). Because `webdriver.dll`'s `DllRegisterServer` was a dummy stub in the original installer, COM instantiation silently failed in Wine, causing the engine to skip level and audio loading. + - **Fix**: `crystal_maze_setup.reg` properly registers `WTDriver`, `IWT`, and typelibs in `HKEY_CLASSES_ROOT` and `HKEY_LOCAL_MACHINE`. +3. **Runtime Attribute Crash on Startup**: + - The game originally queried unpopulated registry runtime attributes, causing fatal exception dialogs. + - **Fix**: Patched the exception handler in `MAZE-WT.EXE` to safely fallback. +4. **DirectDraw 7 / Direct3D Translation**: + - Bundled **dgVoodoo 2.8.2** (`DDraw.dll` and `D3DImm.dll`) with custom configuration (`DeframerSize = 0`, watermarks disabled) translating DirectDraw 7 to Direct3D 11, which DXVK then maps to Vulkan at a locked 60 FPS. + +--- + +## 🚀 Quick Setup Guide (Heroic Games Launcher) + +### Step 1: Extract the Game +Download and extract `Crystal-Maze-Proton-Ready.zip` to your desired folder (e.g. `~/Games/Crystal Maze` or inside your Wine prefix). + +### Step 2: Add Game to Heroic +1. Open **Heroic Games Launcher**. +2. Click **Add Game** ➔ **Sideload Game**. +3. Fill in the details: + - **Game Title**: `Crystal Maze` + - **Select Executable**: Browse to `MAZE-WT.EXE` inside your extracted folder. + - **Working Directory**: The extracted `Crystal Maze` folder. + - **Wine Version**: Select **GE-Proton9-27** (or any modern **GE-Proton 9.x / Proton 9+** installed via Heroic's Wine Manager). + - **Wine Prefix**: Choose any folder (e.g. `~/Heroic Games/Prefixes/crystal maze`). + +### Step 3: Configure DLL Overrides in Heroic +1. In Heroic, go to **Game Settings** ➔ **Advanced tab**. +2. Under **Environment Variables**, add: + - **Key**: `WINEDLLOVERRIDES` + - **Value**: `ddraw,d3dimm=n,b` + +### Step 4: Run Prefix Setup (Once) +Open a terminal in the game folder and run: +```bash +bash setup_prefix.sh "/path/to/your/wineprefix" +``` +*(Alternatively, in Heroic: go to **Wine Settings** ➔ click **"Run EXE on Prefix"** and select `setup_prefix.sh` or import `crystal_maze_setup.reg`).* + +### Step 5: Play! +Click **Play** in Heroic. Lily, the 3D maze, and original sound/music will launch immediately! + +--- + +## 📂 Repository Contents + +- `setup_prefix.sh`: One-click Bash script to copy driver configs and register COM components in a target Wine prefix. +- `crystal_maze_setup.reg`: Standalone Windows registry file containing all required COM CLSIDs, SKU info, and DLL overrides. +- `dgVoodoo.conf`: Pre-tuned dgVoodoo 2.8.2 configuration (no watermark, window aspect ratio fixes, DeframerSize disabled). +- `SKUInfo.ini`: WildTangent SKU configuration required to prevent CRT save aborts. +- `wt3d.ini`: Core 3D engine driver settings. + +--- + +## 📜 Credits & Preservation + +Crystal Maze originally developed by WildTangent (2003–2006). This repository is intended for digital preservation and compatibility on modern Linux/Proton systems. diff --git a/SKUInfo.ini b/SKUInfo.ini new file mode 100644 index 0000000..324d392 --- /dev/null +++ b/SKUInfo.ini @@ -0,0 +1,11 @@ +[SKUInfo] +SKU=crystalmaze +ProductCodeName=crystalmaze +ProductDisplayName=Crystal Maze +DPCodeName=Crystal Maze +ExeName=MAZE-WT.EXE +RuntimeExeName=MAZE-WT.EXE +LaunchExeName=MAZE-WT.EXE +ProductGUID={52T6zs4hCQ9fUYNxkiDzFQ} +InstallDirectory=C:\Games\Crystal Maze\ +UseLeaderboard=0 diff --git a/crystal_maze_setup.reg b/crystal_maze_setup.reg new file mode 100644 index 0000000..fc30bd9 --- /dev/null +++ b/crystal_maze_setup.reg @@ -0,0 +1,151 @@ +REGEDIT4 + +;; ========================================================== +;; 1. DirectDraw & Direct3D DLL Overrides for dgVoodoo2 +;; ========================================================== +[-HKEY_CURRENT_USER\Software\Wine\Direct3D] + +[-HKEY_CURRENT_USER\Software\Wine\AppDefaults\MAZE-WT.EXE\Direct3D] + +[HKEY_CURRENT_USER\Software\Wine\DllOverrides] +"d3d11"="native" +"dxgi"="native" +"ddraw"="native,builtin" +"d3dimm"="native,builtin" +"wined3d"=- + +[HKEY_CURRENT_USER\Software\Wine\AppDefaults\MAZE-WT.EXE\DllOverrides] +"d3d11"="native" +"dxgi"="native" +"ddraw"="native,builtin" +"d3dimm"="native,builtin" + +;; ========================================================== +;; 2. WildTangent Installed SKU Info +;; ========================================================== +[HKEY_LOCAL_MACHINE\Software\WildTangent] + +[HKEY_LOCAL_MACHINE\Software\WildTangent\InstalledSKUs] + +[HKEY_LOCAL_MACHINE\Software\WildTangent\InstalledSKUs\crystalmaze] +"SKU"="crystalmaze" +"InstallDirectory"="C:\\Games\\Crystal Maze\\" +"RuntimeExeName"="MAZE-WT.EXE" +"LaunchExeName"="MAZE-WT.EXE" +"ExeName"="MAZE-WT.EXE" +"DPCodeName"="Crystal Maze" +"ProductGUID"="{52T6zs4hCQ9fUYNxkiDzFQ}" + +[HKEY_LOCAL_MACHINE\Software\Wow6432Node\WildTangent] + +[HKEY_LOCAL_MACHINE\Software\Wow6432Node\WildTangent\InstalledSKUs] + +[HKEY_LOCAL_MACHINE\Software\Wow6432Node\WildTangent\InstalledSKUs\crystalmaze] +"SKU"="crystalmaze" +"InstallDirectory"="C:\\Games\\Crystal Maze\\" +"RuntimeExeName"="MAZE-WT.EXE" +"LaunchExeName"="MAZE-WT.EXE" +"ExeName"="MAZE-WT.EXE" +"DPCodeName"="Crystal Maze" +"ProductGUID"="{52T6zs4hCQ9fUYNxkiDzFQ}" + +;; ========================================================== +;; 3. WildTangent WTDriver ActiveX COM Registration +;; ========================================================== +[HKEY_CLASSES_ROOT\CLSID\{FA13A9FA-CA9B-11D2-9780-00104B242EA3}] +@="WildTangent WTDriver" + +[HKEY_CLASSES_ROOT\CLSID\{FA13A9FA-CA9B-11D2-9780-00104B242EA3}\InprocServer32] +@="C:\\Games\\Crystal Maze\\WebDriver\\webdriver.dll" +"ThreadingModel"="Apartment" + +[HKEY_CLASSES_ROOT\CLSID\{FA13A9FA-CA9B-11D2-9780-00104B242EA3}\ProgID] +@="WT.WT.1" + +[HKEY_CLASSES_ROOT\CLSID\{FA13A9FA-CA9B-11D2-9780-00104B242EA3}\VersionIndependentProgID] +@="WT.WT" + +[HKEY_CLASSES_ROOT\CLSID\{FA13A9FA-CA9B-11D2-9780-00104B242EA3}\TypeLib] +@="{FA13AA2E-CA9B-11D2-9780-00104B242EA3}" + +[HKEY_CLASSES_ROOT\CLSID\{FA13A9FA-CA9B-11D2-9780-00104B242EA3}\Control] +@="" + +[HKEY_CLASSES_ROOT\WT.WT] +@="WildTangent WTDriver" + +[HKEY_CLASSES_ROOT\WT.WT\CLSID] +@="{FA13A9FA-CA9B-11D2-9780-00104B242EA3}" + +[HKEY_CLASSES_ROOT\WT.WT\CurVer] +@="WT.WT.1" + +[HKEY_CLASSES_ROOT\WT.WT.1] +@="WildTangent WTDriver" + +[HKEY_CLASSES_ROOT\WT.WT.1\CLSID] +@="{FA13A9FA-CA9B-11D2-9780-00104B242EA3}" + +[HKEY_CLASSES_ROOT\TypeLib\{FA13AA2E-CA9B-11D2-9780-00104B242EA3}\1.0] +@="WT3DLib" + +[HKEY_CLASSES_ROOT\TypeLib\{FA13AA2E-CA9B-11D2-9780-00104B242EA3}\1.0\0\win32] +@="C:\\Games\\Crystal Maze\\WebDriver\\webdriver.dll" + +[HKEY_CLASSES_ROOT\Interface\{BDB9B021-CAFF-11D2-9780-00104B242EA3}] +@="IWT" + +[HKEY_CLASSES_ROOT\Interface\{BDB9B021-CAFF-11D2-9780-00104B242EA3}\ProxyStubClsid32] +@="{00020424-0000-0000-C000-000000000046}" + +[HKEY_CLASSES_ROOT\Interface\{BDB9B021-CAFF-11D2-9780-00104B242EA3}\TypeLib] +@="{FA13AA2E-CA9B-11D2-9780-00104B242EA3}" +"Version"="1.0" + +[HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{FA13A9FA-CA9B-11D2-9780-00104B242EA3}] +@="WildTangent WTDriver" + +[HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{FA13A9FA-CA9B-11D2-9780-00104B242EA3}\InprocServer32] +@="C:\\Games\\Crystal Maze\\WebDriver\\webdriver.dll" +"ThreadingModel"="Apartment" + +[HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{FA13A9FA-CA9B-11D2-9780-00104B242EA3}\Control] +@="" + +[HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{FA13A9FA-CA9B-11D2-9780-00104B242EA3}\ProgID] +@="WT.WT.1" + +[HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{FA13A9FA-CA9B-11D2-9780-00104B242EA3}\VersionIndependentProgID] +@="WT.WT" + +[HKEY_LOCAL_MACHINE\Software\Classes\CLSID\{FA13A9FA-CA9B-11D2-9780-00104B242EA3}\TypeLib] +@="{FA13AA2E-CA9B-11D2-9780-00104B242EA3}" + +[HKEY_LOCAL_MACHINE\Software\Classes\Interface\{BDB9B021-CAFF-11D2-9780-00104B242EA3}] +@="IWT" + +[HKEY_LOCAL_MACHINE\Software\Classes\Interface\{BDB9B021-CAFF-11D2-9780-00104B242EA3}\ProxyStubClsid32] +@="{00020424-0000-0000-C000-000000000046}" + +[HKEY_LOCAL_MACHINE\Software\Classes\Interface\{BDB9B021-CAFF-11D2-9780-00104B242EA3}\TypeLib] +@="{FA13AA2E-CA9B-11D2-9780-00104B242EA3}" +"Version"="1.0" + +[HKEY_LOCAL_MACHINE\Software\Wow6432Node\Classes\CLSID\{FA13A9FA-CA9B-11D2-9780-00104B242EA3}] +@="WildTangent WTDriver" + +[HKEY_LOCAL_MACHINE\Software\Wow6432Node\Classes\CLSID\{FA13A9FA-CA9B-11D2-9780-00104B242EA3}\InprocServer32] +@="C:\\Games\\Crystal Maze\\WebDriver\\webdriver.dll" +"ThreadingModel"="Apartment" + +[HKEY_LOCAL_MACHINE\Software\Wow6432Node\Classes\CLSID\{FA13A9FA-CA9B-11D2-9780-00104B242EA3}\Control] +@="" + +[HKEY_LOCAL_MACHINE\Software\Wow6432Node\Classes\CLSID\{FA13A9FA-CA9B-11D2-9780-00104B242EA3}\ProgID] +@="WT.WT.1" + +[HKEY_LOCAL_MACHINE\Software\Wow6432Node\Classes\CLSID\{FA13A9FA-CA9B-11D2-9780-00104B242EA3}\VersionIndependentProgID] +@="WT.WT" + +[HKEY_LOCAL_MACHINE\Software\Wow6432Node\Classes\CLSID\{FA13A9FA-CA9B-11D2-9780-00104B242EA3}\TypeLib] +@="{FA13AA2E-CA9B-11D2-9780-00104B242EA3}" diff --git a/dgVoodoo.conf b/dgVoodoo.conf new file mode 100644 index 0000000..1d92173 --- /dev/null +++ b/dgVoodoo.conf @@ -0,0 +1,334 @@ +;========================================================================== +; === Text based config file for dgVoodoo2 +; === Use this file if you are a game modder/hacker or an experted user and +; want to modify some advanced properties not available via the CPL. +;========================================================================== + +Version = 0x280 + +;-------------------------------------------------------------------------- + +[General] + +; OutputAPI: "d3d11warp", "d3d11_fl10_0", "d3d11_fl10_1", "d3d11_fl11_0", +; "d3d12_fl11_0", "d3d12_fl12_0", "bestavailable" +; Adapters: "all", or the ordinal of the adapter (1, ...) +;FullScreenOutput: "default", or the ordinal of the output on the adapter (1, ...) +; ScalingMode: "unspecified", "centered", "stretched", "centered_ar", "stretched_ar", "stretched_ar_crt", +; "stretched_4_3", "stretched_4_3_crt", "stretched_4_3_c64" +; +;InheritColorProfileInFullScreenMode: +; Enabled by default and can only be disabled only when a D3D11 output API +; is explicitly selected. Disabled case is intended for avoiding extra +; rendering resources on old hardware for better performance, if required. + +OutputAPI = bestavailable +Adapters = all +FullScreenOutput = default +FullScreenMode = false +ScalingMode = unspecified +ProgressiveScanlineOrder = false +EnumerateRefreshRates = false + +Brightness = 100 +Color = 100 +Contrast = 100 +InheritColorProfileInFullScreenMode = true + +KeepWindowAspectRatio = false +CaptureMouse = false +CenterAppWindow = false + +;-------------------------------------------------------------------------- + +[GeneralExt] + +; DesktopResolution: Desktop (native) resolution can be forced for dgVoodoo's internal calculations. +; Useful for rare applications that pre-set the desktop to other than the native +; resolution before dgVoodoo gets in action. Only the compact format can be used here, +; and applies to all outputs of the desktop. +; DesktopBitDepth: You can define what screen bit depth should be reported through dgVoodoo +; (8, 16, 32) +; DeframerSize: When resolution is forced to other than the app default then +; a black frame is drawn around the output image coming from a wrapped API +; to remove scaling artifacts - +; frame thickness can be defined in pixels (max 16, 0 = disable) +; ImageScaleFactor: Integer factor for scaling the output image coming from a wrapped API +; Always done by nearest point filtering, independent on scaling mode +; (0 = max available) +; Separate factors can be defined for horizontal and vertical scaling +; by subproperties, e.g. +; ImageScaleFactor = x:3, y:2 +; CursorScaleFactor: Integer factor for scaling the emulated hardware mouse (max 16) +; (0 = automatic, 1 = no scale, 2 = double scale, ...) +; DisplayROI: Display region of interest +; If scaling is done by the dgVoodoo then you can define a subrect of the +; output image, coming from a wrapped API, to be displayed. The defined subrect +; is mapped to the display output according to the current scaling mode +; It can be useful for applications rendering a widescreen subimage into a 4:3 +; resolution; in this case you can scale up that subimage to (nearly) fill the +; whole screen on a widescreen monitor. +; DisplayROI empty value means the whole image. +; DisplayROI value can be a proportion in form of %d_%d or a pixel size (%d|%d) +; Pos subproperty is not mandatory and can be 'centered' or a pixel position (%d|%d) +; Examples: DisplayROI = 16_9, pos:centered +; DisplayROI = (320|200), pos:(10|10) +; Resampling: When scaling is done by the dgVoodoo for the given scaling mode, +; you can choose which filter is to be used for resampling the output image +; Available filters are: "pointsampled", "bilinear", "bicubic", "lanczos-2", "lanczos-3" +; PresentationModel: Low-level swapchain swap effect: if you know what you are doing then it can be +; overridden here. Flip models are better suited for modern OS features like auto HDR, +; while plain legacy models provide the best presentation performance under ideal conditions +; Not all model + output API + OS version combinations are supported. +; "auto", "discard", "seq", "flip_discard", "flip_seq" +; FreeMouse: If true then physical mouse is free to move inside the game window +; when using emulated scaling and/or application and forced resolution +; differs; can be useful when a game relies on the physical window size +; WindowedAttributes: You can define attributes for forced windowed appearance (separated by commas): +; "borderless" - forces the app window not have any border +; "alwaysontop" - forces the app window into the top-most band +; "fullscreensize" - forces the app window to be full screen size with image scaling inside +; FullscreenAttributes: You can define attributes for fullscreen appearance (separated by commas): +; "fake" - forces fake fullscreen mode with a screen-size window +; FPSLimit: An integer or rational (fractional) value, 0 = unlimited +; Environment: Software environment in which dgVoodoo is running: can be left unspecified (native) +; or can be set to 'DosBox' or 'QEmu'. +; SystemHookFlags: You can define which part of the system should be hooked (x86-DX only): +; "gdi" - for showing graphical contents rendered through GDI +; (like movie playback through the ancient Windows Multimedia AVI player library) +; "cursor" - for suppressing double-cursor symptoms when the cursor is emulated + +DesktopResolution = +DesktopBitDepth = +DeframerSize = 0 +ImageScaleFactor = 1 +CursorScaleFactor = 0 +DisplayROI = +Resampling = bilinear +PresentationModel = auto +FreeMouse = false +WindowedAttributes = +FullscreenAttributes = +FPSLimit = 0 +Environment = +SystemHookFlags = gdi + +;-------------------------------------------------------------------------- + +[Glide] + +; VideoCard: "voodoo_graphics", "voodoo_rush", "voodoo_2", "voodoo_banshee", "other_greater" +; OnboardRAM: in MBs +; MemorySizeOfTMU: in kBs +; TMUFiltering: "appdriven", "pointsampled", "bilinear" +; +; Resolution: either "unforced", "max", "max_isf", "max_fhd", "max_fhd_isf", "max_qhd", "max_qhd_isf", "desktop", "%dx", +; "max_%dx", "max_isf_%dx", "max_fhd_%dx", "max_fhd_isf_%d"x, "max_qhd_%dx", "max_qhd_isf_%dx", "desktop_%dx" +; or subproperties: h: horizontal, v: vertical +; + optional subproperty refrate: refresh rate in Hz +; e.g. Resolution = max, refrate:60 +; Resolution = 2x, refrate:59 +; Resolution = h:1280, v:1024, refrate:75 +; Resolution = max_2x +; or just use the compact form like "1024x768@60" or "512x384" +; +;Antialiasing: "off", "appdriven", "2x", "4x", "8x", "16x" (your GPU must support the chosen one) + +VideoCard = voodoo_2 +OnboardRAM = 8 +MemorySizeOfTMU = 4096 +NumberOfTMUs = 2 +TMUFiltering = appdriven +DisableMipmapping = false +Resolution = unforced +Antialiasing = appdriven + +EnableGlideGammaRamp = true +ForceVerticalSync = true +ForceEmulatingTruePCIAccess = false +16BitDepthBuffer = false +3DfxWatermark = false +3DfxSplashScreen = false +PointcastPalette = false +EnableInactiveAppState = false + + +;-------------------------------------------------------------------------- + +[GlideExt] + +; DitheringEffect: "pure32bit", "dither2x2", "dither4x4" +; Dithering: "disabled", "appdriven", "forcealways" +; DitherOrderedMatrixSizeScale: integer scale value for dither matrix size +; 1 = normal, 2 = double size, etc. +; 0 = automatic (the aim is to have some retro feel&look) + +DitheringEffect = pure32bit +Dithering = forcealways +DitherOrderedMatrixSizeScale = 0 + +;-------------------------------------------------------------------------- + +[DirectX] + +; VideoCard: "svga", "internal3D", "geforce_ti_4800", "ati_radeon_8500", +; "matrox_parhelia-512", "geforce_fx_5700_ultra", "geforce_9800_gt" +; VRAM: in MBs (default) or in GBs (e.g. VRAM = 2GB) +; Filtering: "appdriven", "pointsampled", "bilinear", "linearmip", "trilinear" +; or the integer value of an anisotropic filtering level (1-16) +; KeepFilterIfPointSampled: if enabled then forced filtering affects only non-point sampled textures +; Bilinear2DOperations: if enabled then DirectDraw Blit and CPU-written data is transferred with bilinear scaling + +DisableAndPassThru = false + +VideoCard = geforce_fx_5700_ultra +VRAM = 512 +Filtering = appdriven +KeepFilterIfPointSampled = false +DisableMipmapping = false +Resolution = unforced +Antialiasing = appdriven + +AppControlledScreenMode = true +DisableAltEnterToToggleScreenMode = true + +Bilinear2DOperations = true +PhongShadingWhenPossible = false +ForceVerticalSync = false +dgVoodooWatermark = false +FastVideoMemoryAccess = true + +;-------------------------------------------------------------------------- + +[DirectXExt] + +; AdapterIDType: "nvidia", "amd", "intel" or leave it undefined +; You can define what type of driver version and vendor id's the wrapper should report to +; the application; Some games rely on that information so it can be useful for them +; Can be defined only for SVGA and Internal3D card types; the others have their own wired +; information + +; VendorID, DeviceID, SubsystemID, RevisionID: +; Can be defined only for SVGA and Internal3D card types +; You can overwrite these properties even if a non-default AdapterIDType is defined; +; say, you defined an nvidia id type but would like to refine the vendor id + +; DefaultEnumeratedResolutions: you can define what resolutions should be enumerated to the application by default +; "all", "classics", "none" + +; ExtraEnumeratedResolutions: you can add extra resolutions (separated by commas, max 16) that will get +; enumerated to the application as display adapter supported ones - +; can be useful if an app supports rendering at arbitrary resolutions +; and you have a particular favorite resolution that are not +; enumerated to the application by default +; you can either use the compact resolution format here, or +; "max", "max@refrate" meaning your desktop resolution with a potential refresh rate, or +; "max_4_3", "max_4_3@refrate", "max_16_9", "max_16_9@refrate" +; meaning the maximum resolution with the given aspect ratio calculated from +; the desktop resolution with the given refresh rate, e.g. "max_4_3@60", "max_16_9" + +; EnumeratedResolutionBitdepths: you can filter what bitdepths are included in the resolution enumeration +; any subset of {"8", "16", "32"}, or "all" + +; DitheringEffect: "pure32bit", "ordered2x2", "ordered4x4" +; Dithering: "disabled", "appdriven", "forceon16bit", "forcealways" +; DitherOrderedMatrixSizeScale: integer scale value for dither matrix size +; 1 = normal, 2 = double size, etc. +; 0 = automatic +; DepthBuffersBitDepth: internal bit depth of depth/stencil buffers for 3D rendering (32 bit is not recommended) +; "appdriven", "forcemin24bit", "force32bit" +; Default3DRenderFormat: default format of 3D rendering +; argb2101010 gives higher dynamic range but it can break the rendering +; "argb8888", "argb2101010" + +; MaxVSConstRegisters: Max number of vertex shader constant registers (DX8/9 only) +; Can be defined only for SVGA and Internal3D card types +; Valid values are 256 (default), 512 or 1024 + +; NPatchTesselationLevel: Force N-Patch tesselation level (D3D8/9) +; 0 = app driven +; 1 = disable +; 2 to 8 = a forced tesselation level +; Altough tesselation works with all vertex shader versions, you can force level higher than 1 +; only for the fixed function or vs.1.x vertex pipeline because of performance and practical reasons +; (forced tesselation also disables adaptive mode (D3D9), but forcing is not recommended at all, anyway) + +; DisplayOutputEnableMask: Each bit in this 32 bit value corresponds to a display output. Display outputs of the adapters are numbered +; sequentially. If Adapter0 has n display outputs and Adapter1 has m display outputs attached then the lowest +; n bits match Adapter0 display outputs, the next m bits match Adapter1 outputs, and so on. The lowest bit +; in a group corresponds to Output0. If a bit value is 0 then the display output is disabled for the device +; enumeration, in other words, it is invisible to the application. It can be useful for D3D9 multihead- +; or very special applications where you want to enable only individual displays on your monitor wall. + +; MSD3DDeviceNames: if true then original Microsoft D3D device names are exposed +; (some applications check for them and they fail) + +; RTTexturesForceScaleAndMSAA: if true then forced resolution scaling and MSAA is +; applied also to rendertarget textures +; Set it to false for games requiring pixel-precise rendering +; but be careful it can EASILY break certain things, not recommended + +; SmoothedDepthSampling: if true then extra smoothing is added to depth textures +; when they are sampled + +; DeferredScreenModeSwitch: If true the switching to full screen is deferred after the application initialized +; the DirectX device; can be useful for games that don't expect rendering window changes +; during initialization and crash + +; PrimarySurfaceBatchedUpdate: If true then direct changes of the primary surface are batched together for presenting them +; If false then each change is instantly presented (debug-like mode) + +AdapterIDType = +VendorID = +DeviceID = +SubsystemID = +RevisionID = + +DefaultEnumeratedResolutions = all +ExtraEnumeratedResolutions = +EnumeratedResolutionBitdepths = all + +DitheringEffect = pure32bit +Dithering = forcealways +DitherOrderedMatrixSizeScale = 0 +DepthBuffersBitDepth = appdriven +Default3DRenderFormat = argb8888 + +MaxVSConstRegisters = 256 + +NPatchTesselationLevel = 0 + +DisplayOutputEnableMask = 0xffffffff + +MSD3DDeviceNames = false +RTTexturesForceScaleAndMSAA = true +SmoothedDepthSampling = true +DeferredScreenModeSwitch = false +PrimarySurfaceBatchedUpdate = true + +;-------------------------------------------------------------------------- + +[Debug] + +; This section affects only debug/spec release builds +; +; Info, Warning, Error +; "Disable" - disables all messages and debugger break +; "Enable" - enables messages and disables debugger break +; "EnableBreak" - enables both messages and breaking into debugger +; +; MaxTraceLevel: Maximum level of tracing API calls +; 0 - Disable +; 1 - API Functions and methods +; 2 - Additional trace info for internals +; +; LogToFile: if false or debugger is detected then output goes to the debug output +; if true and no debugger detected then output goes to 'dgVoodoo.log' +; (not implemented yet, always the default debug output is used) + +Info = enable +Warning = enable +Error = enable +MaxTraceLevel = 0 + +;LogToFile = false \ No newline at end of file diff --git a/setup_prefix.sh b/setup_prefix.sh new file mode 100755 index 0000000..f1b3377 --- /dev/null +++ b/setup_prefix.sh @@ -0,0 +1,49 @@ +#!/bin/bash +# ========================================================== +# Crystal Maze - Prefix Setup Script +# Configures a Wine/Proton prefix with required registry keys, +# wt3d config files, and DirectX overrides. +# ========================================================== + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +# Detect Wine prefix +PREFIX="${WINEPREFIX:-$1}" +if [ -z "$PREFIX" ]; then + echo "Usage: $0 /path/to/wineprefix" + echo "Or set WINEPREFIX environment variable." + exit 1 +fi + +echo "[*] Setting up Crystal Maze in prefix: $PREFIX" + +# Create required config directories +mkdir -p "$PREFIX/drive_c/ProgramData/WildTangent/WebDriverConfig" +mkdir -p "$PREFIX/drive_c/Program Files/WildTangent/WebDriverConfig" +mkdir -p "$PREFIX/drive_c/Program Files (x86)/WildTangent/WebDriverConfig" +mkdir -p "$PREFIX/drive_c/WildTangent/WebDriverConfig" +mkdir -p "$PREFIX/drive_c/windows/wt" + +# Copy wt3d.ini configuration +cp -f "$SCRIPT_DIR/wt3d.ini" "$PREFIX/drive_c/ProgramData/WildTangent/WebDriverConfig/wt3d.ini" +cp -f "$SCRIPT_DIR/wt3d.ini" "$PREFIX/drive_c/Program Files/WildTangent/WebDriverConfig/wt3d.ini" +cp -f "$SCRIPT_DIR/wt3d.ini" "$PREFIX/drive_c/Program Files (x86)/WildTangent/WebDriverConfig/wt3d.ini" +cp -f "$SCRIPT_DIR/wt3d.ini" "$PREFIX/drive_c/WildTangent/WebDriverConfig/wt3d.ini" + +# Copy patched driver to windows/wt +if [ -f "$SCRIPT_DIR/WebDriver/dx7drv.dll" ]; then + cp -f "$SCRIPT_DIR/WebDriver/dx7drv.dll" "$PREFIX/drive_c/windows/wt/dx7drv.dll" +fi + +# Detect wine / proton runner +WINE_BIN="wine" +if [ -n "$WINE" ]; then + WINE_BIN="$WINE" +elif command -v wine &>/dev/null; then + WINE_BIN="wine" +fi + +echo "[*] Importing registry settings..." +WINEPREFIX="$PREFIX" "$WINE_BIN" regedit "$SCRIPT_DIR/crystal_maze_setup.reg" 2>/dev/null || true + +echo "[+] Crystal Maze prefix configuration complete!" diff --git a/wt3d.ini b/wt3d.ini new file mode 100755 index 0000000..9dd5748 --- /dev/null +++ b/wt3d.ini @@ -0,0 +1,14 @@ +[WT3D_CFG] +Version=0.0.0.0 +UseHardware=2 +EnableTextures=2 +EnableTextureFiltering=2 +EnableTransparency=2 +EnableAlphaTest=2 +MaxTextureCount=1024 +MaxBitmapCount=2048 +MaxObjectCount=768 +SoftwareRenderer=0 +Enable8Bit=0 +FPS=30 +EnableOverlay=1