Status: scaffold staged, toolchain package pending. The Wine prefix, wrapper scripts and validation battery exist locally (below); the VC6 toolchain itself gets prepared on the WinXP VM (install + SP6 + dependency builds) and packaged like the VS2008 flow. Companion pages: VS2008 under Wine for the conventions this mirrors, and Windows Compatibility Targets for the runtime-side matrix (which OS each era's binaries run on — this page covers the compiler-side ceilings instead).
The original NeL / Ryzom / Snowballs codebase — preserved at github.com/ryzom/nel_cvs — was built with Visual C++ 6.0 (cl 12.00), with Format-6.00 .dsp/.dsw project files (55 projects: nel, nelns, snowballs2, tools). Building that tree with its original compiler under Wine gives the authentic 2000s-era x87 reference, the same role the VS2008/Wine environment plays for the Max-2010-era pipeline.
Survey of the final CVS state (2026-08-06):
nel/include/nel/misc/types_nl.h hard-requires STLport (#error unless __SGI_STL_PORT — any STLport 4.x defines it). VC6's native STL is not an option by the project's own gate.opengl32.lib, odbc32.lib, ...). No freetype in 3d.dsp at this tree state..mak files — building the .dsp projects needs either MSDEV.EXE /MAKE (the VC6 command-line build driver) or an external build harness.Prepared on the XP VM like the VS2008 toolchain — install VC6 + Service Pack 6 (cl 12.00.8804), build the dependencies with that same compiler, then package:
Toolchain (from Program Files/Microsoft Visual Studio/):
VC98/ — BIN/ (CL.EXE, C1.DLL, C1XX.DLL, C2.DLL, LINK.EXE, LIB.EXE, NMAKE.EXE, ...), INCLUDE/, LIB/, MFC/ (INCLUDE+LIB+SRC), ATL/INCLUDE/Common/MSDev98/Bin/ — MSPDB60.DLL (cl's PDB backend, same-install rule as the VS2008 mspdb80 trap), RC.EXE (lives here in VC6, not VC98/Bin), and — for driving the .dsw/.dsp builds — MSDEV.EXE with its DLLs/packages (DEVSHL.DLL, DEVBLD.PKG, ...); MSDEV file.dsp /MAKE "name - Win32 Release" is the era's CLI build path and the first thing to try under WineMSPDB60 gives the VC6 flavor of C1902)Externals (era dependencies, built in the VM with the same VC6):
stlport/) + the iostreams library built with VC6 (lib/). Goes to drive_c/STLport (or NL_VC6_STLPORT override). Must be first in INCLUDE — the wrappers handle the ordering.No windows-folder supplement needed — VC6 predates SxS entirely: plain MSVCRT.DLL (Wine's builtin serves), no manifests, no winsxs, no mt.exe, no .NET.
~/toolchain_vc6_prefix — fresh 32-bit Wine prefix, ready to receive the package into drive_c/Program Files/Microsoft Visual Studio/.~/bin/wine-vc6/winecl6-{cc,link,lib,rc} + shared winecl6-env, parameterized via NL_VC6_PREFIX/NL_VC6_STLPORT. Same Unix-path translate_args as the VS2008 layer; additionally drops /showIncludes (cl 12.00 predates it — relevant if CMake/Ninja ever drives this compiler: builds work, header-dependency tracking doesn't).~/bin/wine-vc6/validate_vc6.sh — compiler banner (12.00.*), C hello with exact x87 float bits (1.0f/3.0f → 3eaaaaab; VC6 printf has no %a, bits are dumped raw), C++ /GX iostream smoke, STLport smoke (gated on presence, asserts __SGI_STL_PORT), RC smoke./Zi (MSPDB60 under Wine untested; /Z7 exists on VC6) and prefer /DEBUG:NONE-style linking until proven otherwise.tool/wine_vs2008/lowercase_alias.py) will likely be needed over VC98/INCLUDE + STLport once real builds start.MSDEV.EXE under Wine is the big unknown — it is the IDE binary in CLI mode. Fallback if it misbehaves: a small .dsp parser emitting ninja/make (the format is simple line-based), or hand-driven cl/lib scripts per project.From nel/INSTALL (which documents the official build as Visual C++ 6.0 SP4) cross-checked against actual code usage in the final CVS state. The tree is lean: no zlib, no ogg/vorbis, no mysql/curl anywhere; snowballs2/client.dsp adds only freetype.lib beyond system libs.
| Dependency | Used by | Era version | Latest VC6-compilable | Notes |
|---|---|---|---|---|
| STLport | everything (types_nl.h hard gate) |
4.0 documented; 4.5.3/4.6.2 era-practical | 5.2.1 (final release; its own docs list MSVC 6 SP5+) | NeL uses the SGI iostreams — the STLport library must be built, headers alone don't suffice. Era fidelity → 4.6.2; 5.x changes defaults, treat as experiment |
| FreeType | nel3d font_generator/texture_font; snowballs client |
2.0.x documented | current 2.13.x plausible — the codebase remains "industry-standard ANSI C"; bundled project files are modern-VS, build via custom makefile/nmake | era → 2.0.9–2.1.x |
| libxml2 | nelmisc i_xml/o_xml |
~2.4.x (2001–2003) | 2.9.14 known-safe (last 2.9; win32 MSVC script era); 2.10/2.11 nominally C89 but drifting (flexible array members appear) — verify on VM; 2.12+ is C99 | |
| OpenAL | sound driver | openal.org 1.0 SDK | 1.1 SDK headers + import lib (the API is plain C and frozen there); the runtime can be a modern soft_oal.dll — same ABI |
compile-side effectively version-capped by the SDK, not the implementation |
| Python | ai/pyserver only |
1.5 documented (1.5.2) | 2.3.5 (last Python officially built with VC6; 2.4 moved to VC7.1) | optional — NeL core, snowballs and nelns don't touch it |
| (Mesa 3.3) | Linux GL note only | — | — | Windows uses system opengl32 |
| (DirectX SDK) | not needed at this tree state; Ryzom-era client only (D3D/DInput8) | 9.0b/9.0c (Ryzom shipped Sep 2004) | DX9.0c SDK Update Summer 2004 — last with in-box VC6 libs (Oct 2004 works via the separate "Extras" D3DX9; Dec 2004+ links a symbol VC6's linker can't resolve) | era-authentic and max-compatible coincide |
Compiler: SP4 documented, SP6 recommended for the package (final servicing; one SP level throughout, see the C1902-class trap).
For the VM: era-authentic set = STLport 4.6.2 + FreeType 2.1.x + libxml2 2.4.x-era (or 2.9.14 for sanity) + OpenAL 1.1 SDK, all built with the same VC6 SP6. The "latest" column is the upgrade headroom to probe once the era build is green.
validate_vc6.sh green.nel/src/misc.dsp → nlmisc.lib (smallest real target, exercises STLport + the header set).snowballs2 client/server — the era's complete shippable, and the byte-reference target the Snowballs corpus findings can be compared against.