diff --git a/README.md b/README.md index fbe9a57..e21af65 100644 --- a/README.md +++ b/README.md @@ -117,7 +117,7 @@ node dev/server.mjs 8080 home world starts with **Tether – Level 1** already installed; **Tether – Level 2** needs the level-2 tether research plus a world holding a level-1 tether, and installs in **20 s for 200 minerals** — the planet's - tether range then grows from 5120 to 6400 px (world state that outlives + tether range then grows from 5120 to 10240 px (world state that outlives the surface stay). While a build runs the whole deck is locked (BUILD stays open to watch the progress); completion fires the build's `effects` and a toast. Build records + the in-progress build persist in diff --git a/assets/images/originals/rocky-planet-01.png b/assets/images/originals/rocky-planet-01.png index 5d08da0..ca0aed3 100644 Binary files a/assets/images/originals/rocky-planet-01.png and b/assets/images/originals/rocky-planet-01.png differ diff --git a/assets/images/originals/rockey-planet-02.png b/assets/images/originals/rocky-planet-02.png similarity index 100% rename from assets/images/originals/rockey-planet-02.png rename to assets/images/originals/rocky-planet-02.png diff --git a/assets/images/originals/rocky-planet-03-a.png b/assets/images/originals/rocky-planet-03-a.png new file mode 100644 index 0000000..4713265 Binary files /dev/null and b/assets/images/originals/rocky-planet-03-a.png differ diff --git a/assets/images/originals/rocky-planet-03-b.png b/assets/images/originals/rocky-planet-03-b.png new file mode 100644 index 0000000..288ac7e Binary files /dev/null and b/assets/images/originals/rocky-planet-03-b.png differ diff --git a/data/builds.json b/data/builds.json index f9e4c74..1ef4f15 100644 --- a/data/builds.json +++ b/data/builds.json @@ -57,7 +57,7 @@ }, "tether-l2": { "label": "Tether - Level 2", - "description": "Extends the planet's tether to level 2: the field's range grows from 5120 px to 6400 px around the world. Requires the level-2 tether research and a planet already holding a level-1 tether. Installed in 20 seconds for 200 minerals.", + "description": "Extends the planet's tether to level 2: the field's range grows from 5120 px to 10240 px around the world. Requires the level-2 tether research and a planet already holding a level-1 tether. Installed in 20 seconds for 200 minerals.", "icon": "tether2", "category": "planet", "targets": ["planet"], diff --git a/data/landing.json b/data/landing.json index 7230eee..7701fb0 100644 --- a/data/landing.json +++ b/data/landing.json @@ -41,10 +41,10 @@ }, "videos": [ { "land": "terran-land-01.mp4", "surface": "terran-surface-01.mp4", "takeoff": "terran-takeoff-01.mp4", "shop": "terran-shop-01.mp4" }, - { "land": "terran-land-02.mp4", "surface": "terran-surface-01.mp4", "takeoff": "terran-takeoff-02.mp4", "shop": "terran-shop-01.mp4" }, + { "land": "terran-land-02.mp4", "surface": "terran-surface-02.mp4", "takeoff": "terran-takeoff-02.mp4", "shop": "terran-shop-01.mp4" }, { "land": "terran-land-01.mp4", "surface": "terran-surface-01.mp4", "takeoff": "terran-takeoff-01.mp4", "shop": "terran-shop-01.mp4" }, { "land": "gasgiant-land-01.mp4", "surface": "terran-surface-01.mp4", "takeoff": "gasgiant-takeoff-01.mp4", "shop": "terran-shop-01.mp4" }, - { "land": "gasgiant-land-02.mp4", "surface": "terran-surface-01.mp4", "takeoff": "gasgiant-takeoff-02.mp4", "shop": "terran-shop-01.mp4" }, - { "land": "gasgiant-land-01.mp4", "surface": "terran-surface-01.mp4", "takeoff": "gasgiant-takeoff-01.mp4", "shop": "terran-shop-01.mp4" } + { "land": "gasgiant-land-02.mp4", "surface": "terran-surface-02.mp4", "takeoff": "gasgiant-takeoff-02.mp4", "shop": "terran-shop-01.mp4" }, + { "land": "gasgiant-land-03.mp4", "surface": "terran-surface-01.mp4", "takeoff": "gasgiant-takeoff-03.mp4", "shop": "terran-shop-01.mp4" } ] } diff --git a/data/planets.json b/data/planets.json index 292ed54..bd20ebf 100644 --- a/data/planets.json +++ b/data/planets.json @@ -6,7 +6,7 @@ "scale": 1.0, "frames": { "terran": [0, 1, 2], - "rocky": [0, 1, 2], + "rocky": [6, 7, 8], "gas": [3, 4, 5], "ice": [0, 1, 2], "lava": [0, 1, 2] diff --git a/data/research/exploration.json b/data/research/exploration.json index 5e38188..74ec45e 100644 --- a/data/research/exploration.json +++ b/data/research/exploration.json @@ -1,5 +1,5 @@ { - "_comment": "EXPLORATION — the player's reach. Tether tech raises the home tether's level (effects.tether.level → TetherField.setLevel; radius = 5,120 × 1.25^(level−1), see data/tether.json and docs/PROJECT_NOTES.md) — except Tether Level 2, which is the BLUEPRINT only (effects: {}): the player installs it as a TETHER - LEVEL 2 build on a world holding a level-1 tether (data/builds.json → tether-l2; the build carries the effect). Tether Anchoring and Signal Amplification grant capability flags (seam) that future mechanics read. Node contract: `requires` = parents that must be RESEARCHED first (the DAG edges — authoritative); `unlocks` = what completing the tech opens: `builds` (ids in data/builds.json the tech makes available — the build's own `requires` is the authoritative gate, this list is the declaration, and the test keeps the two in lock-step) and `research` (a readable mirror of the children's `requires` edges); `effects` = what the scene applies on completion. `starting` = already researched on a fresh run, so its children are available the first time the console opens. duration is in research.timeUnit (seconds); 0 = granted, never researched.", + "_comment": "EXPLORATION — the player's reach. Tether tech raises the home tether's level (effects.tether.level → TetherField.setLevel; radius = 5,120 × 2^(level−1), see data/tether.json and docs/PROJECT_NOTES.md) — except Tether Level 2, which is the BLUEPRINT only (effects: {}): the player installs it as a TETHER - LEVEL 2 build on a world holding a level-1 tether (data/builds.json → tether-l2; the build carries the effect). Tether Anchoring and Signal Amplification grant capability flags (seam) that future mechanics read. Node contract: `requires` = parents that must be RESEARCHED first (the DAG edges — authoritative); `unlocks` = what completing the tech opens: `builds` (ids in data/builds.json the tech makes available — the build's own `requires` is the authoritative gate, this list is the declaration, and the test keeps the two in lock-step) and `research` (a readable mirror of the children's `requires` edges); `effects` = what the scene applies on completion. `starting` = already researched on a fresh run, so its children are available the first time the console opens. duration is in research.timeUnit (seconds); 0 = granted, never researched.", "starting": ["tether_l1"], "nodes": { "tether_l1": { @@ -13,7 +13,7 @@ }, "tether_l2": { "label": "Tether Level 2", - "description": "A second stage of field power. The blueprint for a stronger tether: install it with a TETHER - LEVEL 2 build on a world that holds a level-1 tether (200 minerals, 20 s — data/builds.json) and that world's boundary ring pulls out to 6,400 m.", + "description": "A second stage of field power. The blueprint for a stronger tether: install it with a TETHER - LEVEL 2 build on a world that holds a level-1 tether (200 minerals, 20 s — data/builds.json) and that world's boundary ring pulls out to 10,240 m.", "icon": "tether", "duration": 60, "requires": ["tether_l1"], @@ -22,7 +22,7 @@ }, "tether_l3": { "label": "Tether Level 3", - "description": "Third stage: 8,000 m of tether. The outer belt of an average system sits comfortably inside the ring — less time parked on the line, more time working it.", + "description": "Third stage: 20,480 m of tether. The outer belt of an average system sits comfortably inside the ring — less time parked on the line, more time working it.", "icon": "tether", "duration": 150, "requires": ["tether_l2"], @@ -31,7 +31,7 @@ }, "tether_l4": { "label": "Tether Level 4", - "description": "Fourth stage: 10,000 m. At this level every object of a ten-body system — all the worlds and stations — lies inside one ring around your anchor, and the barrier stops meaning anything out here.", + "description": "Fourth stage: 40,960 m. At this level every object of a ten-body system — all the worlds and stations — lies inside one ring around your anchor, and the barrier stops meaning anything out here.", "icon": "tether", "duration": 300, "requires": ["tether_l3"], diff --git a/data/tether.json b/data/tether.json index dfdaded..7362d2c 100644 --- a/data/tether.json +++ b/data/tether.json @@ -1,7 +1,7 @@ { "_comment": "TETHER — the player's range. A tether anchors on a world or station and defines a circular zone: radius = distance from the anchor's center. Level 1 = 5120 px (design rule); radius(level) = level1Radius × radiusGrowth^(level−1). The ship may fly anywhere in the UNION of its tethers' zones — where zones overlap there is no line and no wall; outside all of them is a hard barrier, drawn as a thick cyberpunk glitch dotted line along the union's boundary. homeId/homeLevel/homeLabel = the tether the player starts with (anchored on the home world, which sits at the system origin). line = the barrier's look & motion (dash/gap px along the rim, thicknesses, march speed = how fast dashes flow, colors/alphas = the neon passes, glitch = ambient bursts: dash flicker, radial displacement, sparks). contact = feedback when the ship bumps the barrier (pulse = the local shudder of the line; toastCooldown = console warning throttle, ms).", "level1Radius": 5120, - "radiusGrowth": 1.25, + "radiusGrowth": 2.0, "maxLevel": 12, "homeId": "home", "homeLevel": 1, diff --git a/dev/asteroids.test.mjs b/dev/asteroids.test.mjs index b4a9be7..714d2e1 100644 --- a/dev/asteroids.test.mjs +++ b/dev/asteroids.test.mjs @@ -78,7 +78,7 @@ check('distribution has target/min/max/jitter', Number.isFinite(D.targetObjects) check('starting system minimum ≥ 2', (D.startingSystemMinClusters ?? 2) >= 2); const P = A.placement ?? {}; check('placement rules present', P.minObjectSpacing === 1024 && P.minRadius > 0 && P.maxRadius >= P.minRadius); -const TETHER = config.get('tether.level1Radius', 5120) * Math.pow(config.get('tether.radiusGrowth', 1.25), Math.max(1, Math.floor(config.get('tether.homeLevel', 1))) - 1); +const TETHER = config.get('tether.level1Radius', 5120) * Math.pow(config.get('tether.radiusGrowth', 2.0), Math.max(1, Math.floor(config.get('tether.homeLevel', 1))) - 1); // --- Name synthesis --------------------------------------------------------- { diff --git a/dev/tether-flow.html b/dev/tether-flow.html new file mode 100644 index 0000000..889fb6a --- /dev/null +++ b/dev/tether-flow.html @@ -0,0 +1,17 @@ + + +
+ +