@jgengine/core 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +214 -2
- package/README.md +2 -0
- package/dist/ai/crowd.d.ts +36 -0
- package/dist/ai/crowd.js +213 -0
- package/dist/ai/jobBoard.d.ts +49 -0
- package/dist/ai/jobBoard.js +155 -0
- package/dist/ai/spawnDirector.d.ts +61 -0
- package/dist/ai/spawnDirector.js +162 -0
- package/dist/ai/threat.d.ts +25 -0
- package/dist/ai/threat.js +67 -0
- package/dist/anim/easing.d.ts +14 -0
- package/dist/anim/easing.js +55 -0
- package/dist/audio/audioFalloff.d.ts +38 -0
- package/dist/audio/audioFalloff.js +32 -0
- package/dist/behaviour/behaviour.d.ts +136 -0
- package/dist/behaviour/behaviour.js +388 -0
- package/dist/board/laneBoard.d.ts +63 -0
- package/dist/board/laneBoard.js +114 -0
- package/dist/board/timelineBoard.d.ts +36 -0
- package/dist/board/timelineBoard.js +70 -0
- package/dist/cards/cardPile.d.ts +64 -0
- package/dist/cards/cardPile.js +175 -0
- package/dist/cards/modifierPipeline.d.ts +33 -0
- package/dist/cards/modifierPipeline.js +48 -0
- package/dist/combat/abilityKit.d.ts +47 -0
- package/dist/combat/abilityKit.js +139 -0
- package/dist/combat/animationState.d.ts +47 -0
- package/dist/combat/animationState.js +101 -0
- package/dist/combat/attackTags.d.ts +14 -0
- package/dist/combat/attackTags.js +26 -0
- package/dist/combat/breakMeters.d.ts +32 -0
- package/dist/combat/breakMeters.js +51 -0
- package/dist/combat/comboString.d.ts +35 -0
- package/dist/combat/comboString.js +59 -0
- package/dist/combat/death.d.ts +8 -0
- package/dist/combat/death.js +5 -2
- package/dist/combat/defensiveWindow.d.ts +34 -0
- package/dist/combat/defensiveWindow.js +66 -0
- package/dist/combat/downed.d.ts +35 -0
- package/dist/combat/downed.js +104 -0
- package/dist/combat/effects.d.ts +12 -1
- package/dist/combat/effects.js +31 -19
- package/dist/combat/hitReaction.d.ts +23 -0
- package/dist/combat/hitReaction.js +20 -0
- package/dist/combat/projectiles.d.ts +42 -5
- package/dist/combat/projectiles.js +98 -12
- package/dist/combat/resistance.d.ts +13 -0
- package/dist/combat/resistance.js +46 -0
- package/dist/combat/telegraph.d.ts +31 -0
- package/dist/combat/telegraph.js +51 -0
- package/dist/commands/commandRegistry.d.ts +1 -1
- package/dist/commands/commandRegistry.js +2 -1
- package/dist/crafting/crop.d.ts +59 -0
- package/dist/crafting/crop.js +181 -0
- package/dist/crafting/production.d.ts +64 -0
- package/dist/crafting/production.js +130 -0
- package/dist/crafting/recipe.d.ts +62 -0
- package/dist/crafting/recipe.js +101 -0
- package/dist/data/dataSource.d.ts +26 -0
- package/dist/data/dataSource.js +93 -0
- package/dist/data/devProxy.d.ts +11 -0
- package/dist/data/devProxy.js +38 -0
- package/dist/data/fetchJson.d.ts +20 -0
- package/dist/data/fetchJson.js +43 -0
- package/dist/data/jsonDataSource.d.ts +4 -0
- package/dist/data/jsonDataSource.js +6 -0
- package/dist/devtools/devtools.d.ts +157 -0
- package/dist/devtools/devtools.js +484 -0
- package/dist/devtools/transformTunables.d.ts +14 -0
- package/dist/devtools/transformTunables.js +38 -0
- package/dist/economy/sharedWallet.d.ts +28 -0
- package/dist/economy/sharedWallet.js +62 -0
- package/dist/economy/techTree.d.ts +40 -0
- package/dist/economy/techTree.js +66 -0
- package/dist/game/chat.d.ts +66 -0
- package/dist/game/chat.js +165 -0
- package/dist/game/cosmetics.d.ts +25 -0
- package/dist/game/cosmetics.js +51 -0
- package/dist/game/defineGame.d.ts +10 -2
- package/dist/game/defineGame.js +2 -1
- package/dist/game/events.d.ts +87 -0
- package/dist/game/levelSequence.d.ts +44 -0
- package/dist/game/levelSequence.js +78 -0
- package/dist/game/lootFilter.d.ts +33 -0
- package/dist/game/lootFilter.js +48 -0
- package/dist/game/ping.d.ts +67 -0
- package/dist/game/ping.js +86 -0
- package/dist/game/playableGame.d.ts +516 -8
- package/dist/game/playableGame.js +6 -1
- package/dist/game/progression.d.ts +1 -0
- package/dist/game/progression.js +23 -2
- package/dist/game/race.d.ts +100 -0
- package/dist/game/race.js +236 -0
- package/dist/game/runDraft.d.ts +34 -0
- package/dist/game/runDraft.js +97 -0
- package/dist/game/social.d.ts +69 -0
- package/dist/game/social.js +138 -0
- package/dist/game/spawnPoints.d.ts +19 -0
- package/dist/game/spawnPoints.js +23 -0
- package/dist/game/worldItem.d.ts +95 -0
- package/dist/game/worldItem.js +138 -0
- package/dist/input/actionBindings.d.ts +10 -0
- package/dist/input/actionBindings.js +14 -0
- package/dist/input/axisInput.d.ts +43 -0
- package/dist/input/axisInput.js +70 -0
- package/dist/input/gestureSurface.d.ts +31 -0
- package/dist/input/gestureSurface.js +120 -0
- package/dist/input/pointer.d.ts +69 -0
- package/dist/input/pointer.js +65 -0
- package/dist/input/touchScheme.d.ts +83 -0
- package/dist/input/touchScheme.js +115 -0
- package/dist/interaction/contextMenu.d.ts +30 -0
- package/dist/interaction/contextMenu.js +22 -0
- package/dist/interaction/qte.d.ts +20 -0
- package/dist/interaction/qte.js +24 -0
- package/dist/interaction/skillCheck.d.ts +20 -0
- package/dist/interaction/skillCheck.js +26 -0
- package/dist/inventory/shapedGrid.d.ts +56 -0
- package/dist/inventory/shapedGrid.js +176 -0
- package/dist/inventory/storageTier.d.ts +52 -0
- package/dist/inventory/storageTier.js +77 -0
- package/dist/item/affix.d.ts +54 -0
- package/dist/item/affix.js +115 -0
- package/dist/item/durability.d.ts +51 -0
- package/dist/item/durability.js +78 -0
- package/dist/item/modularItem.d.ts +46 -0
- package/dist/item/modularItem.js +75 -0
- package/dist/meta/changelog.d.ts +1 -1
- package/dist/meta/changelog.js +71 -1
- package/dist/movement/dash.d.ts +37 -0
- package/dist/movement/dash.js +65 -0
- package/dist/movement/movementModel.d.ts +36 -3
- package/dist/movement/movementModel.js +81 -5
- package/dist/movement/voxelController.d.ts +61 -0
- package/dist/movement/voxelController.js +229 -0
- package/dist/multiplayer/chatContract.d.ts +42 -0
- package/dist/multiplayer/chatContract.js +57 -0
- package/dist/multiplayer/combatSnapshot.d.ts +45 -0
- package/dist/multiplayer/combatSnapshot.js +89 -0
- package/dist/multiplayer/identity.d.ts +13 -0
- package/dist/multiplayer/identity.js +20 -0
- package/dist/multiplayer/lagCompensation.d.ts +43 -0
- package/dist/multiplayer/lagCompensation.js +154 -0
- package/dist/multiplayer/matchmaking.d.ts +33 -0
- package/dist/multiplayer/matchmaking.js +60 -0
- package/dist/multiplayer/poseSyncGate.d.ts +1 -0
- package/dist/multiplayer/poseSyncGate.js +13 -1
- package/dist/multiplayer/presenceModel.d.ts +3 -0
- package/dist/multiplayer/presenceModel.js +15 -1
- package/dist/multiplayer/simultaneousCommit.d.ts +34 -0
- package/dist/multiplayer/simultaneousCommit.js +53 -0
- package/dist/multiplayer/voiceContract.d.ts +44 -0
- package/dist/multiplayer/voiceContract.js +108 -0
- package/dist/nav/navConstrain.d.ts +14 -0
- package/dist/nav/navConstrain.js +26 -0
- package/dist/nav/navFromEnvironment.d.ts +11 -0
- package/dist/nav/navFromEnvironment.js +16 -0
- package/dist/nav/navGrid.d.ts +56 -0
- package/dist/nav/navGrid.js +265 -0
- package/dist/nav/pathFollow.d.ts +31 -0
- package/dist/nav/pathFollow.js +69 -0
- package/dist/physics/ballisticSweep.d.ts +18 -0
- package/dist/physics/ballisticSweep.js +49 -0
- package/dist/physics/buoyancy.d.ts +49 -0
- package/dist/physics/buoyancy.js +112 -0
- package/dist/physics/carryable.d.ts +46 -0
- package/dist/physics/carryable.js +110 -0
- package/dist/physics/damageZones.d.ts +56 -0
- package/dist/physics/damageZones.js +107 -0
- package/dist/physics/forceVolume.d.ts +48 -0
- package/dist/physics/forceVolume.js +119 -0
- package/dist/physics/physicsWorld.d.ts +124 -2
- package/dist/physics/physicsWorld.js +493 -41
- package/dist/physics/ragdoll.d.ts +49 -0
- package/dist/physics/ragdoll.js +103 -0
- package/dist/physics/spatialGrid.d.ts +41 -0
- package/dist/physics/spatialGrid.js +143 -0
- package/dist/physics/structure.d.ts +83 -0
- package/dist/physics/structure.js +0 -0
- package/dist/physics/traversal.d.ts +75 -0
- package/dist/physics/traversal.js +138 -0
- package/dist/physics/vehicleBody.d.ts +99 -0
- package/dist/physics/vehicleBody.js +233 -0
- package/dist/puzzle/cellGrid.d.ts +26 -0
- package/dist/puzzle/cellGrid.js +110 -0
- package/dist/puzzle/fallingPiece.d.ts +24 -0
- package/dist/puzzle/fallingPiece.js +51 -0
- package/dist/random/nameGen.d.ts +18 -0
- package/dist/random/nameGen.js +35 -0
- package/dist/random/rng.d.ts +2 -0
- package/dist/random/rng.js +23 -0
- package/dist/runtime/adapter.d.ts +35 -0
- package/dist/runtime/adapter.js +37 -1
- package/dist/runtime/cameraDirector.d.ts +10 -0
- package/dist/runtime/cameraDirector.js +25 -0
- package/dist/runtime/gameContext.d.ts +107 -3
- package/dist/runtime/gameContext.js +253 -7
- package/dist/runtime/hostPersistence.d.ts +39 -0
- package/dist/runtime/hostPersistence.js +54 -0
- package/dist/runtime/inputSnapshot.d.ts +7 -0
- package/dist/runtime/inputSnapshot.js +12 -0
- package/dist/runtime/motionIntents.d.ts +25 -0
- package/dist/runtime/motionIntents.js +25 -0
- package/dist/runtime/persistenceScope.d.ts +32 -0
- package/dist/runtime/persistenceScope.js +64 -0
- package/dist/runtime/transport.d.ts +32 -0
- package/dist/scene/autoTarget.d.ts +15 -0
- package/dist/scene/autoTarget.js +54 -0
- package/dist/scene/behaviors.d.ts +13 -1
- package/dist/scene/behaviors.js +3 -0
- package/dist/scene/captureCheck.d.ts +7 -0
- package/dist/scene/captureCheck.js +11 -0
- package/dist/scene/entityStore.d.ts +9 -1
- package/dist/scene/entityStore.js +25 -2
- package/dist/scene/form.d.ts +40 -0
- package/dist/scene/form.js +56 -0
- package/dist/scene/mount.d.ts +62 -0
- package/dist/scene/mount.js +107 -0
- package/dist/scene/movementSpeed.d.ts +35 -0
- package/dist/scene/movementSpeed.js +20 -0
- package/dist/scene/objectQuery.d.ts +18 -0
- package/dist/scene/objectQuery.js +108 -0
- package/dist/scene/objectStore.d.ts +11 -0
- package/dist/scene/objectStore.js +109 -4
- package/dist/scene/paintLayer.d.ts +15 -0
- package/dist/scene/paintLayer.js +53 -0
- package/dist/scene/possession.d.ts +30 -0
- package/dist/scene/possession.js +51 -0
- package/dist/scene/roster.d.ts +25 -0
- package/dist/scene/roster.js +57 -0
- package/dist/scene/selection.d.ts +30 -0
- package/dist/scene/selection.js +38 -0
- package/dist/scene/spatial.d.ts +21 -0
- package/dist/scene/spatial.js +63 -1
- package/dist/scene/stationClaim.d.ts +43 -0
- package/dist/scene/stationClaim.js +109 -0
- package/dist/sensor/concealment.d.ts +21 -0
- package/dist/sensor/concealment.js +63 -0
- package/dist/sensor/freezeMonitor.d.ts +17 -0
- package/dist/sensor/freezeMonitor.js +35 -0
- package/dist/sensor/frustumSensor.d.ts +60 -0
- package/dist/sensor/frustumSensor.js +104 -0
- package/dist/sensor/hiddenStateProbe.d.ts +31 -0
- package/dist/sensor/hiddenStateProbe.js +40 -0
- package/dist/sensor/recordingBuffer.d.ts +29 -0
- package/dist/sensor/recordingBuffer.js +61 -0
- package/dist/sensor/revealQuery.d.ts +22 -0
- package/dist/sensor/revealQuery.js +36 -0
- package/dist/session/contestedChannel.d.ts +36 -0
- package/dist/session/contestedChannel.js +100 -0
- package/dist/session/extraction.d.ts +54 -0
- package/dist/session/extraction.js +108 -0
- package/dist/session/ring.d.ts +36 -0
- package/dist/session/ring.js +88 -0
- package/dist/session/roles.d.ts +6 -0
- package/dist/session/roles.js +32 -0
- package/dist/session/roundState.d.ts +79 -0
- package/dist/session/roundState.js +158 -0
- package/dist/stats/accumulatorMeter.d.ts +31 -0
- package/dist/stats/accumulatorMeter.js +81 -0
- package/dist/stats/eventMeter.d.ts +34 -0
- package/dist/stats/eventMeter.js +76 -0
- package/dist/stats/rollCheck.d.ts +15 -0
- package/dist/stats/rollCheck.js +15 -0
- package/dist/survival/decayMeter.d.ts +59 -0
- package/dist/survival/decayMeter.js +95 -0
- package/dist/survival/moodle.d.ts +48 -0
- package/dist/survival/moodle.js +91 -0
- package/dist/survival/regionHealth.d.ts +72 -0
- package/dist/survival/regionHealth.js +129 -0
- package/dist/tactics/fallingGrid.d.ts +62 -0
- package/dist/tactics/fallingGrid.js +158 -0
- package/dist/tactics/predictiveQuery.d.ts +34 -0
- package/dist/tactics/predictiveQuery.js +44 -0
- package/dist/tactics/snapshot.d.ts +18 -0
- package/dist/tactics/snapshot.js +65 -0
- package/dist/tactics/surface.d.ts +52 -0
- package/dist/tactics/surface.js +135 -0
- package/dist/tactics/tacticalGrid.d.ts +68 -0
- package/dist/tactics/tacticalGrid.js +261 -0
- package/dist/time/beatClock.d.ts +40 -0
- package/dist/time/beatClock.js +73 -0
- package/dist/time/simClock.d.ts +25 -1
- package/dist/time/simClock.js +28 -3
- package/dist/turn/commit.d.ts +27 -0
- package/dist/turn/commit.js +72 -0
- package/dist/turn/intent.d.ts +14 -0
- package/dist/turn/intent.js +29 -0
- package/dist/turn/turnLoop.d.ts +60 -0
- package/dist/turn/turnLoop.js +223 -0
- package/dist/world/buildPermissions.d.ts +47 -0
- package/dist/world/buildPermissions.js +134 -0
- package/dist/world/carve.d.ts +105 -0
- package/dist/world/carve.js +175 -0
- package/dist/world/connectors.d.ts +40 -0
- package/dist/world/connectors.js +67 -0
- package/dist/world/envField.d.ts +71 -0
- package/dist/world/envField.js +96 -0
- package/dist/world/environmentSummary.d.ts +53 -0
- package/dist/world/environmentSummary.js +129 -0
- package/dist/world/features.d.ts +87 -6
- package/dist/world/features.js +52 -2
- package/dist/world/fog.d.ts +40 -0
- package/dist/world/fog.js +137 -0
- package/dist/world/gridInstances.d.ts +13 -0
- package/dist/world/gridInstances.js +22 -0
- package/dist/world/markers.d.ts +52 -0
- package/dist/world/markers.js +96 -0
- package/dist/world/minimap.d.ts +42 -0
- package/dist/world/minimap.js +72 -0
- package/dist/world/placedStructureStore.d.ts +39 -0
- package/dist/world/placedStructureStore.js +95 -0
- package/dist/world/placementController.d.ts +69 -0
- package/dist/world/placementController.js +153 -0
- package/dist/world/realm.d.ts +61 -0
- package/dist/world/realm.js +66 -0
- package/dist/world/support.d.ts +27 -0
- package/dist/world/support.js +75 -0
- package/dist/world/terraform.d.ts +54 -0
- package/dist/world/terraform.js +186 -0
- package/dist/world/terrain.d.ts +23 -1
- package/dist/world/terrain.js +64 -1
- package/dist/world/voxelField.d.ts +54 -0
- package/dist/world/voxelField.js +241 -0
- package/dist/world/walls.d.ts +61 -0
- package/dist/world/walls.js +221 -0
- package/dist/world/weather.d.ts +92 -0
- package/dist/world/weather.js +169 -0
- package/llms.txt +4102 -0
- package/package.json +3 -2
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
const NEUTRAL = {
|
|
2
|
+
grip: 1,
|
|
3
|
+
visibility: 1,
|
|
4
|
+
structureDamage: 0,
|
|
5
|
+
chill: 0,
|
|
6
|
+
ignition: 0,
|
|
7
|
+
spread: 1,
|
|
8
|
+
};
|
|
9
|
+
function lerp(from, to, t) {
|
|
10
|
+
return from + (to - from) * t;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Resolve a weather state against a game-owned modifier table into concrete gameplay
|
|
14
|
+
* numbers. Multiplier-style effects (grip, visibility, spread) interpolate from the
|
|
15
|
+
* neutral 1 by intensity; rate-style effects (structureDamage, ignition, chill) scale
|
|
16
|
+
* linearly. Games read `grip`/`visibility` in movement and AI, `structureDamage` on a
|
|
17
|
+
* building tick, and `spread`/`ignition` feed the fire grid.
|
|
18
|
+
*/
|
|
19
|
+
export function resolveWeather(state, table) {
|
|
20
|
+
const entry = table[state.kind];
|
|
21
|
+
if (entry === undefined)
|
|
22
|
+
return { ...NEUTRAL };
|
|
23
|
+
const t = Math.max(0, Math.min(1, state.intensity));
|
|
24
|
+
return {
|
|
25
|
+
grip: lerp(1, entry.grip ?? 1, t),
|
|
26
|
+
visibility: lerp(1, entry.visibility ?? 1, t),
|
|
27
|
+
structureDamage: (entry.structureDamage ?? 0) * t,
|
|
28
|
+
chill: (entry.chill ?? 0) * t,
|
|
29
|
+
ignition: (entry.ignition ?? 0) * t,
|
|
30
|
+
spread: lerp(1, entry.spread ?? 1, t),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
const NEIGHBOURS = [
|
|
34
|
+
[1, 0],
|
|
35
|
+
[-1, 0],
|
|
36
|
+
[0, 1],
|
|
37
|
+
[0, -1],
|
|
38
|
+
[1, 1],
|
|
39
|
+
[1, -1],
|
|
40
|
+
[-1, 1],
|
|
41
|
+
[-1, -1],
|
|
42
|
+
];
|
|
43
|
+
export function createFireGrid(config) {
|
|
44
|
+
const { cols, rows, cellSize } = config;
|
|
45
|
+
if (cols <= 0 || rows <= 0)
|
|
46
|
+
throw new Error("createFireGrid: cols/rows must be positive");
|
|
47
|
+
const originX = config.origin?.[0] ?? 0;
|
|
48
|
+
const originZ = config.origin?.[1] ?? 0;
|
|
49
|
+
const ignitionThreshold = config.ignitionThreshold ?? 1;
|
|
50
|
+
const spreadRate = config.spreadRate ?? 0.6;
|
|
51
|
+
const burnRate = config.burnRate ?? 0.25;
|
|
52
|
+
const windBias = Math.max(0, Math.min(1, config.windBias ?? 0.6));
|
|
53
|
+
const wind = config.wind;
|
|
54
|
+
const windLen = wind === undefined ? 0 : Math.hypot(wind[0], wind[1]);
|
|
55
|
+
const windX = windLen > 0 ? wind[0] / windLen : 0;
|
|
56
|
+
const windZ = windLen > 0 ? wind[1] / windLen : 0;
|
|
57
|
+
const cells = new Array(cols * rows);
|
|
58
|
+
for (let row = 0; row < rows; row += 1) {
|
|
59
|
+
for (let col = 0; col < cols; col += 1) {
|
|
60
|
+
const fuel = config.fuelAt?.(col, row) ?? 1;
|
|
61
|
+
cells[row * cols + col] = { fuel: Math.max(0, fuel), heat: 0, state: "unburnt" };
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
const index = (col, row) => row * cols + col;
|
|
65
|
+
const inBounds = (col, row) => col >= 0 && col < cols && row >= 0 && row < rows;
|
|
66
|
+
const cellCoord = (x, z) => {
|
|
67
|
+
const col = Math.round((x - originX) / cellSize);
|
|
68
|
+
const row = Math.round((z - originZ) / cellSize);
|
|
69
|
+
return inBounds(col, row) ? { col, row } : null;
|
|
70
|
+
};
|
|
71
|
+
const directionalWeight = (dx, dz) => {
|
|
72
|
+
if (windLen === 0)
|
|
73
|
+
return 1;
|
|
74
|
+
const len = Math.hypot(dx, dz) || 1;
|
|
75
|
+
const alignment = (dx / len) * windX + (dz / len) * windZ;
|
|
76
|
+
return 1 + windBias * alignment;
|
|
77
|
+
};
|
|
78
|
+
let burning = 0;
|
|
79
|
+
for (const cell of cells)
|
|
80
|
+
if (cell.state === "burning")
|
|
81
|
+
burning += 1;
|
|
82
|
+
const igniteCell = (col, row) => {
|
|
83
|
+
if (!inBounds(col, row))
|
|
84
|
+
return;
|
|
85
|
+
const cell = cells[index(col, row)];
|
|
86
|
+
if (cell.state === "burnt" || cell.fuel <= 0)
|
|
87
|
+
return;
|
|
88
|
+
if (cell.state !== "burning")
|
|
89
|
+
burning += 1;
|
|
90
|
+
cell.state = "burning";
|
|
91
|
+
cell.heat = Math.max(cell.heat, ignitionThreshold);
|
|
92
|
+
};
|
|
93
|
+
return {
|
|
94
|
+
cols,
|
|
95
|
+
rows,
|
|
96
|
+
step(dt, options) {
|
|
97
|
+
if (dt <= 0)
|
|
98
|
+
return;
|
|
99
|
+
const globalSpread = options?.spread ?? 1;
|
|
100
|
+
const wetnessAt = options?.wetnessAt;
|
|
101
|
+
const addedHeat = new Float64Array(cols * rows);
|
|
102
|
+
for (let row = 0; row < rows; row += 1) {
|
|
103
|
+
for (let col = 0; col < cols; col += 1) {
|
|
104
|
+
const cell = cells[index(col, row)];
|
|
105
|
+
if (cell.state !== "burning")
|
|
106
|
+
continue;
|
|
107
|
+
for (const [dx, dz] of NEIGHBOURS) {
|
|
108
|
+
const nc = col + dx;
|
|
109
|
+
const nr = row + dz;
|
|
110
|
+
if (!inBounds(nc, nr))
|
|
111
|
+
continue;
|
|
112
|
+
const neighbour = cells[index(nc, nr)];
|
|
113
|
+
if (neighbour.state === "burnt" || neighbour.fuel <= 0)
|
|
114
|
+
continue;
|
|
115
|
+
addedHeat[index(nc, nr)] +=
|
|
116
|
+
spreadRate * globalSpread * directionalWeight(dx, dz) * dt;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
for (let row = 0; row < rows; row += 1) {
|
|
121
|
+
for (let col = 0; col < cols; col += 1) {
|
|
122
|
+
const i = index(col, row);
|
|
123
|
+
const cell = cells[i];
|
|
124
|
+
if (cell.state === "burning") {
|
|
125
|
+
cell.fuel = Math.max(0, cell.fuel - burnRate * dt);
|
|
126
|
+
if (cell.fuel <= 0) {
|
|
127
|
+
cell.state = "burnt";
|
|
128
|
+
cell.heat = 0;
|
|
129
|
+
burning -= 1;
|
|
130
|
+
}
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
if (cell.state !== "unburnt" || addedHeat[i] === 0)
|
|
134
|
+
continue;
|
|
135
|
+
const resist = wetnessAt === undefined ? 0 : Math.max(0, Math.min(1, wetnessAt(col, row)));
|
|
136
|
+
cell.heat += addedHeat[i] * (1 - resist);
|
|
137
|
+
if (cell.heat >= ignitionThreshold && cell.fuel > 0) {
|
|
138
|
+
cell.state = "burning";
|
|
139
|
+
burning += 1;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
igniteCell,
|
|
145
|
+
ignite(x, z) {
|
|
146
|
+
const coord = cellCoord(x, z);
|
|
147
|
+
if (coord === null)
|
|
148
|
+
return false;
|
|
149
|
+
igniteCell(coord.col, coord.row);
|
|
150
|
+
return true;
|
|
151
|
+
},
|
|
152
|
+
cell(col, row) {
|
|
153
|
+
if (!inBounds(col, row))
|
|
154
|
+
throw new Error(`fire cell out of bounds: ${col},${row}`);
|
|
155
|
+
return cells[index(col, row)];
|
|
156
|
+
},
|
|
157
|
+
cellAt(x, z) {
|
|
158
|
+
const coord = cellCoord(x, z);
|
|
159
|
+
return coord === null ? null : cells[index(coord.col, coord.row)];
|
|
160
|
+
},
|
|
161
|
+
cellCoord,
|
|
162
|
+
get burning() {
|
|
163
|
+
return burning;
|
|
164
|
+
},
|
|
165
|
+
snapshot() {
|
|
166
|
+
return cells.map((cell) => ({ ...cell }));
|
|
167
|
+
},
|
|
168
|
+
};
|
|
169
|
+
}
|