@jgengine/node 0.4.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/CHANGELOG.md +66 -0
  2. package/package.json +7 -4
package/CHANGELOG.md ADDED
@@ -0,0 +1,66 @@
1
+ # Changelog
2
+
3
+ All eight `@jgengine/*` packages are versioned in lockstep, so this one file
4
+ covers every release. Format follows [Keep a Changelog](https://keepachangelog.com);
5
+ each release **leads with a Migrate block** — the concrete steps to move a game
6
+ from the previous version onto the new APIs — because the point of a bump is to
7
+ let consumers pick up the better stuff, not just to list what moved.
8
+
9
+ Agents building on the published SDK can also read this programmatically:
10
+ `import { VERSION, CHANGELOG } from "@jgengine/core/meta/changelog"` gives the
11
+ same data as typed values, so an updater can diff its installed version against
12
+ the latest and surface the migration steps.
13
+
14
+ ## Unreleased
15
+
16
+ _Nothing yet._
17
+
18
+ ## 0.6.0
19
+
20
+ An additive release: **every 0.5.0 API is unchanged**, so upgrading is only a
21
+ version bump. The headline is a whole outdoor-world layer — composable
22
+ `environment(...)` descriptors, renderer-free query primitives so gameplay reads
23
+ the same world the shell renders, a standalone rigid-body physics sim, and the
24
+ `@jgengine/shell` renderers that draw it all.
25
+
26
+ ### Migrate
27
+
28
+ - Bump every `@jgengine/*` dependency to `^0.6.0` (the eight packages version in lockstep).
29
+ - No code change is required — 0.6.0 adds surface, it doesn't move or remove any.
30
+ - Optional: describe an outdoor scene once with `environment({ terrain, weather, vegetation, water, structures })` from `@jgengine/core/world/features`. `@jgengine/shell`'s `EnvironmentScene` renders it (terrain, rain/snow, grass, ocean, buildings), and gameplay reads the same world through the renderer-free primitives — `resolveTerrainField(...)` for ground-snap/collision, `windField(...)` for sway/sailing, `waterSurface(...)` for buoyancy, `scatter(...)` for prop/spawn placement, `buildingIndex(...)` for placement avoidance — no three.js needed.
31
+
32
+ ### Added
33
+
34
+ - `@jgengine/core/world` query primitives — pure, renderer-free world sampling so gameplay and rendering read one source of truth. `world/terrain` (`TerrainField`, `noiseField`, `resolveTerrainField`, `resolveGroundStep` for slope-limited movement), `world/wind` (`windField` — one wind source for weather sway, grass, sailing, fire spread), `world/water` (`waterSurface` / `waterSurfaceFromDescriptor` — CPU Gerstner matching the ocean shader, for buoyancy and shorelines), `world/scatter` (`scatter` — seeded, overlap-aware point distribution for vegetation/props/spawns), `world/buildings` (`generateBuilding`, `generateBuildingDistrict`) and `world/buildingIndex` (`buildingIndex` — `at`/`within`/`nearest`/`isInside`/`blockers` over a district).
35
+ - `@jgengine/core/world/features` composable outdoor descriptors — `environment(...)` plus `terrain()`, `rain()`, `snow()`, `grass()`, `ocean()`, `building()`.
36
+ - `@jgengine/core/world/regions` (`createRegionField` — blend content-agnostic biomes by nearest selector, adding `tint`/`water`/`fog`/`speedMultiplier`/opaque `data`; extends `TerrainField` so it ground-snaps too) and `@jgengine/core/world/scatterItems` (`scatterItems` — region-driven content scatter: density per region, grounded, above-water/slope-aware, with `pickWeighted` for weighted rolls).
37
+ - `@jgengine/core/physics/physicsWorld` — standalone fixed-capacity rigid-body sim (SoA buffers, spatial-hash broadphase, sleeping) for many colliding dynamic bodies (piles, debris, stress scenes). Distinct from the `defineGame` `physics: { gravity }` character-controller config.
38
+ - `ctx.time` simulation clock (`@jgengine/core/time/simClock`) — `onTick`'s `dt` is now **game time**, so `rate * dt` decay/regen/AI obeys pause and fast-forward for free without per-system wiring. Configure with `defineGame({ time: { scale?, speeds?, dayLength?, start?, startPaused? } })` (all optional; default is real-time 1:1). `ctx.time` exposes `pause`/`play`/`toggle`/`setSpeed`/`cycleSpeed` + `snapshot()`/`calendar()`; `useGameClock()` binds it in React.
39
+ - `@jgengine/shell` environment/terrain/water/weather/structures renderers — `EnvironmentScene` mounts an `environment()` descriptor as R3F renderers; `GrassField`, `ProceduralGround`, `Ocean`, `RainField`, `SnowField`, `LightningStrike`, `GeneratedBuilding`, and `world/InstancedBodies` (renders `PhysicsWorld` bodies).
40
+ - `@jgengine/react/liveBind` — `useFrameBind` drives a DOM/SVG element from a per-frame value without re-rendering React (HUDs bound to live engine state never re-render or lag).
41
+
42
+ ## 0.5.0
43
+
44
+ An additive release: **every 0.4.0 API is unchanged**, so upgrading is only a
45
+ version bump. New pure primitives across progression, inventory slots, world
46
+ geometry, and React store bindings.
47
+
48
+ ### Migrate
49
+
50
+ - Bump every `@jgengine/*` dependency to `^0.5.0` (the eight packages version in lockstep).
51
+ - No code change is required — 0.5.0 adds surface, it doesn't move or remove any.
52
+ - Optional: replace a game's hand-rolled `progression/curves.ts` with the new `leveling(...)` track. `leveling({ xpForLevel: { kind: "power", base, exponent, round: "floor" }, maxLevel })` returns `xpForLevel`, `resolve`, and `grantXp(ctx.scene.entity.stats, userId, amount, onLevelUp?)` — a drop-in for the old `xpRequiredForLevel` / `resolveLevelProgress` / `grantXp` exports. `ctx.scene.entity.stats` satisfies the primitive's `LevelingStatAccess` structurally, so no adapter is needed.
53
+
54
+ ### Added
55
+
56
+ - `@jgengine/core/game/progression` — genre-agnostic progression primitive. `curve(spec)` / `evalCurve(spec, x)` evaluate declarative scalar curves (`const`, `linear`, `power`, `geometric`, `steps`, `piecewise`, each with optional `round`/`min`/`max`) for speed-by-level, difficulty-by-wave, loot drop-rate ramps, and similar scaling. `leveling(config)` builds the stateful XP→level track (threshold accumulation, multi-level grants, cap handling, `stat.levelUp` emit) on top of an `xpForLevel` curve.
57
+ - `@jgengine/core/inventory/slotModel` — pure slot-grid primitives (`createSlots`, `placeAt`, `removeAt`, `moveSlot`).
58
+ - `@jgengine/core/world/geometry`, `/world/interiors`, `/world/placement` — pure world primitives: grid snapping, footprint AABBs and overlap, interior/exterior spaces, and placement validation.
59
+ - `@jgengine/react/engineStore` — raw-store React bindings (`useEngineState`, `useEngineStore`, `useEngineEvent`).
60
+ - Pure/functional tiers for the `trade`, `unlocks`, `quest`, and `feed` verbs in `@jgengine/core/game`.
61
+
62
+ ## 0.4.0
63
+
64
+ Baseline release: the eight `@jgengine/*` packages (core, ws, sql, react,
65
+ convex, node, shell, assets) as the first tracked version. No migration —
66
+ this is the floor changelog entries are measured against.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jgengine/node",
3
- "version": "0.4.0",
3
+ "version": "0.6.0",
4
4
  "description": "Standalone authoritative game host for JGengine: in-memory server snapshots, tick loop, save-cadence flush, WebSocket server, memory/file persistence.",
5
5
  "license": "AGPL-3.0-only",
6
6
  "type": "module",
@@ -10,7 +10,10 @@
10
10
  "url": "git+https://github.com/Noisemaker111/jgengine.git",
11
11
  "directory": "packages/node"
12
12
  },
13
- "files": ["dist"],
13
+ "files": [
14
+ "dist",
15
+ "CHANGELOG.md"
16
+ ],
14
17
  "exports": {
15
18
  "./*": {
16
19
  "types": "./dist/*.d.ts",
@@ -23,8 +26,8 @@
23
26
  "test": "bun test src"
24
27
  },
25
28
  "dependencies": {
26
- "@jgengine/core": "^0.4.0",
27
- "@jgengine/ws": "^0.4.0",
29
+ "@jgengine/core": "^0.6.0",
30
+ "@jgengine/ws": "^0.6.0",
28
31
  "ws": "^8.18.0"
29
32
  },
30
33
  "devDependencies": {