summaryrefslogtreecommitdiff
path: root/src/SomhairlesDream.Modeling
diff options
context:
space:
mode:
authorSomhairle H. Marisol <[email protected]>2026-09-21 15:16:23 +0800
committerSomhairle H. Marisol <[email protected]>2026-09-21 15:16:23 +0800
commitd2a4cb4e645979f20c22a5c46c1c767db460f54a (patch)
tree3ffe0d01552a0b4ae66d476ab030e71937191e6b /src/SomhairlesDream.Modeling
parent26bdd272e3d26040a8c9b64b302fd94d7b6be978 (diff)
downloadsomhairles-dream-fsharp-d2a4cb4e645979f20c22a5c46c1c767db460f54a.tar.gz
feat(ship): HNX-01 crewed starship design branch (7-step ship.py, --design ship, 409 replays completed run history)
Diffstat (limited to 'src/SomhairlesDream.Modeling')
-rw-r--r--src/SomhairlesDream.Modeling/BlenderBridge.fs5
-rw-r--r--src/SomhairlesDream.Modeling/Definitions.fs86
2 files changed, 89 insertions, 2 deletions
diff --git a/src/SomhairlesDream.Modeling/BlenderBridge.fs b/src/SomhairlesDream.Modeling/BlenderBridge.fs
index c4215ae..0f605b0 100644
--- a/src/SomhairlesDream.Modeling/BlenderBridge.fs
+++ b/src/SomhairlesDream.Modeling/BlenderBridge.fs
@@ -102,7 +102,10 @@ type BlenderProcessBridge(python: string, stageRoot: string, ?timeout: TimeSpan)
File.WriteAllText(path, content)
member private _.ScriptPath(stepId: string) =
- let scriptName = if stepId.StartsWith("probe-") then "probe.py" else "fixture.py"
+ let scriptName =
+ if stepId.StartsWith("probe-") then "probe.py"
+ elif stepId.StartsWith("ship-") then "ship.py"
+ else "fixture.py"
Path.GetFullPath(Path.Combine(stageRoot, "blender", scriptName))
diff --git a/src/SomhairlesDream.Modeling/Definitions.fs b/src/SomhairlesDream.Modeling/Definitions.fs
index 9a9256e..e1d2739 100644
--- a/src/SomhairlesDream.Modeling/Definitions.fs
+++ b/src/SomhairlesDream.Modeling/Definitions.fs
@@ -92,5 +92,89 @@ module Design =
ObjectIds = prior (prior (prior (prior (prior (prior bus booms) rtgs) hga) instruments) mast) [||]
Changes = liveryChanges } |]
+ // HNX-01 crewed interstellar starship (Concept A "Keel"): fusion-torch
+ // study with a spin-gravity habitat torus, water-shadow radiation
+ // shield and an axial keel separating crew from the reactor section.
+ // Display-scale visual research; no mass/thrust/shielding closure is
+ // claimed — the ship.py module header lists the deliberately open
+ // engineering problems.
+ let shipSteps : DesignStep array =
+ let keel =
+ [| "starship.keel.spine"; "starship.nose.cone"; "starship.dock.ring" |]
+ let hab =
+ [| "starship.hab.torus"; "starship.hub.core"
+ "starship.spoke.00"; "starship.spoke.01"; "starship.spoke.02"
+ "starship.spoke.03"; "starship.spoke.04"; "starship.spoke.05" |]
+ let radiation =
+ [| "starship.shadow.collar"; "starship.storm.cellar" |]
+ let reactor =
+ [| "starship.core.pressure"; "starship.core.shield.plug"
+ "starship.nozzle.magnetic"
+ "starship.radiator.00"; "starship.radiator.01"; "starship.radiator.02"
+ "starship.radiator.03"; "starship.radiator.04"; "starship.radiator.05" |]
+ let power =
+ [| "starship.power.truss"; "starship.capacitor.ring"
+ "starship.comm.dish"; "starship.comm.feed" |]
+ let cabin =
+ [| "starship.window.00"; "starship.window.01"; "starship.window.02"
+ "starship.window.03"
+ "starship.airlock.ring"; "starship.airlock.tunnel"
+ "starship.cargo.pod.00"; "starship.cargo.pod.01" |]
+ let prior (prefix: string array) (current: string array) =
+ Array.append prefix current
+
+ let keelChanges =
+ [| { ObjectId = "starship.keel.spine"; Kind = "add"; Summary = "Add axial keel spine from bow to nozzle bay" }
+ { ObjectId = "starship.nose.cone"; Kind = "add"; Summary = "Add forward nose cone" }
+ { ObjectId = "starship.dock.ring"; Kind = "add"; Summary = "Add forward docking ring" } |]
+ let habChanges =
+ Array.append
+ [| { ObjectId = "starship.hab.torus"; Kind = "add"; Summary = "Add rotating spin-gravity habitat torus" }
+ { ObjectId = "starship.hub.core"; Kind = "add"; Summary = "Add zero-g hub with bearing core" } |]
+ (Array.init 6 (fun index ->
+ { ObjectId = sprintf "starship.spoke.%02d" index; Kind = "add"; Summary = "Add pressurized transfer spoke" }))
+ let radiationChanges =
+ [| { ObjectId = "starship.shadow.collar"; Kind = "add"; Summary = "Add water-shadow radiation collar" }
+ { ObjectId = "starship.storm.cellar"; Kind = "add"; Summary = "Add storm cellar shelter volume" } |]
+ let reactorChanges =
+ Array.append
+ [| { ObjectId = "starship.core.pressure"; Kind = "add"; Summary = "Add fusion core pressure vessel" }
+ { ObjectId = "starship.core.shield.plug"; Kind = "add"; Summary = "Add reactor shield plug" }
+ { ObjectId = "starship.nozzle.magnetic"; Kind = "add"; Summary = "Add magnetic exhaust nozzle" } |]
+ (Array.init 6 (fun index ->
+ { ObjectId = sprintf "starship.radiator.%02d" index; Kind = "add"; Summary = "Add waste-heat radiator panel" }))
+ let powerChanges =
+ [| { ObjectId = "starship.power.truss"; Kind = "add"; Summary = "Add power conditioning truss" }
+ { ObjectId = "starship.capacitor.ring"; Kind = "add"; Summary = "Add pulsed-power capacitor hoop" }
+ { ObjectId = "starship.comm.dish"; Kind = "add"; Summary = "Add high-gain communication dish" }
+ { ObjectId = "starship.comm.feed"; Kind = "add"; Summary = "Add communication feed horn" } |]
+ let cabinChanges =
+ Array.append
+ (Array.init 4 (fun index ->
+ { ObjectId = sprintf "starship.window.%02d" index; Kind = "add"; Summary = "Add habitat observation window" }))
+ [| { ObjectId = "starship.airlock.ring"; Kind = "add"; Summary = "Add forward airlock ring" }
+ { ObjectId = "starship.airlock.tunnel"; Kind = "add"; Summary = "Add pressurized airlock tunnel" }
+ { ObjectId = "starship.cargo.pod.00"; Kind = "add"; Summary = "Add port cargo pod" }
+ { ObjectId = "starship.cargo.pod.01"; Kind = "add"; Summary = "Add starboard cargo pod" } |]
+ let liveryChanges =
+ [| { ObjectId = "starship.keel.spine"; Kind = "update"; Summary = "Livery pass: bone-white hull structure" }
+ { ObjectId = "starship.hab.torus"; Kind = "update"; Summary = "Livery pass: habitat ring bone finish" }
+ { ObjectId = "starship.shadow.collar"; Kind = "update"; Summary = "Livery pass: ceramic shield darkening" }
+ { ObjectId = "starship.storm.cellar"; Kind = "update"; Summary = "Livery pass: ceramic cellar finish" }
+ { ObjectId = "starship.dock.ring"; Kind = "update"; Summary = "Livery pass: amber accent on dock ring" }
+ { ObjectId = "starship.capacitor.ring"; Kind = "update"; Summary = "Livery pass: amber capacitor hoop" }
+ { ObjectId = "starship.window.00"; Kind = "update"; Summary = "Livery pass: glass glazing" }
+ { ObjectId = "starship.nozzle.magnetic"; Kind = "update"; Summary = "Livery pass: nozzle coil graphite" } |]
+
+ [| { StepId = "ship-01-keel"; Index = 0; ObjectIds = keel; Changes = keelChanges }
+ { StepId = "ship-02-hab"; Index = 1; ObjectIds = Array.append keel hab; Changes = habChanges }
+ { StepId = "ship-03-radiation"; Index = 2; ObjectIds = Array.append (Array.append keel hab) radiation; Changes = radiationChanges }
+ { StepId = "ship-04-reactor"; Index = 3; ObjectIds = Array.append (Array.append (Array.append keel hab) radiation) reactor; Changes = reactorChanges }
+ { StepId = "ship-05-power"; Index = 4; ObjectIds = Array.append (Array.append (Array.append (Array.append keel hab) radiation) reactor) power; Changes = powerChanges }
+ { StepId = "ship-06-cabin"; Index = 5; ObjectIds = Array.append (Array.append (Array.append (Array.append (Array.append keel hab) radiation) reactor) power) cabin; Changes = cabinChanges }
+ { StepId = "ship-07-livery"; Index = 6; ObjectIds = Array.append (Array.append (Array.append (Array.append (Array.append (Array.append keel hab) radiation) reactor) power) cabin) [||]; Changes = liveryChanges } |]
+
let forProject (projectId: string) : DesignStep array =
- if projectId.StartsWith("probe-") then probeSteps else steps
+ if projectId.StartsWith("probe-") then probeSteps
+ elif projectId.StartsWith("ship-") then shipSteps
+ else steps