@adatechnology/game-crowd 0.0.0-stage → 0.2.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/crowd.ts","../src/data/defaults.json","../src/doors.ts","../src/grid.ts","../src/rng.ts","../src/store.ts","../src/types.ts","../src/behaviours/civilians.ts","../src/behaviours/herd.ts","../src/behaviours/flock.ts","../src/behaviours/infection.ts"],"sourcesContent":["import { createCorpseLedger } from '@adatechnology/game-characters'\nimport type { CorpseLedger } from '@adatechnology/game-characters'\n\nimport defaults from './data/defaults.json'\nimport { createDoors } from './doors'\nimport type { Doors } from './doors'\nimport { createNavGrid } from './grid'\nimport type { NavGrid } from './grid'\nimport { createRng } from './rng'\nimport { AGENT_FIELDS, createStore } from './store'\nimport type { CrowdStore } from './store'\nimport { STATE } from './types'\nimport type { CrowdDamageResult, CrowdEventMap, CrowdEventName, CrowdHit, CrowdPack, CrowdTarget, CrowdType } from './types'\n\nexport type CrowdNumbers = typeof defaults.numbers\nexport type CrowdBand = { readonly max: number; readonly dt: number }\n/** The game's numbers; `bands[3].max` is `Infinity` (JSON keeps it as null). */\nexport const CROWD_DEFAULTS: { readonly sources: Readonly<Record<string, string>>; readonly bands: readonly CrowdBand[]; readonly numbers: CrowdNumbers } = {\n sources: defaults.sources,\n bands: defaults.bands.map((band) => ({ max: band.max ?? Infinity, dt: band.dt })),\n numbers: defaults.numbers,\n}\n\n/** A body on the ground (G 67062 `CP`). */\nexport type Corpse = {\n readonly x: number\n readonly z: number\n readonly yaw: number\n readonly height: number\n readonly build: number\n readonly missing: number\n readonly color: number\n /** Body variant of the renderer, -1 for a body that was not an agent (a civilian). */\n readonly variant: number\n readonly skin: number\n readonly seed: number\n readonly named: number\n}\n\n/** A custom move: runs on every decision tick after the timed states and before the moves on the target; `true` means it took care of the movement. */\nexport type CrowdPlugin = {\n readonly id: string\n ability?(crowd: Crowd, i: number, context: { d: number; dx: number; dz: number; tdt: number; band: number; alive: boolean }): boolean\n}\n\n/** A migration: `count` agents every `every` s (the first after `numbers.migrationFirst`), born in the box at (x, z) and walking to `goal`. */\nexport type MigrationOptions = { readonly every: number; readonly count: number; readonly x: number; readonly z: number; readonly width: number; readonly depth: number; readonly goal: readonly [number, number] }\n\nexport type CrowdOptions = {\n readonly pack: CrowdPack\n readonly random?: () => number\n readonly seed?: number\n readonly capacity?: number\n readonly grid?: NavGrid\n readonly doors?: Doors\n /** Water at (x, z): the drowned swim, the charred lose health (the game's `POOL`). */\n readonly water?: (x: number, z: number) => boolean\n readonly numbers?: Partial<CrowdNumbers>\n readonly bands?: readonly CrowdBand[]\n /** Flow field: half window in cells (192), and the clock its time budget reads (default `performance.now`; pass `() => 0` to finish every field in one frame). */\n readonly flow?: { readonly radius?: number; readonly clock?: () => number }\n readonly plugins?: readonly CrowdPlugin[]\n readonly target?: CrowdTarget | null\n}\n\nexport type CrowdView = { readonly x: number; readonly z: number; readonly yaw: number; readonly far: number }\n\nexport type CrowdUpdateContext = {\n readonly target?: CrowdTarget | null\n /** 0 day, 1 night: sight drops by 40% at night. */\n readonly nightFactor?: number\n /** Where the flow field converges (the target by default; the foot of a ladder when the target is on a roof). */\n readonly flowTarget?: readonly [number, number]\n /** Where the viewer looks (yaw: forward is `(-sin, -cos)`); the stalker wakes when the target turns its back. Default: the target's view. */\n readonly viewYaw?: number\n}\n\nexport type Crowd = {\n readonly store: CrowdStore\n readonly pack: CrowdPack\n readonly grid: NavGrid\n readonly doors: Doors\n readonly corpses: CorpseLedger<Corpse>\n readonly numbers: CrowdNumbers\n readonly stats: { bands: [number, number, number, number]; slots: number; kills: number; heads: number }\n /** Height of the bodies piled per grid cell. */\n readonly pile: Float32Array\n /** How many agents are steps of a pile now. */\n pileCount(): number\n readonly trail: { x: number; z: number; t: number }[]\n /** Global variant index of each type's variants (G 67079 `ZVAR_OF`). */\n readonly variantsOf: readonly (readonly number[])[]\n target: CrowdTarget | null\n /** The stream every draw takes (the behaviours share it, in the game's order). */\n readonly random: () => number\n /** Emits a `sound` event, as the crowd's own (for the behaviours). */\n sound(id: string, volume: number, x: number, y: number, z: number, distance: number): void\n /** Emits an `effect` event, as the crowd's own (for the behaviours). */\n effect(payload: CrowdEventMap['effect']): void\n typeIndex(id: string): number\n spawn(x: number, z: number, type?: number): number\n remove(i: number): void\n update(dt: number, context?: CrowdUpdateContext): void\n emitNoise(x: number, z: number, radius: number): void\n damage(i: number, hit: CrowdHit): CrowdDamageResult\n kill(i: number, headshot?: boolean): void\n /** The blood trail of the target, for the trackers (G 67238 `trailUpdate`). */\n updateTrail(dt: number, target?: CrowdTarget | null): void\n updateCorpses(dt: number): void\n /** Keeps the count near `target` from the edge, removes the excess out of sight and sends a migration now and then (G 67158). */\n updatePopulation(dt: number, view: CrowdView, options?: { readonly target?: number; readonly migration?: MigrationOptions | null }): void\n /** Spawns one agent `minD` to `maxD` m from the target, out of the view (G 67141 `spawnAway`). */\n spawnAway(minD: number, maxD: number, view: CrowdView): number\n /** A blast at the base of a pile undoes it (G 67227 `pileBlast`). */\n pileBlast(x: number, z: number, radius: number): void\n /** The agent hunts something else than the target (a civilian): `game-crowd` civilians set it. */\n setHunt(hunt: ((i: number, tdt: number) => boolean) | null): void\n /** The chase speed of agent `i` now (the stalker's sprint, the drowned in water; G 67343 `zChaseSpeed`). */\n chaseSpeed(i: number): number\n /** The interface `game-player` uses to push, cut and be held by the agents. */\n asPlayerCrowd(): PlayerCrowdLike\n on<K extends CrowdEventName>(event: K, listener: (event: CrowdEventMap[K]) => void): () => void\n}\n\n/** The same shape as `game-player`'s `PlayerCrowd` (structural, no dependency). */\nexport type PlayerCrowdLike = {\n count(): number\n active(i: number): boolean\n x(i: number): number\n z(i: number): number\n y(i: number): number\n floor(i: number): number\n chasing(i: number): boolean\n down(i: number): boolean\n panicWeight(i: number): number\n hold(i: number, x: number, z: number, k: number, lookX: number, lookZ: number): void\n stun(i: number, seconds: number, vx: number, vz: number): void\n chase(i: number, cooldown: number): void\n damage(i: number, hit: { region: number; amount: number; distance: number; cut: number }): void\n}\n\nconst clamp = (v: number, a: number, b: number): number => (v < a ? a : v > b ? b : v)\nconst TAU_APPROX = 6.2832\nconst TURN = 6.28\n\n/**\n * The crowd: a literal port of the team game's horde (`jogo.js` G 66714-67430). One struct of arrays, relevance bands R0-R3 with hysteresis, perception\n * by sight, hearing and smell, the sliced flow field, the spatial hash, separation, six attack slots, chain alerts, doors, piles against walls, the\n * abilities as type traits, corpses, the blood trail and the population. Every draw on `random` is in the game's order.\n */\nexport function createCrowd(options: CrowdOptions): Crowd {\n const random = options.random ?? createRng(options.seed ?? 1)\n const R = random\n const pack = options.pack\n const types: readonly CrowdType[] = pack.types\n const N: CrowdNumbers = { ...CROWD_DEFAULTS.numbers, ...options.numbers }\n const BANDS = options.bands ?? CROWD_DEFAULTS.bands\n const HYST = N.hysteresis\n const grid = options.grid ?? createNavGrid()\n const doors = options.doors ?? createDoors(grid, { random })\n const water = options.water ?? (() => false)\n const plugins = options.plugins ?? []\n const clock = options.flow?.clock ?? (() => (typeof performance === 'undefined' ? Date.now() : performance.now()))\n const FLOW_R = options.flow?.radius ?? N.flowRadius\n const Z = createStore(options.capacity ?? N.capacity)\n const { occ, occH, cellOf, solidAt } = grid\n const HALF = grid.half\n const GC = grid.cell\n const FW = grid.n\n const HC = N.hashCell\n const HN = Math.floor(grid.size / HC)\n const hHead = new Int32Array(HN * HN)\n const hNext = new Int32Array(Z.capacity)\n const pile = new Float32Array(FW * FW)\n let pileN = 0\n const flow = {\n dir: new Int8Array(FW * FW * 2),\n back: new Int8Array(FW * FW * 2),\n dist: new Float32Array(FW * FW),\n q: new Int32Array((2 * FLOW_R + 1) ** 2 * 2),\n phase: 0,\n qh: 0,\n qt: 0,\n c: 0,\n t: 0,\n cell: -1,\n ms: 0,\n win: [0, 0, -1, -1],\n winB: [0, 0, -1, -1],\n }\n const catTable: number[] = []\n types.forEach((c, i) => {\n for (let k = 0; k < c.weight; k++) catTable.push(i)\n })\n const variantsOf: number[][] = []\n {\n let next = 0\n types.forEach((type) => {\n const list: number[] = []\n for (let v = 0; v < (type.variants ?? 1); v++) list.push(next++)\n variantsOf.push(list)\n })\n }\n const typeIndexById = new Map(types.map((type, index) => [type.id, index]))\n const noises: { x: number; z: number; r: number }[] = []\n const stats: Crowd['stats'] = { bands: [0, 0, 0, 0], slots: 0, kills: 0, heads: 0 }\n const corpses = createCorpseLedger<Corpse>({ max: N.corpsesMax, seconds: N.corpseSeconds })\n const trail: { x: number; z: number; t: number }[] = []\n let trailLast = { x: 1e9, z: 1e9 }\n const killQ: number[] = []\n let groanBudget = 0\n let migrateT = N.migrationFirst\n let hunt: ((i: number, tdt: number) => boolean) | null = null\n let target: CrowdTarget | null = options.target ?? null\n let nightF = 0\n let viewYaw = 0\n const listeners = new Map<CrowdEventName, Set<(event: never) => void>>()\n const emit = <K extends CrowdEventName>(event: K, payload: CrowdEventMap[K]): void => {\n const set = listeners.get(event)\n if (set) for (const listener of set) (listener as (event: CrowdEventMap[K]) => void)(payload)\n }\n const emitNoise = (x: number, z: number, r: number): void => void noises.push({ x, z, r })\n doors.on('noise', (e) => emitNoise(e.x, e.z, e.radius))\n doors.on('sound', (e) => emit('sound', { ...e, distance: target ? Math.hypot(e.position[0] - target.state.x, e.position[2] - target.state.z) : 0 }))\n doors.on('effect', (e) => emit('effect', e))\n doors.on('broken', (e) => {\n const d = doors.list[e.door]!\n if (target && Math.hypot(d.x - target.state.x, d.z - target.state.z) < N.doorMessageDistance) emit('message', { id: 'door_broken', seconds: 2 })\n })\n const sound = (id: string, volume: number, x: number, y: number, z: number, d: number): void => emit('sound', { sound: id, volume, position: [x, y, z], distance: d })\n const pick = <T extends { p: number }>(list: readonly T[]): T => {\n const r = R()\n let acc = 0\n for (const it of list) {\n acc += it.p\n if (r < acc) return it\n }\n return list[0]!\n }\n const T = (i: number): CrowdType => types[Z.type[i]!]!\n const traits = (i: number) => T(i).traits ?? {}\n\n // ----- spawn and removal -----\n const special = (i: number): void => {\n const tr = traits(i)\n Z.y[i] = 0\n Z.floor[i] = 0\n Z.floorLocked[i] = 0\n Z.vy[i] = 0\n Z.abilityTimer[i] = 0\n Z.eaten[i] = 0\n Z.stuck[i] = 0\n Z.stepCell[i] = -1\n Z.burn[i] = 0\n Z.hunts[i] = -1\n Z.named[i] = -1\n if (tr.color !== undefined && !tr.submerged) {\n Z.color[i] = tr.color\n if (tr.skin !== undefined) Z.skin[i] = tr.skin\n }\n if (tr.ambush && R() < tr.ambush.chance) {\n Z.state[i] = STATE.DORMANT\n Z.yaw[i] = R() * TURN\n }\n if (tr.submerged) {\n Z.state[i] = STATE.DORMANT\n Z.y[i] = tr.submerged.depth\n if (tr.color !== undefined) Z.color[i] = tr.color\n }\n }\n\n const spawn = (x: number, z: number, catForce = -1): number => {\n if (Z.n >= Z.capacity) return -1\n const i = Z.n++\n const c = catForce >= 0 ? catForce : catTable[Math.floor(R() * catTable.length)]!\n const C = types[c]!\n const ai = pack.ages.indexOf(pick(pack.ages))\n const maxAge = C.traits?.maxAge\n const A = pack.ages[maxAge !== undefined ? Math.min(ai, maxAge) : ai]!\n const ri = pack.outfits.indexOf(pick(pack.outfits))\n const RO = pack.outfits[ri]!\n Z.x[i] = x\n Z.z[i] = z\n Z.vx[i] = Z.vz[i] = 0\n Z.type[i] = c\n Z.age[i] = pack.ages.indexOf(A)\n Z.outfit[i] = ri\n const g = (R() + R() + R() - 1.5) * 0.09\n Z.height[i] = clamp(1 + g, 0.9, 1.1) * (C.scale || 1)\n const bb = R()\n Z.build[i] = (bb < 0.3 ? 0.85 + R() * 0.1 : bb < 0.8 ? 0.95 + R() * 0.13 : 1.08 + R() * 0.17) * (C.build || (C.scale ? 1.3 : 1))\n const heavy = bb >= 0.8\n const thin = bb < 0.3\n Z.chaseSpeed[i] = C.speed.chase * A.speed * (thin ? 1.05 : heavy ? 0.9 : 1) * (0.92 + R() * 0.16)\n Z.wanderSpeed[i] = C.speed.wander * A.speed * (0.8 + R() * 0.4)\n Z.hpMax[i] = Z.hp[i] = C.health * A.health * (thin ? 0.9 : heavy ? 1.15 : 1)\n Z.headHp[i] = pack.segments.head\n Z.armHp[i * 2] = Z.armHp[i * 2 + 1] = pack.segments.arm\n Z.legHp[i * 2] = Z.legHp[i * 2 + 1] = pack.segments.leg\n Z.missing[i] = 0\n Z.helmet[i] = RO.helmet ? 1 : 0\n Z.crawl[i] = C.crawls ? 1 : 0\n Z.limp[i] = 0\n Z.state[i] = 0\n Z.stateTimer[i] = 0\n Z.lost[i] = 0\n Z.attackTimer[i] = R()\n Z.alertIn[i] = 0\n Z.cooldown[i] = 0\n {\n const vs = variantsOf[c]!\n Z.variant[i] = vs[Math.floor(R() * vs.length)]!\n }\n Z.yaw[i] = Z.renderYaw[i] = R() * TURN\n Z.renderSpeed[i] = 0\n Z.steering[i] = 0\n Z.pause[i] = 0\n Z.attackPose[i] = 0\n Z.arms[i] = 0\n Z.phase[i] = R() * 10\n Z.band[i] = 3\n Z.next[i] = R() * 0.05\n Z.wx[i] = x\n Z.wz[i] = z\n Z.color[i] = RO.color || pack.palette[Math.floor(R() * pack.palette.length)]!\n Z.skin[i] = R()\n special(i)\n emit('spawn', { agent: i, type: C.id })\n return i\n }\n\n const remove = (i: number): void => {\n if (Z.state[i] === STATE.PILE_STEP) stepRelease(i)\n const j = --Z.n\n if (i === j) {\n emit('remove', { agent: i, moved: -1 })\n return\n }\n for (const k of AGENT_FIELDS) (Z[k] as { [index: number]: number })[i] = (Z[k] as { [index: number]: number })[j]!\n Z.armHp[i * 2] = Z.armHp[j * 2]!\n Z.armHp[i * 2 + 1] = Z.armHp[j * 2 + 1]!\n Z.legHp[i * 2] = Z.legHp[j * 2]!\n Z.legHp[i * 2 + 1] = Z.legHp[j * 2 + 1]!\n if (target) {\n if (target.state.grabbedBy === j) target.state.grabbedBy = i\n else if (target.state.grabbedBy === i) target.state.grabbedBy = -1\n }\n emit('remove', { agent: i, moved: j })\n }\n\n // ----- the sliced flow field (no spike) -----\n const flowStart = (x: number, z: number): void => {\n const gx = clamp(Math.floor((x + HALF) / GC), 0, FW - 1)\n const gz = clamp(Math.floor((z + HALF) / GC), 0, FW - 1)\n const W = flow.winB\n W[0] = Math.max(0, gx - FLOW_R)\n W[1] = Math.max(0, gz - FLOW_R)\n W[2] = Math.min(FW - 1, gx + FLOW_R)\n W[3] = Math.min(FW - 1, gz + FLOW_R)\n for (let r = W[1]; r <= W[3]; r++) flow.dist.fill(1e9, r * FW + W[0], r * FW + W[2] + 1)\n const s = gz * FW + gx\n flow.dist[s] = 0\n flow.q[0] = s\n flow.qh = 0\n flow.qt = 1\n flow.phase = 1\n flow.c = 0\n flow.t = 0\n }\n const flowStep = (budget: number): void => {\n if (!flow.phase) return\n const t0 = clock()\n const D = flow.dist\n const Q = flow.q\n const F = flow.back\n const W = flow.winB\n let n = 0\n while (flow.phase === 1) {\n if (flow.qh >= flow.qt) {\n flow.phase = 2\n break\n }\n const c = Q[flow.qh++]!\n const cx = c % FW\n const cz = (c / FW) | 0\n const dc = D[c]!\n for (let dz = -1; dz <= 1; dz++)\n for (let dx = -1; dx <= 1; dx++) {\n if (!dx && !dz) continue\n const nx = cx + dx\n const nz = cz + dz\n if (nx < W[0]! || nz < W[1]! || nx > W[2]! || nz > W[3]!) continue\n const k = nz * FW + nx\n if (occ[k] && occ[k]! < 3) continue\n if (dx && dz && ((occ[cz * FW + nx] && occ[cz * FW + nx]! < 3) || (occ[nz * FW + cx] && occ[nz * FW + cx]! < 3))) continue\n const nd = dc + (dx && dz ? 1.414 : 1)\n if (nd < D[k]! - 1e-3) {\n D[k] = nd\n if (flow.qt < Q.length) Q[flow.qt++] = k\n }\n }\n if ((++n & 2047) === 0 && clock() - t0 > budget) {\n flow.t += clock() - t0\n return\n }\n }\n const ww = W[2]! - W[0]! + 1\n while (flow.phase === 2) {\n const j = flow.c++\n if (j >= ww * (W[3]! - W[1]! + 1)) {\n const tmp = flow.dir\n flow.dir = F\n flow.back = tmp\n const tw = flow.win\n flow.win = W\n flow.winB = tw\n flow.phase = 0\n flow.ms = flow.t + clock() - t0\n return\n }\n const cx = W[0]! + (j % ww)\n const cz = W[1]! + ((j / ww) | 0)\n const c = cz * FW + cx\n if (occ[c] && occ[c]! < 3) {\n F[c * 2] = F[c * 2 + 1] = 0\n continue\n }\n let best = D[c]!\n let bx = 0\n let bz = 0\n for (let dz = -1; dz <= 1; dz++)\n for (let dx = -1; dx <= 1; dx++) {\n const nx = cx + dx\n const nz = cz + dz\n if (nx < W[0]! || nz < W[1]! || nx > W[2]! || nz > W[3]!) continue\n const d = D[nz * FW + nx]!\n if (d < best) {\n best = d\n bx = dx\n bz = dz\n }\n }\n F[c * 2] = bx\n F[c * 2 + 1] = bz\n if ((j & 8191) === 0 && clock() - t0 > budget) {\n flow.t += clock() - t0\n return\n }\n }\n }\n const losClear = grid.losClear\n\n // ----- piles against walls -----\n const groundAt = (c: number, _y: number): number => {\n if (c < 0) return 0\n const k = occ[c]\n if (k === 2 || (k === 1 && occH[c]! <= _y + 0.05)) return occH[c]!\n return pile[c]!\n }\n const blockedAt = (i: number, x: number, z: number): boolean => {\n const c = cellOf(x, z)\n if (c < 0) return true\n const k = occ[c]\n const y = Z.y[i]!\n if (k === 0 || k === 3) return pile[c]! > y + 0.5 && Z.state[i] !== STATE.AIRBORNE\n if (k === 2 && y + 0.5 >= occH[c]!) return false\n if (Z.state[i] === STATE.AIRBORNE && occH[c]! <= y) return false\n return true\n }\n const tryStep = (i: number, hitCell: number): boolean => {\n if (pileN >= N.pileMax) return false\n const c = cellOf(Z.x[i]!, Z.z[i]!)\n if (c < 0 || occ[c] !== 0) return false\n const dir = hitCell - c\n const w = c + dir\n const back = c - dir\n const h = pile[c]! + N.pileStep\n if (h > N.pileTop) return false\n const cap = occ[w] === 2 ? (back >= 0 ? pile[back]! : 0) + 1.0 : pile[w]!\n if (h > cap + 1e-3) return false\n pile[c] = h\n pileN++\n Z.state[i] = STATE.PILE_STEP\n Z.stepCell[i] = c\n Z.vx[i] = Z.vz[i] = 0\n Z.y[i] = h - N.pileStep\n Z.stateTimer[i] = 6 + R() * 6\n return true\n }\n function stepRelease(i: number): void {\n const c = Z.stepCell[i]!\n if (c >= 0) {\n pile[c] = Math.max(0, pile[c]! - N.pileStep)\n pileN = Math.max(0, pileN - 1)\n }\n Z.stepCell[i] = -1\n Z.state[i] = STATE.CHASE\n Z.stuck[i] = 0\n }\n const pileBlast = (x: number, z: number, r: number): void => {\n for (let i = 0; i < Z.n; i++)\n if (Z.state[i] === STATE.PILE_STEP && (Z.x[i]! - x) ** 2 + (Z.z[i]! - z) ** 2 < r * r) {\n stepRelease(i)\n Z.state[i] = STATE.STUNNED\n Z.stateTimer[i] = 1.2\n }\n }\n\n // ----- alerts -----\n const voice = (i: number): string => traits(i).voice ?? 'groan'\n const groan = (i: number, d: number): void => {\n // chain alert: 8 m, 0.2-0.6 s per hop\n const r2 = N.alertRadius * N.alertRadius\n for (let j = 0; j < Z.n; j++) {\n if (Z.state[j] !== 0 || Z.alertIn[j]! > 0) continue\n const ex = Z.x[j]! - Z.x[i]!\n const ez = Z.z[j]! - Z.z[i]!\n if (ex * ex + ez * ez < r2) Z.alertIn[j] = N.alertDelay + R() * N.alertDelayRandom\n }\n emit('alert', { agent: i })\n if (d < N.voiceDistance && groanBudget <= 0) {\n sound(voice(i), 1, Z.x[i]!, Z.height[i]! * 1.6, Z.z[i]!, d)\n groanBudget = N.voiceEvery\n }\n }\n const screamAt = (i: number, x: number, z: number): void => {\n const tr = traits(i).caller!\n sound('scream_hoarse', 1, x, 1.6, z, target ? Math.hypot(x - target.state.x, z - target.state.z) : 0)\n for (let j = 0; j < Z.n; j++) {\n const ex = Z.x[j]! - x\n const ez = Z.z[j]! - z\n if (ex * ex + ez * ez < tr.radius * tr.radius) {\n Z.state[j] = STATE.CHASE\n Z.lost[j] = 0\n }\n }\n if (target) target.state.screamBoost = tr.boost\n emit('message', { id: 'called', seconds: 3, type: T(i).id })\n emit('scream', { agent: i, x, z })\n }\n\n // ----- attack on the target -----\n const attack = (i: number, d: number, tdt: number): void => {\n Z.attackTimer[i]! -= tdt\n if (Z.attackTimer[i]! > 0) return\n Z.attackTimer[i] = N.attackEvery\n const C = T(i)\n const tr = C.traits ?? {}\n if (tr.heavySwing && R() < tr.heavySwing.chance) {\n Z.state[i] = STATE.SWING\n Z.stateTimer[i] = tr.heavySwing.windUp\n return\n }\n const noJaw = Z.missing[i]! & 512\n const noArms = (Z.missing[i]! & 6) === 6\n const P = target!\n if (P.state.grabbedBy < 0 && !noArms && !Z.crawl[i] && R() < C.bite * (P.state.crouch ? N.crouchBite : 1)) {\n P.grab(i, !!noJaw, !!tr.drownGrab && water(P.state.x, P.state.z))\n Z.state[i] = STATE.GRAB\n } else {\n P.hurt(C.damage * (Z.crawl[i] ? N.crawlDamage : 1), i)\n if (tr.burns && Z.abilityTimer[i]! >= 0) P.state.burnTimer = tr.burns.seconds\n }\n void d\n }\n\n // ----- damage (G 67010 zDamage) -----\n const effect = (payload: CrowdEventMap['effect']): void => emit('effect', payload)\n const blood = (x: number, y: number, z: number, age: number, amount: number, died: boolean, agent?: number): void => effect({ effect: 'blood', point: [x, y, z], age, amount, died, ...(agent === undefined ? {} : { agent }) })\n const damage = (i: number, hit: CrowdHit): CrowdDamageResult => {\n const C = T(i)\n const A = pack.ages[Z.age[i]!]!\n const RO = pack.outfits[Z.outfit[i]!]!\n const cal = hit.caliber ?? null\n const proj = !!cal\n const dano = hit.amount\n const dist = hit.distance\n const corte = hit.cut ?? 0\n const regiao = hit.region\n let morreu = false\n let headshot = false\n if (regiao === 0) {\n if (proj && Z.helmet[i] && cal!.class === 'pistol') {\n Z.helmet[i] = 0\n effect({ effect: 'spark', point: [Z.x[i]!, Z.height[i]! * 1.75, Z.z[i]!], agent: i })\n sound('impact', 1, Z.x[i]!, Z.height[i]! * 1.75, Z.z[i]!, dist)\n return { died: false }\n }\n const mata = proj ? (cal!.skull === 1 || dist <= cal!.skull) && dano >= N.skullMinDamage : dano * 3 >= Z.headHp[i]!\n if (mata) {\n morreu = true\n headshot = true\n if (dano > N.skullTakeDamage || (cal && N.skullTakeWithin[cal.id as keyof typeof N.skullTakeWithin] !== undefined && dist < N.skullTakeWithin[cal.id as keyof typeof N.skullTakeWithin]!)) Z.missing[i]! |= 1\n } else {\n Z.hp[i]! -= dano * 3\n Z.headHp[i]! -= dano\n if (dano > N.jawDamage && R() < N.jawChance) Z.missing[i]! |= 512\n }\n } else if (regiao === 1) {\n let m = C.multipliers.torso\n if (RO.vest && proj) m *= cal!.class === 'pistol' ? RO.vest.pistol : RO.vest.rifle\n Z.hp[i]! -= dano * m\n } else {\n const perna = regiao >= 4\n const lado = regiao & 1\n const mm = (perna ? C.multipliers.legs : C.multipliers.arms) * A.limb * (RO.limb || 1)\n const segArr = perna ? Z.legHp : Z.armHp\n const k = i * 2 + (perna ? lado : regiao === 3 ? 1 : 0)\n segArr[k]! -= dano * mm\n Z.hp[i]! -= dano * mm * 0.5\n const max = perna ? pack.segments.leg : pack.segments.arm\n if (perna && segArr[k]! <= max * 0.5) Z.limp[i] = 1\n if (segArr[k]! <= 0) {\n const arranca = corte >= 0.5 || dano * mm > max * 0.9\n if (perna) {\n Z.crawl[i] = 1\n if (arranca) Z.missing[i]! |= lado ? 16 : 8\n else Z.missing[i]! |= lado ? 256 : 128\n } else if (arranca) Z.missing[i]! |= regiao === 3 ? 4 : 2\n else Z.missing[i]! |= regiao === 3 ? 64 : 32\n effect({ effect: 'limb', point: [Z.x[i]!, Z.height[i]! * (perna ? 0.5 : 1.2), Z.z[i]!], agent: i, region: regiao, severed: arranca })\n }\n }\n if (Z.hp[i]! <= 0) morreu = true\n blood(Z.x[i]!, regiao === 0 ? Z.height[i]! * 1.65 : regiao === 1 ? Z.height[i]! * 1.2 : Z.height[i]! * 0.7, Z.z[i]!, Z.age[i]!, regiao === 0 ? 120 : 30, morreu, i)\n if (morreu) {\n kill(i, headshot)\n return { died: morreu, headshot }\n }\n const st = Z.state[i]\n if (dano >= N.hitStunDamage && st !== STATE.GRAB && st !== STATE.PILE_STEP && st !== STATE.AIRBORNE) {\n Z.state[i] = STATE.STUNNED\n Z.stateTimer[i] = C.traits?.hitStun ?? N.hitStun\n }\n const st2 = Z.state[i]\n if (st2 === 0 || st2 === STATE.DORMANT || st2 === STATE.EATING || st2 === STATE.SEEKING_SOUND) {\n Z.state[i] = STATE.CHASE\n Z.lost[i] = 0\n const sub = C.traits?.submerged\n if (sub) Z.y[i] = Math.max(Z.y[i]!, sub.surface)\n }\n return { died: morreu }\n }\n function kill(i: number, headshot = false): void {\n stats.kills++\n if (headshot) stats.heads++\n const tr = traits(i)\n if (tr.burst) burstAt(i, Z.x[i]!, Z.z[i]!)\n const C = T(i)\n emit('kill', { agent: i, type: C.id, headshot, x: Z.x[i]!, z: Z.z[i]! })\n corpseAdd(i)\n if (target && target.state.grabbedBy === i) target.release()\n remove(i)\n }\n const burstAt = (i: number, x: number, z: number): void => {\n const b = traits(i).burst!\n effect({ effect: 'cloud', point: [x, 0, z], radius: 4, color: b.cloudColor, amount: 8 })\n effect({ effect: 'blood', point: [x, 1.0, z], amount: 1500, died: true, color: b.bloodColor })\n if (target) {\n const d = Math.hypot(x - target.state.x, z - target.state.z)\n if (d < b.radius) {\n target.state.blind = b.blind\n target.state.scentTimer = b.scent\n emit('message', { id: 'burst_hit', seconds: 2.5, type: T(i).id })\n emitNoise(target.state.x, target.state.z, b.noiseNear)\n }\n }\n emitNoise(x, z, b.noise)\n }\n\n // ----- corpses -----\n const corpseAdd = (i: number): void => {\n corpses.add({\n x: Z.x[i]!,\n z: Z.z[i]!,\n yaw: Z.renderYaw[i]!,\n height: Z.height[i]!,\n build: Z.build[i]!,\n named: Z.named[i]!,\n missing: Z.missing[i]!,\n color: Z.color[i]!,\n variant: Z.variant[i]!,\n skin: Z.skin[i]!,\n seed: R() * 10,\n })\n }\n\n // ----- abilities (G 67265 zAbility). true: it took care of the movement -----\n const ability = (i: number, d: number, dx: number, dz: number, tdt: number, b: number, alive: boolean): boolean => {\n const C = T(i)\n const tr = C.traits ?? {}\n const st = Z.state[i]\n const P = target\n // dormant: the stalker wakes under 3 m or with the target's back turned within 10 m; the drowned rises at 5 m\n if (st === STATE.DORMANT) {\n Z.vx[i] = Z.vz[i] = 0\n if (!alive || b > 1) return true\n if (tr.submerged) {\n if (d < tr.submerged.wake) {\n Z.state[i] = STATE.CHASE\n groan(i, d)\n sound('step', 2, Z.x[i]!, 0, Z.z[i]!, d)\n }\n return true\n }\n const am = tr.ambush\n const wake = am?.wake ?? N.dormantWake\n const behind = am?.wakeBehind ?? N.dormantWakeBehind\n const fx = -Math.sin(viewYaw)\n const fz = -Math.cos(viewYaw)\n const costas = (dx * fx + dz * fz) / (d || 1) < (am?.behindCos ?? -0.3)\n if (d < wake || (costas && d < behind)) {\n Z.state[i] = STATE.CHASE\n Z.abilityTimer[i] = am?.sprintSeconds ?? 3\n Z.lost[i] = 0\n sound('runner_groan', 1, Z.x[i]!, 1.6, Z.z[i]!, d)\n }\n return true\n }\n if (st === STATE.AIRBORNE || st === STATE.PILE_STEP) return true\n if (st === STATE.SWELLING) {\n Z.vx[i] = Z.vz[i] = 0\n return true\n }\n if (st === STATE.SWING) {\n Z.vx[i] = Z.vz[i] = 0\n Z.stateTimer[i]! -= tdt\n if (Z.stateTimer[i]! <= 0) {\n const hs = tr.heavySwing!\n Z.state[i] = STATE.CHASE\n Z.attackTimer[i] = 2\n sound('impact', 1.4, Z.x[i]!, 1, Z.z[i]!, d)\n if (d < hs.range && alive && P) {\n P.hurt(C.damage, i)\n P.knock(hs.knock)\n emit('message', { id: 'swing_knock', seconds: 1.5, type: C.id })\n }\n }\n return true\n }\n if (st === STATE.EATING) {\n const ec = tr.eatsCorpses!\n Z.vx[i] = Z.vz[i] = 0\n Z.stateTimer[i]! -= tdt\n if (alive && d < ec.defend) {\n Z.state[i] = STATE.CHASE\n Z.lost[i] = 0\n groan(i, d)\n return false\n } // defends the food\n if (Z.stateTimer[i]! <= 0) {\n let best = -1\n let bd = ec.grabRange\n const list = corpses.entries\n for (let k = 0; k < list.length; k++) {\n const e = Math.hypot(list[k]!.data.x - Z.x[i]!, list[k]!.data.z - Z.z[i]!)\n if (e < bd) {\n bd = e\n best = k\n }\n }\n if (best >= 0) {\n corpses.remove(best)\n Z.hp[i]! += ec.health\n Z.hpMax[i]! += ec.health\n Z.height[i]! *= ec.grow\n Z.build[i]! *= ec.grow\n Z.eaten[i]!++\n }\n Z.state[i] = 0\n Z.abilityTimer[i] = ec.rest\n }\n return true\n }\n if (st === STATE.SEEKING_SOUND) {\n const ss = tr.soundSeeker ?? { arrive: 1, loseChase: 3, hitRadius2: 1.1 }\n if (alive && d < 2.5) {\n Z.state[i] = STATE.CHASE\n return false\n }\n const wx = Z.wx[i]! - Z.x[i]!\n const wz = Z.wz[i]! - Z.z[i]!\n const wl = Math.hypot(wx, wz)\n if (wl < ss.arrive) {\n Z.state[i] = 0\n return false\n }\n Z.vx[i] = (wx / wl) * Z.chaseSpeed[i]!\n Z.vz[i] = (wz / wl) * Z.chaseSpeed[i]!\n Z.yaw[i] = Math.atan2(wx, wz)\n // hits whatever it meets on the way, other agents too\n if (b === 0) {\n Z.attackTimer[i]! -= tdt\n if (Z.attackTimer[i]! <= 0) {\n const hx = Math.floor(Z.x[i]! + HALF)\n const hz = Math.floor(Z.z[i]! + HALF)\n if (hx >= 0 && hz >= 0 && hx < HN && hz < HN)\n for (let j = hHead[hz * HN + hx]!; j !== -1; j = hNext[j]!) {\n if (j !== i && (Z.x[j]! - Z.x[i]!) ** 2 + (Z.z[j]! - Z.z[i]!) ** 2 < ss.hitRadius2) {\n Z.attackTimer[i] = N.attackEvery\n hurtOther(j, C.damage)\n break\n }\n }\n }\n }\n return true\n }\n // custom moves (none in the game): after the timed states, before the moves on the target, with or without a target\n for (const plugin of plugins) if (plugin.ability?.(crowd, i, { d, dx, dz, tdt, band: b, alive })) return true\n if (!alive) return false\n if (Z.hunts[i]! >= 0 && st <= 1 && hunt) return hunt(i, tdt)\n // the blind one does not follow the target across the map: it only goes where it heard\n if (tr.soundSeeker && st === STATE.CHASE && d > tr.soundSeeker.loseChase) {\n Z.state[i] = STATE.SEEKING_SOUND\n Z.wx[i] = P!.state.x\n Z.wz[i] = P!.state.z\n return false\n }\n // pounce up to 6 m, 5 s cooldown\n const po = tr.pounce\n if (po && st === STATE.CHASE && Z.cooldown[i]! <= 0 && d > po.min && d < po.max && b === 0 && losClear(Z.x[i]!, Z.z[i]!, P!.state.x, P!.state.z)) {\n const sp = Math.min(po.speedCap, d / po.time)\n Z.state[i] = STATE.AIRBORNE\n Z.vy[i] = P!.state.y > po.highAbove ? po.liftHigh : po.lift\n Z.vx[i] = (-dx / d) * sp\n Z.vz[i] = (-dz / d) * sp\n Z.yaw[i] = Math.atan2(-dx, -dz)\n Z.cooldown[i] = po.cooldown\n Z.abilityTimer[i] = 1\n sound('runner_groan', 1, Z.x[i]!, 1.6, Z.z[i]!, d)\n return true\n }\n // the bloater swells 0.5 s and bursts when close\n if (tr.burst && st === STATE.CHASE && d < tr.burst.range) {\n Z.state[i] = STATE.SWELLING\n Z.stateTimer[i] = tr.burst.swell\n sound('flesh', 1.2, Z.x[i]!, 1, Z.z[i]!, d)\n return true\n }\n // the devourer looks for corpses (up to 3)\n const ec = tr.eatsCorpses\n if (ec && st === 0 && Z.eaten[i]! < ec.max && Z.abilityTimer[i]! <= 0 && corpses.count) {\n let best = -1\n let bd = ec.search\n const list = corpses.entries\n for (let k = 0; k < list.length; k++) {\n const e = Math.hypot(list[k]!.data.x - Z.x[i]!, list[k]!.data.z - Z.z[i]!)\n if (e < bd) {\n bd = e\n best = k\n }\n }\n if (best >= 0) {\n if (bd < ec.reach) {\n Z.state[i] = STATE.EATING\n Z.stateTimer[i] = ec.seconds\n Z.vx[i] = Z.vz[i] = 0\n return true\n }\n const cp = list[best]!.data\n const ex = cp.x - Z.x[i]!\n const ez = cp.z - Z.z[i]!\n const sp = Z.wanderSpeed[i]! * ec.approach\n Z.vx[i] = (ex / bd) * sp\n Z.vz[i] = (ez / bd) * sp\n Z.yaw[i] = Math.atan2(ex, ez)\n Z.wx[i] = cp.x\n Z.wz[i] = cp.z\n return true\n } else Z.abilityTimer[i] = ec.retry\n }\n // the tracker follows the blood trail and leads up to 8 of its kind\n const tk = tr.tracker\n if (tk && st === 0 && trail.length) {\n let best: { x: number; z: number } | null = null\n for (let k = trail.length - 1; k >= 0; k--) {\n const p = trail[k]!\n if ((p.x - Z.x[i]!) ** 2 + (p.z - Z.z[i]!) ** 2 < tk.range * tk.range) {\n best = p\n break\n }\n }\n if (best) {\n Z.wx[i] = best.x\n Z.wz[i] = best.z\n let led = 0\n const leads = typeIndexById.get(tk.leads) ?? -1\n for (let j = 0; j < Z.n && led < tk.max; j++)\n if (Z.type[j] === leads && Z.state[j] === 0 && (Z.x[j]! - Z.x[i]!) ** 2 + (Z.z[j]! - Z.z[i]!) ** 2 < tk.leadRadius * tk.leadRadius) {\n Z.wx[j] = Z.x[i]!\n Z.wz[j] = Z.z[i]!\n led++\n }\n }\n }\n return false\n }\n const chaseSpeed = (i: number): number => {\n const tr = traits(i)\n if (tr.ambush) return Z.abilityTimer[i]! > 0 ? tr.ambush.sprint : tr.ambush.slow\n if (tr.submerged && water(Z.x[i]!, Z.z[i]!)) return tr.submerged.swim\n return Z.chaseSpeed[i]!\n }\n const hurtOther = (j: number, amount: number): void => {\n Z.hp[j]! -= amount\n blood(Z.x[j]!, Z.height[j]! * 1.2, Z.z[j]!, Z.age[j]!, 30, false, j)\n if (Z.hp[j]! <= 0) deferKill(j)\n }\n const deferKill = (j: number): void => {\n if (!killQ.includes(j)) killQ.push(j)\n }\n const killQFlush = (): void => {\n if (!killQ.length) return\n killQ.sort((a, b) => b - a)\n for (const j of killQ) if (j < Z.n) kill(j, false)\n killQ.length = 0\n }\n\n // ----- per frame: height (pile, wall, jump), timed states (G 67377 zFrame) -----\n const frame = (i: number, dt: number, d: number, alive: boolean): void => {\n const st = Z.state[i]\n const tr = traits(i)\n if (st === STATE.PILE_STEP) {\n // a step: lets go when the target is gone\n Z.stateTimer[i]! -= dt\n if (!alive || d > N.pileReleaseDistance || Z.stateTimer[i]! <= 0) stepRelease(i)\n return\n }\n if (st === STATE.SWELLING) {\n Z.stateTimer[i]! -= dt\n if (Z.stateTimer[i]! <= 0) deferKill(i)\n return\n }\n if (tr.ambush && Z.abilityTimer[i]! > 0) Z.abilityTimer[i]! -= dt\n if (tr.eatsCorpses && Z.abilityTimer[i]! > 0 && st === 0) Z.abilityTimer[i]! -= dt\n if (tr.waterWeak && Z.abilityTimer[i] === 0 && water(Z.x[i]!, Z.z[i]!)) {\n Z.abilityTimer[i] = -1\n Z.hp[i]! *= tr.waterWeak.keep\n effect({ effect: 'cloud', point: [Z.x[i]!, 0, Z.z[i]!], radius: 1.5, color: tr.waterWeak.cloud, amount: 3, agent: i })\n }\n const c = cellOf(Z.x[i]!, Z.z[i]!)\n const gy = groundAt(c, Z.y[i]!)\n if (st === STATE.DORMANT || Z.floorLocked[i]) return\n if (st === STATE.AIRBORNE || Z.y[i]! > gy + 0.02 || Z.vy[i]! > 0) {\n Z.vy[i]! -= N.gravity * dt\n Z.y[i]! += Z.vy[i]! * dt\n if (Z.y[i]! <= gy) {\n const fall = -Z.vy[i]!\n Z.y[i] = gy\n Z.vy[i] = 0\n if (st === STATE.AIRBORNE) {\n Z.state[i] = STATE.CHASE\n if (tr.pounce && alive && d < tr.pounce.landRange && target) {\n target.knock(tr.pounce.knock)\n target.hurt(T(i).damage, i)\n emit('message', { id: 'pounce_knock', seconds: 1.5, type: T(i).id })\n }\n } else if (fall > N.fallStun && Z.state[i]! <= 1) {\n Z.state[i] = STATE.STUNNED\n Z.stateTimer[i] = 0.9\n }\n }\n } else if (gy > Z.y[i]!) Z.y[i] = Math.min(gy, Z.y[i]! + N.climbSpeed * dt)\n }\n\n // ----- the horde update (G 66835 hordeUpdate) -----\n const update = (dt: number, context: CrowdUpdateContext = {}): void => {\n if (context.target !== undefined) target = context.target\n groanBudget -= dt\n nightF = context.nightFactor ?? 0\n const P = target\n const px = P ? P.state.x : (context.flowTarget?.[0] ?? 0)\n const pz = P ? P.state.z : (context.flowTarget?.[1] ?? 0)\n const alive = !!P && P.state.alive && !P.state.turned\n viewYaw = context.viewYaw ?? (P ? P.state.yaw - Math.PI : 0)\n const fx0 = context.flowTarget?.[0] ?? px\n const fz0 = context.flowTarget?.[1] ?? pz\n const pc = cellOf(fx0, fz0)\n if (flow.cell < 0) {\n flowStart(fx0, fz0)\n flowStep(1e9)\n flow.cell = pc\n } else if (pc !== flow.cell && !flow.phase) {\n flowStart(fx0, fz0)\n flow.cell = pc\n }\n flowStep(N.flowBudgetMs)\n // spatial hash for R0\n hHead.fill(-1)\n for (let i = 0; i < Z.n; i++) {\n if (Z.band[i] !== 0) continue\n const hx = Math.floor(Z.x[i]! + HALF)\n const hz = Math.floor(Z.z[i]! + HALF)\n if (hx < 0 || hz < 0 || hx >= HN || hz >= HN) continue\n const h = hz * HN + hx\n hNext[i] = hHead[h]!\n hHead[h] = i\n }\n const B = stats.bands\n B[0] = B[1] = B[2] = B[3] = 0\n let slots = 0\n const F = flow.dir\n for (let i = 0; i < Z.n; i++) {\n const dx = Z.x[i]! - px\n const dz = Z.z[i]! - pz\n const d = Math.sqrt(dx * dx + dz * dz)\n let b = Z.band[i]!\n while (b > 0 && d < BANDS[b - 1]!.max - HYST) b--\n while (b < 3 && d > BANDS[b]!.max + HYST) b++\n Z.band[i] = b\n B[b as 0 | 1 | 2 | 3]++\n const C = T(i)\n const tr = C.traits ?? {}\n if (Z.state[i] === STATE.STUNNED) {\n Z.stateTimer[i]! -= dt\n if (Z.stateTimer[i]! <= 0) Z.state[i] = STATE.CHASE\n Z.vx[i]! *= 0.9\n Z.vz[i]! *= 0.9\n }\n if (Z.state[i] === STATE.CALLING) {\n Z.stateTimer[i]! -= dt\n Z.vx[i] = Z.vz[i] = 0\n if (Z.stateTimer[i]! <= 0) {\n Z.state[i] = STATE.CHASE\n screamAt(i, Z.x[i]!, Z.z[i]!)\n Z.cooldown[i] = tr.caller!.cooldown\n }\n }\n Z.cooldown[i]! -= dt\n if (Z.alertIn[i]! > 0) {\n Z.alertIn[i]! -= dt\n if (Z.alertIn[i]! <= 0 && Z.state[i] === 0 && !tr.soundSeeker) {\n Z.state[i] = STATE.CHASE\n Z.lost[i] = 0\n }\n }\n Z.next[i]! -= dt\n if (Z.next[i]! <= 0) {\n const tdt = BANDS[b]!.dt\n Z.next[i]! += tdt\n // perception (R0 and R1 only)\n if (alive && b <= 1 && Z.state[i]! <= 1) {\n let sees = false\n const A = pack.ages[Z.age[i]!]!\n const vis = C.perception.sight * (1 - N.nightSight * nightF) * (P!.state.crouch ? N.crouchSight : 1) * A.sight\n if (d < vis) {\n const fx = Math.sin(Z.yaw[i]!)\n const fz = Math.cos(Z.yaw[i]!)\n const cone = (-dx * fx - dz * fz) / (d || 1)\n if ((cone > N.sightCone || d < N.sightNear) && (Z.floor[i] === P!.state.floor || d < 5) && (Z.floor[i] || P!.state.floor || losClear(Z.x[i]!, Z.z[i]!, px, pz))) sees = true\n }\n if (C.perception.smell && d < C.perception.smell * (P!.state.bleeding || P!.state.scentTimer > 0 ? 2 : 1)) sees = true // smell\n if (sees) {\n if (Z.state[i] === 0) groan(i, d)\n Z.state[i] = STATE.CHASE\n Z.lost[i] = 0\n } else if (Z.state[i] === STATE.CHASE) {\n Z.lost[i]! += tdt\n if (Z.lost[i]! > N.loseAfter) {\n Z.state[i] = 0\n Z.wx[i] = px\n Z.wz[i] = pz\n }\n }\n }\n for (let k = 0; k < noises.length && (Z.state[i] === 0 || Z.state[i] === STATE.SEEKING_SOUND); k++) {\n const Nz = noises[k]!\n const hear = Nz.r * (C.perception.hearing / N.hearingBase) * pack.ages[Z.age[i]!]!.hearing\n if ((Z.x[i]! - Nz.x) ** 2 + (Z.z[i]! - Nz.z) ** 2 < hear * hear) {\n if (tr.soundSeeker) {\n Z.state[i] = STATE.SEEKING_SOUND\n Z.wx[i] = Nz.x\n Z.wz[i] = Nz.z\n break\n } // straight to the source\n Z.state[i] = STATE.CHASE\n Z.lost[i] = N.heardLost\n groan(i, d)\n }\n }\n // the caller winds up 1.5 s and calls the crowd within 150 m\n if (tr.caller && Z.state[i] === STATE.CHASE && d < tr.caller.range && Z.cooldown[i]! <= 0) {\n Z.state[i] = STATE.CALLING\n Z.stateTimer[i] = tr.caller.windUp\n }\n Z.steering[i] = 0\n if (!ability(i, d, dx, dz, tdt, b, alive)) {\n // where it wants to go\n let tx = 0\n let tz = 0\n let sp = 0\n if (Z.state[i] === STATE.CHASE || Z.state[i] === STATE.GRAB) {\n const c = cellOf(Z.x[i]!, Z.z[i]!)\n const sameL = !P || Z.floor[i] === P.state.floor\n if (d < N.directRange && alive && sameL) {\n tx = -dx / (d || 1)\n tz = -dz / (d || 1)\n } else if (c >= 0 && b === 0 && d < N.pyramidRange && sameL && flow.dist[c]! < 1e8 && flow.dist[c]! * GC > d * 2 + 6 && losClear(Z.x[i]!, Z.z[i]!, px, pz)) {\n tx = -dx / d\n tz = -dz / d\n } // the path goes round: straight against the wall (pyramid)\n else if (c >= 0) {\n const W = flow.win\n const cx = c % FW\n const cz = (c / FW) | 0\n if (cx >= W[0]! && cx <= W[2]! && cz >= W[1]! && cz <= W[3]!) {\n tx = F[c * 2]!\n tz = F[c * 2 + 1]!\n } else {\n tx = -dx\n tz = -dz\n } // outside the window: straight at the target\n const l = Math.hypot(tx, tz) || 1\n tx /= l\n tz /= l\n }\n if (tr.caller && Z.cooldown[i]! > tr.caller.fleeAbove && d < tr.caller.fleeRange && alive) {\n tx = dx / (d || 1)\n tz = dz / (d || 1)\n } // runs from the fight after calling\n sp = chaseSpeed(i) * (P && P.state.screamBoost > 0 ? N.screamSpeed : 1)\n if (!alive) sp = Z.wanderSpeed[i]!\n if (d < N.attackRange && alive && Math.abs(P!.state.y - Z.y[i]!) < N.attackHeight) {\n sp = 0\n if (slots < N.attackSlots) {\n slots++\n attack(i, d, tdt)\n }\n }\n } else if (Z.state[i] === 0) {\n const wx = Z.wx[i]! - Z.x[i]!\n const wz = Z.wz[i]! - Z.z[i]!\n const wl = Math.hypot(wx, wz)\n if (wl < 1 || R() < 0.01 * tdt * 60) {\n Z.wx[i] = clamp(Z.x[i]! + (R() - 0.5) * N.wanderSpan, -HALF + 2, HALF - 2)\n Z.wz[i] = clamp(Z.z[i]! + (R() - 0.5) * N.wanderSpan, -HALF + 2, HALF - 2)\n } else {\n tx = wx / wl\n tz = wz / wl\n Z.pause[i]! -= tdt\n if (Z.pause[i]! < -4 - R() * 6) Z.pause[i] = 1 + R() * 2.5\n sp = Z.pause[i]! > 0 ? 0 : Z.wanderSpeed[i]!\n } // pauses of 1 to 3.5 s between walks\n }\n if (Z.crawl[i]) sp = Math.min(sp, N.crawlSpeed)\n else if (Z.limp[i]) sp *= N.limpSpeed\n // separation from the neighbours\n let sx = 0\n let sz = 0\n if (b === 0) {\n const hx = Math.floor(Z.x[i]! + HALF)\n const hz = Math.floor(Z.z[i]! + HALF)\n for (let oz = -1; oz <= 1; oz++)\n for (let ox = -1; ox <= 1; ox++) {\n const qx = hx + ox\n const qz = hz + oz\n if (qx < 0 || qz < 0 || qx >= HN || qz >= HN) continue\n for (let j = hHead[qz * HN + qx]!; j !== -1; j = hNext[j]!) {\n if (j === i || Z.state[j] === STATE.PILE_STEP || Z.state[j] === STATE.DORMANT) continue\n const ex = Z.x[i]! - Z.x[j]!\n const ez = Z.z[i]! - Z.z[j]!\n const e2 = ex * ex + ez * ez\n const rr = N.separation * (Z.build[i]! + Z.build[j]!)\n if (e2 < rr * rr * 1.6 && e2 > 1e-6) {\n const e = Math.sqrt(e2)\n const w = (rr * 1.26 - e) / e\n sx += ex * w\n sz += ez * w\n }\n }\n }\n }\n if (Z.state[i]! <= 2) {\n Z.dvx[i] = tx * sp + sx * N.separationPush\n Z.dvz[i] = tz * sp + sz * N.separationPush\n Z.steering[i] = 1\n if (sp > 0.05) Z.yaw[i] = Math.atan2(tx, tz)\n else if (d < 3 && alive) Z.yaw[i] = Math.atan2(-dx, -dz)\n }\n }\n }\n // integrates every frame (the wanted speed arrives in ~0.15 s, no jerk)\n if (Z.steering[i] && Z.state[i]! <= 2) {\n const k = 1 - Math.exp(-dt * (b === 0 ? 9 : 5))\n Z.vx[i]! += (Z.dvx[i]! - Z.vx[i]!) * k\n Z.vz[i]! += (Z.dvz[i]! - Z.vz[i]!) * k\n }\n const nx = Z.x[i]! + Z.vx[i]! * dt\n const nz = Z.z[i]! + Z.vz[i]! * dt\n let hitCell = -1\n if (!blockedAt(i, nx, Z.z[i]!)) Z.x[i] = nx\n else {\n if (Z.state[i] !== STATE.AIRBORNE) Z.vx[i] = 0\n hitCell = cellOf(nx, Z.z[i]!)\n }\n if (!blockedAt(i, Z.x[i]!, nz)) Z.z[i] = nz\n else {\n if (Z.state[i] !== STATE.AIRBORNE) Z.vz[i] = 0\n hitCell = cellOf(Z.x[i]!, nz)\n }\n if (hitCell >= 0 && Z.state[i] === STATE.CHASE && b === 0) {\n // runners and leapers jump a low obstacle (car, yard wall)\n const vl = tr.vaultsLow\n if (vl && occ[hitCell] !== 5 && occH[hitCell]! <= vl.maxHeight && occH[hitCell]! > Z.y[i]! + vl.minRise) {\n Z.state[i] = STATE.AIRBORNE\n Z.vy[i] = Math.sqrt(2 * N.gravity * (occH[hitCell]! - Z.y[i]! + vl.clearance))\n const s2 = Z.chaseSpeed[i]! * vl.speedFactor\n Z.vx[i] = Math.sin(Z.yaw[i]!) * s2\n Z.vz[i] = Math.cos(Z.yaw[i]!) * s2\n } else if (occ[hitCell] === 2 || (occ[hitCell] === 0 && pile[hitCell]! > 0)) {\n // stuck on the wall or the pile: becomes a step of the pyramid\n Z.stuck[i]! += dt\n if (Z.stuck[i]! > 0.35 + 0.5 * Z.skin[i]!) {\n Z.stuck[i] = 0\n tryStep(i, hitCell)\n }\n }\n } else if (Z.stuck[i]! > 0) Z.stuck[i]! -= dt\n // a closed door in the way: hits it (10 per blow every 1.5 s; brute x3)\n if (hitCell >= 0 && Z.state[i] === STATE.CHASE && doors.at(hitCell) >= 0) {\n Z.attackTimer[i]! -= dt\n if (Z.attackTimer[i]! <= 0) {\n Z.attackTimer[i] = N.attackEvery\n doors.hit(doors.at(hitCell), N.doorDamage * (tr.doorDamage ?? 1))\n }\n }\n frame(i, dt, d, alive)\n const spd = Math.hypot(Z.vx[i]!, Z.vz[i]!)\n Z.renderSpeed[i]! += (spd - Z.renderSpeed[i]!) * Math.min(1, dt * 6)\n // arms: up when it perceives someone; down against a wall so the hand does not go through\n if (Z.band[i]! <= 1) {\n const s = Z.state[i]\n let goal = s === STATE.CHASE || s === STATE.GRAB || s === STATE.PILE_STEP ? 1 : 0\n if (goal && solidAt(Z.x[i]! + Math.sin(Z.renderYaw[i]!) * 0.62, Z.z[i]! + Math.cos(Z.renderYaw[i]!) * 0.62, 1.0)) goal = 0.1\n Z.arms[i]! += (goal - Z.arms[i]!) * Math.min(1, dt * (goal > Z.arms[i]! ? 3 : 5))\n }\n Z.phase[i]! += dt * (Z.renderSpeed[i]! < 0.05 ? 0.15 : N.cadenceBase + N.cadencePerSpeed * Z.renderSpeed[i]!)\n // walking without attacking: the body points where it goes\n if (spd > 0.35 && Z.state[i]! <= 1 && !Z.attackPose[i]) Z.yaw[i] = Math.atan2(Z.vx[i]!, Z.vz[i]!)\n let dy = Z.yaw[i]! - Z.renderYaw[i]!\n dy -= Math.round(dy / TAU_APPROX) * TAU_APPROX\n Z.renderYaw[i]! += dy * Math.min(1, dt * (Z.state[i] === STATE.AIRBORNE ? 20 : 9))\n }\n killQFlush()\n noises.length = 0\n stats.slots = slots\n }\n\n // ----- trail, corpses, population -----\n const updateTrail = (dt: number, who: CrowdTarget | null = target): void => {\n for (const p of trail) p.t += dt\n while (trail.length && trail[0]!.t > N.trailSeconds) trail.shift()\n if (!who) return\n const s = who.state\n if ((s.bleeding || s.scentTimer > 0) && s.alive && Math.hypot(s.x - trailLast.x, s.z - trailLast.z) > N.trailStep) {\n trail.push({ x: s.x, z: s.z, t: 0 })\n trailLast = { x: s.x, z: s.z }\n if (trail.length > N.trailMax) trail.shift()\n }\n }\n const spawnAway = (minD: number, maxD: number, view: CrowdView): number => {\n const ox = target ? target.state.x : view.x\n const oz = target ? target.state.z : view.z\n for (let t = 0; t < 30; t++) {\n const a = R() * TURN\n const r = minD + Math.sqrt(R()) * (maxD - minD) // denser away from home\n const x = ox + Math.cos(a) * r\n const z = oz + Math.sin(a) * r\n // never born in front of the camera inside the fog\n const vx = x - view.x\n const vz = z - view.z\n const vd = Math.hypot(vx, vz)\n if (vd < view.far && vx * -Math.sin(view.yaw) + vz * -Math.cos(view.yaw) > vd * 0.5) continue\n if (Math.abs(x) < HALF - 3 && Math.abs(z) < HALF - 3 && !grid.blocked(x, z)) return spawn(x, z)\n }\n return -1\n }\n const updatePopulation = (dt: number, view: CrowdView, opts: { readonly target?: number; readonly migration?: MigrationOptions | null } = {}): void => {\n const popTarget = opts.target ?? N.population\n let k = 0\n while (Z.n < popTarget && k++ < 20) spawnAway(N.refillMin, N.refillMax, view)\n // the excess fades away slowly, only far and out of sight\n if (Z.n > popTarget + 120)\n for (let t = 0, rm = 0; t < 40 && rm < 4; t++) {\n const i = Math.floor(R() * Z.n)\n if (Z.band[i]! < 2 || Z.named[i]! >= 0 || (target && i === target.state.grabbedBy)) continue\n const vx = Z.x[i]! - view.x\n const vz = Z.z[i]! - view.z\n const vd = Math.hypot(vx, vz)\n if (vd < view.far && vx * -Math.sin(view.yaw) + vz * -Math.cos(view.yaw) > -vd * 0.35) continue\n remove(i)\n rm++\n }\n const mg = opts.migration === undefined ? null : opts.migration\n if (!mg) return\n migrateT -= dt\n if (migrateT <= 0) {\n migrateT = mg.every\n let m = 0\n for (let q = 0; q < mg.count && Z.n < Z.capacity; q++) {\n const i = spawn(mg.x + (R() - 0.5) * mg.width, mg.z + R() * mg.depth)\n if (i >= 0) {\n Z.wx[i] = mg.goal[0]\n Z.wz[i] = mg.goal[1]\n m++\n }\n }\n if (m) emit('message', { id: 'migration', seconds: 4 })\n }\n }\n\n const crowd: Crowd = {\n store: Z,\n pack,\n grid,\n doors,\n corpses,\n numbers: N,\n stats,\n pile,\n pileCount: () => pileN,\n trail,\n variantsOf,\n get target() {\n return target\n },\n set target(next) {\n target = next\n },\n random,\n sound,\n effect,\n typeIndex: (id) => typeIndexById.get(id) ?? -1,\n spawn: (x, z, type = -1) => spawn(x, z, type),\n remove,\n update,\n emitNoise,\n damage,\n kill: (i, headshot = false) => kill(i, headshot),\n updateTrail,\n updateCorpses: (dt) => void corpses.update(dt),\n updatePopulation,\n spawnAway,\n pileBlast,\n setHunt(next) {\n hunt = next\n },\n chaseSpeed,\n asPlayerCrowd: () => ({\n count: () => Z.n,\n active: (i) => Z.band[i] === 0,\n x: (i) => Z.x[i]!,\n z: (i) => Z.z[i]!,\n y: (i) => Z.y[i]!,\n floor: (i) => Z.floor[i]!,\n chasing: (i) => Z.state[i] === STATE.CHASE,\n down: (i) => Z.crawl[i] !== 0 || Z.state[i] === STATE.STUNNED,\n panicWeight: (i) => traits(i).panicWeight ?? 1,\n hold(i, x, z, k, lookX, lookZ) {\n Z.x[i]! += (x - Z.x[i]!) * k\n Z.z[i]! += (z - Z.z[i]!) * k\n Z.vx[i] = Z.vz[i] = Z.dvx[i] = Z.dvz[i] = 0\n Z.yaw[i] = Math.atan2(lookX - Z.x[i]!, lookZ - Z.z[i]!)\n },\n stun(i, seconds, vx, vz) {\n Z.state[i] = STATE.STUNNED\n Z.stateTimer[i] = seconds\n Z.vx[i] = vx\n Z.vz[i] = vz\n },\n chase(i, cooldown) {\n Z.state[i] = STATE.CHASE\n Z.attackTimer[i] = cooldown\n },\n damage: (i, hit) => void damage(i, { region: hit.region as CrowdHit['region'], amount: hit.amount, distance: hit.distance, cut: hit.cut, caliber: null }),\n }),\n on(event, listener) {\n let set = listeners.get(event)\n if (!set) listeners.set(event, (set = new Set()))\n set.add(listener as (event: never) => void)\n return () => void set.delete(listener as (event: never) => void)\n },\n }\n return crowd\n}\n","{\n \"sources\": {\n \"store\": \"jogo.js G 66714-66734 (Z, ZMAX 6000, FIELDS)\",\n \"bands\": \"jogo.js G 62019-62020 (BANDS, HYST)\",\n \"flow\": \"jogo.js G 66735-66737, 66773-66825 (FLOW_R 192, flowStart, flowStep; budget 1 ms a frame, the first field in one go)\",\n \"update\": \"jogo.js G 66835-66977 hordeUpdate\",\n \"alerts\": \"jogo.js G 66978-66993 groan, screamAt\",\n \"attack\": \"jogo.js G 66996-67006 zAttack\",\n \"damage\": \"jogo.js G 67010-67045 zDamage\",\n \"kill\": \"jogo.js G 67046-67059 zKill, inchadoBurst\",\n \"corpses\": \"jogo.js G 62021 (CORPOS_MAX 400, CORPO_VIDA 900), 67062-67075 corpseAdd, corpsesUpdate\",\n \"population\": \"jogo.js G 67139-67177 spawnAway, populationUpdate (popTarget 1200, migration 120 every 90 s, the first after 60 s)\",\n \"pile\": \"jogo.js G 67184-67227 (PILE_STEP 0.48, PILE_TOP 3.7, PILE_MAX 160, groundAt, zBlockedAt, tryStep, stepRelease, pileBlast)\",\n \"trail\": \"jogo.js G 67238-67246 trailUpdate\",\n \"abilities\": \"jogo.js G 67266-67356 zAbility, zChaseSpeed, zHurtOther, killQ\",\n \"frame\": \"jogo.js G 67377-67402 zFrame\",\n \"cadence\": \"jogo.js G 65507 walkCad\"\n },\n \"bands\": [\n { \"max\": 35, \"dt\": 0.05 },\n { \"max\": 120, \"dt\": 0.2 },\n { \"max\": 400, \"dt\": 1 },\n { \"max\": null, \"dt\": 5 }\n ],\n \"numbers\": {\n \"capacity\": 6000,\n \"hysteresis\": 10,\n \"flowRadius\": 192,\n \"flowBudgetMs\": 1,\n \"hashCell\": 1,\n \"nightSight\": 0.4,\n \"crouchSight\": 0.6,\n \"sightCone\": 0.5,\n \"sightNear\": 2.5,\n \"loseAfter\": 15,\n \"hearingBase\": 40,\n \"heardLost\": 5,\n \"alertRadius\": 8,\n \"alertDelay\": 0.2,\n \"alertDelayRandom\": 0.4,\n \"voiceDistance\": 40,\n \"voiceEvery\": 0.25,\n \"directRange\": 4,\n \"pyramidRange\": 14,\n \"screamSpeed\": 1.2,\n \"attackRange\": 1.15,\n \"attackHeight\": 1.3,\n \"attackSlots\": 6,\n \"attackEvery\": 1.5,\n \"crouchBite\": 1.3,\n \"crawlDamage\": 0.6,\n \"wanderSpan\": 24,\n \"crawlSpeed\": 0.4,\n \"limpSpeed\": 0.5,\n \"separation\": 0.31,\n \"separationPush\": 2.2,\n \"doorDamage\": 10,\n \"doorMessageDistance\": 25,\n \"skullMinDamage\": 20,\n \"skullTakeDamage\": 60,\n \"skullTakeWithin\": { \"12ga\": 5 },\n \"jawDamage\": 25,\n \"jawChance\": 0.3,\n \"hitStunDamage\": 35,\n \"hitStun\": 0.45,\n \"dormantWake\": 3,\n \"dormantWakeBehind\": 10,\n \"pileStep\": 0.48,\n \"pileTop\": 3.7,\n \"pileMax\": 160,\n \"pileReleaseDistance\": 30,\n \"gravity\": 9.8,\n \"fallStun\": 3.2,\n \"climbSpeed\": 1.9,\n \"cadenceBase\": 0.5,\n \"cadencePerSpeed\": 0.3,\n \"corpsesMax\": 400,\n \"corpseSeconds\": 900,\n \"trailSeconds\": 120,\n \"trailStep\": 1.5,\n \"trailMax\": 200,\n \"population\": 1200,\n \"refillMin\": 70,\n \"refillMax\": 160,\n \"migrationFirst\": 60\n }\n}\n","import type { NavGrid } from './grid'\n\nexport type Door = {\n readonly x: number\n readonly z: number\n /** The leaf runs along `x` (front or back wall) or `z`. */\n readonly axis: 'x' | 'z'\n readonly width: number\n hp: number\n hpMax: number\n open: boolean\n broken: boolean\n planks: number\n readonly rect: readonly [number, number, number, number]\n /** Whatever the game hangs on it (the building it belongs to). */\n readonly data?: unknown\n}\n\nexport type DoorEventMap = {\n sound: { sound: 'wood'; volume: number; position: [number, number, number] }\n noise: { x: number; z: number; radius: number }\n effect: { effect: 'dust'; point: [number, number, number]; color: number }\n broken: { door: number }\n}\nexport type DoorEventName = keyof DoorEventMap\n\nexport type DoorNumbers = {\n /** Hit points of a door (G 63803 `PORTA_VIDA`). */\n readonly doorHp: number\n /** Hit points each plank adds (G 63803 `TABUA_VIDA`). */\n readonly plankHp: number\n readonly height: number\n readonly thickness: number\n readonly soundChance: number\n readonly soundVolume: number\n readonly breakVolume: number\n readonly breakNoise: number\n}\n\nexport const DOOR_DEFAULTS: DoorNumbers = { doorHp: 300, plankHp: 150, height: 2.2, thickness: 0.1, soundChance: 0.3, soundVolume: 0.8, breakVolume: 1.5, breakNoise: 30 }\n\nexport type Doors = {\n readonly list: readonly Door[]\n /** The door index at a grid cell, -1 for none. */\n at(cell: number): number\n add(x: number, z: number, axis: 'x' | 'z', width: number, data?: unknown): number\n /** Opens or closes: the cells become passable (3) or a closed door (5). A broken door stays open. */\n set(index: number, open: boolean): void\n /** An agent hits a closed door (G 64044 `doorHit`): the 30% knock, planks giving way, and the door breaking open. */\n hit(index: number, damage: number): void\n /** Nails a plank on (each adds `plankHp`). */\n plank(index: number): void\n on<K extends DoorEventName>(event: K, listener: (event: DoorEventMap[K]) => void): () => void\n}\n\n/** The doors of the game's buildings on a grid (G 63796-63816 `DOORS`, `doorAt`, `addDoor`, `setDoor`; G 64044 `doorHit`). */\nexport function createDoors(grid: NavGrid, options: { random: () => number; numbers?: Partial<DoorNumbers> }): Doors {\n const N: DoorNumbers = { ...DOOR_DEFAULTS, ...options.numbers }\n const random = options.random\n const list: Door[] = []\n const doorAt = new Int16Array(grid.n * grid.n).fill(-1)\n const listeners = new Map<DoorEventName, Set<(event: never) => void>>()\n const emit = <K extends DoorEventName>(event: K, payload: DoorEventMap[K]): void => {\n for (const listener of listeners.get(event) ?? []) (listener as (event: DoorEventMap[K]) => void)(payload)\n }\n const set = (index: number, open: boolean): void => {\n const d = list[index]\n if (!d) return\n d.open = open\n grid.fillRect(...d.rect, open || d.broken ? 3 : 5, N.height)\n }\n return {\n list,\n at: (cell) => (cell < 0 ? -1 : doorAt[cell]!),\n add(x, z, axis, width, data) {\n const i = list.length\n const t = N.thickness\n const x0 = axis === 'x' ? x - width / 2 : x - t\n const x1 = axis === 'x' ? x + width / 2 : x + t\n const z0 = axis === 'x' ? z - t : z - width / 2\n const z1 = axis === 'x' ? z + t : z + width / 2\n list.push({ x, z, axis, width, hp: N.doorHp, hpMax: N.doorHp, open: false, broken: false, planks: 0, rect: [x0, z0, x1, z1], data })\n grid.fillRect(x0, z0, x1, z1, 5, N.height)\n const a = Math.floor((x0 + grid.half) / grid.cell)\n const b = Math.ceil((x1 + grid.half) / grid.cell)\n const c = Math.floor((z0 + grid.half) / grid.cell)\n const e = Math.ceil((z1 + grid.half) / grid.cell)\n for (let gz = c; gz < e; gz++) for (let gx = a; gx < b; gx++) doorAt[gz * grid.n + gx] = i\n return i\n },\n set,\n hit(index, damage) {\n const d = list[index]\n if (!d || d.open || d.broken) return\n d.hp -= damage\n if (random() < N.soundChance) emit('sound', { sound: 'wood', volume: N.soundVolume, position: [d.x, 1, d.z] })\n if (d.planks && d.hp < d.hpMax - d.planks * N.plankHp + N.plankHp * (d.planks - 1)) d.planks = Math.max(0, d.planks - 1)\n if (d.hp <= 0) {\n d.broken = true\n d.planks = 0\n set(index, true)\n emit('noise', { x: d.x, z: d.z, radius: N.breakNoise })\n emit('sound', { sound: 'wood', volume: N.breakVolume, position: [d.x, 1, d.z] })\n emit('effect', { effect: 'dust', point: [d.x, 1, d.z], color: 0x8a6a4a })\n emit('broken', { door: index })\n }\n },\n plank(index) {\n const d = list[index]\n if (!d) return\n d.planks += 1\n d.hp += N.plankHp\n d.hpMax += N.plankHp\n },\n on(event, listener) {\n let set_ = listeners.get(event)\n if (!set_) listeners.set(event, (set_ = new Set()))\n set_.add(listener as (event: never) => void)\n return () => void set_.delete(listener as (event: never) => void)\n },\n }\n}\n","/** Occupancy codes of a grid cell (G 62162: 0 free, 1 solid, 2 low wall that can be climbed, 3 open door, 4 glass; 5 closed door, G 63816). */\nexport const CELL = { FREE: 0, SOLID: 1, LOW_WALL: 2, OPEN_DOOR: 3, GLASS: 4, CLOSED_DOOR: 5 } as const\n\nexport type NavGridOptions = {\n /** Side of the square world in metres, centred on the origin (default 768, the game's world). */\n readonly size?: number\n /** Cell side in metres (default 0.5). */\n readonly cell?: number\n /** Fill a solid border of `borderWidth` m and `borderHeight` m around the world, as the game does (default true). */\n readonly border?: boolean\n}\n\n/**\n * The navigation and collision grid of the game (G 62158-62170): a square world of cells with an occupancy code and a height. Agents, the player,\n * the flow field and line of sight all read it. Buildings write it with `fillRect`.\n */\nexport type NavGrid = {\n readonly size: number\n readonly half: number\n readonly cell: number\n /** Cells per side. */\n readonly n: number\n readonly occ: Uint8Array\n readonly occH: Float32Array\n cellOf(x: number, z: number): number\n /** Solid for a body at height `y` (default 0.5): outside the world, or an occupied cell that is not an open door and is taller than `y`. */\n solidAt(x: number, z: number, y?: number): boolean\n /** The occupancy code at (x, z), -1 outside. */\n cellKind(x: number, z: number): number\n fillRect(x0: number, z0: number, x1: number, z1: number, kind: number, height: number): void\n /** Blocked for a walking agent: outside, or anything but free and open door (G 66826 `zBlocked`). */\n blocked(x: number, z: number): boolean\n /** Nothing solid and taller than 1.5 m between the two points, sampled every 0.5 m (G 66828 `losClear`). */\n losClear(x0: number, z0: number, x1: number, z1: number): boolean\n}\n\nconst BORDER_WIDTH = 1\nconst BORDER_HEIGHT = 50\nconst LOS_STEP = 0.5\nconst LOS_HEIGHT = 1.5\n\nexport function createNavGrid(options: NavGridOptions = {}): NavGrid {\n const size = options.size ?? 768\n const half = size / 2\n const cell = options.cell ?? 0.5\n const n = size / cell\n const occ = new Uint8Array(n * n)\n const occH = new Float32Array(n * n)\n const cellOf = (x: number, z: number): number => {\n const gx = Math.floor((x + half) / cell)\n const gz = Math.floor((z + half) / cell)\n return gx < 0 || gz < 0 || gx >= n || gz >= n ? -1 : gz * n + gx\n }\n const solidAt = (x: number, z: number, y = 0.5): boolean => {\n const c = cellOf(x, z)\n return c < 0 || (occ[c] !== 0 && occ[c] !== 3 && occH[c]! > y)\n }\n const fillRect = (x0: number, z0: number, x1: number, z1: number, kind: number, h: number): void => {\n const a = Math.floor((x0 + half) / cell)\n const b = Math.ceil((x1 + half) / cell)\n const c = Math.floor((z0 + half) / cell)\n const d = Math.ceil((z1 + half) / cell)\n for (let gz = Math.max(0, c); gz < Math.min(n, d); gz++)\n for (let gx = Math.max(0, a); gx < Math.min(n, b); gx++) {\n const i = gz * n + gx\n occ[i] = kind\n occH[i] = h\n }\n }\n if (options.border ?? true) {\n fillRect(-half, -half, half, -half + BORDER_WIDTH, 1, BORDER_HEIGHT)\n fillRect(-half, half - BORDER_WIDTH, half, half, 1, BORDER_HEIGHT)\n fillRect(-half, -half, -half + BORDER_WIDTH, half, 1, BORDER_HEIGHT)\n fillRect(half - BORDER_WIDTH, -half, half, half, 1, BORDER_HEIGHT)\n }\n return {\n size,\n half,\n cell,\n n,\n occ,\n occH,\n cellOf,\n solidAt,\n cellKind: (x, z) => {\n const c = cellOf(x, z)\n return c < 0 ? -1 : occ[c]!\n },\n fillRect,\n blocked(x, z) {\n const c = cellOf(x, z)\n return c < 0 || (occ[c] !== 0 && occ[c] !== 3)\n },\n losClear(x0, z0, x1, z1) {\n const d = Math.hypot(x1 - x0, z1 - z0)\n const steps = Math.ceil(d / LOS_STEP)\n for (let k = 1; k < steps; k++) {\n const t = k / steps\n const c = cellOf(x0 + (x1 - x0) * t, z0 + (z1 - z0) * t)\n if (c < 0 || (occ[c] === 1 && occH[c]! > LOS_HEIGHT)) return false\n }\n return true\n },\n }\n}\n","const FNV_OFFSET = 0x811c9dc5\nconst FNV_PRIME = 0x01000193\nconst MIX = 0x9e3779b1\n\n/** Deterministic mulberry32 generator; returns floats in [0, 1). */\nexport function createRng(seed: number): () => number {\n let state = seed >>> 0\n return () => {\n state = (state + 0x6d2b79f5) >>> 0\n let mixed = Math.imul(state ^ (state >>> 15), state | 1)\n mixed ^= mixed + Math.imul(mixed ^ (mixed >>> 7), mixed | 61)\n return ((mixed ^ (mixed >>> 14)) >>> 0) / 4294967296\n }\n}\n\n/** A seed for the stream called `name`: the same seed gives each name its own sequence, so lightning never shifts the schedule. */\nexport function streamSeed(seed: number, name: string): number {\n let hash = FNV_OFFSET\n for (let index = 0; index < name.length; index++) hash = Math.imul(hash ^ name.charCodeAt(index), FNV_PRIME) >>> 0\n return Math.imul((seed >>> 0) ^ hash, MIX) >>> 0\n}\n\nexport function createStream(seed: number, name: string): () => number {\n return createRng(streamSeed(seed, name))\n}\n\nexport function drawBetween(rng: () => number, range: readonly [min: number, max: number]): number {\n return range[0] + rng() * (range[1] - range[0])\n}\n","/**\n * The agents as a struct of arrays (G 66717 `Z`, ZMAX 6000): one typed array per field, the same types as the game so the floats round the same way.\n * The names are the game's in English; `armHp` and `legHp` hold two values per agent (left, right).\n */\nexport const createStore = (capacity: number) => {\n const f32 = () => new Float32Array(capacity)\n const u8 = () => new Uint8Array(capacity)\n return {\n n: 0,\n capacity,\n x: f32(),\n z: f32(),\n vx: f32(),\n vz: f32(),\n yaw: f32(),\n phase: f32(),\n type: u8(),\n age: u8(),\n outfit: u8(),\n height: f32(),\n build: f32(),\n chaseSpeed: f32(),\n wanderSpeed: f32(),\n hp: f32(),\n hpMax: f32(),\n headHp: f32(),\n armHp: new Float32Array(capacity * 2),\n legHp: new Float32Array(capacity * 2),\n missing: new Uint16Array(capacity),\n helmet: u8(),\n state: u8(),\n stateTimer: f32(),\n lost: f32(),\n attackTimer: f32(),\n band: u8(),\n next: f32(),\n wx: f32(),\n wz: f32(),\n crawl: u8(),\n limp: u8(),\n color: new Uint32Array(capacity),\n skin: f32(),\n alertIn: f32(),\n cooldown: f32(),\n y: f32(),\n floor: u8(),\n floorLocked: u8(),\n vy: f32(),\n abilityTimer: f32(),\n eaten: u8(),\n stuck: f32(),\n stepCell: new Int32Array(capacity),\n burn: f32(),\n hunts: new Int8Array(capacity),\n named: new Int8Array(capacity),\n dvx: f32(),\n dvz: f32(),\n steering: u8(),\n renderYaw: f32(),\n renderSpeed: f32(),\n pause: f32(),\n lod: u8(),\n variant: u8(),\n attackPose: u8(),\n arms: f32(),\n }\n}\nexport type CrowdStore = ReturnType<typeof createStore>\ntype Arrays = Omit<CrowdStore, 'n' | 'capacity' | 'armHp' | 'legHp'>\n/** The one-per-agent fields (G 66733 `FIELDS`): what a removal copies from the last agent. */\nexport const AGENT_FIELDS = [\n 'x', 'z', 'vx', 'vz', 'yaw', 'phase', 'type', 'age', 'outfit', 'height', 'build', 'chaseSpeed', 'wanderSpeed', 'hp', 'hpMax', 'headHp', 'missing', 'helmet', 'state', 'stateTimer', 'lost', 'attackTimer',\n 'band', 'next', 'wx', 'wz', 'crawl', 'limp', 'color', 'skin', 'alertIn', 'cooldown', 'y', 'floor', 'floorLocked', 'vy', 'abilityTimer', 'eaten', 'stuck', 'stepCell', 'burn', 'hunts', 'named', 'dvx', 'dvz',\n 'steering', 'renderYaw', 'renderSpeed', 'pause', 'lod', 'variant', 'attackPose', 'arms',\n] as const satisfies readonly (keyof Arrays)[]\n","/** What an agent is doing (G 66724 and 67180-67183): the store keeps the number. */\nexport const STATE = {\n WANDER: 0,\n CHASE: 1,\n GRAB: 2,\n STUNNED: 3,\n CALLING: 4,\n AIRBORNE: 5,\n DORMANT: 6,\n SWELLING: 7,\n SWING: 8,\n EATING: 9,\n PILE_STEP: 10,\n SEEKING_SOUND: 12,\n} as const\n\n/** Body regions of a hit (G 67012): 0 head, 1 torso, 2 left arm, 3 right arm, 4 left leg, 5 right leg. */\nexport type Region = 0 | 1 | 2 | 3 | 4 | 5\n\n/**\n * Missing parts as bits (G 67010-67045): 1 skull, 2 left arm off, 4 right arm off, 8 left leg off, 16 right leg off, 32 left arm broken, 64 right arm broken,\n * 128 left leg broken, 256 right leg broken, 512 jaw.\n */\nexport const MISSING = { SKULL: 1, ARM_L: 2, ARM_R: 4, LEG_L: 8, LEG_R: 16, ARM_L_BROKEN: 32, ARM_R_BROKEN: 64, LEG_L_BROKEN: 128, LEG_R_BROKEN: 256, JAW: 512 } as const\n\n/**\n * The type traits: the special moves of a type, read in the game's order. A type without a trait does not have the move. Every number is the game's\n * (`jogo.js` G 67180-67430, the Bestiário table 3.1 and 12.7).\n */\nexport type CrowdTraits = {\n /** Jumps a low obstacle in the way while chasing (car, yard wall) up to `maxHeight` m (runner, leaper). */\n readonly vaultsLow?: { readonly maxHeight: number; readonly minRise: number; readonly clearance: number; readonly speedFactor: number }\n /** Pounce from `min` to `max` m in line of sight: cooldown, flight time, speed cap, the vertical speeds and the knock-down on landing (leaper). */\n readonly pounce?: { readonly min: number; readonly max: number; readonly cooldown: number; readonly time: number; readonly speedCap: number; readonly lift: number; readonly liftHigh: number; readonly highAbove: number; readonly landRange: number; readonly knock: number }\n /** A heavy swing: chance per attack, wind-up, reach and knock-down (brute). */\n readonly heavySwing?: { readonly chance: number; readonly windUp: number; readonly range: number; readonly knock: number }\n /** Multiplies the damage on doors (brute 3). */\n readonly doorDamage?: number\n /** Seconds stunned by a heavy hit (default `numbers.hitStun`; brute 0.25). */\n readonly hitStun?: number\n /** Only hears: goes to the source of a sound and hits whatever it meets on the way, other agents too (blind). */\n readonly soundSeeker?: { readonly arrive: number; readonly loseChase: number; readonly hitRadius2: number }\n /** Calls the crowd: wind-up, radius, cooldown, the boost it gives the target, and running from the fight afterwards (screamer). */\n readonly caller?: { readonly range: number; readonly windUp: number; readonly radius: number; readonly cooldown: number; readonly boost: number; readonly fleeAbove: number; readonly fleeRange: number }\n /** Sets the target on fire on a hit (charred). */\n readonly burns?: { readonly seconds: number }\n /** Loses a share of its health the first time it enters water (charred 0.7). */\n readonly waterWeak?: { readonly keep: number; readonly cloud: number }\n /** Waits under water and pulls the target down (drowned). */\n readonly submerged?: { readonly depth: number; readonly wake: number; readonly swim: number; readonly surface: number }\n /** Plays dead and wakes close or behind the target, then sprints for a while (stalker). */\n readonly ambush?: { readonly chance: number; readonly wake: number; readonly wakeBehind: number; readonly behindCos: number; readonly sprint: number; readonly sprintSeconds: number; readonly slow: number }\n /** Swells and bursts close to the target: blinds and marks it with a scent (bloater). */\n readonly burst?: { readonly range: number; readonly swell: number; readonly radius: number; readonly blind: number; readonly scent: number; readonly noiseNear: number; readonly noise: number; readonly cloudColor: number; readonly bloodColor: number; readonly bloodDry: number }\n /** Eats corpses: search radius, reach, seconds, how many, what it gains (devourer). */\n readonly eatsCorpses?: { readonly max: number; readonly search: number; readonly reach: number; readonly seconds: number; readonly grabRange: number; readonly health: number; readonly grow: number; readonly rest: number; readonly retry: number; readonly defend: number; readonly approach: number }\n /** Follows the target's blood trail and leads agents of the type `leads` along (sniffer). */\n readonly tracker?: { readonly range: number; readonly leads: string; readonly max: number; readonly leadRadius: number }\n /** Never older than this age index (runner: recent at most). */\n readonly maxAge?: number\n /** The groan sound id (runner `runner_groan`; default `groan`). */\n readonly voice?: string\n /** How much it adds to the target's panic (runner 2.5). */\n readonly panicWeight?: number\n /** Pulls the target into water when it grabs there (drowned). */\n readonly drownGrab?: boolean\n /** Body colour and skin override at birth (charred, drowned). */\n readonly color?: number\n readonly skin?: number\n}\n\n/** One type of agent (a zombie type, a cow, a civilian). The undead pack (`undeadCrowdTypes`) gives the 13 types of the game. */\nexport type CrowdType = {\n readonly id: string\n /** Weight in the draw of an agent without a forced type (0: never drawn). */\n readonly weight: number\n readonly health: number\n readonly speed: { readonly wander: number; readonly chase: number }\n readonly damage: number\n /** Chance per attack to grab (and bite). */\n readonly bite: number\n readonly multipliers: { readonly head: number; readonly torso: number; readonly arms: number; readonly legs: number }\n /** Metres. */\n readonly perception: { readonly sight: number; readonly hearing: number; readonly smell: number }\n readonly crawls?: boolean\n /** Height multiplier (brute 1.42). */\n readonly scale?: number\n /** Build multiplier (bloater 1.35; a scaled type without one is 1.3). */\n readonly build?: number\n /** Body variants of the type for the renderer (walker 4, runner 3, crawler and brute 2, others 1). */\n readonly variants?: number\n readonly eye?: number\n readonly traits?: CrowdTraits\n}\n\n/** The age of a body (G IDADES): its share, and what it does to speed, health, limbs and senses. */\nexport type CrowdAge = { readonly id: string; readonly p: number; readonly speed: number; readonly health: number; readonly limb: number; readonly sight: number; readonly hearing: number; readonly blood: number; readonly bloodColor: number; readonly dryColor: number }\n/** What a body wears (G ROUPAS): its share, the vest against pistol and rifle classes, a helmet, a limb factor and the colour. */\nexport type CrowdOutfit = { readonly id: string; readonly p: number; readonly vest?: { readonly pistol: number; readonly rifle: number }; readonly helmet?: boolean; readonly limb?: number; readonly color: number | null }\n\n/** Everything the crowd draws a body from. */\nexport type CrowdPack = {\n readonly types: readonly CrowdType[]\n readonly ages: readonly CrowdAge[]\n readonly outfits: readonly CrowdOutfit[]\n /** Hit points of the segments, only for dismembering (G `SEG`). */\n readonly segments: { readonly head: number; readonly arm: number; readonly leg: number }\n /** Clothes colours of the outfits without one (G `CIVIL_COR`). */\n readonly palette: readonly number[]\n}\n\n/** The calibre of a projectile hit: its class (pistol or rifle, for vests and helmets), the skull distance (1: any) and an id. */\nexport type CrowdCaliber = { readonly id: string; readonly class: 'pistol' | 'rifle'; readonly skull: number }\nexport type CrowdHit = { readonly region: Region; readonly amount: number; readonly distance: number; readonly cut?: number; readonly caliber?: CrowdCaliber | null }\nexport type CrowdDamageResult = { readonly died: boolean; readonly headshot?: boolean }\n\n/**\n * Who the crowd hunts. `game-player`'s `Player` is one as it is; a game with its own player writes a small object with the same names.\n * Reads: `state`. Writes: the verbs, and `state.burnTimer`, `state.blind`, `state.scentTimer`, `state.screamBoost`.\n */\nexport interface CrowdTarget {\n readonly state: {\n x: number\n z: number\n y: number\n floor: number\n alive: boolean\n turned: boolean\n crouch: boolean\n bleeding: number\n scentTimer: number\n screamBoost: number\n grabbedBy: number\n blind: number\n burnTimer: number\n /** The body's yaw; the view looks the other way (`yaw - π`). */\n yaw: number\n }\n grab(by: number, noJaw?: boolean, drown?: boolean): void\n hurt(amount: number, by?: number): void\n knock(seconds: number): void\n release(): void\n}\n\nexport type CrowdSoundId = 'groan' | 'runner_groan' | 'scream_hoarse' | 'step' | 'impact' | 'flesh' | 'wood' | (string & {})\nexport type CrowdEffectId = 'spark' | 'blood' | 'limb' | 'cloud' | 'dust' | (string & {})\nexport type CrowdMessageId = 'called' | 'burst_hit' | 'swing_knock' | 'pounce_knock' | 'migration' | 'door_broken' | (string & {})\n\nexport type CrowdEventMap = {\n sound: { sound: CrowdSoundId; volume: number; position: [number, number, number]; distance: number }\n effect: { effect: CrowdEffectId; point: [number, number, number]; agent?: number; region?: number; severed?: boolean; radius?: number; color?: number; amount?: number; died?: boolean; age?: number }\n message: { id: CrowdMessageId; seconds: number; type?: string }\n spawn: { agent: number; type: string }\n alert: { agent: number }\n kill: { agent: number; type: string; headshot: boolean; x: number; z: number }\n remove: { agent: number; moved: number }\n scream: { agent: number; x: number; z: number }\n}\nexport type CrowdEventName = keyof CrowdEventMap\n","import type { Crowd } from '../crowd'\nimport { STATE } from '../types'\n\n/** A building the civilians walk between: its rectangle, whether it is a house (it has a gate), and the side its front faces (-1: toward -z). */\nexport type CivilianBuilding = { readonly x: number; readonly z: number; readonly w: number; readonly d: number; readonly house?: boolean; readonly front: -1 | 1 }\n\nexport type CivilianSpec = {\n readonly id: string\n /** The building name it lives in. */\n readonly home: string\n readonly child?: boolean\n readonly color?: number\n /** `[hour, building]`: from that hour, for one hour, it walks to that building. */\n readonly routine?: readonly (readonly [number, string])[]\n /** In a group it follows this civilian when that one is in the group too, else the target. */\n readonly leader?: string\n /** How close it keeps to whom it follows (2.2 m; the game's child keeps 1.2). */\n readonly followDistance?: number\n}\n\nexport type CivilianState = 'home' | 'walking' | 'group' | 'fleeing' | 'gone' | 'dead' | 'undead'\n\nexport type Civilian = {\n readonly id: string\n readonly spec: CivilianSpec\n readonly k: number\n x: number\n z: number\n yaw: number\n phase: number\n vx: number\n vz: number\n hp: number\n state: CivilianState\n path: [number, number][]\n pathIndex: number\n /** Seconds left to turn after a bite (0: not bitten). */\n biteTimer: number\n attackTimer: number\n fear: number\n /** The building it is going to (or is at). */\n goal: string\n stuckTimer: number\n /** The agent it turned into. */\n agent: number\n}\n\nexport type CivilianNumbers = {\n readonly hpAdult: number\n readonly hpChild: number\n readonly childOffset: number\n readonly sightSquared: number\n readonly leaveDistance: number\n readonly attackRange: number\n readonly attackEvery: number\n readonly biteFactor: number\n readonly biteSeconds: number\n readonly fearAfterHit: number\n readonly nearMessage: number\n readonly fearRange: number\n readonly fearSpeed: number\n readonly walkSpeed: number\n readonly childSpeed: number\n readonly bittenSpeed: number\n readonly groupRunBeyond: number\n readonly groupRunSpeed: number\n readonly fleeSpeed: number\n readonly childFleeFactor: number\n readonly stuckSeconds: number\n readonly arrive: number\n readonly probe: number\n readonly whiskers: readonly number[]\n readonly doorProbe: number\n readonly steer: number\n readonly bodyHeight: number\n readonly patrolChance: number\n readonly childHeight: number\n readonly childBuild: number\n readonly cadenceBase: number\n readonly cadencePerSpeed: number\n readonly inside: number\n readonly doorInside: number\n readonly doorOutside: number\n readonly gate: number\n readonly sidewalk: number\n readonly houseOffset: number\n}\n\n/** The game's numbers (`jogo.js` G 69960-70175). */\nexport const CIVILIAN_DEFAULTS: CivilianNumbers = {\n hpAdult: 100,\n hpChild: 40,\n childOffset: 0.6,\n sightSquared: 100,\n leaveDistance: 18,\n attackRange: 1.0,\n attackEvery: 1.5,\n biteFactor: 1.5,\n biteSeconds: 120,\n fearAfterHit: 10,\n nearMessage: 30,\n fearRange: 6,\n fearSpeed: 3.4,\n walkSpeed: 1.3,\n childSpeed: 0.85,\n bittenSpeed: 0.8,\n groupRunBeyond: 6,\n groupRunSpeed: 3.6,\n fleeSpeed: 2.6,\n childFleeFactor: 1.1,\n stuckSeconds: 8,\n arrive: 0.25,\n probe: 0.45,\n whiskers: [0, 0.7, -0.7, 1.4, -1.4],\n doorProbe: 0.6,\n steer: 8,\n bodyHeight: 0.4,\n patrolChance: 0.2,\n childHeight: 0.65,\n childBuild: 0.7,\n cadenceBase: 0.5,\n cadencePerSpeed: 0.3,\n inside: 0.8,\n doorInside: 0.8,\n doorOutside: 0.9,\n gate: 7.6,\n sidewalk: 6,\n houseOffset: 0.8,\n}\n\nexport type CivilianEventMap = {\n bitten: { id: string; near: boolean }\n died: { id: string; cause: 'attacked' }\n turned: { id: string; agent: number }\n gone: { id: string }\n}\nexport type CivilianEventName = keyof CivilianEventMap\n\nexport type CivilianOptions = {\n readonly people: readonly CivilianSpec[]\n readonly buildings: Readonly<Record<string, CivilianBuilding>>\n /** The hour of the day now (0-24), for the routines. */\n readonly hour?: () => number\n /** The crowd type a bitten civilian turns into (default the first type). */\n readonly turnInto?: number\n /** The waypoints of a building (G 69967 `pontos`): inside, the door from inside and outside, the gate of a house, the sidewalk. */\n readonly waypoints?: (building: CivilianBuilding) => [number, number][]\n readonly numbers?: Partial<CivilianNumbers>\n}\n\nexport type Civilians = {\n readonly list: readonly Civilian[]\n get(id: string): Civilian | undefined\n /** Moves the civilians, lets the agents hunt them, bites, deaths and turning (G 70144 `npcUpdate`, G 70042 `npcZombies`). */\n update(dt: number): void\n /** Joins the target's group: follows its leader or the target. */\n join(id: string): void\n /** Leaves along a path of points; at the end it is `gone`. */\n flee(id: string, path: readonly (readonly [number, number])[]): void\n /** The route between two buildings (G 69974 `rota`): the points of one, the street crossing, the points of the other reversed. */\n route(from: string, to: string): [number, number][]\n on<K extends CivilianEventName>(event: K, listener: (event: CivilianEventMap[K]) => void): () => void\n}\n\n/**\n * Civilians on a crowd: a literal port of the team game's survivors on the block (`jogo.js` G 69960-70175: `pontos`, `rota`, `npcZombies`,\n * `zChaseNpc`, `npcMorre`, `npcVira`, `npcMove`, `npcUpdate`). They keep a routine by the hour, run home when an agent is near, follow a leader in a\n * group, leave along a path, open doors on the way; agents within 10 m that are closer to them than to the target hunt them, bite, and a bitten one\n * turns after `biteSeconds`. No names, lines, radio or diary: those are the game's, through the events.\n */\nexport function createCivilians(crowd: Crowd, options: CivilianOptions): Civilians {\n const N: CivilianNumbers = { ...CIVILIAN_DEFAULTS, ...options.numbers }\n const Z = crowd.store\n const grid = crowd.grid\n const doors = crowd.doors\n const hourNow = options.hour ?? (() => 12)\n const turnInto = options.turnInto ?? 0\n const listeners = new Map<CivilianEventName, Set<(event: never) => void>>()\n const emit = <K extends CivilianEventName>(event: K, payload: CivilianEventMap[K]): void => {\n for (const listener of listeners.get(event) ?? []) (listener as (event: CivilianEventMap[K]) => void)(payload)\n }\n const random = crowd.random\n const R = random\n const lerp = (a: number, b: number, t: number): number => a + (b - a) * t\n const casaDe = (name: string): CivilianBuilding | undefined => options.buildings[name]\n const pontos =\n options.waypoints ??\n ((b: CivilianBuilding): [number, number][] => {\n const casa = !!b.house\n const side = b.front\n const front = side < 0 ? b.z + b.d : b.z\n const back = side < 0 ? b.z : b.z + b.d\n const cx = b.x + b.w / 2\n const inw = side < 0 ? -1 : 1\n const calc = side < 0 ? -N.sidewalk : N.sidewalk\n const pts: [number, number][] = [\n [cx + (casa ? N.houseOffset : 0), (front + (front + back) / 2) / 2],\n [cx, front + inw * N.doorInside],\n [cx, front - inw * N.doorOutside],\n ]\n if (casa) pts.push([cx, side < 0 ? -N.gate : N.gate])\n pts.push([cx, calc])\n return pts\n })\n const rota = (bA: CivilianBuilding, bB: CivilianBuilding): [number, number][] => {\n const a = pontos(bA)\n const b = pontos(bB).reverse()\n const out = a.slice()\n if (Math.sign(a[a.length - 1]![1]) !== Math.sign(b[0]![1])) out.push([a[a.length - 1]![0], b[0]![1]]) // crosses the street\n return out.concat(b)\n }\n const list: Civilian[] = options.people.map((spec, k) => {\n const b = casaDe(spec.home)!\n const p = pontos(b)[0]!\n return {\n id: spec.id,\n spec,\n k,\n x: p[0] + (spec.child ? N.childOffset : 0),\n z: p[1],\n yaw: 0,\n phase: 0,\n vx: 0,\n vz: 0,\n hp: spec.child ? N.hpChild : N.hpAdult,\n state: 'home',\n path: [],\n pathIndex: 0,\n biteTimer: 0,\n attackTimer: 0,\n fear: 0,\n goal: spec.home,\n stuckTimer: 0,\n agent: -1,\n }\n })\n const byId = new Map(list.map((c) => [c.id, c]))\n const exposed = (n: Civilian): boolean => n.state !== 'dead' && n.state !== 'undead' && n.state !== 'gone'\n const target = () => crowd.target?.state ?? null\n const distToTarget = (x: number, z: number): number => {\n const t = target()\n return t ? Math.hypot(x - t.x, z - t.z) : 0\n }\n\n const turn = (n: Civilian): void => {\n n.state = 'undead'\n const i = crowd.spawn(n.x, n.z, turnInto)\n if (i >= 0) {\n Z.color[i] = n.spec.color ?? Z.color[i]!\n Z.named[i] = n.k\n Z.height[i] = n.spec.child ? N.childHeight : Z.height[i]!\n Z.build[i] = n.spec.child ? N.childBuild : Z.build[i]!\n Z.age[i] = 0\n Z.state[i] = STATE.CHASE\n n.agent = i\n }\n emit('turned', { id: n.id, agent: i })\n }\n const die = (n: Civilian): void => {\n if (n.biteTimer > 0) return turn(n)\n n.state = 'dead'\n n.vx = n.vz = 0\n // the body with what it carried (the game's own item stays with the game)\n crowd.corpses.add({\n x: n.x,\n z: n.z,\n yaw: n.yaw,\n height: n.spec.child ? N.childHeight : 1,\n build: n.spec.child ? N.childBuild : 1,\n missing: 0,\n color: n.spec.color ?? 0,\n variant: -1,\n skin: 0.4,\n seed: R() * 10,\n named: n.k,\n })\n crowd.effect({ effect: 'blood', point: [n.x, 1, n.z], age: 0, amount: 300, died: true })\n emit('died', { id: n.id, cause: 'attacked' })\n }\n\n // ----- the agents against the civilians (G 70042 npcZombies) -----\n const agentsAgainst = (dt: number): void => {\n const t = target()\n for (let i = 0; i < Z.n; i++) {\n if (Z.band[i]! > 1) continue\n const k = Z.hunts[i]!\n if (k >= 0) {\n const n = list[k]!\n if (!exposed(n)) {\n Z.hunts[i] = -1\n continue\n }\n const dx = n.x - Z.x[i]!\n const dz = n.z - Z.z[i]!\n const d = Math.hypot(dx, dz)\n if (d > N.leaveDistance) {\n Z.hunts[i] = -1\n continue\n }\n if (d < N.attackRange) {\n Z.attackTimer[i]! -= dt\n if (Z.attackTimer[i]! <= 0) {\n Z.attackTimer[i] = N.attackEvery\n const C = crowd.pack.types[Z.type[i]!]!\n n.hp -= C.damage\n n.fear = N.fearAfterHit\n crowd.sound('flesh', 0.7, n.x, 1, n.z, distToTarget(n.x, n.z))\n crowd.effect({ effect: 'blood', point: [n.x, 1.2, n.z], age: 0, amount: 30, died: false })\n if (n.biteTimer <= 0 && R() < C.bite * N.biteFactor) {\n n.biteTimer = N.biteSeconds\n emit('bitten', { id: n.id, near: distToTarget(n.x, n.z) < N.nearMessage })\n }\n if (n.hp <= 0) die(n)\n }\n }\n } else if (Z.state[i]! <= 1) {\n for (const n of list) {\n if (!exposed(n) || n.state === 'home') continue\n const dx = n.x - Z.x[i]!\n const dz = n.z - Z.z[i]!\n const d2 = dx * dx + dz * dz\n const dp = t ? (t.x - Z.x[i]!) ** 2 + (t.z - Z.z[i]!) ** 2 : Infinity\n if (d2 < N.sightSquared && d2 < dp && grid.losClear(Z.x[i]!, Z.z[i]!, n.x, n.z)) {\n Z.hunts[i] = n.k\n Z.state[i] = STATE.CHASE\n break\n }\n }\n }\n }\n }\n // the crowd calls it: an agent hunting a civilian goes straight at it (G 70073 zChaseNpc)\n crowd.setHunt((i) => {\n const n = list[Z.hunts[i]!]\n if (!n) return false\n const dx = n.x - Z.x[i]!\n const dz = n.z - Z.z[i]!\n const d = Math.hypot(dx, dz) || 1\n const sp = d < 1 ? 0 : crowd.chaseSpeed(i)\n Z.vx[i] = (dx / d) * sp\n Z.vz[i] = (dz / d) * sp\n Z.yaw[i] = Math.atan2(dx, dz)\n return true\n })\n\n // ----- moving (G 70125 npcMove) -----\n const move = (n: Civilian, dt: number, tx: number, tz: number, sp: number): boolean => {\n const dx = tx - n.x\n const dz = tz - n.z\n const d = Math.hypot(dx, dz)\n if (d < N.arrive) {\n n.vx = n.vz = 0\n return true\n }\n let ax = dx / d\n let az = dz / d\n // round a wall: tries 0, ±40°, ±80°\n for (const a of N.whiskers) {\n const c = Math.cos(a)\n const s = Math.sin(a)\n const bx = ax * c - az * s\n const bz = ax * s + az * c\n if (!grid.solidAt(n.x + bx * N.probe, n.z + bz * N.probe, N.bodyHeight)) {\n ax = bx\n az = bz\n break\n }\n }\n // a closed door ahead: opens it\n const c = grid.cellOf(n.x + ax * N.doorProbe, n.z + az * N.doorProbe)\n const di = doors.at(c)\n if (c >= 0 && di >= 0) {\n const D = doors.list[di]!\n if (!D.open && !D.broken && !D.planks) {\n doors.set(di, true)\n crowd.sound('wood', 0.3, D.x, 1, D.z, distToTarget(D.x, D.z))\n }\n }\n n.vx = lerp(n.vx, ax * sp, Math.min(1, dt * N.steer))\n n.vz = lerp(n.vz, az * sp, Math.min(1, dt * N.steer))\n const nx = n.x + n.vx * dt\n const nz = n.z + n.vz * dt\n if (!grid.solidAt(nx, n.z, N.bodyHeight)) n.x = nx\n if (!grid.solidAt(n.x, nz, N.bodyHeight)) n.z = nz\n n.yaw = Math.atan2(n.vx, n.vz)\n return false\n }\n\n const update = (dt: number): void => {\n agentsAgainst(dt)\n const h = hourNow()\n const t = target()\n for (const n of list) {\n if (n.state === 'dead' || n.state === 'undead' || n.state === 'gone') continue\n if (n.biteTimer > 0) {\n n.biteTimer -= dt\n if (n.biteTimer <= 0) {\n turn(n)\n continue\n }\n }\n // fear: an agent near sends it home (or close to its leader in a group)\n let perto = 99\n for (let i = 0; i < Z.n; i++) {\n if (Z.band[i]) continue\n const d = Math.hypot(Z.x[i]! - n.x, Z.z[i]! - n.z)\n if (d < perto) perto = d\n }\n const sp = (perto < N.fearRange ? N.fearSpeed : N.walkSpeed) * (n.spec.child ? N.childSpeed : 1) * (n.biteTimer > 0 ? N.bittenSpeed : 1)\n if (n.state === 'group') {\n const leaderCivilian = n.spec.leader ? byId.get(n.spec.leader) : undefined\n const lider = leaderCivilian && leaderCivilian.state === 'group' ? leaderCivilian : t\n if (lider) {\n const dd = Math.hypot(lider.x - n.x, lider.z - n.z)\n if (dd > (n.spec.followDistance ?? 2.2)) move(n, dt, lider.x, lider.z, dd > N.groupRunBeyond ? N.groupRunSpeed : sp)\n else {\n n.vx *= 0.8\n n.vz *= 0.8\n }\n }\n } else if (n.state === 'fleeing') {\n const p = n.path[n.pathIndex]\n if (!p) {\n n.state = 'gone'\n emit('gone', { id: n.id })\n continue\n }\n n.stuckTimer += dt\n if (move(n, dt, p[0], p[1], N.fleeSpeed * (n.spec.child ? N.childFleeFactor : 1)) || n.stuckTimer > N.stuckSeconds) {\n n.pathIndex++\n n.stuckTimer = 0\n }\n } else if (n.spec.routine) {\n // the routine by hour: walks to the building of the hour\n let alvo = n.spec.home\n for (const [hh, onde] of n.spec.routine) if (h >= hh && h < hh + 1) alvo = onde\n if (perto < N.fearRange) alvo = n.spec.home\n if (alvo !== n.goal) {\n const home = casaDe(n.spec.home)!\n n.path = rota(casaDe(n.goal) ?? home, casaDe(alvo) ?? home)\n n.pathIndex = 0\n n.goal = alvo\n n.state = 'walking'\n }\n if (n.state === 'walking') {\n const p = n.path[n.pathIndex]\n n.stuckTimer += dt\n if (!p) n.state = 'home'\n else if (move(n, dt, p[0], p[1], sp) || n.stuckTimer > N.stuckSeconds) {\n n.pathIndex++\n n.stuckTimer = 0\n }\n } else {\n n.vx *= 0.8\n n.vz *= 0.8\n }\n } else {\n n.vx *= 0.8\n n.vz *= 0.8\n }\n {\n const v = Math.hypot(n.vx, n.vz)\n n.phase += dt * (v < 0.05 ? 0 : N.cadenceBase + N.cadencePerSpeed * v)\n }\n }\n // a named agent: walks the street of its old routine slowly while it sees nobody\n for (let i = 0; i < Z.n; i++)\n if (Z.named[i]! >= 0 && Z.state[i] === STATE.WANDER && R() < dt * N.patrolChance) {\n const n = list[Z.named[i]!]\n if (!n) continue\n const p = pontos(casaDe(n.spec.home)!)\n const q = p[Math.floor(R() * p.length)]!\n Z.wx[i] = q[0]\n Z.wz[i] = q[1]\n }\n }\n\n return {\n list,\n get: (id) => byId.get(id),\n update,\n join(id) {\n const n = byId.get(id)\n if (n && exposed(n)) n.state = 'group'\n },\n flee(id, path) {\n const n = byId.get(id)\n if (!n || !exposed(n)) return\n n.state = 'fleeing'\n n.path = path.map(([x, z]) => [x, z])\n n.pathIndex = 0\n },\n route(from, to) {\n return rota(casaDe(from)!, casaDe(to)!)\n },\n on(event, listener) {\n let set = listeners.get(event)\n if (!set) listeners.set(event, (set = new Set()))\n set.add(listener as (event: never) => void)\n return () => void set.delete(listener as (event: never) => void)\n },\n }\n}\n","import type { Crowd } from '../crowd'\nimport { STATE } from '../types'\n\n/** What an animal does besides wandering and fleeing; each is optional, an animal without one only wanders and flees. */\nexport type HerdRole = {\n /** Wanders within this many metres of home (8). */\n readonly range?: number\n /** Flees from the target closer than this and from agents closer than `fear·1.5 + 2` (5; 0 never flees). */\n readonly fear?: number\n /** Calls when it flees (the hen): sound, noise radius, cooldown. */\n readonly fleeCall?: { readonly sound: string; readonly noise: number; readonly cooldown: number }\n /** Alarm when the target comes within `range` (the lapwing): flies for `fly` s. */\n readonly alarm?: { readonly range: number; readonly sound: string; readonly noise: number; readonly cooldown: number; readonly fly: number }\n /** Now and then calls loud (the cow): chance per second, sound, noise, cooldown. */\n readonly call?: { readonly chance: number; readonly sound: string; readonly noise: number; readonly cooldown: number }\n /** Barks at agents within `bark` m and growls at agents within `growl` m when it is the target's companion (the dog). */\n readonly guard?: { readonly bark: number; readonly barkNoise: number; readonly barkCooldown: number; readonly growl: number; readonly growlCooldown: number; readonly sound: string }\n}\n\nexport type HerdAnimalSpec = HerdRole & {\n /** The species id (any registry: `game-animals-species` has the 13 of the deliveries). */\n readonly species: string\n readonly x: number\n readonly z: number\n /** The species' gait rates and its size (`game-animals` `quadrupedLayout(body).size`, `birdSize(body)`). */\n readonly walkHz: number\n readonly runHz: number\n readonly size: number\n /** Follows 2.2 m behind the target (the companion dog). */\n readonly companion?: boolean\n /** A carcass: it does not move (the vultures circle it). */\n readonly dead?: boolean\n /** A bird of the sky (the vulture): only the flock moves it. */\n readonly sky?: boolean\n}\n\nexport type HerdAnimal = {\n readonly index: number\n readonly spec: HerdAnimalSpec\n x: number\n z: number\n yaw: number\n homeX: number\n homeZ: number\n range: number\n fear: number\n clip: 'idle' | 'walk' | 'run'\n timer: number\n targetX: number\n targetZ: number\n fly: number\n cooldown: number\n walkSpeed: number\n runSpeed: number\n companion: boolean\n dead: boolean\n /** The nearest agent seen in the last look (index and distance), refreshed about a quarter of the time. */\n near: readonly [number, number] | null | undefined\n}\n\nexport type HerdEventMap = {\n sound: { sound: string; volume: number; position: [number, number, number]; distance: number; animal: number }\n noise: { x: number; z: number; radius: number; animal: number }\n message: { id: 'alarm' | 'bark' | 'growl'; seconds: number; animal: number; distance?: number }\n}\nexport type HerdEventName = keyof HerdEventMap\n\nexport type HerdNumbers = {\n readonly range: number\n readonly fear: number\n readonly walkFactor: number\n readonly walkBase: number\n readonly runFactor: number\n readonly runBase: number\n readonly activeDistance: number\n readonly companionBehind: number\n readonly companionRun: number\n readonly companionStop: number\n readonly retargetTries: number\n readonly restBase: number\n readonly restRandom: number\n readonly lookEvery: number\n readonly lookShare: number\n readonly lookRadius: number\n readonly fearAgentFactor: number\n readonly fearAgentBase: number\n readonly fleeStep: number\n readonly arrive: number\n readonly bodyHeight: number\n readonly turn: number\n readonly freeHeight: number\n readonly worldMargin: number\n}\n\n/** The game's numbers (`jogo.js` G 66592-66700 `bichoNovo`, `bichoLivre`, `bichosUpdate`). */\nexport const HERD_DEFAULTS: HerdNumbers = {\n range: 8,\n fear: 5,\n walkFactor: 1.05,\n walkBase: 0.25,\n runFactor: 2.2,\n runBase: 0.8,\n activeDistance: 70,\n companionBehind: 2.2,\n companionRun: 6,\n companionStop: 0.8,\n retargetTries: 6,\n restBase: 4,\n restRandom: 7,\n lookEvery: 7,\n lookShare: 0.25,\n lookRadius: 40,\n fearAgentFactor: 1.5,\n fearAgentBase: 2,\n fleeStep: 6,\n arrive: 0.3,\n bodyHeight: 0.3,\n turn: 6,\n freeHeight: 0.6,\n worldMargin: 4,\n}\n\n/**\n * The roles of the animals of the deliveries, by `game-animals-species` id: what `bichosPovoar` gives each one (`jogo.js` G 66607-66623) and the\n * calls of `bichosUpdate` (hen 30 m every 6 s; lapwing 12 m, 40 m, flies 4 s; cow 80 m, 2% a second, every 30 s; dog barks under 12 m, 60 m, every\n * 3 s, growls under 40 m every 10 s). A game passes its own or changes one.\n */\nexport const HERD_ROLES: Readonly<Record<string, HerdRole & { readonly sky?: boolean }>> = {\n dog: { range: 6, fear: 0, guard: { bark: 12, barkNoise: 60, barkCooldown: 3, growl: 40, growlCooldown: 10, sound: 'bark' } },\n cat: { range: 6, fear: 5 },\n chicken: { range: 5, fear: 4, fleeCall: { sound: 'cluck', noise: 30, cooldown: 6 } },\n southern_lapwing: { range: 5, fear: 0, alarm: { range: 12, sound: 'lapwing', noise: 40, cooldown: 8, fly: 4 } },\n cow: { range: 10, fear: 6, call: { chance: 0.02, sound: 'moo', noise: 80, cooldown: 30 } },\n horse: { range: 10, fear: 7 },\n pig: { range: 5, fear: 3 },\n capybara: { range: 8, fear: 15 },\n vulture: { sky: true },\n}\n\nexport type HerdOptions = {\n /** Where the camera is: animals farther than 70 m rest, and sounds carry their distance from here. Default: the target. */\n readonly view?: () => { readonly x: number; readonly z: number }\n /** A spot an animal must not wander into (inside a building). */\n readonly blocked?: (x: number, z: number) => boolean\n readonly numbers?: Partial<HerdNumbers>\n}\n\nexport type Herd = {\n readonly list: readonly HerdAnimal[]\n /** Adds an animal (draws its heading and its first rest, as the game does). */\n add(spec: HerdAnimalSpec): HerdAnimal\n /** A free spot `r0` to `r1` m from (x, z), or null (G 66601 `bichoLivre`). */\n free(x: number, z: number, r0: number, r1: number, tries?: number): [number, number] | null\n /** Wander, flee, follow, call (G 66648 `bichosUpdate`, without the drawing). */\n update(dt: number): void\n /** The time the herd has run (the flock reads it). */\n readonly time: number\n setCompanion(index: number, on: boolean): void\n on<K extends HerdEventName>(event: K, listener: (event: HerdEventMap[K]) => void): () => void\n}\n\n/**\n * Animals on a crowd: a literal port of the team game's animals (`jogo.js` G 66592-66700). Each wanders around home and rests 4 to 11 s, flees\n * from the target and from the crowd's agents, and may call, raise an alarm or guard the target as its companion. The calls are noises the crowd\n * hears. The drawing and the bones are the game's (`game-animals-three`).\n */\nexport function createHerd(crowd: Crowd, options: HerdOptions = {}): Herd {\n const N: HerdNumbers = { ...HERD_DEFAULTS, ...options.numbers }\n const R = crowd.random\n const Z = crowd.store\n const grid = crowd.grid\n const list: HerdAnimal[] = []\n let time = 0\n const listeners = new Map<HerdEventName, Set<(event: never) => void>>()\n const emit = <K extends HerdEventName>(event: K, payload: HerdEventMap[K]): void => {\n for (const listener of listeners.get(event) ?? []) (listener as (event: HerdEventMap[K]) => void)(payload)\n }\n const view = options.view ?? (() => crowd.target?.state ?? { x: 0, z: 0 })\n const free = (x0: number, z0: number, r0: number, r1: number, tries = 40): [number, number] | null => {\n for (let k = 0; k < tries; k++) {\n const a = R() * 6.28\n const r = r0 + R() * (r1 - r0)\n const x = x0 + Math.cos(a) * r\n const z = z0 + Math.sin(a) * r\n if (Math.abs(x) < grid.half - N.worldMargin && Math.abs(z) < grid.half - N.worldMargin && !grid.solidAt(x, z, N.freeHeight) && !options.blocked?.(x, z)) return [x, z]\n }\n return null\n }\n // the nearest live agent (the crowd's grid is costly for this; the fauna is small, so it sweeps all)\n const nearestAgent = (x: number, z: number, r: number): [number, number] | null => {\n let best = -1\n let bd = r * r\n for (let i = 0; i < Z.n; i++) {\n if (Z.state[i] === STATE.DORMANT) continue\n const dx = Z.x[i]! - x\n const dz = Z.z[i]! - z\n const d = dx * dx + dz * dz\n if (d < bd) {\n bd = d\n best = i\n }\n }\n return best < 0 ? null : [best, Math.sqrt(bd)]\n }\n const call = (E: HerdAnimal, sound: string, noise: number, dc: number): void => {\n crowd.emitNoise(E.x, E.z, noise)\n emit('noise', { x: E.x, z: E.z, radius: noise, animal: E.index })\n emit('sound', { sound, volume: 1, position: [E.x, 0.5, E.z], distance: dc, animal: E.index })\n }\n const update = (dt: number): void => {\n time += dt\n const t = crowd.target?.state\n const px = t?.x ?? 0\n const pz = t?.z ?? 0\n const v = view()\n for (const E of list) {\n if (E.spec.sky) continue\n const dc = Math.hypot(E.x - v.x, E.z - v.z)\n if (dc >= N.activeDistance || E.dead) continue\n E.timer -= dt\n E.cooldown -= dt\n let alvoX = E.targetX\n let alvoZ = E.targetZ\n let corre = false\n const dp = t ? Math.hypot(E.x - px, E.z - pz) : Infinity\n if (E.companion && t) {\n // follows 2.2 m behind the target\n const bx = px - Math.sin(t.yaw) * N.companionBehind\n const bz = pz - Math.cos(t.yaw) * N.companionBehind\n alvoX = bx\n alvoZ = bz\n corre = dp > N.companionRun\n if (Math.hypot(bx - E.x, bz - E.z) < N.companionStop) {\n alvoX = E.x\n alvoZ = E.z\n }\n } else if (E.timer <= 0) {\n const q = free(E.homeX, E.homeZ, 0, E.range, N.retargetTries)\n if (q) {\n E.targetX = q[0]\n E.targetZ = q[1]\n }\n E.timer = N.restBase + R() * N.restRandom\n alvoX = E.targetX\n alvoZ = E.targetZ\n }\n // fear: flees from the target (not the companion) and from agents\n const zp = (time * N.lookEvery + E.x) % 1 < N.lookShare || E.near === undefined ? (E.near = nearestAgent(E.x, E.z, N.lookRadius)) : E.near\n let fx = 0\n let fz = 0\n if (E.fear && !E.companion && dp < E.fear) {\n fx += E.x - px\n fz += E.z - pz\n }\n if (E.fear && zp && zp[1] < E.fear * N.fearAgentFactor + N.fearAgentBase) {\n fx += E.x - Z.x[zp[0]]!\n fz += E.z - Z.z[zp[0]]!\n }\n if (fx || fz) {\n const l = Math.hypot(fx, fz) || 1\n alvoX = E.x + (fx / l) * N.fleeStep\n alvoZ = E.z + (fz / l) * N.fleeStep\n corre = true\n const fc = E.spec.fleeCall\n if (fc && E.cooldown <= 0) {\n E.cooldown = fc.cooldown\n call(E, fc.sound, fc.noise, dc)\n }\n }\n // alarms\n const al = E.spec.alarm\n if (al && dp < al.range && E.cooldown <= 0) {\n E.cooldown = al.cooldown\n E.fly = al.fly\n call(E, al.sound, al.noise, dc)\n emit('message', { id: 'alarm', seconds: 2.5, animal: E.index })\n }\n const cl = E.spec.call\n if (cl && E.cooldown <= 0 && R() < dt * cl.chance) {\n E.cooldown = cl.cooldown\n call(E, cl.sound, cl.noise, dc)\n }\n const g = E.spec.guard\n if (g && zp && E.cooldown <= 0) {\n if (zp[1] < g.bark) {\n E.cooldown = g.barkCooldown\n call(E, g.sound, g.barkNoise, dc)\n if (E.companion) emit('message', { id: 'bark', seconds: 1.5, animal: E.index, distance: Math.round(zp[1]) })\n } else if (E.companion && zp[1] < g.growl) {\n E.cooldown = g.growlCooldown\n emit('message', { id: 'growl', seconds: 2.5, animal: E.index, distance: Math.round(zp[1]) })\n }\n }\n // walks\n const ax = alvoX - E.x\n const az = alvoZ - E.z\n const ad = Math.hypot(ax, az)\n let sp = 0\n if (E.fly > 0) {\n E.fly -= dt\n E.clip = 'run'\n } else if (ad > N.arrive) {\n sp = corre ? E.runSpeed : E.walkSpeed\n E.clip = corre ? 'run' : 'walk'\n } else E.clip = 'idle'\n if (sp) {\n const k = Math.min(1, (sp * dt) / ad)\n const nx = E.x + ax * k\n const nz = E.z + az * k\n if (!grid.solidAt(nx, nz, N.bodyHeight)) {\n E.x = nx\n E.z = nz\n } else E.timer = 0\n let dy = Math.atan2(ax, az) - E.yaw\n dy -= Math.round(dy / 6.2832) * 6.2832\n E.yaw += dy * Math.min(1, dt * N.turn)\n }\n }\n }\n return {\n list,\n add(spec) {\n const E: HerdAnimal = {\n index: list.length,\n spec,\n x: spec.x,\n z: spec.z,\n yaw: R() * 6.28,\n homeX: spec.x,\n homeZ: spec.z,\n range: spec.range ?? N.range,\n clip: 'idle',\n timer: R() * 4,\n targetX: spec.x,\n targetZ: spec.z,\n fear: spec.fear ?? N.fear,\n fly: 0,\n cooldown: 0,\n walkSpeed: spec.walkHz * spec.size * N.walkFactor + N.walkBase,\n runSpeed: spec.runHz * spec.size * N.runFactor + N.runBase,\n companion: !!spec.companion,\n dead: !!spec.dead,\n near: undefined,\n }\n list.push(E)\n return E\n },\n free,\n update,\n get time() {\n return time\n },\n setCompanion(index, on) {\n const E = list[index]\n if (!E) return\n E.companion = on\n E.homeX = E.x\n E.homeZ = E.z\n },\n on(event, listener) {\n let set = listeners.get(event)\n if (!set) listeners.set(event, (set = new Set()))\n set.add(listener as (event: never) => void)\n return () => void set.delete(listener as (event: never) => void)\n },\n }\n}\n","/** One bird of a flock this frame: where it is, its heading and its roll, its wing phase, and whether it is close enough to draw. */\nexport type FlockBird = { x: number; y: number; z: number; yaw: number; roll: number; wing: number; visible: boolean }\n\nexport type FlockMode =\n /** The vultures (G 66700-66708): circle the centre of the bodies on the ground, each at its own speed, radius and height. */\n | 'carrion'\n /** The birds of the live map (Bancada de Hordas G 53609-53615): a loose ring that rises and falls. */\n | 'orbit'\n\nexport type FlockOptions = {\n readonly count: number\n readonly mode: FlockMode\n /** Visible within this distance of the view (carrion 260 m; orbit always). */\n readonly visibleWithin?: number\n}\n\nexport type Flock = {\n readonly birds: readonly FlockBird[]\n /** Moves the flock to time `t` (seconds) around `center`; `view` decides what is visible. */\n update(t: number, dt: number, center: readonly [number, number], view?: readonly [number, number]): void\n}\n\n/** The centre the vultures circle: the mean of the bodies on the ground when there are three or more, else `fallback` (a carcass). */\nexport const carrionCenter = (corpses: readonly { readonly x: number; readonly z: number }[], fallback: readonly [number, number] | null): [number, number] => {\n let ux = 0\n let uz = 0\n let un = 0\n for (const c of corpses) {\n ux += c.x\n uz += c.z\n un++\n }\n if (un >= 3) return [ux / un, uz / un]\n // as in the game: with one or two bodies and no carcass the sums stay (G 66702)\n return fallback ? [fallback[0], fallback[1]] : [ux, uz]\n}\n\n/** A flock of birds by formula: the game's vultures or the live map's ring (literal formulas from the deliveries). */\nexport function createFlock(options: FlockOptions): Flock {\n const birds: FlockBird[] = Array.from({ length: options.count }, () => ({ x: 0, y: 0, z: 0, yaw: 0, roll: 0, wing: 0, visible: true }))\n const within = options.visibleWithin ?? (options.mode === 'carrion' ? 260 : Infinity)\n return {\n birds,\n update(t, dt, [cx, cz], view) {\n birds.forEach((U, i) => {\n if (options.mode === 'carrion') {\n const a = t * (0.18 + i * 0.04) + i * 2.1\n const r = 7 + i * 2\n U.x = cx + Math.cos(a) * r\n U.y = 16 + i * 2.5\n U.z = cz + Math.sin(a) * r\n U.yaw = -a\n U.roll = 0.35\n U.visible = !view || Math.hypot(cx - view[0], cz - view[1]) < within\n if (U.visible) U.wing += dt * 1.2 * 2 * Math.PI\n } else {\n const a = t * 0.3 + i * 0.4\n const r = 20 + (i % 7) * 4\n U.x = cx + Math.cos(a) * r\n U.y = 25 + Math.sin(t + i) * 2\n U.z = cz + Math.sin(a) * r\n U.yaw = -a\n U.roll = 0\n U.visible = !view || Math.hypot(cx - view[0], cz - view[1]) < within\n }\n })\n },\n }\n}\n","import type { Crowd } from '../crowd'\nimport type { Civilians } from './civilians'\n\n/** What the crowd needs of a region model: `game-infection`'s `Infection` is one as it is. */\nexport type InfectionModelLike = {\n materialize(region: string, n: number): { state: 'active' | 'contained' | 'removed'; seed: number }[]\n giveBack(region: string, batch: { state: 'active' | 'contained' | 'removed'; seed: number }[]): void\n infect(region: string, n?: number, hoursElapsed?: number): void\n}\n\nexport type InfectionBindingOptions = {\n /** Where the k-th agent of a batch is born in the region, from its seed; null skips it (it goes straight back). */\n readonly place: (region: string, seed: number, k: number) => readonly [number, number] | null\n /** The crowd type of an agent (default: drawn by the pack's weights). */\n readonly typeFor?: (agent: { readonly state: 'active' | 'contained' | 'removed'; readonly seed: number }, region: string) => number\n /** The relevance band from which an agent goes back to the model (default 3: farther than 400 m). */\n readonly giveBackBand?: number\n /** Civilians whose bites the model hears about (`infect`), in the region `regionOf` gives. */\n readonly civilians?: Civilians\n readonly regionOf?: (x: number, z: number) => string | null\n}\n\nexport type InfectionBinding = {\n /** Brings up to `n` infected of `region` out of the model into the crowd. Returns the agents born. */\n materialize(region: string, n: number): number[]\n /** Gives back to the model the agents of `region` (all regions when left out) that are in the far band, or all of them with `all`. */\n giveBack(region?: string, options?: { readonly all?: boolean }): number\n /** The region of a materialised agent, or null. */\n regionOf(agent: number): string | null\n unbind(): void\n}\n\n/**\n * Ties a crowd to a region model (`game-infection`): `materialize` turns the model's numbers into agents near the player, a kill of one of them\n * goes back to its region as removed, the far ones go back with `giveBack`, and a civilian's bite is an `infect`. No team code exists for this bridge\n * (decision P12 of the spec); the model's own API is used as it is.\n */\nexport function bindInfection(crowd: Crowd, model: InfectionModelLike, options: InfectionBindingOptions): InfectionBinding {\n const tracked = new Map<number, { region: string; state: 'active' | 'contained' | 'removed'; seed: number }>()\n const band = options.giveBackBand ?? 3\n const offKill = crowd.on('kill', ({ agent }) => {\n const entry = tracked.get(agent)\n if (!entry) return\n // it left the numbers when it was materialised: it goes back as removed (a `remove` would take one more active from the model)\n model.giveBack(entry.region, [{ state: 'removed', seed: entry.seed }])\n tracked.delete(agent)\n })\n const offRemove = crowd.on('remove', ({ agent, moved }) => {\n tracked.delete(agent)\n if (moved < 0) return\n const entry = tracked.get(moved)\n if (!entry) return\n tracked.delete(moved)\n tracked.set(agent, entry)\n })\n const offBite = options.civilians?.on('bitten', ({ id }) => {\n const n = options.civilians?.get(id)\n const region = n && options.regionOf?.(n.x, n.z)\n if (region) model.infect(region, 1, 0)\n })\n return {\n materialize(region, n) {\n const batch = model.materialize(region, n)\n const born: number[] = []\n const back: typeof batch = []\n batch.forEach((agent, k) => {\n const at = options.place(region, agent.seed, k)\n const i = at ? crowd.spawn(at[0], at[1], options.typeFor?.(agent, region) ?? -1) : -1\n if (i < 0) {\n back.push(agent)\n return\n }\n tracked.set(i, { region, state: agent.state, seed: agent.seed })\n born.push(i)\n })\n if (back.length) model.giveBack(region, back)\n return born\n },\n giveBack(region, opts = {}) {\n const byRegion = new Map<string, { state: 'active' | 'contained' | 'removed'; seed: number }[]>()\n const indices = [...tracked.keys()].sort((a, b) => b - a)\n for (const i of indices) {\n const entry = tracked.get(i)\n if (!entry || (region !== undefined && entry.region !== region)) continue\n if (!opts.all && crowd.store.band[i]! < band) continue\n let list = byRegion.get(entry.region)\n if (!list) byRegion.set(entry.region, (list = []))\n list.push({ state: entry.state, seed: entry.seed })\n tracked.delete(i)\n crowd.remove(i)\n }\n let count = 0\n for (const [r, list] of byRegion) {\n model.giveBack(r, list)\n count += list.length\n }\n return count\n },\n regionOf: (agent) => tracked.get(agent)?.region ?? null,\n unbind() {\n offKill()\n offRemove()\n offBite?.()\n tracked.clear()\n },\n }\n}\n"],"mappings":"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","names":["ec","c"]}
package/package.json CHANGED
@@ -1,6 +1,61 @@
1
1
  {
2
2
  "name": "@adatechnology/game-crowd",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.2.1",
4
+ "license": "MIT",
5
+ "description": "Any crowd as a struct of arrays, pure and seeded: relevance bands, perception by sight, hearing and smell, a sliced flow field, separation, attack slots, chain alerts, doors, piles against walls, abilities as type traits, corpses, population and migration; civilians, herds and flocks; a bridge to game-infection. A literal port of the team game horde. Knows nothing about any game.",
6
+ "keywords": [
7
+ "game",
8
+ "crowd",
9
+ "horde",
10
+ "flow-field",
11
+ "agents",
12
+ "simulation",
13
+ "deterministic",
14
+ "seeded"
15
+ ],
16
+ "repository": {
17
+ "type": "git",
18
+ "url": "git+https://github.com/Andersonfrfilho/adatechnology-game-kit.git",
19
+ "directory": "packages/game-crowd"
20
+ },
21
+ "publishConfig": {
22
+ "access": "public"
23
+ },
24
+ "type": "module",
25
+ "main": "dist/index.js",
26
+ "module": "dist/index.js",
27
+ "types": "dist/index.d.ts",
28
+ "unpkg": "dist/index.global.js",
29
+ "jsdelivr": "dist/index.global.js",
30
+ "sideEffects": false,
31
+ "exports": {
32
+ ".": {
33
+ "types": "./dist/index.d.ts",
34
+ "import": "./dist/index.js"
35
+ },
36
+ "./global": "./dist/index.global.js"
37
+ },
38
+ "files": [
39
+ "dist"
40
+ ],
41
+ "dependencies": {
42
+ "@adatechnology/game-characters": "0.2.0",
43
+ "@adatechnology/game-contracts": "0.14.0"
44
+ },
45
+ "devDependencies": {
46
+ "@types/node": "^22.10.7",
47
+ "tsup": "^8.5.1",
48
+ "typescript": "^5.7.3",
49
+ "vitest": "^3.2.4",
50
+ "@adatechnology/game-animals": "0.1.0",
51
+ "@adatechnology/game-animals-species": "0.1.0",
52
+ "@adatechnology/game-characters-undead": "0.2.1",
53
+ "@adatechnology/game-infection": "0.1.0",
54
+ "@adatechnology/golden-tool": "0.0.0"
55
+ },
56
+ "scripts": {
57
+ "build": "tsup",
58
+ "typecheck": "tsc -p tsconfig.json --noEmit",
59
+ "test": "vitest run"
60
+ }
6
61
  }