Nikami Aurora is an experimental, open compatibility runtime for legally installed Aurora-family games and their Odyssey and Eclipse descendants. The first two profiles are Star Wars: Knights of the Old Republic and Dragon Age: Origins.
The canonical first-release target is the dual-profile desktop Hello World: one retail-matched opening route for KOTOR and one for Dragon Age: Origins, both running through the same asset-free launcher and public first-party import pipeline. Flat desktop completion is the product gate; additional VR work is parked until both routes pass.
The project is at early vertical-slice stage. It can identify a target installation, validate profile-specific source markers, produce a SHA-256-bound target manifest, import the real KOTOR Endar Spire room geometry and textures, load that owned-data bundle into Godot, assemble Trask from his installed body, head, texture, weapon, skin weights, and inherited animations, and advance through the first authored dialogue choices. Authored lightmaps, area ambient color, room light nodes, static cameras, and dialogue framing drive the opening presentation. Installed dialogue voice and LIP tracks drive source-timed body talk and facial animation. Movement is constrained to the installed room walkmeshes and the first authored lockdown door is materialized and interactive. Validated NCS contracts now execute the opening dialogue-door and plot-XP branches. Full combat and general script execution remain active milestones.
The same Godot project and neutral boot dispatcher now also run a bounded DAO
development slice: female City Elf rogue Kallian, preset 4, from the native DAO
main menu and character-creation screens through the owned Alienage loading
art, start_wake, the Shianni dialogue, the native HUD, and controllable room
movement. That flow uses public code harvested from OpenDAO commit 404bbaa
and reads all retail presentation from the selected installation or an ignored
machine-local cache. It is a renderable automated integration proof, not yet a
release path: Aurora still needs its own fresh DAO importer, human-driven route,
combat/save completion, and matched-retail parity acceptance.
The current player slice materializes a deterministic chargen player from the installed appearance/portrait tables, drives source idle/walk/run clips, and shares one player/cinematic camera authority between desktop SpringArm and OpenXR origin presentations. Active first-person XR gameplay masks only the local player's eight head meshes, preventing inside-face artifacts while the source torso, arms, hand rig, and equipped weapon remain attached and visible. Dialogue/cinematic cameras and every desktop path restore the complete head.
Desktop keys and OpenXR controller axes now map into one immutable movement
intent. Native-coordinate speed, facing, walkmesh, and closed-door outcomes are
owned and synthetically tested by Profiles.Kotor, not duplicated in Godot.
Opening gameplay state is now profile-owned as well. Locker use, per-placement door state, validated script outcomes, and XP transitions produce deterministic before/after snapshots and typed events consumed by either desktop or OpenXR presentation. Duplicate Odyssey object tags remain independent through stable placement IDs.
The opening footlocker now resolves its installed UTP/UTI contents and transfers the exact two Medpacs, Clothing, and Short Sword into that profile snapshot once. A compact world-space loot readout is shared by desktop and OpenXR; an active XR controller receives the same event through the versioned haptic action.
The opening Clothing and Short Sword can now be equipped through desktop Q or
OpenXR B/Y. The profile owns slot legality and inventory removal; Godot swaps
to a source-derived PMBBM01 skinned player with the sword attached beneath the
animated right-hand hook while preserving idle/walk/run state.
The flat path now imports the source loading screen, native 800x600 HUD, and
native-centered 640x480 Inventory and Equipment menus. The opening player can
navigate between Inventory and Equipment, select all nine authored paper-doll
slots, equip or remove Clothing and the Short Sword through profile state, and
render the base, single-item, or combined source-derived player variant. Owned
GUI, font, icon, portrait, audio, model, and capture payloads stay local.
The inventory's source Quest Items/All Items toggle now reads each installed
UTI Plot bit, and its native arrow/thumb scrollbar clips and navigates lists
that exceed the authored viewport.
The opening Inventory party controls now select the player or Trask through
profile-owned state, refresh the source portrait and imported vitality/Defense,
and target Medpac use at the selected member.
Opening-room furniture now distinguishes baked room meshes from GIT placeables.
The installed PLC_Chair2 model is instanced at all three authored placements;
because the UTP is not usable, those chairs never steal the footlocker prompt.
Source-opaque room furniture now stays in Godot's opaque depth-writing path. The lightmap shader no longer turns generic diffuse alpha into transparency, so the opening sofas and bunks correctly occlude the floor behind them.
Explicit source TXI additive overlays now use a separate non-depth-writing
material path. This makes black LHR_dust01 window texels non-occluding and
restores the owned LSP_stars02 exterior sphere without weakening furniture
opacity or treating arbitrary texture alpha as transparency.
Crossing the authored first-corridor trigger now sets profile global
END_TRASK_DLG=10, signals Trask event 50, and starts the installed Carth radio
transmission at DLG starter 8. Carth is source-assembled and standing under the
retail-matched static camera; desktop cinematics use an independent camera that
the gameplay SpringArm cannot overwrite.
That transmission now continues without fake prompts through the three empty DLG reply records, plays both Trask responses and the journal line, advances the two authored globals, reveals the map in profile state, and stops at the two real player responses. The tight Trask shot is calibrated against the same recorded retail sequence, and facial LIP deltas preserve each unique head's authored mouth rest instead of replacing it with the generic supermodel pose.
The next room-3 slice now opens the second lockdown door and stages the first
Sith firefight through cameras 26, 19, and 20. It materializes the two Sith,
the Republic target, existing corpse/debris/power-conductor props, source
cutscene attack/death clips, both Trask voice/LIP lines, blaster shot/impact
audio, battle music, and source-sized additive projectile/muzzle textures. The
runtime now also transfers all 12 installed room emitters: nine fx_Smoke
systems and three fx_Spark systems, including the dense authored smoke at the
damaged room-3 corridor end. The deterministic combat-ready gate verifies every
launch, impact, room effect, voice, script global, environment placement, and
music transition; general combat AI remains a later milestone.
Those slices now run as one deterministic startup-to-action route. It begins at the installed opening dialogue, waits through every selected voice, takes the shortest validated authored branch, opens the locker and equips its Clothing and Short Sword, traverses the real corridor trigger, completes the Carth/Trask transmission, and reaches then releases the first Sith fight. Completion asserts 15 voices, seven choices, XP/equipment/map/global state, both doors, music, and all first-encounter effects before exposing a capture/movie stage key.
The final development recording path is equally fail-closed: one wrapper runs Godot Movie Maker against the active OpenXR spectator, validates route telemetry and 1280×720 audio/video streams, converts a checked temporary OGV intermediate to H.264/AAC MP4, deletes the temporary directory, and refuses to overwrite an existing output. Generated movies remain ignored local artifacts.
XR controller presentation follows a three-level provider chain: portable OpenXR runtime models, dynamically available Meta FB models, then tracked procedural fallbacks. The same primary-stick and face-button actions feed gameplay and eventual live model animation. Runtime-model managers are created only after OpenXR initializes, so normal desktop and no-HMD fallback boots do not depend on an XR extension lifecycle. Procedural controller meshes also stay hidden until XR is active, so they cannot leak into desktop character shots.
For deterministic VR-path QA, the Meta XR Simulator can now be selected only for the launched process. A Vulkan XR subviewport renders the real tracked session while a shared-world spectator camera mirrors the HMD to the normal root viewport for non-black still and eventual Movie Maker capture. The harness does not change the system OpenXR registry, and it fails if XR silently falls back to desktop.
The existing OpenKOTOR retail bridge and OpenDAO compatibility proof contain valuable research, automation, and runtime work. Nikami Aurora gives that work a clean multi-game architecture:
Coreowns engine-independent contracts and deterministic state.Profilesown each game's formats, resource precedence, script ABI, rules, world assembly, and presentation adapters.- The Godot runtime owns rendering, input, audio, UI, and future OpenXR paths.
- Retail hooks remain evidence oracles; implementation crosses the boundary only through documented behavioral contracts and synthetic tests.
No proprietary game assets, extracted resources, or executables belong in this repository.
The end-user contract is deliberately small:
- Download one Nikami Aurora release.
- Choose a supported game and point Aurora at its legally installed folder.
- Aurora validates that installation and creates a machine-local cache.
- Press Play; later launches reuse or incrementally refresh that cache.
Python, PyKotor, MDLOps, NumPy, Pillow, trimesh, the Godot editor, repository
checkout, and command-line import steps are transitional proof dependencies.
They must be replaced by Aurora-owned public import code before the dual-profile
release and must never become end-user setup or downloaded tool requirements.
Game assets are never included in Nikami Aurora releases or uploaded from the
user's machine. See
docs/RELEASE-UX.md for the packaging gate.
Build and run the source-only acceptance suite:
dotnet build Nikami.Aurora.sln --configuration Release
dotnet run --project tests/Nikami.Aurora.Acceptance --configuration ReleaseList available profiles:
dotnet run --project src/Nikami.Aurora.Cli -- list-profilesProbe a legally installed Steam KOTOR copy:
dotnet run --project src/Nikami.Aurora.Cli -- probe `
--profile kotor `
--root 'D:\SteamLibrary\steamapps\common\swkotor'The command exits successfully only when every required profile marker exists.
Its JSON output includes the executable SHA-256 and never copies game content.
isValid means that the required source layout is present; it does not claim
that optional overrides, proxy DLLs, or the complete installation are stock.
The first verified development target is the Steam KOTOR 1.0.3.0 executable:
34E6D971C034222A417995D8E1E8FDD9F8781795C9C289BD86C499A439F34C88.
The following is the current development-proof path, not the accepted release dependency envelope. The replacement work is tracked in the dual-profile contract.
Install the pinned importer dependencies into Python 3.12, then generate the ignored local bundle from a legally installed KOTOR copy:
py -3.12 -m pip install -r requirements-import.txt
./scripts/Bootstrap-MDLOps.ps1
./scripts/Import-KotorModule.ps1 `
-GameRoot 'D:\SteamLibrary\steamapps\common\swkotor'Profile policy is exposed in config/kotor-runtime.json. The importer validates
and hash-binds that configuration into the ignored local module manifest; pass
-RuntimeConfig to import with another public configuration. See
docs/KOTOR-RUNTIME-CONFIGURATION.md for the configuration/evidence boundary
and deterministic O(N) inventory guard.
Launch the new Godot runtime:
./scripts/Start-KotorGodot.ps1The importer writes only to local/kotor/end_m01aa, which is excluded from
Git. The runtime loads 15 authored Endar Spire room records, materializes and
animates Trask, Carth, the deterministic player, and the first Sith encounter,
and keeps remaining creature debug markers opt-in while broader creature model
assembly is implemented.
src/Nikami.Aurora.Core— profile and installation contracts.src/Nikami.Aurora.Profiles.Kotor— Odyssey/KOTOR profile.src/Nikami.Aurora.Profiles.DragonAgeOrigins— Eclipse/DAO profile.src/Nikami.Aurora.Cli— deterministic profile and target tooling.godot— shared Godot runtime and active KOTOR/DAO vertical slices.godot/config/dao— public DAO cinematic and loading-presentation policy; no retail payloads.config/kotor-runtime.json— public KOTOR profile policy and guardrails.scripts— owned-install import and launch commands.scripts/Run-DaoOriginAcceptance.ps1— shared six-origin DAO runtime launch, capture, and video path backed by a legally owned local installation integration/video gate using external ignored OpenDAO cache roots.tests/Nikami.Aurora.Acceptance— dependency-free synthetic acceptance.docs/ARCHITECTURE.md— dependency and profile boundaries.docs/CLEAN_ROOM.md— evidence and implementation separation.docs/ROADMAP.md— dual-profile desktop delivery and expansion gates.docs/DUAL-PROFILE-HELLO-WORLD.md— canonical two-game desktop product, architecture, dependency, parity, and release contract.docs/OPENDAO-HARVEST.md— controlled migration ledger for the prior OpenDAO implementation and evidence.docs/KOTOR-GODOT-PROOF.md— exact Endar Spire proof and limitations.docs/KOTOR-RUNTIME-CONFIGURATION.md— policy, source, evidence, and O(N) monitoring boundaries.
Nikami Aurora is independent and unaffiliated. Users must provide legally obtained game installations. See NOTICE.md, THIRD_PARTY_NOTICES.md, and LICENSE.