quake2ts 0.0.7
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/apps/viewer/dist/browser/index.global.js +2 -0
- package/apps/viewer/dist/browser/index.global.js.map +1 -0
- package/apps/viewer/dist/cjs/index.cjs +1087 -0
- package/apps/viewer/dist/cjs/index.cjs.map +1 -0
- package/apps/viewer/dist/esm/index.js +1060 -0
- package/apps/viewer/dist/esm/index.js.map +1 -0
- package/apps/viewer/dist/tsconfig.tsbuildinfo +1 -0
- package/apps/viewer/dist/types/index.d.ts +7 -0
- package/apps/viewer/dist/types/index.d.ts.map +1 -0
- package/package.json +107 -0
- package/packages/client/dist/browser/index.global.js +2 -0
- package/packages/client/dist/browser/index.global.js.map +1 -0
- package/packages/client/dist/cjs/index.cjs +57 -0
- package/packages/client/dist/cjs/index.cjs.map +1 -0
- package/packages/client/dist/esm/index.js +32 -0
- package/packages/client/dist/esm/index.js.map +1 -0
- package/packages/client/dist/tsconfig.tsbuildinfo +1 -0
- package/packages/client/dist/types/index.d.ts +14 -0
- package/packages/client/dist/types/index.d.ts.map +1 -0
- package/packages/engine/dist/browser/index.global.js +2 -0
- package/packages/engine/dist/browser/index.global.js.map +1 -0
- package/packages/engine/dist/cjs/index.cjs +1823 -0
- package/packages/engine/dist/cjs/index.cjs.map +1 -0
- package/packages/engine/dist/esm/index.js +1764 -0
- package/packages/engine/dist/esm/index.js.map +1 -0
- package/packages/engine/dist/tsconfig.tsbuildinfo +1 -0
- package/packages/engine/dist/types/assets/browserIngestion.d.ts +7 -0
- package/packages/engine/dist/types/assets/browserIngestion.d.ts.map +1 -0
- package/packages/engine/dist/types/assets/bsp.d.ts +157 -0
- package/packages/engine/dist/types/assets/bsp.d.ts.map +1 -0
- package/packages/engine/dist/types/assets/cache.d.ts +17 -0
- package/packages/engine/dist/types/assets/cache.d.ts.map +1 -0
- package/packages/engine/dist/types/assets/ingestion.d.ts +31 -0
- package/packages/engine/dist/types/assets/ingestion.d.ts.map +1 -0
- package/packages/engine/dist/types/assets/md2.d.ts +73 -0
- package/packages/engine/dist/types/assets/md2.d.ts.map +1 -0
- package/packages/engine/dist/types/assets/pak.d.ts +28 -0
- package/packages/engine/dist/types/assets/pak.d.ts.map +1 -0
- package/packages/engine/dist/types/assets/vfs.d.ts +23 -0
- package/packages/engine/dist/types/assets/vfs.d.ts.map +1 -0
- package/packages/engine/dist/types/configstrings.d.ts +34 -0
- package/packages/engine/dist/types/configstrings.d.ts.map +1 -0
- package/packages/engine/dist/types/cvars.d.ts +43 -0
- package/packages/engine/dist/types/cvars.d.ts.map +1 -0
- package/packages/engine/dist/types/host.d.ts +42 -0
- package/packages/engine/dist/types/host.d.ts.map +1 -0
- package/packages/engine/dist/types/index.d.ts +37 -0
- package/packages/engine/dist/types/index.d.ts.map +1 -0
- package/packages/engine/dist/types/loop.d.ts +40 -0
- package/packages/engine/dist/types/loop.d.ts.map +1 -0
- package/packages/engine/dist/types/render/bsp.d.ts +49 -0
- package/packages/engine/dist/types/render/bsp.d.ts.map +1 -0
- package/packages/engine/dist/types/render/context.d.ts +36 -0
- package/packages/engine/dist/types/render/context.d.ts.map +1 -0
- package/packages/engine/dist/types/render/resources.d.ts +56 -0
- package/packages/engine/dist/types/render/resources.d.ts.map +1 -0
- package/packages/engine/dist/types/render/shaderProgram.d.ts +18 -0
- package/packages/engine/dist/types/render/shaderProgram.d.ts.map +1 -0
- package/packages/engine/dist/types/runtime.d.ts +15 -0
- package/packages/engine/dist/types/runtime.d.ts.map +1 -0
- package/packages/game/dist/browser/index.global.js +2 -0
- package/packages/game/dist/browser/index.global.js.map +1 -0
- package/packages/game/dist/cjs/index.cjs +758 -0
- package/packages/game/dist/cjs/index.cjs.map +1 -0
- package/packages/game/dist/esm/index.js +725 -0
- package/packages/game/dist/esm/index.js.map +1 -0
- package/packages/game/dist/tsconfig.tsbuildinfo +1 -0
- package/packages/game/dist/types/entities/entity.d.ts +92 -0
- package/packages/game/dist/types/entities/entity.d.ts.map +1 -0
- package/packages/game/dist/types/entities/index.d.ts +3 -0
- package/packages/game/dist/types/entities/index.d.ts.map +1 -0
- package/packages/game/dist/types/entities/pool.d.ts +18 -0
- package/packages/game/dist/types/entities/pool.d.ts.map +1 -0
- package/packages/game/dist/types/entities/system.d.ts +18 -0
- package/packages/game/dist/types/entities/system.d.ts.map +1 -0
- package/packages/game/dist/types/entities/thinkScheduler.d.ts +8 -0
- package/packages/game/dist/types/entities/thinkScheduler.d.ts.map +1 -0
- package/packages/game/dist/types/index.d.ts +26 -0
- package/packages/game/dist/types/index.d.ts.map +1 -0
- package/packages/game/dist/types/level.d.ts +14 -0
- package/packages/game/dist/types/level.d.ts.map +1 -0
- package/packages/game/dist/types/loop.d.ts +29 -0
- package/packages/game/dist/types/loop.d.ts.map +1 -0
- package/packages/shared/dist/browser/index.global.js +2 -0
- package/packages/shared/dist/browser/index.global.js.map +1 -0
- package/packages/shared/dist/cjs/index.cjs +2793 -0
- package/packages/shared/dist/cjs/index.cjs.map +1 -0
- package/packages/shared/dist/esm/index.js +2594 -0
- package/packages/shared/dist/esm/index.js.map +1 -0
- package/packages/shared/dist/tsconfig.tsbuildinfo +1 -0
- package/packages/shared/dist/types/bsp/collision.d.ts +112 -0
- package/packages/shared/dist/types/bsp/collision.d.ts.map +1 -0
- package/packages/shared/dist/types/bsp/contents.d.ts +71 -0
- package/packages/shared/dist/types/bsp/contents.d.ts.map +1 -0
- package/packages/shared/dist/types/index.d.ts +25 -0
- package/packages/shared/dist/types/index.d.ts.map +1 -0
- package/packages/shared/dist/types/math/angles.d.ts +17 -0
- package/packages/shared/dist/types/math/angles.d.ts.map +1 -0
- package/packages/shared/dist/types/math/color.d.ts +12 -0
- package/packages/shared/dist/types/math/color.d.ts.map +1 -0
- package/packages/shared/dist/types/math/random.d.ts +48 -0
- package/packages/shared/dist/types/math/random.d.ts.map +1 -0
- package/packages/shared/dist/types/math/vec3.d.ts +76 -0
- package/packages/shared/dist/types/math/vec3.d.ts.map +1 -0
- package/packages/shared/dist/types/pmove/categorize.d.ts +36 -0
- package/packages/shared/dist/types/pmove/categorize.d.ts.map +1 -0
- package/packages/shared/dist/types/pmove/constants.d.ts +75 -0
- package/packages/shared/dist/types/pmove/constants.d.ts.map +1 -0
- package/packages/shared/dist/types/pmove/currents.d.ts +58 -0
- package/packages/shared/dist/types/pmove/currents.d.ts.map +1 -0
- package/packages/shared/dist/types/pmove/dimensions.d.ts +14 -0
- package/packages/shared/dist/types/pmove/dimensions.d.ts.map +1 -0
- package/packages/shared/dist/types/pmove/duck.d.ts +39 -0
- package/packages/shared/dist/types/pmove/duck.d.ts.map +1 -0
- package/packages/shared/dist/types/pmove/fly.d.ts +34 -0
- package/packages/shared/dist/types/pmove/fly.d.ts.map +1 -0
- package/packages/shared/dist/types/pmove/jump.d.ts +26 -0
- package/packages/shared/dist/types/pmove/jump.d.ts.map +1 -0
- package/packages/shared/dist/types/pmove/move.d.ts +58 -0
- package/packages/shared/dist/types/pmove/move.d.ts.map +1 -0
- package/packages/shared/dist/types/pmove/pmove.d.ts +36 -0
- package/packages/shared/dist/types/pmove/pmove.d.ts.map +1 -0
- package/packages/shared/dist/types/pmove/slide.d.ts +63 -0
- package/packages/shared/dist/types/pmove/slide.d.ts.map +1 -0
- package/packages/shared/dist/types/pmove/snap.d.ts +40 -0
- package/packages/shared/dist/types/pmove/snap.d.ts.map +1 -0
- package/packages/shared/dist/types/pmove/special.d.ts +39 -0
- package/packages/shared/dist/types/pmove/special.d.ts.map +1 -0
- package/packages/shared/dist/types/pmove/stuck.d.ts +21 -0
- package/packages/shared/dist/types/pmove/stuck.d.ts.map +1 -0
- package/packages/shared/dist/types/pmove/types.d.ts +48 -0
- package/packages/shared/dist/types/pmove/types.d.ts.map +1 -0
- package/packages/shared/dist/types/pmove/view.d.ts +19 -0
- package/packages/shared/dist/types/pmove/view.d.ts.map +1 -0
- package/packages/shared/dist/types/pmove/water.d.ts +21 -0
- package/packages/shared/dist/types/pmove/water.d.ts.map +1 -0
- package/packages/shared/dist/types/protocol/configstrings.d.ts +51 -0
- package/packages/shared/dist/types/protocol/configstrings.d.ts.map +1 -0
- package/packages/shared/dist/types/protocol/cvar.d.ts +15 -0
- package/packages/shared/dist/types/protocol/cvar.d.ts.map +1 -0
- package/packages/tools/dist/browser/index.global.js +2 -0
- package/packages/tools/dist/browser/index.global.js.map +1 -0
- package/packages/tools/dist/cjs/index.cjs +33 -0
- package/packages/tools/dist/cjs/index.cjs.map +1 -0
- package/packages/tools/dist/esm/index.js +8 -0
- package/packages/tools/dist/esm/index.js.map +1 -0
- package/packages/tools/dist/tsconfig.tsbuildinfo +1 -0
- package/packages/tools/dist/types/index.d.ts +7 -0
- package/packages/tools/dist/types/index.d.ts.map +1 -0
|
@@ -0,0 +1,1087 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
|
|
20
|
+
// src/index.ts
|
|
21
|
+
var index_exports = {};
|
|
22
|
+
__export(index_exports, {
|
|
23
|
+
bootstrapViewer: () => bootstrapViewer
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(index_exports);
|
|
26
|
+
|
|
27
|
+
// ../../packages/client/dist/esm/index.js
|
|
28
|
+
function createClient(imports) {
|
|
29
|
+
let latestFrame;
|
|
30
|
+
return {
|
|
31
|
+
init(initial) {
|
|
32
|
+
latestFrame = initial;
|
|
33
|
+
void imports.engine.trace({ x: 0, y: 0, z: 0 }, { x: 1, y: 0, z: 0 });
|
|
34
|
+
},
|
|
35
|
+
predict(next) {
|
|
36
|
+
const { origin, velocity } = next;
|
|
37
|
+
return {
|
|
38
|
+
origin: {
|
|
39
|
+
x: origin.x + velocity.x,
|
|
40
|
+
y: origin.y + velocity.y,
|
|
41
|
+
z: origin.z + velocity.z
|
|
42
|
+
},
|
|
43
|
+
velocity
|
|
44
|
+
};
|
|
45
|
+
},
|
|
46
|
+
render(sample) {
|
|
47
|
+
latestFrame = sample.latest ?? latestFrame;
|
|
48
|
+
void sample;
|
|
49
|
+
},
|
|
50
|
+
shutdown() {
|
|
51
|
+
latestFrame = void 0;
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// ../../packages/engine/dist/esm/index.js
|
|
57
|
+
var DEFAULT_FIXED_DELTA_MS = 25;
|
|
58
|
+
var DEFAULT_MAX_SUBSTEPS = 5;
|
|
59
|
+
var defaultNow = () => typeof performance !== "undefined" ? performance.now() : Date.now();
|
|
60
|
+
var defaultScheduler = (tick) => {
|
|
61
|
+
if (typeof requestAnimationFrame === "function") {
|
|
62
|
+
requestAnimationFrame(() => tick());
|
|
63
|
+
} else {
|
|
64
|
+
setTimeout(tick, DEFAULT_FIXED_DELTA_MS);
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
var FixedTimestepLoop = class {
|
|
68
|
+
constructor(callbacks, options = {}) {
|
|
69
|
+
this.callbacks = callbacks;
|
|
70
|
+
this.accumulatorMs = 0;
|
|
71
|
+
this.frame = 0;
|
|
72
|
+
this.running = false;
|
|
73
|
+
this.tick = () => {
|
|
74
|
+
if (!this.running) return;
|
|
75
|
+
const nowMs = this.options.now();
|
|
76
|
+
const elapsed = this.lastTimeMs === void 0 ? 0 : nowMs - this.lastTimeMs;
|
|
77
|
+
this.lastTimeMs = nowMs;
|
|
78
|
+
this.advance(elapsed, nowMs);
|
|
79
|
+
if (this.running) {
|
|
80
|
+
this.options.schedule(this.tick);
|
|
81
|
+
}
|
|
82
|
+
};
|
|
83
|
+
const fixedDeltaMs = options.fixedDeltaMs ?? DEFAULT_FIXED_DELTA_MS;
|
|
84
|
+
const maxSubSteps = options.maxSubSteps ?? DEFAULT_MAX_SUBSTEPS;
|
|
85
|
+
this.options = {
|
|
86
|
+
fixedDeltaMs,
|
|
87
|
+
maxSubSteps,
|
|
88
|
+
maxDeltaMs: options.maxDeltaMs ?? fixedDeltaMs * maxSubSteps,
|
|
89
|
+
startTimeMs: options.startTimeMs,
|
|
90
|
+
now: options.now ?? defaultNow,
|
|
91
|
+
schedule: options.schedule ?? defaultScheduler
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
start() {
|
|
95
|
+
if (this.running) return;
|
|
96
|
+
this.running = true;
|
|
97
|
+
this.lastTimeMs = this.options.startTimeMs ?? this.options.now();
|
|
98
|
+
this.options.schedule(this.tick);
|
|
99
|
+
}
|
|
100
|
+
stop() {
|
|
101
|
+
this.running = false;
|
|
102
|
+
}
|
|
103
|
+
pump(elapsedMs) {
|
|
104
|
+
const nowMs = (this.lastTimeMs ?? 0) + elapsedMs;
|
|
105
|
+
this.lastTimeMs = nowMs;
|
|
106
|
+
this.advance(elapsedMs, nowMs);
|
|
107
|
+
}
|
|
108
|
+
isRunning() {
|
|
109
|
+
return this.running;
|
|
110
|
+
}
|
|
111
|
+
get frameNumber() {
|
|
112
|
+
return this.frame;
|
|
113
|
+
}
|
|
114
|
+
advance(elapsedMs, nowMs) {
|
|
115
|
+
const clampedDelta = Math.min(Math.max(elapsedMs, 0), this.options.maxDeltaMs);
|
|
116
|
+
this.accumulatorMs = Math.min(
|
|
117
|
+
this.accumulatorMs + clampedDelta,
|
|
118
|
+
this.options.fixedDeltaMs * this.options.maxSubSteps
|
|
119
|
+
);
|
|
120
|
+
let steps = 0;
|
|
121
|
+
while (this.accumulatorMs >= this.options.fixedDeltaMs && steps < this.options.maxSubSteps) {
|
|
122
|
+
this.frame += 1;
|
|
123
|
+
this.callbacks.simulate({ frame: this.frame, deltaMs: this.options.fixedDeltaMs, nowMs });
|
|
124
|
+
this.accumulatorMs -= this.options.fixedDeltaMs;
|
|
125
|
+
steps += 1;
|
|
126
|
+
}
|
|
127
|
+
const alpha = this.options.fixedDeltaMs === 0 ? 0 : this.accumulatorMs / this.options.fixedDeltaMs;
|
|
128
|
+
this.callbacks.render?.({ alpha, nowMs, accumulatorMs: this.accumulatorMs, frame: this.frame });
|
|
129
|
+
}
|
|
130
|
+
};
|
|
131
|
+
var EngineHost = class {
|
|
132
|
+
constructor(game, client, options = {}) {
|
|
133
|
+
this.game = game;
|
|
134
|
+
this.client = client;
|
|
135
|
+
this.started = false;
|
|
136
|
+
this.stepSimulation = (step) => {
|
|
137
|
+
this.previousFrame = this.latestFrame;
|
|
138
|
+
this.latestFrame = this.game.frame(step);
|
|
139
|
+
};
|
|
140
|
+
this.renderClient = (renderContext) => {
|
|
141
|
+
if (!this.client) return;
|
|
142
|
+
this.client.render({
|
|
143
|
+
...renderContext,
|
|
144
|
+
previous: this.previousFrame,
|
|
145
|
+
latest: this.latestFrame
|
|
146
|
+
});
|
|
147
|
+
};
|
|
148
|
+
const now = options.loop?.now?.() ?? Date.now();
|
|
149
|
+
this.startTimeMs = options.startTimeMs ?? options.loop?.startTimeMs ?? now;
|
|
150
|
+
this.loop = new FixedTimestepLoop(
|
|
151
|
+
{
|
|
152
|
+
simulate: this.stepSimulation,
|
|
153
|
+
render: this.renderClient
|
|
154
|
+
},
|
|
155
|
+
{ ...options.loop, startTimeMs: this.startTimeMs }
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
start() {
|
|
159
|
+
if (this.started) return;
|
|
160
|
+
this.latestFrame = this.game.init(this.startTimeMs) ?? this.latestFrame;
|
|
161
|
+
this.client?.init(this.latestFrame);
|
|
162
|
+
this.started = true;
|
|
163
|
+
this.loop.start();
|
|
164
|
+
}
|
|
165
|
+
stop() {
|
|
166
|
+
if (!this.started) return;
|
|
167
|
+
this.loop.stop();
|
|
168
|
+
this.client?.shutdown();
|
|
169
|
+
this.game.shutdown();
|
|
170
|
+
this.previousFrame = void 0;
|
|
171
|
+
this.latestFrame = void 0;
|
|
172
|
+
this.started = false;
|
|
173
|
+
}
|
|
174
|
+
pump(elapsedMs) {
|
|
175
|
+
this.loop.pump(elapsedMs);
|
|
176
|
+
}
|
|
177
|
+
getLatestFrame() {
|
|
178
|
+
return this.latestFrame;
|
|
179
|
+
}
|
|
180
|
+
isRunning() {
|
|
181
|
+
return this.loop.isRunning();
|
|
182
|
+
}
|
|
183
|
+
};
|
|
184
|
+
var DEG_TO_RAD = Math.PI / 180;
|
|
185
|
+
var DEG2RAD_FACTOR = Math.PI / 180;
|
|
186
|
+
var RAD2DEG_FACTOR = 180 / Math.PI;
|
|
187
|
+
var CONTENTS_SOLID = 1 << 0;
|
|
188
|
+
var CONTENTS_WINDOW = 1 << 1;
|
|
189
|
+
var CONTENTS_AUX = 1 << 2;
|
|
190
|
+
var CONTENTS_LAVA = 1 << 3;
|
|
191
|
+
var CONTENTS_SLIME = 1 << 4;
|
|
192
|
+
var CONTENTS_WATER = 1 << 5;
|
|
193
|
+
var CONTENTS_MIST = 1 << 6;
|
|
194
|
+
var CONTENTS_NO_WATERJUMP = 1 << 13;
|
|
195
|
+
var CONTENTS_PROJECTILECLIP = 1 << 14;
|
|
196
|
+
var CONTENTS_AREAPORTAL = 1 << 15;
|
|
197
|
+
var CONTENTS_PLAYERCLIP = 1 << 16;
|
|
198
|
+
var CONTENTS_MONSTERCLIP = 1 << 17;
|
|
199
|
+
var CONTENTS_CURRENT_0 = 1 << 18;
|
|
200
|
+
var CONTENTS_CURRENT_90 = 1 << 19;
|
|
201
|
+
var CONTENTS_CURRENT_180 = 1 << 20;
|
|
202
|
+
var CONTENTS_CURRENT_270 = 1 << 21;
|
|
203
|
+
var CONTENTS_CURRENT_UP = 1 << 22;
|
|
204
|
+
var CONTENTS_CURRENT_DOWN = 1 << 23;
|
|
205
|
+
var CONTENTS_ORIGIN = 1 << 24;
|
|
206
|
+
var CONTENTS_MONSTER = 1 << 25;
|
|
207
|
+
var CONTENTS_DEADMONSTER = 1 << 26;
|
|
208
|
+
var CONTENTS_DETAIL = 1 << 27;
|
|
209
|
+
var CONTENTS_TRANSLUCENT = 1 << 28;
|
|
210
|
+
var CONTENTS_LADDER = 1 << 29;
|
|
211
|
+
var CONTENTS_PLAYER = 1 << 30;
|
|
212
|
+
var CONTENTS_PROJECTILE = 1 << 31;
|
|
213
|
+
var SURF_LIGHT = 1 << 0;
|
|
214
|
+
var SURF_SLICK = 1 << 1;
|
|
215
|
+
var SURF_SKY = 1 << 2;
|
|
216
|
+
var SURF_WARP = 1 << 3;
|
|
217
|
+
var SURF_TRANS33 = 1 << 4;
|
|
218
|
+
var SURF_TRANS66 = 1 << 5;
|
|
219
|
+
var SURF_FLOWING = 1 << 6;
|
|
220
|
+
var SURF_NODRAW = 1 << 7;
|
|
221
|
+
var SURF_ALPHATEST = 1 << 25;
|
|
222
|
+
var SURF_N64_UV = 1 << 28;
|
|
223
|
+
var SURF_N64_SCROLL_X = 1 << 29;
|
|
224
|
+
var SURF_N64_SCROLL_Y = 1 << 30;
|
|
225
|
+
var SURF_N64_SCROLL_FLIP = 1 << 31;
|
|
226
|
+
var MASK_SOLID = CONTENTS_SOLID | CONTENTS_WINDOW;
|
|
227
|
+
var MASK_PLAYERSOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTER | CONTENTS_PLAYER;
|
|
228
|
+
var MASK_DEADSOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW;
|
|
229
|
+
var MASK_MONSTERSOLID = CONTENTS_SOLID | CONTENTS_MONSTERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTER | CONTENTS_PLAYER;
|
|
230
|
+
var MASK_WATER = CONTENTS_WATER | CONTENTS_LAVA | CONTENTS_SLIME;
|
|
231
|
+
var MASK_OPAQUE = CONTENTS_SOLID | CONTENTS_SLIME | CONTENTS_LAVA;
|
|
232
|
+
var MASK_SHOT = CONTENTS_SOLID | CONTENTS_MONSTER | CONTENTS_PLAYER | CONTENTS_WINDOW | CONTENTS_DEADMONSTER;
|
|
233
|
+
var MASK_CURRENT = CONTENTS_CURRENT_0 | CONTENTS_CURRENT_90 | CONTENTS_CURRENT_180 | CONTENTS_CURRENT_270 | CONTENTS_CURRENT_UP | CONTENTS_CURRENT_DOWN;
|
|
234
|
+
var MASK_BLOCK_SIGHT = CONTENTS_SOLID | CONTENTS_LAVA | CONTENTS_SLIME | CONTENTS_MONSTER | CONTENTS_PLAYER;
|
|
235
|
+
var MASK_NAV_SOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW;
|
|
236
|
+
var MASK_LADDER_NAV_SOLID = CONTENTS_SOLID | CONTENTS_WINDOW;
|
|
237
|
+
var MASK_WALK_NAV_SOLID = CONTENTS_SOLID | CONTENTS_PLAYERCLIP | CONTENTS_WINDOW | CONTENTS_MONSTERCLIP;
|
|
238
|
+
var MASK_PROJECTILE = MASK_SHOT | CONTENTS_PROJECTILECLIP;
|
|
239
|
+
var MAX_CLIENTS = 256;
|
|
240
|
+
var MAX_LIGHTSTYLES = 256;
|
|
241
|
+
var MAX_MODELS = 8192;
|
|
242
|
+
var MAX_SOUNDS = 2048;
|
|
243
|
+
var MAX_IMAGES = 512;
|
|
244
|
+
var MAX_ITEMS = 256;
|
|
245
|
+
var MAX_GENERAL = MAX_CLIENTS * 2;
|
|
246
|
+
var MAX_SHADOW_LIGHTS = 256;
|
|
247
|
+
var MAX_WHEEL_ITEMS = 32;
|
|
248
|
+
var ConfigStringIndex = ((ConfigStringIndex22) => {
|
|
249
|
+
ConfigStringIndex22[ConfigStringIndex22["Name"] = 0] = "Name";
|
|
250
|
+
ConfigStringIndex22[ConfigStringIndex22["CdTrack"] = 1] = "CdTrack";
|
|
251
|
+
ConfigStringIndex22[ConfigStringIndex22["Sky"] = 2] = "Sky";
|
|
252
|
+
ConfigStringIndex22[ConfigStringIndex22["SkyAxis"] = 3] = "SkyAxis";
|
|
253
|
+
ConfigStringIndex22[ConfigStringIndex22["SkyRotate"] = 4] = "SkyRotate";
|
|
254
|
+
ConfigStringIndex22[ConfigStringIndex22["StatusBar"] = 5] = "StatusBar";
|
|
255
|
+
ConfigStringIndex22[ConfigStringIndex22["AirAccel"] = 59] = "AirAccel";
|
|
256
|
+
ConfigStringIndex22[ConfigStringIndex22["MaxClients"] = 60] = "MaxClients";
|
|
257
|
+
ConfigStringIndex22[ConfigStringIndex22["MapChecksum"] = 61] = "MapChecksum";
|
|
258
|
+
ConfigStringIndex22[ConfigStringIndex22["Models"] = 62] = "Models";
|
|
259
|
+
ConfigStringIndex22[ConfigStringIndex22["Sounds"] = 62 + MAX_MODELS] = "Sounds";
|
|
260
|
+
ConfigStringIndex22[ConfigStringIndex22["Images"] = ConfigStringIndex22.Sounds + MAX_SOUNDS] = "Images";
|
|
261
|
+
ConfigStringIndex22[ConfigStringIndex22["Lights"] = ConfigStringIndex22.Images + MAX_IMAGES] = "Lights";
|
|
262
|
+
ConfigStringIndex22[ConfigStringIndex22["ShadowLights"] = ConfigStringIndex22.Lights + MAX_LIGHTSTYLES] = "ShadowLights";
|
|
263
|
+
ConfigStringIndex22[ConfigStringIndex22["Items"] = ConfigStringIndex22.ShadowLights + MAX_SHADOW_LIGHTS] = "Items";
|
|
264
|
+
ConfigStringIndex22[ConfigStringIndex22["PlayerSkins"] = ConfigStringIndex22.Items + MAX_ITEMS] = "PlayerSkins";
|
|
265
|
+
ConfigStringIndex22[ConfigStringIndex22["General"] = ConfigStringIndex22.PlayerSkins + MAX_CLIENTS] = "General";
|
|
266
|
+
ConfigStringIndex22[ConfigStringIndex22["WheelWeapons"] = ConfigStringIndex22.General + MAX_GENERAL] = "WheelWeapons";
|
|
267
|
+
ConfigStringIndex22[ConfigStringIndex22["WheelAmmo"] = ConfigStringIndex22.WheelWeapons + MAX_WHEEL_ITEMS] = "WheelAmmo";
|
|
268
|
+
ConfigStringIndex22[ConfigStringIndex22["WheelPowerups"] = ConfigStringIndex22.WheelAmmo + MAX_WHEEL_ITEMS] = "WheelPowerups";
|
|
269
|
+
ConfigStringIndex22[ConfigStringIndex22["CdLoopCount"] = ConfigStringIndex22.WheelPowerups + MAX_WHEEL_ITEMS] = "CdLoopCount";
|
|
270
|
+
ConfigStringIndex22[ConfigStringIndex22["GameStyle"] = ConfigStringIndex22.CdLoopCount + 1] = "GameStyle";
|
|
271
|
+
ConfigStringIndex22[ConfigStringIndex22["MaxConfigStrings"] = ConfigStringIndex22.GameStyle + 1] = "MaxConfigStrings";
|
|
272
|
+
return ConfigStringIndex22;
|
|
273
|
+
})(ConfigStringIndex || {});
|
|
274
|
+
var MAX_CONFIGSTRINGS = ConfigStringIndex.MaxConfigStrings;
|
|
275
|
+
var WATERJUMP_CLEAR = 8 | 16 | 32 | 1024;
|
|
276
|
+
var EngineRuntime = class {
|
|
277
|
+
constructor(engine, host) {
|
|
278
|
+
this.engine = engine;
|
|
279
|
+
this.host = host;
|
|
280
|
+
this.started = false;
|
|
281
|
+
}
|
|
282
|
+
start() {
|
|
283
|
+
if (this.started) return;
|
|
284
|
+
this.engine.init();
|
|
285
|
+
this.host.start();
|
|
286
|
+
this.started = true;
|
|
287
|
+
}
|
|
288
|
+
stop() {
|
|
289
|
+
if (!this.started) return;
|
|
290
|
+
this.host.stop();
|
|
291
|
+
this.engine.shutdown();
|
|
292
|
+
this.started = false;
|
|
293
|
+
}
|
|
294
|
+
pump(elapsedMs) {
|
|
295
|
+
this.host.pump(elapsedMs);
|
|
296
|
+
}
|
|
297
|
+
getLatestFrame() {
|
|
298
|
+
return this.host.getLatestFrame();
|
|
299
|
+
}
|
|
300
|
+
isRunning() {
|
|
301
|
+
return this.started && this.host.isRunning();
|
|
302
|
+
}
|
|
303
|
+
};
|
|
304
|
+
function createEngineRuntime(engine, game, client, options) {
|
|
305
|
+
return new EngineRuntime(engine, new EngineHost(game, client, options));
|
|
306
|
+
}
|
|
307
|
+
function createCrcTable() {
|
|
308
|
+
const table = new Uint32Array(256);
|
|
309
|
+
for (let i = 0; i < 256; i += 1) {
|
|
310
|
+
let crc = i;
|
|
311
|
+
for (let j = 0; j < 8; j += 1) {
|
|
312
|
+
crc = (crc & 1) !== 0 ? 3988292384 ^ crc >>> 1 : crc >>> 1;
|
|
313
|
+
}
|
|
314
|
+
table[i] = crc >>> 0;
|
|
315
|
+
}
|
|
316
|
+
return table;
|
|
317
|
+
}
|
|
318
|
+
var CRC_TABLE = createCrcTable();
|
|
319
|
+
var HEADER_SIZE2 = 17 * 4;
|
|
320
|
+
var FLOAT_BYTES = 4;
|
|
321
|
+
var STRIDE = 7 * FLOAT_BYTES;
|
|
322
|
+
var BSP_VERTEX_LAYOUT = [
|
|
323
|
+
// Position
|
|
324
|
+
{ index: 0, size: 3, type: 5126, stride: STRIDE, offset: 0 },
|
|
325
|
+
// Diffuse UV
|
|
326
|
+
{ index: 1, size: 2, type: 5126, stride: STRIDE, offset: 3 * FLOAT_BYTES },
|
|
327
|
+
// Lightmap UV
|
|
328
|
+
{ index: 2, size: 2, type: 5126, stride: STRIDE, offset: 5 * FLOAT_BYTES }
|
|
329
|
+
];
|
|
330
|
+
function createEngine(imports) {
|
|
331
|
+
return {
|
|
332
|
+
init() {
|
|
333
|
+
void imports.trace({ x: 0, y: 0, z: 0 }, { x: 0, y: 0, z: 0 });
|
|
334
|
+
},
|
|
335
|
+
shutdown() {
|
|
336
|
+
},
|
|
337
|
+
createMainLoop(callbacks, options) {
|
|
338
|
+
return new FixedTimestepLoop(callbacks, options);
|
|
339
|
+
}
|
|
340
|
+
};
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
// ../../packages/game/dist/esm/index.js
|
|
344
|
+
var ZERO_VEC3 = { x: 0, y: 0, z: 0 };
|
|
345
|
+
var DEG_TO_RAD2 = Math.PI / 180;
|
|
346
|
+
var DEG2RAD_FACTOR2 = Math.PI / 180;
|
|
347
|
+
var RAD2DEG_FACTOR2 = 180 / Math.PI;
|
|
348
|
+
var CONTENTS_SOLID2 = 1 << 0;
|
|
349
|
+
var CONTENTS_WINDOW2 = 1 << 1;
|
|
350
|
+
var CONTENTS_AUX2 = 1 << 2;
|
|
351
|
+
var CONTENTS_LAVA2 = 1 << 3;
|
|
352
|
+
var CONTENTS_SLIME2 = 1 << 4;
|
|
353
|
+
var CONTENTS_WATER2 = 1 << 5;
|
|
354
|
+
var CONTENTS_MIST2 = 1 << 6;
|
|
355
|
+
var CONTENTS_NO_WATERJUMP2 = 1 << 13;
|
|
356
|
+
var CONTENTS_PROJECTILECLIP2 = 1 << 14;
|
|
357
|
+
var CONTENTS_AREAPORTAL2 = 1 << 15;
|
|
358
|
+
var CONTENTS_PLAYERCLIP2 = 1 << 16;
|
|
359
|
+
var CONTENTS_MONSTERCLIP2 = 1 << 17;
|
|
360
|
+
var CONTENTS_CURRENT_02 = 1 << 18;
|
|
361
|
+
var CONTENTS_CURRENT_902 = 1 << 19;
|
|
362
|
+
var CONTENTS_CURRENT_1802 = 1 << 20;
|
|
363
|
+
var CONTENTS_CURRENT_2702 = 1 << 21;
|
|
364
|
+
var CONTENTS_CURRENT_UP2 = 1 << 22;
|
|
365
|
+
var CONTENTS_CURRENT_DOWN2 = 1 << 23;
|
|
366
|
+
var CONTENTS_ORIGIN2 = 1 << 24;
|
|
367
|
+
var CONTENTS_MONSTER2 = 1 << 25;
|
|
368
|
+
var CONTENTS_DEADMONSTER2 = 1 << 26;
|
|
369
|
+
var CONTENTS_DETAIL2 = 1 << 27;
|
|
370
|
+
var CONTENTS_TRANSLUCENT2 = 1 << 28;
|
|
371
|
+
var CONTENTS_LADDER2 = 1 << 29;
|
|
372
|
+
var CONTENTS_PLAYER2 = 1 << 30;
|
|
373
|
+
var CONTENTS_PROJECTILE2 = 1 << 31;
|
|
374
|
+
var SURF_LIGHT2 = 1 << 0;
|
|
375
|
+
var SURF_SLICK2 = 1 << 1;
|
|
376
|
+
var SURF_SKY2 = 1 << 2;
|
|
377
|
+
var SURF_WARP2 = 1 << 3;
|
|
378
|
+
var SURF_TRANS332 = 1 << 4;
|
|
379
|
+
var SURF_TRANS662 = 1 << 5;
|
|
380
|
+
var SURF_FLOWING2 = 1 << 6;
|
|
381
|
+
var SURF_NODRAW2 = 1 << 7;
|
|
382
|
+
var SURF_ALPHATEST2 = 1 << 25;
|
|
383
|
+
var SURF_N64_UV2 = 1 << 28;
|
|
384
|
+
var SURF_N64_SCROLL_X2 = 1 << 29;
|
|
385
|
+
var SURF_N64_SCROLL_Y2 = 1 << 30;
|
|
386
|
+
var SURF_N64_SCROLL_FLIP2 = 1 << 31;
|
|
387
|
+
var MASK_SOLID2 = CONTENTS_SOLID2 | CONTENTS_WINDOW2;
|
|
388
|
+
var MASK_PLAYERSOLID2 = CONTENTS_SOLID2 | CONTENTS_PLAYERCLIP2 | CONTENTS_WINDOW2 | CONTENTS_MONSTER2 | CONTENTS_PLAYER2;
|
|
389
|
+
var MASK_DEADSOLID2 = CONTENTS_SOLID2 | CONTENTS_PLAYERCLIP2 | CONTENTS_WINDOW2;
|
|
390
|
+
var MASK_MONSTERSOLID2 = CONTENTS_SOLID2 | CONTENTS_MONSTERCLIP2 | CONTENTS_WINDOW2 | CONTENTS_MONSTER2 | CONTENTS_PLAYER2;
|
|
391
|
+
var MASK_WATER2 = CONTENTS_WATER2 | CONTENTS_LAVA2 | CONTENTS_SLIME2;
|
|
392
|
+
var MASK_OPAQUE2 = CONTENTS_SOLID2 | CONTENTS_SLIME2 | CONTENTS_LAVA2;
|
|
393
|
+
var MASK_SHOT2 = CONTENTS_SOLID2 | CONTENTS_MONSTER2 | CONTENTS_PLAYER2 | CONTENTS_WINDOW2 | CONTENTS_DEADMONSTER2;
|
|
394
|
+
var MASK_CURRENT2 = CONTENTS_CURRENT_02 | CONTENTS_CURRENT_902 | CONTENTS_CURRENT_1802 | CONTENTS_CURRENT_2702 | CONTENTS_CURRENT_UP2 | CONTENTS_CURRENT_DOWN2;
|
|
395
|
+
var MASK_BLOCK_SIGHT2 = CONTENTS_SOLID2 | CONTENTS_LAVA2 | CONTENTS_SLIME2 | CONTENTS_MONSTER2 | CONTENTS_PLAYER2;
|
|
396
|
+
var MASK_NAV_SOLID2 = CONTENTS_SOLID2 | CONTENTS_PLAYERCLIP2 | CONTENTS_WINDOW2;
|
|
397
|
+
var MASK_LADDER_NAV_SOLID2 = CONTENTS_SOLID2 | CONTENTS_WINDOW2;
|
|
398
|
+
var MASK_WALK_NAV_SOLID2 = CONTENTS_SOLID2 | CONTENTS_PLAYERCLIP2 | CONTENTS_WINDOW2 | CONTENTS_MONSTERCLIP2;
|
|
399
|
+
var MASK_PROJECTILE2 = MASK_SHOT2 | CONTENTS_PROJECTILECLIP2;
|
|
400
|
+
var MAX_CLIENTS2 = 256;
|
|
401
|
+
var MAX_LIGHTSTYLES2 = 256;
|
|
402
|
+
var MAX_MODELS2 = 8192;
|
|
403
|
+
var MAX_SOUNDS2 = 2048;
|
|
404
|
+
var MAX_IMAGES2 = 512;
|
|
405
|
+
var MAX_ITEMS2 = 256;
|
|
406
|
+
var MAX_GENERAL2 = MAX_CLIENTS2 * 2;
|
|
407
|
+
var MAX_SHADOW_LIGHTS2 = 256;
|
|
408
|
+
var MAX_WHEEL_ITEMS2 = 32;
|
|
409
|
+
var ConfigStringIndex2 = ((ConfigStringIndex22) => {
|
|
410
|
+
ConfigStringIndex22[ConfigStringIndex22["Name"] = 0] = "Name";
|
|
411
|
+
ConfigStringIndex22[ConfigStringIndex22["CdTrack"] = 1] = "CdTrack";
|
|
412
|
+
ConfigStringIndex22[ConfigStringIndex22["Sky"] = 2] = "Sky";
|
|
413
|
+
ConfigStringIndex22[ConfigStringIndex22["SkyAxis"] = 3] = "SkyAxis";
|
|
414
|
+
ConfigStringIndex22[ConfigStringIndex22["SkyRotate"] = 4] = "SkyRotate";
|
|
415
|
+
ConfigStringIndex22[ConfigStringIndex22["StatusBar"] = 5] = "StatusBar";
|
|
416
|
+
ConfigStringIndex22[ConfigStringIndex22["AirAccel"] = 59] = "AirAccel";
|
|
417
|
+
ConfigStringIndex22[ConfigStringIndex22["MaxClients"] = 60] = "MaxClients";
|
|
418
|
+
ConfigStringIndex22[ConfigStringIndex22["MapChecksum"] = 61] = "MapChecksum";
|
|
419
|
+
ConfigStringIndex22[ConfigStringIndex22["Models"] = 62] = "Models";
|
|
420
|
+
ConfigStringIndex22[ConfigStringIndex22["Sounds"] = 62 + MAX_MODELS2] = "Sounds";
|
|
421
|
+
ConfigStringIndex22[ConfigStringIndex22["Images"] = ConfigStringIndex22.Sounds + MAX_SOUNDS2] = "Images";
|
|
422
|
+
ConfigStringIndex22[ConfigStringIndex22["Lights"] = ConfigStringIndex22.Images + MAX_IMAGES2] = "Lights";
|
|
423
|
+
ConfigStringIndex22[ConfigStringIndex22["ShadowLights"] = ConfigStringIndex22.Lights + MAX_LIGHTSTYLES2] = "ShadowLights";
|
|
424
|
+
ConfigStringIndex22[ConfigStringIndex22["Items"] = ConfigStringIndex22.ShadowLights + MAX_SHADOW_LIGHTS2] = "Items";
|
|
425
|
+
ConfigStringIndex22[ConfigStringIndex22["PlayerSkins"] = ConfigStringIndex22.Items + MAX_ITEMS2] = "PlayerSkins";
|
|
426
|
+
ConfigStringIndex22[ConfigStringIndex22["General"] = ConfigStringIndex22.PlayerSkins + MAX_CLIENTS2] = "General";
|
|
427
|
+
ConfigStringIndex22[ConfigStringIndex22["WheelWeapons"] = ConfigStringIndex22.General + MAX_GENERAL2] = "WheelWeapons";
|
|
428
|
+
ConfigStringIndex22[ConfigStringIndex22["WheelAmmo"] = ConfigStringIndex22.WheelWeapons + MAX_WHEEL_ITEMS2] = "WheelAmmo";
|
|
429
|
+
ConfigStringIndex22[ConfigStringIndex22["WheelPowerups"] = ConfigStringIndex22.WheelAmmo + MAX_WHEEL_ITEMS2] = "WheelPowerups";
|
|
430
|
+
ConfigStringIndex22[ConfigStringIndex22["CdLoopCount"] = ConfigStringIndex22.WheelPowerups + MAX_WHEEL_ITEMS2] = "CdLoopCount";
|
|
431
|
+
ConfigStringIndex22[ConfigStringIndex22["GameStyle"] = ConfigStringIndex22.CdLoopCount + 1] = "GameStyle";
|
|
432
|
+
ConfigStringIndex22[ConfigStringIndex22["MaxConfigStrings"] = ConfigStringIndex22.GameStyle + 1] = "MaxConfigStrings";
|
|
433
|
+
return ConfigStringIndex22;
|
|
434
|
+
})(ConfigStringIndex2 || {});
|
|
435
|
+
var MAX_CONFIGSTRINGS2 = ConfigStringIndex2.MaxConfigStrings;
|
|
436
|
+
var WATERJUMP_CLEAR2 = 8 | 16 | 32 | 1024;
|
|
437
|
+
var ZERO = { ...ZERO_VEC3 };
|
|
438
|
+
function copyVec3() {
|
|
439
|
+
return { ...ZERO };
|
|
440
|
+
}
|
|
441
|
+
var Entity = class {
|
|
442
|
+
constructor(index) {
|
|
443
|
+
this.inUse = false;
|
|
444
|
+
this.freePending = false;
|
|
445
|
+
this.linkPrevious = null;
|
|
446
|
+
this.linkNext = null;
|
|
447
|
+
this.classname = "";
|
|
448
|
+
this.spawnflags = 0;
|
|
449
|
+
this.origin = copyVec3();
|
|
450
|
+
this.old_origin = copyVec3();
|
|
451
|
+
this.velocity = copyVec3();
|
|
452
|
+
this.avelocity = copyVec3();
|
|
453
|
+
this.angles = copyVec3();
|
|
454
|
+
this.mins = copyVec3();
|
|
455
|
+
this.maxs = copyVec3();
|
|
456
|
+
this.size = copyVec3();
|
|
457
|
+
this.mass = 0;
|
|
458
|
+
this.gravity = 1;
|
|
459
|
+
this.movetype = 0;
|
|
460
|
+
this.modelindex = 0;
|
|
461
|
+
this.frame = 0;
|
|
462
|
+
this.skin = 0;
|
|
463
|
+
this.effects = 0;
|
|
464
|
+
this.renderfx = 0;
|
|
465
|
+
this.health = 0;
|
|
466
|
+
this.max_health = 0;
|
|
467
|
+
this.takedamage = false;
|
|
468
|
+
this.dmg = 0;
|
|
469
|
+
this.deadflag = 0;
|
|
470
|
+
this.enemy = null;
|
|
471
|
+
this.movetarget = null;
|
|
472
|
+
this.goalentity = null;
|
|
473
|
+
this.ideal_yaw = 0;
|
|
474
|
+
this.yaw_speed = 0;
|
|
475
|
+
this.groundentity = null;
|
|
476
|
+
this.groundentity_linkcount = 0;
|
|
477
|
+
this.waterlevel = 0;
|
|
478
|
+
this.watertype = 0;
|
|
479
|
+
this.nextthink = 0;
|
|
480
|
+
this.solid = 0;
|
|
481
|
+
this.flags = 0;
|
|
482
|
+
this.svflags = 0;
|
|
483
|
+
this.index = index;
|
|
484
|
+
}
|
|
485
|
+
reset() {
|
|
486
|
+
this.inUse = false;
|
|
487
|
+
this.freePending = false;
|
|
488
|
+
this.linkPrevious = null;
|
|
489
|
+
this.linkNext = null;
|
|
490
|
+
this.classname = "";
|
|
491
|
+
this.spawnflags = 0;
|
|
492
|
+
this.target = void 0;
|
|
493
|
+
this.targetname = void 0;
|
|
494
|
+
this.team = void 0;
|
|
495
|
+
this.message = void 0;
|
|
496
|
+
this.origin = copyVec3();
|
|
497
|
+
this.old_origin = copyVec3();
|
|
498
|
+
this.velocity = copyVec3();
|
|
499
|
+
this.avelocity = copyVec3();
|
|
500
|
+
this.angles = copyVec3();
|
|
501
|
+
this.mins = copyVec3();
|
|
502
|
+
this.maxs = copyVec3();
|
|
503
|
+
this.size = copyVec3();
|
|
504
|
+
this.mass = 0;
|
|
505
|
+
this.gravity = 1;
|
|
506
|
+
this.movetype = 0;
|
|
507
|
+
this.modelindex = 0;
|
|
508
|
+
this.frame = 0;
|
|
509
|
+
this.skin = 0;
|
|
510
|
+
this.effects = 0;
|
|
511
|
+
this.renderfx = 0;
|
|
512
|
+
this.health = 0;
|
|
513
|
+
this.max_health = 0;
|
|
514
|
+
this.takedamage = false;
|
|
515
|
+
this.dmg = 0;
|
|
516
|
+
this.deadflag = 0;
|
|
517
|
+
this.enemy = null;
|
|
518
|
+
this.movetarget = null;
|
|
519
|
+
this.goalentity = null;
|
|
520
|
+
this.ideal_yaw = 0;
|
|
521
|
+
this.yaw_speed = 0;
|
|
522
|
+
this.groundentity = null;
|
|
523
|
+
this.groundentity_linkcount = 0;
|
|
524
|
+
this.waterlevel = 0;
|
|
525
|
+
this.watertype = 0;
|
|
526
|
+
this.nextthink = 0;
|
|
527
|
+
this.think = void 0;
|
|
528
|
+
this.touch = void 0;
|
|
529
|
+
this.use = void 0;
|
|
530
|
+
this.pain = void 0;
|
|
531
|
+
this.die = void 0;
|
|
532
|
+
this.solid = 0;
|
|
533
|
+
this.flags = 0;
|
|
534
|
+
this.svflags = 0;
|
|
535
|
+
}
|
|
536
|
+
};
|
|
537
|
+
var MAX_EDICTS = 2048;
|
|
538
|
+
var WORLD_INDEX = 0;
|
|
539
|
+
var EntityPool = class {
|
|
540
|
+
constructor(maxEntities = MAX_EDICTS) {
|
|
541
|
+
this.freeList = [];
|
|
542
|
+
this.pendingFree = [];
|
|
543
|
+
this.activeHead = null;
|
|
544
|
+
if (maxEntities < 1 || !Number.isInteger(maxEntities)) {
|
|
545
|
+
throw new Error("EntityPool requires a positive integer size");
|
|
546
|
+
}
|
|
547
|
+
this.entities = new Array(maxEntities);
|
|
548
|
+
for (let i = 0; i < maxEntities; i += 1) {
|
|
549
|
+
this.entities[i] = new Entity(i);
|
|
550
|
+
if (i !== WORLD_INDEX) {
|
|
551
|
+
this.freeList.push(i);
|
|
552
|
+
}
|
|
553
|
+
}
|
|
554
|
+
const world = this.entities[WORLD_INDEX];
|
|
555
|
+
world.inUse = true;
|
|
556
|
+
world.classname = "worldspawn";
|
|
557
|
+
this.activeHead = world;
|
|
558
|
+
}
|
|
559
|
+
get world() {
|
|
560
|
+
return this.entities[WORLD_INDEX];
|
|
561
|
+
}
|
|
562
|
+
get capacity() {
|
|
563
|
+
return this.entities.length;
|
|
564
|
+
}
|
|
565
|
+
get activeCount() {
|
|
566
|
+
let count = 0;
|
|
567
|
+
for (const _ of this) {
|
|
568
|
+
count += 1;
|
|
569
|
+
}
|
|
570
|
+
return count;
|
|
571
|
+
}
|
|
572
|
+
[Symbol.iterator]() {
|
|
573
|
+
let current = this.activeHead;
|
|
574
|
+
return {
|
|
575
|
+
next: () => {
|
|
576
|
+
if (!current) {
|
|
577
|
+
return { done: true, value: void 0 };
|
|
578
|
+
}
|
|
579
|
+
const value = current;
|
|
580
|
+
current = current.linkNext;
|
|
581
|
+
return { done: false, value };
|
|
582
|
+
}
|
|
583
|
+
};
|
|
584
|
+
}
|
|
585
|
+
spawn() {
|
|
586
|
+
const index = this.freeList.pop();
|
|
587
|
+
if (index === void 0) {
|
|
588
|
+
throw new Error("No free entities available");
|
|
589
|
+
}
|
|
590
|
+
const entity = this.entities[index];
|
|
591
|
+
entity.reset();
|
|
592
|
+
entity.inUse = true;
|
|
593
|
+
this.link(entity);
|
|
594
|
+
return entity;
|
|
595
|
+
}
|
|
596
|
+
deferFree(entity) {
|
|
597
|
+
if (entity.index === WORLD_INDEX) {
|
|
598
|
+
throw new Error("Cannot free world entity");
|
|
599
|
+
}
|
|
600
|
+
if (!entity.inUse || entity.freePending) {
|
|
601
|
+
return;
|
|
602
|
+
}
|
|
603
|
+
this.unlink(entity);
|
|
604
|
+
entity.inUse = false;
|
|
605
|
+
entity.freePending = true;
|
|
606
|
+
this.pendingFree.push(entity.index);
|
|
607
|
+
}
|
|
608
|
+
flushFreeList() {
|
|
609
|
+
if (this.pendingFree.length === 0) {
|
|
610
|
+
return;
|
|
611
|
+
}
|
|
612
|
+
for (const index of this.pendingFree) {
|
|
613
|
+
const entity = this.entities[index];
|
|
614
|
+
entity.reset();
|
|
615
|
+
this.freeList.push(index);
|
|
616
|
+
}
|
|
617
|
+
this.pendingFree.length = 0;
|
|
618
|
+
}
|
|
619
|
+
link(entity) {
|
|
620
|
+
entity.linkNext = this.activeHead;
|
|
621
|
+
if (this.activeHead) {
|
|
622
|
+
this.activeHead.linkPrevious = entity;
|
|
623
|
+
}
|
|
624
|
+
this.activeHead = entity;
|
|
625
|
+
entity.linkPrevious = null;
|
|
626
|
+
}
|
|
627
|
+
unlink(entity) {
|
|
628
|
+
if (entity.linkPrevious) {
|
|
629
|
+
entity.linkPrevious.linkNext = entity.linkNext;
|
|
630
|
+
}
|
|
631
|
+
if (entity.linkNext) {
|
|
632
|
+
entity.linkNext.linkPrevious = entity.linkPrevious;
|
|
633
|
+
}
|
|
634
|
+
if (this.activeHead === entity) {
|
|
635
|
+
this.activeHead = entity.linkNext;
|
|
636
|
+
}
|
|
637
|
+
entity.linkPrevious = null;
|
|
638
|
+
entity.linkNext = null;
|
|
639
|
+
}
|
|
640
|
+
};
|
|
641
|
+
var ThinkScheduler = class {
|
|
642
|
+
constructor() {
|
|
643
|
+
this.queue = [];
|
|
644
|
+
}
|
|
645
|
+
schedule(entity, timeSeconds) {
|
|
646
|
+
entity.nextthink = timeSeconds;
|
|
647
|
+
this.queue.push({ entity, time: timeSeconds });
|
|
648
|
+
this.queue.sort((a, b) => a.time === b.time ? a.entity.index - b.entity.index : a.time - b.time);
|
|
649
|
+
}
|
|
650
|
+
cancel(entity) {
|
|
651
|
+
if (this.queue.length === 0) {
|
|
652
|
+
return;
|
|
653
|
+
}
|
|
654
|
+
for (let i = this.queue.length - 1; i >= 0; i -= 1) {
|
|
655
|
+
if (this.queue[i].entity === entity) {
|
|
656
|
+
this.queue.splice(i, 1);
|
|
657
|
+
}
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
runDueThinks(currentTimeSeconds) {
|
|
661
|
+
while (this.queue.length > 0) {
|
|
662
|
+
const next = this.queue[0];
|
|
663
|
+
if (next.time > currentTimeSeconds) {
|
|
664
|
+
break;
|
|
665
|
+
}
|
|
666
|
+
this.queue.shift();
|
|
667
|
+
const { entity, time } = next;
|
|
668
|
+
if (!entity.inUse || entity.freePending) {
|
|
669
|
+
continue;
|
|
670
|
+
}
|
|
671
|
+
if (!entity.think) {
|
|
672
|
+
continue;
|
|
673
|
+
}
|
|
674
|
+
if (entity.nextthink !== time) {
|
|
675
|
+
continue;
|
|
676
|
+
}
|
|
677
|
+
entity.think(entity);
|
|
678
|
+
}
|
|
679
|
+
}
|
|
680
|
+
};
|
|
681
|
+
function computeBounds(entity) {
|
|
682
|
+
return {
|
|
683
|
+
min: {
|
|
684
|
+
x: entity.origin.x + entity.mins.x,
|
|
685
|
+
y: entity.origin.y + entity.mins.y,
|
|
686
|
+
z: entity.origin.z + entity.mins.z
|
|
687
|
+
},
|
|
688
|
+
max: {
|
|
689
|
+
x: entity.origin.x + entity.maxs.x,
|
|
690
|
+
y: entity.origin.y + entity.maxs.y,
|
|
691
|
+
z: entity.origin.z + entity.maxs.z
|
|
692
|
+
}
|
|
693
|
+
};
|
|
694
|
+
}
|
|
695
|
+
function boundsIntersect(a, b) {
|
|
696
|
+
return !(a.min.x > b.max.x || a.max.x < b.min.x || a.min.y > b.max.y || a.max.y < b.min.y || a.min.z > b.max.z || a.max.z < b.min.z);
|
|
697
|
+
}
|
|
698
|
+
var EntitySystem = class {
|
|
699
|
+
constructor(maxEntities) {
|
|
700
|
+
this.currentTimeSeconds = 0;
|
|
701
|
+
this.pool = new EntityPool(maxEntities);
|
|
702
|
+
this.thinkScheduler = new ThinkScheduler();
|
|
703
|
+
}
|
|
704
|
+
get world() {
|
|
705
|
+
return this.pool.world;
|
|
706
|
+
}
|
|
707
|
+
get activeCount() {
|
|
708
|
+
return this.pool.activeCount;
|
|
709
|
+
}
|
|
710
|
+
get timeSeconds() {
|
|
711
|
+
return this.currentTimeSeconds;
|
|
712
|
+
}
|
|
713
|
+
forEachEntity(callback) {
|
|
714
|
+
for (const entity of this.pool) {
|
|
715
|
+
callback(entity);
|
|
716
|
+
}
|
|
717
|
+
}
|
|
718
|
+
spawn() {
|
|
719
|
+
return this.pool.spawn();
|
|
720
|
+
}
|
|
721
|
+
free(entity) {
|
|
722
|
+
this.thinkScheduler.cancel(entity);
|
|
723
|
+
this.pool.deferFree(entity);
|
|
724
|
+
}
|
|
725
|
+
scheduleThink(entity, nextThinkSeconds) {
|
|
726
|
+
this.thinkScheduler.schedule(entity, nextThinkSeconds);
|
|
727
|
+
}
|
|
728
|
+
beginFrame(timeSeconds) {
|
|
729
|
+
this.currentTimeSeconds = timeSeconds;
|
|
730
|
+
}
|
|
731
|
+
runFrame() {
|
|
732
|
+
this.thinkScheduler.runDueThinks(this.currentTimeSeconds);
|
|
733
|
+
this.runTouches();
|
|
734
|
+
this.pool.flushFreeList();
|
|
735
|
+
}
|
|
736
|
+
runTouches() {
|
|
737
|
+
const world = this.pool.world;
|
|
738
|
+
const activeEntities = [];
|
|
739
|
+
for (const entity of this.pool) {
|
|
740
|
+
if (entity === world) {
|
|
741
|
+
continue;
|
|
742
|
+
}
|
|
743
|
+
if (!entity.inUse || entity.freePending) {
|
|
744
|
+
continue;
|
|
745
|
+
}
|
|
746
|
+
activeEntities.push(entity);
|
|
747
|
+
}
|
|
748
|
+
for (let i = 0; i < activeEntities.length; i += 1) {
|
|
749
|
+
const first = activeEntities[i];
|
|
750
|
+
let firstBounds = null;
|
|
751
|
+
for (let j = i + 1; j < activeEntities.length; j += 1) {
|
|
752
|
+
const second = activeEntities[j];
|
|
753
|
+
if (!first.touch && !second.touch) {
|
|
754
|
+
continue;
|
|
755
|
+
}
|
|
756
|
+
if (!firstBounds) {
|
|
757
|
+
firstBounds = computeBounds(first);
|
|
758
|
+
}
|
|
759
|
+
const secondBounds = computeBounds(second);
|
|
760
|
+
if (!boundsIntersect(firstBounds, secondBounds)) {
|
|
761
|
+
continue;
|
|
762
|
+
}
|
|
763
|
+
if (first.touch) {
|
|
764
|
+
first.touch(first, second);
|
|
765
|
+
}
|
|
766
|
+
if (second.touch) {
|
|
767
|
+
second.touch(second, first);
|
|
768
|
+
}
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
};
|
|
773
|
+
var orderedStageNames = [
|
|
774
|
+
"prep",
|
|
775
|
+
"simulate",
|
|
776
|
+
"finish"
|
|
777
|
+
];
|
|
778
|
+
var GameFrameLoop = class {
|
|
779
|
+
constructor(initialStages) {
|
|
780
|
+
this.timeMs = 0;
|
|
781
|
+
this.frame = 0;
|
|
782
|
+
this.stageHandlers = {
|
|
783
|
+
prep: [],
|
|
784
|
+
simulate: [],
|
|
785
|
+
finish: []
|
|
786
|
+
};
|
|
787
|
+
this.stageCounts = {
|
|
788
|
+
prep: 0,
|
|
789
|
+
simulate: 0,
|
|
790
|
+
finish: 0
|
|
791
|
+
};
|
|
792
|
+
this.stageCompactionNeeded = {
|
|
793
|
+
prep: false,
|
|
794
|
+
simulate: false,
|
|
795
|
+
finish: false
|
|
796
|
+
};
|
|
797
|
+
if (initialStages) {
|
|
798
|
+
for (const stageName of orderedStageNames) {
|
|
799
|
+
const handler = initialStages[stageName];
|
|
800
|
+
if (handler) {
|
|
801
|
+
this.addStage(stageName, handler);
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
}
|
|
805
|
+
}
|
|
806
|
+
addStage(stage, handler) {
|
|
807
|
+
const handlers = this.stageHandlers[stage];
|
|
808
|
+
handlers.push(handler);
|
|
809
|
+
this.stageCounts[stage] += 1;
|
|
810
|
+
return () => {
|
|
811
|
+
const index = handlers.indexOf(handler);
|
|
812
|
+
if (index >= 0 && handlers[index]) {
|
|
813
|
+
handlers[index] = void 0;
|
|
814
|
+
this.stageCounts[stage] -= 1;
|
|
815
|
+
this.stageCompactionNeeded[stage] = true;
|
|
816
|
+
}
|
|
817
|
+
};
|
|
818
|
+
}
|
|
819
|
+
reset(startTimeMs) {
|
|
820
|
+
this.timeMs = startTimeMs;
|
|
821
|
+
this.frame = 0;
|
|
822
|
+
}
|
|
823
|
+
advance(step) {
|
|
824
|
+
const previousTimeMs = this.timeMs;
|
|
825
|
+
this.timeMs = previousTimeMs + step.deltaMs;
|
|
826
|
+
this.frame = step.frame;
|
|
827
|
+
const context = {
|
|
828
|
+
...step,
|
|
829
|
+
timeMs: this.timeMs,
|
|
830
|
+
previousTimeMs,
|
|
831
|
+
deltaSeconds: step.deltaMs / 1e3
|
|
832
|
+
};
|
|
833
|
+
this.runStage("prep", context);
|
|
834
|
+
if (this.stageCounts.simulate === 0) {
|
|
835
|
+
throw new Error("GameFrameLoop requires at least one simulate stage");
|
|
836
|
+
}
|
|
837
|
+
this.runStage("simulate", context);
|
|
838
|
+
this.runStage("finish", context);
|
|
839
|
+
return context;
|
|
840
|
+
}
|
|
841
|
+
runStage(stage, context) {
|
|
842
|
+
const handlers = this.stageHandlers[stage];
|
|
843
|
+
for (let i = 0; i < handlers.length; i += 1) {
|
|
844
|
+
const handler = handlers[i];
|
|
845
|
+
if (!handler) {
|
|
846
|
+
continue;
|
|
847
|
+
}
|
|
848
|
+
handler(context);
|
|
849
|
+
}
|
|
850
|
+
if (this.stageCompactionNeeded[stage]) {
|
|
851
|
+
this.compactStageHandlers(stage);
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
compactStageHandlers(stage) {
|
|
855
|
+
const handlers = this.stageHandlers[stage];
|
|
856
|
+
let writeIndex = 0;
|
|
857
|
+
for (let readIndex = 0; readIndex < handlers.length; readIndex += 1) {
|
|
858
|
+
const handler = handlers[readIndex];
|
|
859
|
+
if (handler) {
|
|
860
|
+
handlers[writeIndex] = handler;
|
|
861
|
+
writeIndex += 1;
|
|
862
|
+
}
|
|
863
|
+
}
|
|
864
|
+
handlers.length = writeIndex;
|
|
865
|
+
this.stageCompactionNeeded[stage] = false;
|
|
866
|
+
}
|
|
867
|
+
get time() {
|
|
868
|
+
return this.timeMs;
|
|
869
|
+
}
|
|
870
|
+
get frameNumber() {
|
|
871
|
+
return this.frame;
|
|
872
|
+
}
|
|
873
|
+
};
|
|
874
|
+
var ZERO_STATE = {
|
|
875
|
+
frameNumber: 0,
|
|
876
|
+
timeSeconds: 0,
|
|
877
|
+
previousTimeSeconds: 0,
|
|
878
|
+
deltaSeconds: 0
|
|
879
|
+
};
|
|
880
|
+
var LevelClock = class {
|
|
881
|
+
constructor() {
|
|
882
|
+
this.state = ZERO_STATE;
|
|
883
|
+
}
|
|
884
|
+
start(startTimeMs) {
|
|
885
|
+
const startSeconds = startTimeMs / 1e3;
|
|
886
|
+
this.state = {
|
|
887
|
+
frameNumber: 0,
|
|
888
|
+
timeSeconds: startSeconds,
|
|
889
|
+
previousTimeSeconds: startSeconds,
|
|
890
|
+
deltaSeconds: 0
|
|
891
|
+
};
|
|
892
|
+
}
|
|
893
|
+
tick(context) {
|
|
894
|
+
this.state = {
|
|
895
|
+
frameNumber: context.frame,
|
|
896
|
+
timeSeconds: context.timeMs / 1e3,
|
|
897
|
+
previousTimeSeconds: context.previousTimeMs / 1e3,
|
|
898
|
+
deltaSeconds: context.deltaSeconds
|
|
899
|
+
};
|
|
900
|
+
return this.state;
|
|
901
|
+
}
|
|
902
|
+
get current() {
|
|
903
|
+
return this.state;
|
|
904
|
+
}
|
|
905
|
+
};
|
|
906
|
+
var ZERO_VEC32 = { x: 0, y: 0, z: 0 };
|
|
907
|
+
function createGame(engine, options) {
|
|
908
|
+
const gravity = options.gravity;
|
|
909
|
+
const levelClock = new LevelClock();
|
|
910
|
+
const frameLoop = new GameFrameLoop();
|
|
911
|
+
const entities = new EntitySystem();
|
|
912
|
+
frameLoop.addStage("prep", (context) => {
|
|
913
|
+
levelClock.tick(context);
|
|
914
|
+
entities.beginFrame(levelClock.current.timeSeconds);
|
|
915
|
+
});
|
|
916
|
+
frameLoop.addStage("simulate", ({ deltaSeconds }) => {
|
|
917
|
+
velocity = {
|
|
918
|
+
x: velocity.x + gravity.x * deltaSeconds,
|
|
919
|
+
y: velocity.y + gravity.y * deltaSeconds,
|
|
920
|
+
z: velocity.z + gravity.z * deltaSeconds
|
|
921
|
+
};
|
|
922
|
+
origin = {
|
|
923
|
+
x: origin.x + velocity.x * deltaSeconds,
|
|
924
|
+
y: origin.y + velocity.y * deltaSeconds,
|
|
925
|
+
z: origin.z + velocity.z * deltaSeconds
|
|
926
|
+
};
|
|
927
|
+
entities.runFrame();
|
|
928
|
+
});
|
|
929
|
+
let origin = { ...ZERO_VEC32 };
|
|
930
|
+
let velocity = { ...ZERO_VEC32 };
|
|
931
|
+
const snapshot = (frame) => ({
|
|
932
|
+
frame,
|
|
933
|
+
timeMs: frameLoop.time,
|
|
934
|
+
state: {
|
|
935
|
+
gravity: { ...gravity },
|
|
936
|
+
origin: { ...origin },
|
|
937
|
+
velocity: { ...velocity },
|
|
938
|
+
level: { ...levelClock.current },
|
|
939
|
+
entities: {
|
|
940
|
+
activeCount: entities.activeCount,
|
|
941
|
+
worldClassname: entities.world.classname
|
|
942
|
+
}
|
|
943
|
+
}
|
|
944
|
+
});
|
|
945
|
+
const resetState = (startTimeMs) => {
|
|
946
|
+
frameLoop.reset(startTimeMs);
|
|
947
|
+
levelClock.start(startTimeMs);
|
|
948
|
+
origin = { ...ZERO_VEC32 };
|
|
949
|
+
velocity = { ...ZERO_VEC32 };
|
|
950
|
+
entities.beginFrame(startTimeMs / 1e3);
|
|
951
|
+
entities.runFrame();
|
|
952
|
+
};
|
|
953
|
+
return {
|
|
954
|
+
init(startTimeMs) {
|
|
955
|
+
resetState(startTimeMs);
|
|
956
|
+
void engine.trace({ x: 0, y: 0, z: 0 }, gravity);
|
|
957
|
+
return snapshot(0);
|
|
958
|
+
},
|
|
959
|
+
shutdown() {
|
|
960
|
+
},
|
|
961
|
+
spawnWorld() {
|
|
962
|
+
},
|
|
963
|
+
frame(step) {
|
|
964
|
+
const context = frameLoop.advance(step);
|
|
965
|
+
return snapshot(context.frame);
|
|
966
|
+
},
|
|
967
|
+
entities
|
|
968
|
+
};
|
|
969
|
+
}
|
|
970
|
+
|
|
971
|
+
// ../../packages/shared/dist/esm/index.js
|
|
972
|
+
var ZERO_VEC33 = { x: 0, y: 0, z: 0 };
|
|
973
|
+
var DEG_TO_RAD3 = Math.PI / 180;
|
|
974
|
+
var DEG2RAD_FACTOR3 = Math.PI / 180;
|
|
975
|
+
var RAD2DEG_FACTOR3 = 180 / Math.PI;
|
|
976
|
+
var CONTENTS_SOLID3 = 1 << 0;
|
|
977
|
+
var CONTENTS_WINDOW3 = 1 << 1;
|
|
978
|
+
var CONTENTS_AUX3 = 1 << 2;
|
|
979
|
+
var CONTENTS_LAVA3 = 1 << 3;
|
|
980
|
+
var CONTENTS_SLIME3 = 1 << 4;
|
|
981
|
+
var CONTENTS_WATER3 = 1 << 5;
|
|
982
|
+
var CONTENTS_MIST3 = 1 << 6;
|
|
983
|
+
var CONTENTS_NO_WATERJUMP3 = 1 << 13;
|
|
984
|
+
var CONTENTS_PROJECTILECLIP3 = 1 << 14;
|
|
985
|
+
var CONTENTS_AREAPORTAL3 = 1 << 15;
|
|
986
|
+
var CONTENTS_PLAYERCLIP3 = 1 << 16;
|
|
987
|
+
var CONTENTS_MONSTERCLIP3 = 1 << 17;
|
|
988
|
+
var CONTENTS_CURRENT_03 = 1 << 18;
|
|
989
|
+
var CONTENTS_CURRENT_903 = 1 << 19;
|
|
990
|
+
var CONTENTS_CURRENT_1803 = 1 << 20;
|
|
991
|
+
var CONTENTS_CURRENT_2703 = 1 << 21;
|
|
992
|
+
var CONTENTS_CURRENT_UP3 = 1 << 22;
|
|
993
|
+
var CONTENTS_CURRENT_DOWN3 = 1 << 23;
|
|
994
|
+
var CONTENTS_ORIGIN3 = 1 << 24;
|
|
995
|
+
var CONTENTS_MONSTER3 = 1 << 25;
|
|
996
|
+
var CONTENTS_DEADMONSTER3 = 1 << 26;
|
|
997
|
+
var CONTENTS_DETAIL3 = 1 << 27;
|
|
998
|
+
var CONTENTS_TRANSLUCENT3 = 1 << 28;
|
|
999
|
+
var CONTENTS_LADDER3 = 1 << 29;
|
|
1000
|
+
var CONTENTS_PLAYER3 = 1 << 30;
|
|
1001
|
+
var CONTENTS_PROJECTILE3 = 1 << 31;
|
|
1002
|
+
var SURF_LIGHT3 = 1 << 0;
|
|
1003
|
+
var SURF_SLICK3 = 1 << 1;
|
|
1004
|
+
var SURF_SKY3 = 1 << 2;
|
|
1005
|
+
var SURF_WARP3 = 1 << 3;
|
|
1006
|
+
var SURF_TRANS333 = 1 << 4;
|
|
1007
|
+
var SURF_TRANS663 = 1 << 5;
|
|
1008
|
+
var SURF_FLOWING3 = 1 << 6;
|
|
1009
|
+
var SURF_NODRAW3 = 1 << 7;
|
|
1010
|
+
var SURF_ALPHATEST3 = 1 << 25;
|
|
1011
|
+
var SURF_N64_UV3 = 1 << 28;
|
|
1012
|
+
var SURF_N64_SCROLL_X3 = 1 << 29;
|
|
1013
|
+
var SURF_N64_SCROLL_Y3 = 1 << 30;
|
|
1014
|
+
var SURF_N64_SCROLL_FLIP3 = 1 << 31;
|
|
1015
|
+
var MASK_SOLID3 = CONTENTS_SOLID3 | CONTENTS_WINDOW3;
|
|
1016
|
+
var MASK_PLAYERSOLID3 = CONTENTS_SOLID3 | CONTENTS_PLAYERCLIP3 | CONTENTS_WINDOW3 | CONTENTS_MONSTER3 | CONTENTS_PLAYER3;
|
|
1017
|
+
var MASK_DEADSOLID3 = CONTENTS_SOLID3 | CONTENTS_PLAYERCLIP3 | CONTENTS_WINDOW3;
|
|
1018
|
+
var MASK_MONSTERSOLID3 = CONTENTS_SOLID3 | CONTENTS_MONSTERCLIP3 | CONTENTS_WINDOW3 | CONTENTS_MONSTER3 | CONTENTS_PLAYER3;
|
|
1019
|
+
var MASK_WATER3 = CONTENTS_WATER3 | CONTENTS_LAVA3 | CONTENTS_SLIME3;
|
|
1020
|
+
var MASK_OPAQUE3 = CONTENTS_SOLID3 | CONTENTS_SLIME3 | CONTENTS_LAVA3;
|
|
1021
|
+
var MASK_SHOT3 = CONTENTS_SOLID3 | CONTENTS_MONSTER3 | CONTENTS_PLAYER3 | CONTENTS_WINDOW3 | CONTENTS_DEADMONSTER3;
|
|
1022
|
+
var MASK_CURRENT3 = CONTENTS_CURRENT_03 | CONTENTS_CURRENT_903 | CONTENTS_CURRENT_1803 | CONTENTS_CURRENT_2703 | CONTENTS_CURRENT_UP3 | CONTENTS_CURRENT_DOWN3;
|
|
1023
|
+
var MASK_BLOCK_SIGHT3 = CONTENTS_SOLID3 | CONTENTS_LAVA3 | CONTENTS_SLIME3 | CONTENTS_MONSTER3 | CONTENTS_PLAYER3;
|
|
1024
|
+
var MASK_NAV_SOLID3 = CONTENTS_SOLID3 | CONTENTS_PLAYERCLIP3 | CONTENTS_WINDOW3;
|
|
1025
|
+
var MASK_LADDER_NAV_SOLID3 = CONTENTS_SOLID3 | CONTENTS_WINDOW3;
|
|
1026
|
+
var MASK_WALK_NAV_SOLID3 = CONTENTS_SOLID3 | CONTENTS_PLAYERCLIP3 | CONTENTS_WINDOW3 | CONTENTS_MONSTERCLIP3;
|
|
1027
|
+
var MASK_PROJECTILE3 = MASK_SHOT3 | CONTENTS_PROJECTILECLIP3;
|
|
1028
|
+
var MAX_CLIENTS3 = 256;
|
|
1029
|
+
var MAX_LIGHTSTYLES3 = 256;
|
|
1030
|
+
var MAX_MODELS3 = 8192;
|
|
1031
|
+
var MAX_SOUNDS3 = 2048;
|
|
1032
|
+
var MAX_IMAGES3 = 512;
|
|
1033
|
+
var MAX_ITEMS3 = 256;
|
|
1034
|
+
var MAX_GENERAL3 = MAX_CLIENTS3 * 2;
|
|
1035
|
+
var MAX_SHADOW_LIGHTS3 = 256;
|
|
1036
|
+
var MAX_WHEEL_ITEMS3 = 32;
|
|
1037
|
+
var ConfigStringIndex3 = ((ConfigStringIndex22) => {
|
|
1038
|
+
ConfigStringIndex22[ConfigStringIndex22["Name"] = 0] = "Name";
|
|
1039
|
+
ConfigStringIndex22[ConfigStringIndex22["CdTrack"] = 1] = "CdTrack";
|
|
1040
|
+
ConfigStringIndex22[ConfigStringIndex22["Sky"] = 2] = "Sky";
|
|
1041
|
+
ConfigStringIndex22[ConfigStringIndex22["SkyAxis"] = 3] = "SkyAxis";
|
|
1042
|
+
ConfigStringIndex22[ConfigStringIndex22["SkyRotate"] = 4] = "SkyRotate";
|
|
1043
|
+
ConfigStringIndex22[ConfigStringIndex22["StatusBar"] = 5] = "StatusBar";
|
|
1044
|
+
ConfigStringIndex22[ConfigStringIndex22["AirAccel"] = 59] = "AirAccel";
|
|
1045
|
+
ConfigStringIndex22[ConfigStringIndex22["MaxClients"] = 60] = "MaxClients";
|
|
1046
|
+
ConfigStringIndex22[ConfigStringIndex22["MapChecksum"] = 61] = "MapChecksum";
|
|
1047
|
+
ConfigStringIndex22[ConfigStringIndex22["Models"] = 62] = "Models";
|
|
1048
|
+
ConfigStringIndex22[ConfigStringIndex22["Sounds"] = 62 + MAX_MODELS3] = "Sounds";
|
|
1049
|
+
ConfigStringIndex22[ConfigStringIndex22["Images"] = ConfigStringIndex22.Sounds + MAX_SOUNDS3] = "Images";
|
|
1050
|
+
ConfigStringIndex22[ConfigStringIndex22["Lights"] = ConfigStringIndex22.Images + MAX_IMAGES3] = "Lights";
|
|
1051
|
+
ConfigStringIndex22[ConfigStringIndex22["ShadowLights"] = ConfigStringIndex22.Lights + MAX_LIGHTSTYLES3] = "ShadowLights";
|
|
1052
|
+
ConfigStringIndex22[ConfigStringIndex22["Items"] = ConfigStringIndex22.ShadowLights + MAX_SHADOW_LIGHTS3] = "Items";
|
|
1053
|
+
ConfigStringIndex22[ConfigStringIndex22["PlayerSkins"] = ConfigStringIndex22.Items + MAX_ITEMS3] = "PlayerSkins";
|
|
1054
|
+
ConfigStringIndex22[ConfigStringIndex22["General"] = ConfigStringIndex22.PlayerSkins + MAX_CLIENTS3] = "General";
|
|
1055
|
+
ConfigStringIndex22[ConfigStringIndex22["WheelWeapons"] = ConfigStringIndex22.General + MAX_GENERAL3] = "WheelWeapons";
|
|
1056
|
+
ConfigStringIndex22[ConfigStringIndex22["WheelAmmo"] = ConfigStringIndex22.WheelWeapons + MAX_WHEEL_ITEMS3] = "WheelAmmo";
|
|
1057
|
+
ConfigStringIndex22[ConfigStringIndex22["WheelPowerups"] = ConfigStringIndex22.WheelAmmo + MAX_WHEEL_ITEMS3] = "WheelPowerups";
|
|
1058
|
+
ConfigStringIndex22[ConfigStringIndex22["CdLoopCount"] = ConfigStringIndex22.WheelPowerups + MAX_WHEEL_ITEMS3] = "CdLoopCount";
|
|
1059
|
+
ConfigStringIndex22[ConfigStringIndex22["GameStyle"] = ConfigStringIndex22.CdLoopCount + 1] = "GameStyle";
|
|
1060
|
+
ConfigStringIndex22[ConfigStringIndex22["MaxConfigStrings"] = ConfigStringIndex22.GameStyle + 1] = "MaxConfigStrings";
|
|
1061
|
+
return ConfigStringIndex22;
|
|
1062
|
+
})(ConfigStringIndex3 || {});
|
|
1063
|
+
var MAX_CONFIGSTRINGS3 = ConfigStringIndex3.MaxConfigStrings;
|
|
1064
|
+
var WATERJUMP_CLEAR3 = 8 | 16 | 32 | 1024;
|
|
1065
|
+
|
|
1066
|
+
// src/index.ts
|
|
1067
|
+
function bootstrapViewer() {
|
|
1068
|
+
const engine = createEngine({
|
|
1069
|
+
trace(start, end) {
|
|
1070
|
+
return { start, end, fraction: 1 };
|
|
1071
|
+
}
|
|
1072
|
+
});
|
|
1073
|
+
const game = createGame({
|
|
1074
|
+
trace(start, end) {
|
|
1075
|
+
return { start, end, fraction: 1 };
|
|
1076
|
+
}
|
|
1077
|
+
}, { gravity: ZERO_VEC33 });
|
|
1078
|
+
const client = createClient({ engine: { trace: () => ({ start: ZERO_VEC33, end: ZERO_VEC33, fraction: 1 }) } });
|
|
1079
|
+
const runtime = createEngineRuntime(engine, game, client);
|
|
1080
|
+
runtime.start();
|
|
1081
|
+
return { engine, game, client, runtime };
|
|
1082
|
+
}
|
|
1083
|
+
// Annotate the CommonJS export names for ESM import in node:
|
|
1084
|
+
0 && (module.exports = {
|
|
1085
|
+
bootstrapViewer
|
|
1086
|
+
});
|
|
1087
|
+
//# sourceMappingURL=index.cjs.map
|