# The Descent (HADAL - The Descent) A first-person underwater horror and survival game. The lore is in `GameLore.txt` (Hadra, the Throat, Tethys, the CANTICLE carrier, Tender subs). `Game_decisions.txt` is the user's own running list of requirements. On 2026-10-04 the user decided to **stop the browser version and port the game to Unreal Engine**. ## The Unreal port (active work) - Project: `TheDescentUE/TheDescent.uproject`, UE 5.8.1 (`E:\Tools\UE_5.8`, with engine source), C++ module `TheDescent`. - Read `TheDescentUE/Docs/BRIEF_UE.md` first: the user's requirements (U1–U14 new, V1–V13 carried over), the verified environment and the ground rules. `Docs/DESIGN_UE.md` is the design, `Docs/STATUS.md` says what is built and how to build, run and test it. - **Every build needs `UE_SDKS_ROOT=D:\HADAL - The Descent\.tools\AutoSDK`.** No Visual Studio is registered on this PC, so UnrealBuildTool only finds MSVC 14.44 through that AutoSDK junction. Use `TheDescentUE/Tools/build.ps1`. The compiler itself is installed (MSVC 14.44 under `E:\Tools\Programs\Microsoft Visual Studio`); only its registration is missing. Since 2026-10-11 the variable is also set permanently for the Windows user account, so the editor finds the compiler however it is started. - The game runs offscreen on the real GPU (`-game -RenderOffscreen`), so scenarios and screenshots can be checked without a window. - Packaging (2026-10-14, a test only; the user: the game *"is not even alpha phase"*, so no release work until asked): `TheDescentUE/Package.bat` or `Tools/package.ps1` makes the 64-bit Shipping game in `Builds/Win64-Shipping`. The code loads its assets by path, so `Config/DefaultGame.ini` lists the folders to cook (`DirectoriesToAlwaysCook`) and the map (`MapsToCook`); a new folder loaded by name, a new map or another player model needs a line there, or the package silently lacks it. Release to-dos, not done: make the Python and MCP plugins editor-only, keep the debug and scenario code out of Shipping. - **One project, one Coder (the user's decision of 2026-10-05).** All work happens directly in `TheDescentUE/`. At most three subagents, one per role: Designer, Coder, Critique. Never two Coders at once and no copies of the project. The copies under `.wt/` were merged into `TheDescentUE/` on 2026-10-05 and the folder was removed on 2026-10-11 at the user's request (checked first: nothing unmerged). `.tools/tracks.py` is retired; do not recreate `.wt/`. - Milestones M1–M10 and their acceptance tests are in `Docs/DESIGN_UE.md` §10. The core loop closes at M5. - **Update of 2026-10-11, recorded only:** the user rewrote `GameLore.txt` (penal contract, convict with machine limbs, the ship's AI, start at Anchorage on the surface, empty Tender bay; on 2026-10-19 the user dropped the cradle and made the carrier arrive damaged with one reactor working; on 2026-10-20 the way down became carrier-wide cave systems, digging only through the walls between them, U27; honest voids gone from the game, charge is a meter but there is no cold or warmth mechanic, drinking water is purified from the sea, heat from thermal vents and lava geysers is a hazard, U28 and U29; instrument faults below the Seam come later, D1: remind the user when the Unreal side is structured; 2026-10-23: U30, the carrier can be lost, escape pods below 20 % hull, explosion at 0 %, two reserve carriers sent down damaged and bare, what is stored at Anchorage survives, the third carrier lost is game over; in the lore too) and added gameplay changes to `Game_decisions.txt`. They are listed as U15–U30, D1 and L1–L14 in `TheDescentUE/Docs/updates/2026-10-11/BRIEF_UPDATE.md`, with copies of both files as they stood. The user said not to implement it yet. Nothing is designed or built; do not start agents for it until asked. U26 (2026-10-12): the main character is upgradable with augmentations; it is in the lore and in `Game_decisions.txt` too, and it is also recorded only. - The user's own editor may be open on `D:\UEtest\MyProject` (their test project, with Unreal's MCP server on port 8000). Leave that project and its editor process alone. - Tender model: `models/Kazah-stern-cavity-fixedv4.blend` (the user's choice). Blender 5.2.2 is at `E:\Steam\steamapps\common\Blender\blender.exe`. - Player model (the user's choice of 2026-10-11): Paragon Twinblast from Fab, the default red-armed mesh `/Game/ParagonTwinblast/Characters/Heroes/TwinBlast/Meshes/TwinBlast`, **without the guns**. The pack is already in `TheDescentUE/Content/ParagonTwinblast/` (never edit the pack itself). The user said "put him in now, legs metal, use the twinblast arms and animations" the same day: U25 in `BRIEF_UPDATE.md`, state in `TheDescentUE/Docs/status/player_body.md`. The old custom first-person arm stays in the code, off the view. **The model is not final (the user, 2026-10-12): keep everything model-independent.** The model's profile and the animation table are one file, `TheDescentUE/Config/DescentBody.json`; animations come from the user's Fab packs (UE5 mannequin skeleton) and are baked per model by `Tools/ue/assets_14_body_anims.py`. How to change the model: `TheDescentUE/Docs/PLAYER_MODEL_SWAP.md`. Never edit the user's packs in `Content/`. - Augmentation body (2026-10-12, Blender only): `models/convict-body/Convict_Body_Augments.blend`, the lore's convict on one skeleton with four augmentation stages as swappable modules. Built at the user's request; not imported into Unreal, and the user has not said whether it replaces Twinblast. Details in its `README.md`. - Captain's quarters (2026-10-13, Blender only): `models/captains-quarters/CaptainsQuarters.blend`, a black cabin built after a reference picture from the user (bunk alcove, padded wall, window, chair, desk, lockers), sized to "Quarters A" of the vessel interior. Not imported into Unreal. Details in its `README.md`. Since the same afternoon it is in the ship (`models/M_Ship_v2_interior_season2.blend`, user's requests): the middle bay of the captain's quarters, which fill the whole starboard room beside the control room corridor (lounge forward, mess aft, made round it with the model's own library) and are entered by the corridor's own side door. One sloping roof, 2.6 m at the bunk wall to 4.0 m at the corridor's wall (the model's flat ceiling, door and door wall are not used in the ship). Its materials carry real texture sets (the packs' metal and floor sets, CC0 leather and cloth scans in `models/vessel-interior/source_textures`); its pictures are Cycles renders. `models/vessel-interior/README.md`, `build/captains_cabin.py`, `build/captains_suite.py` (`rebuild()`), `build/captains_look.py`. - Reactor room (2026-10-13, Blender only): in the interior fork (`models/M_Ship_v2_interior_season2.blend`) the reactor gallery between engine control and the works hall was widened into a room at the user's request (*"extend this corridor and make a room instead of a corridor"*): 14.0 m between its walls, which is what the hull allows at floor level. `models/vessel-interior/build/reactor_room.py` (`apply`, `remove`, `check`); its own parts as FBX in `models/vessel-interior/reactor-room/fbx`. Not in Unreal. Details in `models/vessel-interior/README.md`. - Fore main deck raised (2026-10-13, Blender only): in the same interior fork the fore passage and its four rooms stand 1.40 m higher, against the command deck's underside, at the user's request (*"this whole section should be moved up ... so that I can utilize the space underneath better ... its gonna be 3 floor I will add a lift later on, sensor room needs to be extended"*). Forward of the passage's door: a sensor room 9.6 x 7.2 m and an empty lift room; at the sub bay door a landing with steps. `models/vessel-interior/build/fore_deck.py` (`apply`, `remove`, `check`). Not in Unreal. On 2026-10-14 (*"create the room underneath"*) the third floor: a lower deck 10.8 x 20.8 m, 3.9 m high, floor at z -7.95, its roof just under the raised deck (`build/lower_deck.py`). The lift is still the user's to add; its shaft fits through the lift room's aft half into the lower deck's last bay. No way into the lower deck until then. - Ore patches (2026-10-13, Blender only): `models/ore-patches/OrePatches.blend`, eighteen minable patches, two for each of nine ore types, built after a reference picture from the user: a scanned rock with separate ore clusters seated in sockets, loose chunk meshes, baked textures, FBX files and `OrePatches.json` (the layout for the game). Built headless by `build/build_ore_patches.py`. Not imported into Unreal and no game code written. Details in its `README.md`. The user sent the first look back the same day (*"do it more realistic with good textures"*): since then the rocks are baked from scanned rock from Poly Haven (CC0, in `source_textures/`, downloaded with the user's yes). The user then asked for iron, copper, silver, gold, lead, platinum and titanium beside the game's ferrite, cobalt and pearl. **The game's design and code know only those three ore types**; the seven metals are models, recorded only. Last word so far (*"they are too distinct make them less"*): all share one dark rock and have modest, dull pieces; ferrite has the iron look. **Pearl was deleted from the set on the user's word** (*"how ... pearl is an ore"*): do not build it again. The game's design and code still list Seam Pearl as their third ore type; the user has not said what replaces it. Earlier states are in `versions/` (1.7 GB). - Anchorage station (2026-10-12 and 13, Blender only): `models/anchorage/Anchorage_Station_exterior.blend`, the sea-level facility of the lore, assembled from the Modular SciFi Season 1 Starter Bundle (`TheDescentUE/Content/StarterBundle`, never edit the pack) at the user's request, with the vessel (linked `models/M_Ship_v2.blend`) docked at it (*"create a facility that vessel docks"*). On 2026-10-13 the user asked for its outside and its ground (*"save a copy and build exterior of it so it should completed and put ice under the whole structure so it sits on the ice a big ice mass"*): the rooms now have an outer shell and stand on an ice floe with the berth along its south edge. `Anchorage_Station.blend` is the first, rooms-only file, kept as it was. Shell and ice are generated: after changing rooms run `build/apply_exterior.py` on the file (in place), then `build/check_exterior.py` and `build/check_site.py`. Not in Unreal: `build/ue_spawn_layout.ps1 -Layout anchorage_exterior_layout.json` was only dry-run (nothing saved). Details in its `README.md`. On 2026-10-14 the user sent it back three times and it changed in place in their open Blender: the floe's edge is broken, not a straight cut (*"more realistic random deformations"*); the relay is the Sci-Fi Lite Sample Pack's satellite (`Content/SciFI_Lite_Assets`, *"use the relay from Sci-Fi Lite Sample pack"*; the user tipped the dish by hand); and the plain shell became an **outpost** (*"too flat, too basic, looks like 95 game do it more versatile, stylized, try to do like an actual outpost"*): white armour, pylons, portals, roof works and a site with a pad, a tank farm, a mast and a cargo yard, all outside the shell, which stays the closed dark structure (`build/outpost.py`, `outpost_more.py`, `outpost_site.py`, `hs.py`; `apply_exterior.py -- --only outpost`). Its materials: the Lite pack's painted metals and instances of them, scanned concrete from the user's Fab library (`Assets/VaultCache`: *"check for materials for vault cache"*), props and the sky from polyhaven.com (`models/anchorage/source_polyhaven`; the user: *"polyhaven.com is free to use gather many things from there its permitted"*). The user works in that file by hand (materials brought in with the Fab add-on): never rebuild it. The same day the user found that the kit's big door leaves had nowhere to go when opened (*"they will clip through the walls because there is not enough coverage"*): they lift 4.10 m, each into a housing over a slot in the roof (`exterior.door_slots`, `outpost_more.door_housing`; `build/check_doors.py` lifts every leaf and checks it; `apply_exterior.py -- --only doors`). Check moving parts in their open position, always. Then *"rig the doors so they open and close"*: `build/doors.py` (`rig()`). The collection `11 DOORS | rig (open and close)` holds one arrow per doorway with the slider `open`, and `DOORS | all` with `open_all`, which the timeline drives (shut at frame 1, open at 61, shut again at 181, 30 fps). Each leaf's height is driven by a simple expression: this Blender does not run scripts in files, and simple expressions need no Python. Every leaf keeps `closed_location`; the housings and the Unreal export go by that. `check_doors.py` checks the whole travel, also from eyes at the doorways. It found a slit of mine at the outer doors' heads, now sealed (`exterior.door_casing`). Then *"make the ice 916meter x 956 meter with random deformations like we did before"*, and an hour later *"it looks too big now thinking for a second. make it 350x350m"*. The floe is now 350 x 350 m (east-west x north-south, the berth on its south edge as before), 51,406 quads (`build/ice.py`; the 916 m recipe is in `models/_backups/ice_916x956_2026-10-14.py`). Round the station the ground is as it was; further out the cells grow to 4 m and the swell is slower. On it stand **four ice coolers** that keep it frozen (the lore; *"use the asset from fab library called "star citizen workflow to sketchfab - decals 6" without the human"*). They stand on the free ice at (±110, 75) and (±110, 225), on level pads (`build/coolers.py`, collection `12 ICE COOLERS`). They are instances of one model, made ready from the Fab cache by `build/fab_cooler_prepare.py` into `models/anchorage/source_fab/scifiEngine_005/` (without the two figures, the showroom floor and the doubled engine; since 2026-10-21 also without the camouflage cloth, *"remove that camo textile on top of the generators"*). The user has turned the four coolers by hand (SW 93.2°, SE -54°, NW 21.9°, NE -21.6°). On 2026-10-21 the station was **furnished** at the user's request (fan heaters *"in the corners couple of them"*, nutrition feeders *"to the facility walls"*, robots *"2 inside 2 outside 1 next to one of the generators"* from the Unreal pack `Content/Robot_scout_R_21`, Season 2 crates and tools and nine models the user named): `build/furnish.py` (`apply`, `check`, `remove`; what goes where is its `SPEC`, each place found by a rule and checked with the models' own faces), collection `13 FURNISHING` (51 things). Models made ready once in `source_fab/` by `props_prepare.py`, `robot_prepare.py` (posed, baked; Unreal gets the skeletal mesh and its animation from the layout's `"robots"`), `season2_prepare.py` (read from the ship file). Applied in the user's open Blender and saved; Unreal dry run only. Seen, not changed: `dressing.py` hung the hazard bands at the arrivals and maintenance doors in the air (0.64 and 0.86 m). - Pressure door (2026-10-14, Blender only): `models/pressure-door/PressureDoor.blend`, a round hinged vault-style door for the vessel's boarding gate (the docking door), after four reference renders from the user (*"a pressure door"*). Built in the live Blender through the MCP by `models/pressure-door/build/` scripts; rigged (`PressureDoor_Root["open"]`), checked through its swing (`pd_check.py`), textured from the Season 2 pack, FBX + UCX + `PressureDoor_layout.json` exported. Not placed in the ship or in Unreal. Details in its `README.md`. - Boarding gate (2026-10-15, Blender only): in the interior fork the Season 1 lattice gate in the works hall's port wall (the marker `Boarding gate (port, Anchorage bridge)`) is replaced by the pressure door, at the user's request (*"replace this part of the vessel change it with [models/pressure-door] ... open a hole on the main hull of the vessel all the way so it is going to be a pressure door"*): the door appended from its file, a wall plate in the opening, a sleeve from the frame's back flange through the lining void to the hull, a collar on the hull's outside, and a round hole R 1.21 cut into `M_SHIP_Hull`. Done in the user's open Blender through the MCP. `models/vessel-interior/build/boarding_gate.py` (`apply`, `remove`, `check`); details in `models/vessel-interior/README.md`. The Anchorage file and the GAME EXPORT body have no hole. Not in Unreal. The same night (*"Do a more realistic color and texture on it"*) the door's surfaces became a real painted-steel scan (Poly Haven `blue_metal_plate`, CC0, in `models/pressure-door/source_polyhaven/`) under the door's baked masks, in a dark grey metallic finish (*"Do it dark grey mettalic"*): `models/pressure-door/build/pd_look.py` (`look()`, `STYLES`), applied in the ship; the door's own file still has the first surfaces. Then (*"Save a copy. now do the newly created pressure door I want to see which one will be looking better"*) the open file was copied to `models/M_Ship_v2_interior_season2_hinged-door_2026-10-15.blend` and the **sliding pressure door** (`models/pressure-door-sliding`, another session's) fitted in the same place instead (`boarding_gate.remove()`, `apply(door="sliding")`; `DOORS` holds both, `DEFAULT_DOOR` is what the file holds). **The user compares the two; no choice yet.** Pictures `Vessel_66`-`70` (hinged) and `71`-`75` (sliding) in `models/vessel-interior/previews`. On the same evening, 23:00 (*"Do the same realistic dark grey mettalic texture on the sliding door too"*) the sliding door got the same treatment in the ship (`pd_look.look(prefix="M_PDS_", ...)`, `apply()` does it for either door; pictures `82`, `83`). On 2026-10-16 (*"delete that screen"*) the keypad on its left leaf was taken off in the ship (its baked shadow cleared in `models/vessel-interior/textures/T_PDS_Masks_ship.png`; `apply()` repeats it); the door's own file still has it. The handle disc's bar lies horizontal when shut and stands vertical after its quarter turn (the user's CLOSED / OPEN pictures; `level_handle_bar()`, the rig unchanged); the door's own file still has the bar at 45 degrees. On 2026-10-15 in the evening (the user to the door's session: *"update the ship"*) the sliding door in the file became its corrected version (no cables, the reference's leaf relief, a handle disc that turns a quarter before the leaves slide, 1.40 x 2.10 m clear: the gate is 3.30 m between its wall pieces and the pockets allow no wider opening); the script's "sliding" entry carries its numbers and the handle as a fifth mover, `check()` passes, pictures `Vessel_76`-`81`. Earlier states of the door are in `models/pressure-door-sliding/versions/`. - Moon pool door arms (2026-10-16, Blender only): in the interior fork each starboard pocket door (`Moonpool_Door_Aft`, `Moonpool_Door_Fore`) hangs on an arm after a marine flush hinge sheet the user sent (*"Create a door arm that looks like in the referance ... rig it accordingly and mechanically. according to the open and close animation fit it to the scene"*, with a drawing of an arm from each pocket's rail to its door): a trolley on the pocket's upper rail, a frame block on a yaw bearing, main arm + turnbuckle, knuckle, link + turnbuckle, a bracket with a disc on a wedge mount on the door. The doors' own keyframes drive it (simple-expression drivers, two-link IK); checked clash-free through the timeline. The user's placeholder carriages on the rails are hidden. `models/vessel-interior/build/door_arms.py` (`apply`, `remove`, `check`); the file before: `models/M_Ship_v2_interior_season2_before-door-arms_2026-10-16.blend`. Not in Unreal. **Since 2026-10-18 their collection is excluded**: the robot door arm (below) took the rails. - Door robot arm (2026-10-16 to 18, Blender only, **standalone**): `models/door-robot-arm/DoorRobotArm.blend`, a white six-axis industrial robot arm after seven reference pictures from the user, hung upside down from a carriage on each starboard pocket's upper rail and attached to `Moonpool_Door_Aft` / `_Fore`, driven by the doors' own animation (604 simple-expression drivers through solver empties; the doors, rails and pocket are a reference copy in `source/`). Two versions: A with the grab limbs (four fingers on a knob), B the neck and plate from the user's red sketch; `DoorArm | CONTROLS["version"]` switches them, the scene `DoorArm | Showroom` stands them side by side. FBX with LODs, UCX, baked atlas, Cycles pictures; scripts `build/dra_build.py --stage ...`. Built standalone first (*"this will be standalone project dont add on the ship yet"*); on 2026-10-18 the user had **version B installed in the ship** (*"ok now install this version of the arm to the ship, you can change the rail system with this"*): `build/dra_ship_install.py` (`apply`, `remove`, `check`), collections `02 MECHANISM | Starboard pocket doors | robot door arms (version B)`; the plain rail boxes are hidden and replaced by the arm's dark steel rail beams with its rail kit; the flush-hinge arms' collection is excluded (kept). Backup before: `models/M_Ship_v2_interior_season2_before-robot-arm-install_2026-10-18.blend`. The same evening (*"make it bigger so those can withstand the pressure"*, *"attach the main plate to the doors center and make it bigger"*) it became **1.6x** with upper arm and forearm +20 %, its rail line moved 2 m inboard (y -3.80, the arm's own beam under the deck), B's plate 1.2 m on a 1.3 m pad at each door's exact centre; reinstalled 22:24 (backup `..._before-robot-arm-scale-up_2026-10-18.blend`). The user asked for build, check and install only: no bake (mask maps off), and the FBX, LODs, layout JSON and renders still show the old 1.0x arm. 2026-10-19 (*"texture the arms accoding to picture yes red color and that mettallic paint and everything bake it"*, a red industrial robot picture, `reference/ref8_red_metallic_paint.png`): glossy red metallic paint with a clear coat (`M_DoorArm_PaintRed`, was PaintWhite), white labels (`M_DoorArm_Marking`, was Orange), black motors and base, braided black cables; atlas masks re-baked for the 1.6x UVs and the final look baked to `textures/T_DoorArm_BaseColor`, `_ORM` (A = clear coat), `_Normal` (4096). Applied inside the user's open ship and arm sessions by `build/dra_live_look.py` and saved (backups `models/M_Ship_v2_interior_season2_before-red-look_2026-10-19.blend`, `versions/v23_before_red_look_live/`). FBX files still carry the old material names. Run its headless Blender with `-t 30` at below-normal priority: a full-thread run held the PC at 100 % CPU (2026-10-18). - Wall props (2026-10-19, Blender only): the pack's 26 "Storage Area Network" wall boxes in the interior fork are replaced by props from the user's two kits (*"replace every box of that object in ship with inside "MachineParts_Kit" "HardSurfaceKit" objects ... do the objects gameready asset with baked textures ... metallic substance in grey tones similar to that boxes ... choose attachable objects to the wall or hangable"*): `models/wall-props/` holds 16 wall-mounting kit parts made game-ready (own UVs, baked BaseColor/ORM/Normal, one material, UCX, FBX; `build/wp_build.py`; the kits' own files unchanged); `models/vessel-interior/build/wall_props.py` (`apply`, `remove`, `check`) places them at random, fitted to each box's face and checked clash-free. Not in Unreal. - Moon pool room ceiling (2026-10-22, Blender only): the sub bay's bare roof (the M-Ship model's own hull lining above the wall ledge at z 1.2) became a lined vault at the user's request (*"try to create those empty ceiling of moon pool room with those materials"*, then floor modules, then *"I dont like it cover it with this material"*): the whole vault (coves, crown, end walls) in the works hall's perforated plates `SI_MI_Floor_A` with 2 cm reveals, red/black ribs over the wall pilasters, dark trims, a rose round the carousel pylon. The quilted grid and the floor modules were both sent back. The vault stands 6 cm outside the old lining (whose part above the ledge is cut away) because the carousel's ore hoses pass 8.6 cm under it. `models/vessel-interior/build/moonpool_ceiling.py` (`apply`, `remove`, `check`, `carousel_sweep`). **The user now works in the test copies, not the fork:** fore stairs, raised lower bay and this ceiling are in `models/M_Ship_v2_interior_season2_test-ceiling.blend` (the chain test-fore-stairs, test-platform, test-ceiling); the fork `M_Ship_v2_interior_season2.blend` still has none of them. Not in Unreal. On 2026-10-23 the room's untextured places got the **Season 1 wall buffer's smooth dark finish** (`IN_MI_WallBuffer_A`): the two bands beside the command deck doorway (my plates had been cut there by mistake; `moonpool_ceiling.DOOR_BANDS` keeps them open now), the ledges, piers, lintels and jambs (`LINING | dark structure`), the gallery's edges and, the same afternoon, the carousel's pylon (*"do the same with this piece"*; a mesh copy, the docking arm's materials untouched) (`build/sub_bay_bare_places.py`). The user had asked for "that black marble texture" and meant that buffer (*"forget about marble"*); a marble made from their Fab set was taken out again. Not done: the open band under the ledges (bare lining). - Pressure hatch (2026-10-14, Blender only): `models/pressure-hatch/PressureHatch.blend`, a round hinged hatch (opening Ø 1.0 m) in a grey wall plate, after the user's reference sheet "PRESSURE HATCH" (*"create me a 3d hatch according to the reference image use blender mcp"*). Built the pressure door's way (`models/pressure-hatch/build/ph_*.py`): rigged (`PressureHatch_Root["open"]`: cam and eight locking dogs, then the swing), checked through its travel, textured from the Season 2 pack, FBX + UCX + `PressureHatch_layout.json`. Origin on the hatch axis, not at the floor. **A stand-alone model for now** (the user: *"I'll say later where it goes"*): do not place it in the ship or in Unreal until they do. Details in its `README.md`. - Manta Tender (2026-10-14, Blender only): `models/tender-manta/Tender_Manta.blend`, a third Tender after a reference picture from the user (pale grey-white sub, amber-lit cabin window low on the nose, curled wing fins, stern tool boom). Bigger than the Kazah within the user's limit (*"fits the moon pool max limit 1 meter closure"*: 1.03 m from the deck well's edge, checked). **No hatch** (the user's word): four holder clips with the Kazah collar's profile, at the docking arm's four claws, round the clamp axis (0, -0.09). Checked against the moon pool, the carousel sweep, the clamp and its own moving parts; FBX, UCX and `Manta_layout.json` exported in the Kazah's axes. Not in Unreal. "Manta" is a working name. Details in its `README.md`. The Remora (`models/tender-remora`) is another session's second Tender, from a different picture. - Veiled robot (2026-10-19, Blender only): `models/veiled-robot/VeiledRobot.blend`, a humanoid robot after five renders from the user, without the compound bow (and its arrows and quiver) and without the camouflage net (the user's words); the head under the net is my design. 77 parts rigid-skinned to 53 UE5-mannequin-named bones, generic stencil decals (no maker name), Cycles look not baked, FBX exported, joint travel checked by script. Not in Unreal. Details in its `README.md`. Version 2 the same day (*"more precise pixel by pixel according to the pictures"*): proportions measured on pixel grids over the front renders (wide hips, hip joints at +-0.22 m) and checked by an outline overlay from a matched camera (`build/vr_overlay.py`); version 1 in `versions/v01_first_build/`. - Spearfish Tender (2026-10-20, Blender only): `models/tender-spearfish/Tender_Spearfish.blend`, a fourth Tender after the user's orthographic blueprint sheet (*"Create this blueprint as subtub tender 3d model in blender using MCP precisely accordingly"*), built in the open Blender through the MCP from pixel measurements (`build/sf_measure.py`) and checked by overlay on every view (`previews/compare/`). 9.55 m long, 3.81 m span. My additions beyond the sheet: docking clips between the dorsal rails, a cabin, an opening under the top hatch, and **folding whip masts** (raised as drawn they hit the carousel bay's wall; stow with `Spearfish_Root["masts_folded"]` = 1). Moon pool 1.107 m, carousel 0.406 m folded, clamp 0 hits. Textured, FBX + `Spearfish_layout.json`; not in Unreal. "Spearfish" is a working name. Details in its `README.md`. The same day the user sent it back (*"the topology is terrible fix the topology and make this as a game ready asset. also delete the red lined artifact only wings should be"*): the hull is now one clean quad grid with the openings as grid rectangles and their frames in its own topology (`build/sf_hull.py`, 31k triangles instead of 137k), and the ribbed actuators at the fin roots are gone (the fins stay). The first delivery is in `versions/v02_dense_grid_textured/`. Then (*"two seater next to each other ... each should can see the sea from the window front the glass should be bigger"*, drawn in red on two screenshots): the canopy follows the user's drawn outline (`build/canopy_user_2026-10-20.json`, read by fitting the screenshots), the canards moved 0.42 m aft out of it, and two bucket seats sit side by side at y -0.9, +-0.50 m, each seeing straight ahead through its own glass (`build/view_check.py`). Before: `versions/v04_before_two_seats/`. Then (*"looks terrible those frames"*): the outline is smoothed and every window frame is a swept trim of one constant section over the hull's hole edge (`sf_hull.frame_sweep`; the hatch keeps its in-grid frame); a clash test in the build (frames and glass vs attached parts) is 0. Before: `versions/v05_before_frame_fix/`. - Mako Tender (2026-10-20, Blender only, built headless): `models/tender-mako/Tender_Mako.blend`, a fifth Tender after the user's four-view sheet of an orange shark-like sub, with the holder clips where the user's red line marks them (over the canopy's rear and the collar). Sent back twice; v04 after *"work with the critique and do it accordingly to the reference picture"* (a Critique agent, `critique/round1.md`, `round2.md`), then **SIDE rules** (the user: *"just use the side referance you dont have to obey the other wiev pictures"*, clean view `reference/user_side_clean.png`) and the user's red lines on the side render. The hull is a profile-assembled quad grid (`build/mk_shape.py`, `mk_hull.py`: a glass bubble with pale upper glass, a thin orange brow carrying the fore clips, the collar band following SIDE's arcs by a station warp, the jaw with its C and prongs, the recess, light grey side bodies, straight faceted fins). Clamp axis at sheet x 312 (20 px aft of the loop's centre, still inside it). Moon pool 1.149 m, clamp 0 hits, carousel and motion clear; FBX + `Mako_layout.json`; not in Unreal. `previews/compare/side_pair.png` sets the clean SIDE over the model. Earlier states in `versions/` (v02, v03). "Mako" is a working name. Details in its `README.md`. - Nutrition feeder (2026-10-21, Blender only, built headless): `models/nutrition-feeder/NutritionFeeder.blend`, the wall unit after the user's picture (*"Create me 3d model for nutrition feeding device in the game descent exactly as the image"*): panel with the picture's status screen (UI drawn as a texture, `build/nf_screen_ui.py`), raised cavity frame, a tunnel for the hand with a lip, two blue light bars and a wrist cradle, an injector whose nozzle and needle slide down (one slider `NutritionFeeder_Root["inject"]`, checked clash-free). 1 picture px = 0.5 mm (from the hand): 46.7 x 62.3 cm, the tunnel 12.3 cm into the wall. No hand or arm in the model. FBX + UCX + `NutritionFeeder_layout.json`; not in Unreal. The side-by-side with the picture: `previews/compare/lookalike_v01.png`. Details in its `README.md`. - Nutrition vat (2026-10-21, Blender only, built headless): `models/nutrition-vat/NutritionVat.blend`, a standing pod after the user's three-view picture of a "medpod" (*"Create 3d model for nutrition vat in blender. build exactly as the image"*): a two-chamber glass tank of teal liquid, a C-frame, six ports, a C-shaped arm behind it into the plinth, a cartridge at each rear corner. 2.00 m to the head (1 picture px = 4.62 mm). A camera is fitted to each view (`build/nv_fit.py`) and `previews/compare/v02*.png` sets the picture beside the model per view. The front view has no arm or hoses: the side view rules. Side label "nutrivat" (no names from the picture); the picture is gen:LOCK concept art, the user was told. On 2026-10-22 the picture's cables became **pipes to the ceiling** (*"replace those cables with pipes from arm models (those transparant ones) ... max 3 pipes ... the other holes should be without cables or pipes. pipes should be going to the ceiling"*): the docking arm's clear ore duct (its film shader and `T_DockArm_Duct_*` maps, read in place), **as wide as the port** (the user's red drawing), on three ports (right rear, left rear, front), bent to vertical, up to a steel ceiling coupling at 3.46 m (the corridor ceiling); the other three ports stay open. Pieces: `SM_NutritionVat_PipeFitting`, a 1 m `_PipeRun` stretched to length (ceiling - 8.3 - 233.3 cm), `_PipeCeiling` (the socket for the ship's main line). The user's plan, not built: the vat placeable anywhere, its pipes joined to a ship-wide main line that carries biomass from the Tenders' cargo, as ore goes. No clashes (`build/nv_check.py`); FBX + UCX + `NutritionVat_layout.json`; not in Unreal. The cable version is in `versions/v01_cables/`. Details in its `README.md`. - Radiation canister station (2026-10-21, Blender only, built headless): `models/canister-station/CanisterStation.blend`, after one product picture from the user (*"create me a 3d model of this picture"*): black frame, dark green panels, cream trim, a 40 cm canister with a radiation sign at 47 degrees in a cream cup and cradle rail, a cap with a glow ring and four latches, a status screen, a hub. Traced through a model of the picture's camera (`build/cs_lib.py`, `CS_PictureCamera`); the picture shows one side, so that side's detail is copied onto the far side (screen and handles front only). The canister slides 32 cm out along its axis (`CanisterStation_Root["eject"]`, checked clash-free). FBX + UCX + `CanisterStation_layout.json`; not in Unreal. "Canister station" is a working name. Details in its `README.md`. - Robot cell (2026-10-22, Blender only, built headless): `models/robot-cell/RobotCell.blend`, after one product picture from the user (*"create me exact 3d model with rig of this reference picture"*): a glazed industrial cell (charcoal frame, two sliding front leaves, a glass side door on copper hinges, a control pod with screen, buttons and e-stop, LED strips, diamond-plate floor, a sunk copper tray, a turntable) with an orange six-axis robot. The picture's camera was fitted to the cell's six visible corners (`build/rc_fit.py`, 3 px) and everything read through it; the robot's pose fitted too (`rc_fitpose.py`). Scale mine: 3.05 x 2.88 x 2.49 m. Rig: sliders on `RobotCell_Root` (leaves, side door, turntable, e-stop), the robot an armature `RC_Robot_Rig` (A1-A6, Tool, Tool_Spin, one axis each, limits), a 460-frame demo with IK-solved work poses; `build/rc_check.py` passes every travel and the cycle clash-free. No brand names (ring mark, "CELL 01", "R-60"). FBX (robot as a skeletal mesh with its take) + UCX + `RobotCell_layout.json`; not in Unreal. "Robot cell" is a working name. Details in its `README.md`. A copy, `models/robot-cell/RobotCell_DoorArm.blend` (*"create another copy with robot arm replaced with moon pool door arm"*, then *"make a welding tip instead of plain plate"*): the door robot arm's version B at 0.28x on a base ring of mine, skinned to an armature (the J3 cylinder by constraints), its plate replaced by a MIG welding torch of mine; a weld cycle on the turning turntable. `build/rc_doorarm.py`; README section "Copy". - Tiger (2026-10-22, Blender only, built headless): `models/tender-tiger/Tender_Tiger.blend`, after one painted perspective picture from the user (*"create me 3model of this picture exactly"*): the Mako sheet's orange shark design in the picture's proportions (unswept big fins, taller dorsal fin, smaller canopy). Camera and key points fitted together (`build/tg_fit.py`), outlines cast through it, canopy fitted by overlay; textured by the Mako/Spearfish surfaces pass; FBX + UCX + `Tiger_layout.json`. The rear window is kept as the picture shows it (its own part). The same day it became a **Tender** (*"Make it a Tender: add docking clips where the arm can hold it and run the moon pool, carousel and clamp checks"*): the Mako's four clips with the clamp axis at the collar's back edge (aft of it the dorsal fin meets the arm's ore hose), the model moved 0.16 m aft so the axis is at (0, -0.09); the picture's stern boom is a tool arm that folds down for docking (`SM_Tiger_ToolArm`, `Tiger_Root["tool_arm_down_deg"]`; pointing aft it fails the moon pool). Checks all pass (`build/run_checks.sh`): moon pool 1.029 m, carousel 0.188 m, clamp 0 hits in 86 arm poses and the ship, BOARD to POOL clear. No hatch. Not in Unreal. "Tiger" is a working name. Details in its `README.md`. - Grouper Tender (2026-10-22, Blender only, built headless by a workflow: Designer, Coder, two Critique and fix rounds): `models/tender-grouper/Tender_Grouper.blend`, after the user's AI-drawn blueprint "SUBTUB CLASS DS-ST-001" (*"create me 3d model of this tender from this blueprint exactly"*) and a concept render of the same sub sent during the work (*"Check this picture as a referance"*). My division: the blueprint rules shape (SIDE first), the concept the look (dark gunmetal hull, cyan light strips and circuit traces, glowing hexagon lens on the nose drum, "Subtub 1" in title case; the flag a generic striped mark, no national flag). Scale 17.1 mm per sheet pixel, set by the drawn top ring, which has the Kazah collar's radii (it IS the docking collar; hatch inside); the sheet's size labels contradict each other. 7.45 x 2.70 m, keel z -1.73 to the collar's lip 1.375. Two seats side by side (moved inboard to see out of the front window), side doors, hatch, rotor, folding antenna. Moon pool 1.457 m, clamp 86 poses 0 hits, carousel and BOARD-to-POOL clear (the Tiger's check chain). FBX with LODs + UCX + `Grouper_layout.json`; not in Unreal. "Grouper" is a working name. Details in its `README.md`. - Aethel-9 (2026-10-22, Blender only, built headless by me): `models/tender-aethel/Tender_Aethel.blend`, after the user's blue blueprint "AETHEL-9 / TERRAFORMING UNIT 02" (*"create me 3d model of this blueprint exactly in blender"*). The name is the sheet's. 12.5 mm per sheet px (6.5 m claw tip to stern); hull 5.86 m, 6.44 x 4.03 x 3.56 m overall; origin on the keel at mid hull. SIDE rules; the hull is one quad grid on an analytic surface with its seven windows and the hatch as grid rectangles (Laplace + Winslow), painted maps from the sheet through its parameter UVs. Two seats, two lower ducted-fan nacelles, two upper thrusters, lidar belt, two rigged arms, hatch; sliders on `Aethel_Root`, arm ranges cut to the clear region found by `build/ae_check.py`. **Not a Tender** (no clips, no moon pool checks: not asked). FBX + UCX + `Aethel_layout.json`; not in Unreal, no LODs. Details in its `README.md`. The same day the user sent the concept render (`reference/user_concept.jpg`) and asked for the model only (*"no only the model needs to be exact so topology and mesh correct it accordingly and texture it"*): the concept now rules the look and details (dark worn gunmetal, white lettering, blue-violet strips, a creased roof chamfer, a vented hood instead of the roof window, raised lower flank plates, winged upper thrusters, a turret hatch, boxy arms), checked from a camera fitted to it (`build/ae_concept_fit.py`). The white blueprint-only first version is in `versions/v01_blueprint_white/`. - The carrier has no model from the user yet. It is a procedural blockout in code. ## Second memory (Obsidian) The user asked on 2026-10-05 for the Obsidian vault to be the project's second memory: `D:\AI\Vault\EagerEagle\The Descent\`. Read `Reference\Unreal port state.md` there when a session starts cold (milestones, ids of running agents, next steps) and update it when a session ends or a track is merged. On 2026-10-08 the user widened this: **"from now on whatever you do write it down to obsidian its your second memory"**. Every session that does anything gets a chat note in `Chats\` (`YYYY-MM-DD short title`, session id in the frontmatter, linked from `The Descent MoC.md`). Write it as the work goes, after each task, not only at the end, because sessions get cut off by the usage limit. It holds what the user asked, what was changed and where, backups, decisions and what is still open. The vault rule note is `Rules\Write everything down in the vault.md`. ## The team the user asked for Designer (Opus) designs, Coder (Opus 5.5 since 2026-10-05; the user stopped Sonnet for coding) writes all the code, Critique (Opus) checks the result only against the user's stated requirements, and the main agent is the Administrator who relays between them and the user. ## The browser version (frozen reference) - `the-descent/` is v2: `src/NN_*` concatenated into `index.html` by `build.mjs`, `docs/DESIGN_V2.md`, `docs/BRIEF_V2.md`, `v1/`. It is also on GitHub: `Alazkhan/Alazkhan`, folder `the-descent/`, commit a5e0dfa. `descent_v2/` is the same v2 as first delivered. Do not edit either. - Published artifacts: v2 at https://claude.ai/artifact/SMvzDHgqztEVV6WdJBJpw8, v1 at https://claude.ai/artifact/RC9nRRgg7uZzTUo2oBYNTj. - It began in the claude.ai chat "Subnautica clone game design" (2026-09-28 to 09-29). ## Other folders - `models/` holds the user's own Blender models (Kazah, S-7.5 Prospector, BT-01, robotic arm). - `Assets/` holds third-party reference files the user collected. Do not import them unless told to. - `sub-v0/` is an older, unrelated browser prototype. - `website/` is the game's website (2026-10-14, the user: *"Create me a website about this game"*): one page that reads as a dive from Anchorage. **It is a teaser** (the user, after the first version told nearly all the public lore: *"dont tell everything its a mystery game dont spoil everything"*): premise, survival needs, carrier, Tenders and ore only; the strata below the Throat are black bars. Nothing public may tell the lore. The four augmentation stages render is not to be shown (*"it looks awfull unfortunately"*). `page.html` is the source, `build.py` makes `index.html` from it, `img/` holds web copies of renders and shots. The first, full-lore version is the local-only git branch `v1-full-lore-local` there; never push it. Published privately at https://claude.ai/artifact/DB6Kg82aWx7wHhQc5p2bJu (publish `page.html` with that URL to update it). It is titled "HADAL: The Descent" after the folder name; the user has not confirmed that title. Since the same day it is also public on GitHub Pages (the user: *"put it on github pages"*): https://alazkhan.github.io/hadal-the-descent/, repository `Alazkhan/hadal-the-descent`. `website/` is its own git repository (the project folder is still none); Pages serves the `gh-pages` branch. To update: edit `page.html`, run `build.py`, commit, `git push origin main main:gh-pages`, then republish the artifact. There is no `gh` on this PC; git signs in through Git Credential Manager (saved since the first push). - This folder is not a git repository. Node.js is not installed. Python 3.14 is at `E:\Tools\Programs\Python\python.exe`. ## Folder rename (2026-10-14) The project folder was renamed from `D:\SubnauticaCLONE` to `D:\HADAL - The Descent` at the user's request. The user wrote "HADAL:The Descent"; Windows does not allow ":" in a folder name. No session could do it (Windows refuses while any process works inside the folder, and the Claude app's own processes do), so the user renamed the folder by hand after a restart; `.tools\rename_project_folder.ps1 -AlreadyRenamed` then did the repairs (log beside it). Vault note: `Chats\2026-10-13 Project folder rename to HADAL - The Descent.md`. - `D:\SubnauticaCLONE` still exists as a **hidden link (junction)** to the new folder, so that sessions, .blend files and logs that name the old path keep working. Never delete it with a recursive delete. When the user says the old sessions are finished, remove only the link: `cmd /c rmdir "D:\SubnauticaCLONE"`. - Use the new path in all new work. A build started through the old path makes UnrealBuildTool recompile the module, because the project then seems to be somewhere else. - Claude's memory is `C:\Users\PC\.claude\projects\D--HADAL---The-Descent\memory`; `C:\Users\PC\.claude\projects\D--SubnauticaCLONE\memory` is a link to it. Transcripts of sessions started before the rename are still in `C:\Users\PC\.claude\projects\D--SubnauticaCLONE`. - `UE_SDKS_ROOT` is `D:\HADAL - The Descent\.tools\AutoSDK` (the user variable and the tool scripts). - Paths in logs, backups, `versions\` folders and the vault's chat notes still say `D:\SubnauticaCLONE`: they are records. - Only the folder was renamed. The Unreal project is still `TheDescent`, the vault folder still `The Descent`; the user has not said that the game's title changed.