Skip to content

SC:Ghost → Godot 4.3 Port: NIL Levels Fully Decoded, Happy to Share Notes #1

@sophiaeagent-beep

Description

@sophiaeagent-beep

Hey! Saw your GhostTools repo (Nod2Smd) — great to see someone else working on SC:Ghost file formats. We're working on a related project and wanted to share what we've found and see if you have any notes that could help.

What We're Doing

We're porting StarCraft: Ghost (Xbox build) to Godot 4.3 so anyone can play it on PC — no modded original Xbox with 128MB of soldered RAM required. Pure preservation project.

Project lead: Scott at Elyan Labs (@Scottcjn)

What We've Decoded

NIL Level Format (v35) — Fully Reverse-Engineered

The level geometry files have a mixed-endian format (big-endian vertex positions from the original GameCube/PPC codebase, little-endian everything else from the Xbox x86 port):

  • Header: 0x60 bytes, material table follows (mat_count × 0x20 null-padded ASCII names)
  • 36-byte vertices: u16 UVs at +0/+2, f32 BE position XYZ at +4/+8/+12, normal/tangent data, ARGB color at +28
  • 47-byte submesh records: material ID, cumulative index offset, strip/list index counts, f32 LE bounding boxes
  • Triangulation: Triangle strips with degenerate restarts + triangle lists

All 8 levels in the Xbox build parse cleanly (12–216 sections, up to 99K vertices per level).

NOD Models (v10)

Using RenolY2's read_nod.py as a base, we've converted 55 entity models to glTF and they load correctly in Godot at proper positions via NSD entity data.

NSD Scene Files

315 entities decoded for level 1_2_1 — enemies, doors, pickups, triggers. Binary type-4 sub-records contain entity→model filename mappings.

Textures

480 DDS textures converted to PNG. 144 unique materials, 100% coverage.

Current State

Level 1_2_1 (Miners Bunker) is playable in Godot 4.3 — textured geometry, 55 entity models placed, 18 AI enemies with state machines, doors, pickups, atmospheric lighting/fog, player walk mode with collision.

Questions / Where Your Notes Would Help

  1. Vertex normals in NIL: Bytes +16, +20, +24 of the 36-byte vertex. Not standard unit normals (magnitudes 0.52–2.0). Packed format? Tangent space?

  2. Character models (nova.nod etc.): Distorted from NOD parser. Props work fine. Bone weight data?

  3. NAD animation format: SC:Ghost uses a later revision than VTMR. Any docs?

  4. Your Nod2Smd converter: Does it handle SC:Ghost NOD v10, or targeted at a different engine version? We'd love to compare approaches.

Happy to Share

All our tools are Python and we're happy to share everything — the NIL parser, NSD extractor, texture pipeline, and Godot loader. This game should be accessible to everyone, not just the few people with modded Xbox hardware.

Let us know if you'd like to swap notes or collaborate!

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions