Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions .claude/skills/jgengine-assets/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,10 @@
- `ExtractedSpriteFile` (interface): interface ExtractedSpriteFile — One SVG/PNG file pulled out of a sprite/icon-pack archive by `extractSpriteFiles`.
- `ExtractedTexture` (interface): interface ExtractedTexture — ⚠ undocumented
- `FetchLike` (type): type FetchLike = typeof fetch — ⚠ undocumented
- `MAX_ARCHIVE_COMPRESSION_RATIO` (const): const MAX_ARCHIVE_COMPRESSION_RATIO: 100 — Max allowed originalSize/size ratio for a single archive entry — past this it's treated as a zip bomb.
- `MAX_ARCHIVE_DOWNLOAD_BYTES` (const): const MAX_ARCHIVE_DOWNLOAD_BYTES: number — Max size of a downloaded (still-compressed) archive, in bytes. Provider zips run tens of MB; this leaves headroom without buffering an unbounded response.
- `MAX_ARCHIVE_ENTRY_COUNT` (const): const MAX_ARCHIVE_ENTRY_COUNT: 20000 — Max number of entries this module will extract out of one archive.
- `MAX_ARCHIVE_UNCOMPRESSED_BYTES` (const): const MAX_ARCHIVE_UNCOMPRESSED_BYTES: number — Max total uncompressed size this module will inflate out of one archive, in bytes.

## @jgengine/assets/find

Expand Down
4 changes: 4 additions & 0 deletions .claude/skills/jgengine-combat/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,10 @@
- `deathReasonFromEffect` (function): function deathReasonFromEffect(ctx: EffectDeathContext): DeathReason — ⚠ undocumented
- `normalizeOnDeath` (function): function normalizeOnDeath(spec: OnDeathSpec | null | undefined): NormalizedOnDeath — ⚠ undocumented

## @jgengine/core/combat/deathReason

- `DeathReason` (type): type DeathReason = | { kind: "player_kill"; killerUserId: string; via?: { item?: string } } | { kind: "environment"; source: string } | { kind: "self"; source: string } — Why an entity died — who or what gets credit, for drop/command rules and the `entity.died` event.

## @jgengine/core/combat/defensiveWindow

- `DefenseKind` (type): type DefenseKind = "parry" | "block" | "dodge" — ⚠ undocumented
Expand Down
45 changes: 34 additions & 11 deletions .claude/skills/jgengine-editor/api.md

Large diffs are not rendered by default.

7 changes: 5 additions & 2 deletions .claude/skills/jgengine-gameplay/api.md
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@

## @jgengine/core/game/connectedPlayers

- `ConnectedPlayer` (interface): interface ConnectedPlayer — A player currently joined to a hosted world — the unit a shared-world loop iterates instead of `ctx.player`.
- `ConnectedPlayer` (interface): interface ConnectedPlayer — A player currently joined to a hosted world — the unit a shared-world loop iterates instead of `ctx.player`. Frozen by the registry (see {@link ConnectedPlayers.get}); fields are `readonly` so a caller can't edit its own copy and assume the change stuck.
- `ConnectedPlayers` (interface): interface ConnectedPlayers — The set of players connected to one hosted world. A single-player game uses `ctx.player`; a shared-world loop reads `ctx.game.players` so `onTick` can advance every connected hero, not just the one local player. The host (`HostedGameRunner`) drives `join`/`leave`/`setInput`; game code reads `list`/`ids`/`has`/`count`/`input`.
- `createConnectedPlayers` (function): function createConnectedPlayers(): ConnectedPlayers — Build an empty {@link ConnectedPlayers} registry — the host joins/leaves players; the game loop reads them.

Expand Down Expand Up @@ -281,7 +281,7 @@
- `CombatTelegraphEvent` (interface): interface CombatTelegraphEvent — ⚠ undocumented
- `CombatVfxEvent` (interface): interface CombatVfxEvent — A transient sprite-particle effect the shell renders once and expires — one burst of `kind`, tinted `color`, anchored at `from` (and `to` for travel/beam effects).
- `CosmeticsChangedEvent` (interface): interface CosmeticsChangedEvent — ⚠ undocumented
- `DeathReason` (type): type DeathReason = | { kind: "player_kill"; killerUserId: string; via?: { item?: string } } | { kind: "environment"; source: string } | { kind: "self"; source: string } — ⚠ undocumented
- `DeathReason` (type): type DeathReason = | { kind: "player_kill"; killerUserId: string; via?: { item?: string } } | { kind: "environment"; source: string } | { kind: "self"; source: string } — Why an entity died — who or what gets credit, for drop/command rules and the `entity.died` event.
- `EmotePlayedEvent` (interface): interface EmotePlayedEvent — ⚠ undocumented
- `EntityAnimationEvent` (interface): interface EntityAnimationEvent — Request that an entity's rig play a one-shot animation clip bound to `event` in its `animation.oneShots` (e.g. an "attack" swing); the shell resolves the clip and plays it once over the locomotion state.
- `EntityDiedEvent` (interface): interface EntityDiedEvent — ⚠ undocumented
Expand Down Expand Up @@ -928,9 +928,12 @@

## @jgengine/core/random/rng

- `RandomSeed` (type): type RandomSeed = number & { readonly __randomSeed: unique symbol } — Opaque, serializable PRNG cursor for state machines that must persist their own random stream (a spawn director, a heat/pursuit meter) instead of holding a closure — the state round-trips through save/load and multiplayer sync, so it can't carry a function. Never read or do arithmetic on the raw value directly; thread it through {@link stepRandomSeed} only.
- `hashString` (function): function hashString(text: string): number — Deterministic 32-bit FNV-1a hash of a string → unsigned int. Same text, same number, on every platform — the stable seed behind per-id jitter, spread offsets, and content-addressed variation.
- `randomSeedFrom` (function): function randomSeedFrom(seed: number): RandomSeed — Wraps an already-integer seed (e.g. a `config.seed`) as a {@link RandomSeed} — no hashing.
- `seededRng` (function): function seededRng(seed: string | number): () => number — Deterministic pseudo-random generator seeded from a string or number — same seed, same sequence.
- `seededStreams` (function): function seededStreams(seed: string | number): (stream: string) => () => number — Derives independent, deterministic {@link seededRng} streams from one base seed, keyed by stream name.
- `stepRandomSeed` (function): function stepRandomSeed(seed: RandomSeed): readonly [value: number, next: RandomSeed] — One step of the {@link seededRng} recurrence in pure (seed in, seed out) form — the same mulberry32-style generator, shared by every state machine that persists its own PRNG cursor instead of closing over a generator.

## @jgengine/core/random/seedLink

Expand Down
44 changes: 0 additions & 44 deletions .claude/skills/jgengine-gameplay/capabilities.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,6 @@ Reach for these before hand-rolling. Each row is *the thing you need* → *the p

- `createCosmetics` (function) · `import { createCosmetics } from "@jgengine/core/game/cosmetics"`

## currency-format — format a currency amount with its symbol for display

- `formatCurrencyAmount` (function) · `import { formatCurrencyAmount } from "@jgengine/core/economy/currency"`

## dialogue-bridge — open/close the talkable→DialogueBox flow with no per-game store or command glue

- `createGameDialogue` (function) · `import { createGameDialogue } from "@jgengine/core/game/dialogue"`
Expand All @@ -40,19 +36,11 @@ Reach for these before hand-rolling. Each row is *the thing you need* → *the p

- `createSaveStore` (function) · `import { createSaveStore } from "@jgengine/core/game/saveStore"`

## inventory-grid — a bag of stackable items with add, remove, and move

- `createEmptyInventory` (function) · `import { createEmptyInventory } from "@jgengine/core/inventory/inventoryModel"`

## item-instance-registry — a runtime store for procedurally generated item instances

- `createItemInstanceRegistry` (function) · `import { createItemInstanceRegistry } from "@jgengine/core/item/itemInstanceRegistry"`
- `proceduralLootEntry` (function) · `import { proceduralLootEntry } from "@jgengine/core/item/itemInstanceRegistry"`

## lane-board — a lane-based card-battler board with per-lane outcomes

- `createLaneBoard` (function) · `import { createLaneBoard } from "@jgengine/core/board/laneBoard"`

## lap-splits — per-lap durations from a cumulative split book

- `lapDurations` (function) · `import { lapDurations } from "@jgengine/core/game/race"`
Expand Down Expand Up @@ -92,10 +80,6 @@ Reach for these before hand-rolling. Each row is *the thing you need* → *the p
- `createLootRegistry` (function) · `import { createLootRegistry } from "@jgengine/core/game/lootTable"`
- `lootTable` (function) · `import { lootTable } from "@jgengine/core/game/lootTable"`

## match-rounds — run buy/action/end round phases with per-round economy

- `createRoundState` (function) · `import { createRoundState } from "@jgengine/core/session/roundState"`

## modular-item — attach parts into item mount slots to compute combined stats

- `slotAccepts` (function) · `import { slotAccepts } from "@jgengine/core/item/modularItem"`
Expand Down Expand Up @@ -133,22 +117,10 @@ Reach for these before hand-rolling. Each row is *the thing you need* → *the p

- `createRaceState` (function) · `import { createRaceState } from "@jgengine/core/game/race"`

## role-assign — assign hidden or team roles to players by ratio

- `assignRoles` (function) · `import { assignRoles } from "@jgengine/core/session/roles"`

## run-modifiers — a roguelike run built from stacking drafted modifier picks

- `createRunDraft` (function) · `import { createRunDraft } from "@jgengine/core/game/runDraft"`

## shared-wallet — shared/group currency pools tracking per-member contributions

- `createWalletBook` (function) · `import { createWalletBook } from "@jgengine/core/economy/sharedWallet"`

## shop-trade — buy and sell goods against player currency balances

- `createTradeSystem` (function) · `import { createTradeSystem } from "@jgengine/core/game/trade"`

## social-emotes — emotes and social interactions between nearby players

- `createSocial` (function) · `import { createSocial } from "@jgengine/core/game/social"`
Expand All @@ -157,18 +129,6 @@ Reach for these before hand-rolling. Each row is *the thing you need* → *the p

- `createSpawnPoints` (function) · `import { createSpawnPoints } from "@jgengine/core/game/spawnPoints"`

## tech-tree — research nodes with prerequisites that unlock recipes

- `availableTech` (function) · `import { availableTech } from "@jgengine/core/economy/techTree"`

## tetris-inventory — a spatial grid inventory holding shaped multi-cell items

- `createShapedGrid` (function) · `import { createShapedGrid } from "@jgengine/core/inventory/shapedGrid"`

## timeline-board — a step-sequencer timeline board of timed slots

- `createTimelineBoard` (function) · `import { createTimelineBoard } from "@jgengine/core/board/timelineBoard"`

## toast-feed — queue of transient self-expiring on-screen messages (toasts, announcer, kill-feed)

- `appendToast` (function) · `import { appendToast } from "@jgengine/core/game/toasts"`
Expand All @@ -193,7 +153,3 @@ Reach for these before hand-rolling. Each row is *the thing you need* → *the p
## weighted-pick — pick one item from a set with an injected random source

- `pickUniform` (function) · `import { pickUniform } from "@jgengine/core/random/pick"`

## world-drops — spawn pickup-able items in the world, including death drops

- `createWorldItemStore` (function) · `import { createWorldItemStore } from "@jgengine/core/game/worldItem"`
Loading
Loading