ball2d 0.1.1 → 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.
- package/LICENSE +42 -0
- package/README.md +193 -138
- package/dist/browser.js +1737 -1206
- package/dist/core.wasm +0 -0
- package/dist/node.js +104 -43358
- package/dist/stadiums/big.hbs +515 -85
- package/dist/stadiums/big_easy.hbs +515 -85
- package/dist/stadiums/big_hockey.hbs +612 -87
- package/dist/stadiums/big_rounded.hbs +611 -100
- package/dist/stadiums/classic.hbs +515 -85
- package/dist/stadiums/easy.hbs +515 -85
- package/dist/stadiums/hockey.hbs +612 -87
- package/dist/stadiums/huge.hbs +515 -85
- package/dist/stadiums/provenance.json +24 -22
- package/dist/stadiums/rounded.hbs +611 -100
- package/dist/stadiums/small.hbs +515 -85
- package/dist/types/announcement.d.ts +1 -0
- package/dist/types/browser.d.ts +10 -0
- package/dist/types/config.d.ts +9 -0
- package/dist/types/disc.d.ts +4 -0
- package/dist/types/{core/match-state.d.ts → match-state.d.ts} +2 -0
- package/dist/types/node.d.ts +15 -0
- package/dist/types/{core/host-types.d.ts → player.d.ts} +3 -1
- package/dist/types/{core/replay-types.d.ts → replay.d.ts} +3 -3
- package/dist/types/{sdk/types.d.ts → room.d.ts} +9 -4
- package/dist/types/stadium.d.ts +5 -0
- package/dist/types/team.d.ts +6 -0
- package/package.json +28 -6
- package/dist/types/client/announcement.d.ts +0 -10
- package/dist/types/client/connection-stats.d.ts +0 -11
- package/dist/types/client/headless.d.ts +0 -130
- package/dist/types/client/host-config.d.ts +0 -11
- package/dist/types/client/host-runtime.d.ts +0 -10
- package/dist/types/client/network-runtime.d.ts +0 -8
- package/dist/types/client/network.d.ts +0 -91
- package/dist/types/client/stadium-library.d.ts +0 -4
- package/dist/types/client/startup-scope.d.ts +0 -6
- package/dist/types/client/traffic.d.ts +0 -9
- package/dist/types/core/avatar.d.ts +0 -2
- package/dist/types/core/build-id.d.ts +0 -2
- package/dist/types/core/control.d.ts +0 -5
- package/dist/types/core/disc-properties.d.ts +0 -7
- package/dist/types/core/engine.d.ts +0 -68
- package/dist/types/core/protocol.d.ts +0 -24
- package/dist/types/core/replay-codec.d.ts +0 -6
- package/dist/types/core/replay-wire.d.ts +0 -5
- package/dist/types/core/replay.d.ts +0 -48
- package/dist/types/core/stadium.d.ts +0 -91
- package/dist/types/core/team-colors.d.ts +0 -8
- package/dist/types/sdk/browser.d.ts +0 -11
- package/dist/types/sdk/command-queue.d.ts +0 -11
- package/dist/types/sdk/config.d.ts +0 -6
- package/dist/types/sdk/node-transport.d.ts +0 -4
- package/dist/types/sdk/node.d.ts +0 -18
- package/dist/types/sdk/replay.d.ts +0 -4
- package/dist/types/sdk/room.d.ts +0 -7
- package/dist/types/sdk/stadium.d.ts +0 -9
- package/dist/types/shared/room-link.d.ts +0 -6
- /package/dist/types/{sdk/create-options.d.ts → creation.d.ts} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type { HostPlayer, HostScores, HostDiscProperties } from '
|
|
2
|
-
import type { DiscPropertyPatch } from '
|
|
3
|
-
import type { MatchState } from '
|
|
4
|
-
import type { AnnouncementStyle } from '
|
|
1
|
+
import type { HostPlayer, HostScores, HostDiscProperties } from './player.js';
|
|
2
|
+
import type { DiscPropertyPatch } from './disc.js';
|
|
3
|
+
import type { MatchState } from './match-state.js';
|
|
4
|
+
import type { AnnouncementStyle } from './announcement.js';
|
|
5
5
|
/** Public room contract: runtime classes and transport types are deliberately absent. */
|
|
6
6
|
export interface Room {
|
|
7
7
|
readonly roomId: string;
|
|
@@ -13,6 +13,7 @@ export interface Room {
|
|
|
13
13
|
onRoomLink?: (url: string) => void;
|
|
14
14
|
onPlayerJoin?: (p: HostPlayer) => void;
|
|
15
15
|
onPlayerTeamChange?: (p: HostPlayer, byPlayer: HostPlayer | null) => void;
|
|
16
|
+
onPlayerMuteChange?: (p: HostPlayer, byPlayer: HostPlayer | null) => void;
|
|
16
17
|
onPlayerAdminChange?: (p: HostPlayer, byPlayer: HostPlayer | null) => void;
|
|
17
18
|
onGameStart?: (byPlayer: HostPlayer | null) => void;
|
|
18
19
|
onGameStop?: (byPlayer: HostPlayer | null) => void;
|
|
@@ -41,6 +42,8 @@ export interface Room {
|
|
|
41
42
|
setPlayerAvatar(id: number, avatar: string | null): Promise<void>;
|
|
42
43
|
setPlayerTeam(id: number, team: 0 | 1 | 2): Promise<void>;
|
|
43
44
|
setPlayerAdmin(id: number, admin: boolean): Promise<void>;
|
|
45
|
+
/** Mute room chat for this player until unmuted or they leave. */
|
|
46
|
+
setPlayerMuted(id: number, muted: boolean): Promise<void>;
|
|
44
47
|
setTeamsLock(locked: boolean): Promise<void>;
|
|
45
48
|
kickPlayer(id: number, reason?: string, ban?: boolean): Promise<void>;
|
|
46
49
|
clearBan(id: number): Promise<void>;
|
|
@@ -51,6 +54,8 @@ export interface Room {
|
|
|
51
54
|
stopGame(): Promise<void>;
|
|
52
55
|
pauseGame(paused: boolean): Promise<void>;
|
|
53
56
|
setKickRateLimit(min?: number, rate?: number, burst?: number): Promise<void>;
|
|
57
|
+
/** Enable the wet-grass preset or restore dry ground; requires a stopped match. */
|
|
58
|
+
setSurfaceEnabled(enabled: boolean): Promise<void>;
|
|
54
59
|
setPassword(password: string | null): Promise<void>;
|
|
55
60
|
readonly requireVerification: boolean | null;
|
|
56
61
|
setRequireVerification(required: boolean): Promise<void>;
|
package/package.json
CHANGED
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "ball2d",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "Ball2D browser and
|
|
3
|
+
"version": "0.2.1",
|
|
4
|
+
"description": "Ball2D SDK for browser integration and API-key-authorized Node.js room hosting",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"files": [
|
|
8
8
|
"dist",
|
|
9
|
-
"README.md"
|
|
9
|
+
"README.md",
|
|
10
|
+
"LICENSE"
|
|
10
11
|
],
|
|
11
12
|
"exports": {
|
|
12
13
|
".": {
|
|
13
|
-
"types": "./dist/types/
|
|
14
|
+
"types": "./dist/types/browser.d.ts",
|
|
14
15
|
"default": "./dist/browser.js"
|
|
15
16
|
},
|
|
16
17
|
"./node": {
|
|
17
|
-
"types": "./dist/types/
|
|
18
|
+
"types": "./dist/types/node.d.ts",
|
|
18
19
|
"node": "./dist/node.js"
|
|
19
20
|
}
|
|
20
21
|
},
|
|
21
|
-
"license": "
|
|
22
|
+
"license": "SEE LICENSE IN LICENSE",
|
|
22
23
|
"homepage": "https://ball2d.com",
|
|
23
24
|
"repository": {
|
|
24
25
|
"type": "git",
|
|
@@ -29,5 +30,26 @@
|
|
|
29
30
|
},
|
|
30
31
|
"bugs": {
|
|
31
32
|
"url": "https://github.com/fillbyte/ball2d/issues"
|
|
33
|
+
},
|
|
34
|
+
"scripts": {
|
|
35
|
+
"check": "node scripts/check.mjs",
|
|
36
|
+
"check:docs": "node scripts/check-docs.mjs",
|
|
37
|
+
"format:check": "prettier --check .",
|
|
38
|
+
"format": "prettier --write .",
|
|
39
|
+
"pack:check": "npm pack --dry-run --ignore-scripts"
|
|
40
|
+
},
|
|
41
|
+
"keywords": [
|
|
42
|
+
"ball2d",
|
|
43
|
+
"football",
|
|
44
|
+
"multiplayer",
|
|
45
|
+
"webrtc",
|
|
46
|
+
"sdk"
|
|
47
|
+
],
|
|
48
|
+
"devDependencies": {
|
|
49
|
+
"prettier": "3.9.6"
|
|
50
|
+
},
|
|
51
|
+
"publishConfig": {
|
|
52
|
+
"access": "public",
|
|
53
|
+
"registry": "https://registry.npmjs.org/"
|
|
32
54
|
}
|
|
33
55
|
}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
export declare const announcementStyles: readonly ['normal', 'bold', 'italic', 'small', 'small-bold', 'small-italic'];
|
|
2
|
-
export type AnnouncementStyle = (typeof announcementStyles)[number];
|
|
3
|
-
export interface Announcement {
|
|
4
|
-
type: 'announcement';
|
|
5
|
-
text: string;
|
|
6
|
-
color: number | null;
|
|
7
|
-
style: AnnouncementStyle;
|
|
8
|
-
sound: 0 | 1 | 2;
|
|
9
|
-
}
|
|
10
|
-
export declare function announcement(text: string, color?: number | null, style?: AnnouncementStyle | null, sound?: number | null): Announcement;
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
interface StatsRow {
|
|
2
|
-
id: string;
|
|
3
|
-
type: string;
|
|
4
|
-
selectedCandidatePairId?: string;
|
|
5
|
-
state?: string;
|
|
6
|
-
nominated?: boolean;
|
|
7
|
-
currentRoundTripTime?: number;
|
|
8
|
-
}
|
|
9
|
-
/** Selected ICE path RTT from STUN checks; not input-to-display latency. */
|
|
10
|
-
export declare function selectedRtt(rows: Iterable<StatsRow>): number | null;
|
|
11
|
-
export {};
|
|
@@ -1,130 +0,0 @@
|
|
|
1
|
-
import { type HostConfig } from './host-config.js';
|
|
2
|
-
import { type AnnouncementStyle } from './announcement.js';
|
|
3
|
-
import { type DiscPropertyPatch } from '../core/disc-properties.js';
|
|
4
|
-
import { type HostRuntime } from './host-runtime.js';
|
|
5
|
-
import { Engine, type MatchState } from '../core/engine.js';
|
|
6
|
-
import { Network } from './network.js';
|
|
7
|
-
import type { HostPlayer, HostScores, HostDiscProperties } from '../core/host-types.js';
|
|
8
|
-
export type { HostPlayer, HostScores, HostDiscProperties } from '../core/host-types.js';
|
|
9
|
-
export type { HostConfig } from './host-config.js';
|
|
10
|
-
/** Shared headless room implementation; browser runtime is the current default. */
|
|
11
|
-
export declare class HeadlessRoom {
|
|
12
|
-
private readonly runtime;
|
|
13
|
-
readonly engine: Engine;
|
|
14
|
-
network: Network;
|
|
15
|
-
roomId: string;
|
|
16
|
-
roomLink: string;
|
|
17
|
-
roomName: string;
|
|
18
|
-
private epoch;
|
|
19
|
-
private stadiumSelection;
|
|
20
|
-
private players;
|
|
21
|
-
private nextPlayerId;
|
|
22
|
-
private bans;
|
|
23
|
-
private loop?;
|
|
24
|
-
private linkNotification?;
|
|
25
|
-
private last;
|
|
26
|
-
private accumulator;
|
|
27
|
-
private recorder?;
|
|
28
|
-
private closed;
|
|
29
|
-
private readonly closeController;
|
|
30
|
-
readonly signal: AbortSignal;
|
|
31
|
-
private finishingRecording;
|
|
32
|
-
lastRecording: Blob | null;
|
|
33
|
-
onRecordingComplete?: (blob: Blob, reason: string) => void;
|
|
34
|
-
private locked;
|
|
35
|
-
private teamStyles;
|
|
36
|
-
private inputs;
|
|
37
|
-
private traffic;
|
|
38
|
-
onRoomLink?: (url: string) => void;
|
|
39
|
-
onPlayerJoin?: (p: HostPlayer) => void;
|
|
40
|
-
onPlayerTeamChange?: (p: HostPlayer, byPlayer: HostPlayer | null) => void;
|
|
41
|
-
onPlayerAdminChange?: (p: HostPlayer, byPlayer: HostPlayer | null) => void;
|
|
42
|
-
onGameStart?: (byPlayer: HostPlayer | null) => void;
|
|
43
|
-
onGameStop?: (byPlayer: HostPlayer | null) => void;
|
|
44
|
-
onTeamVictory?: (scores: HostScores) => void;
|
|
45
|
-
/** Legacy Ball2D callback; prefer onTeamVictory. */
|
|
46
|
-
onGameVictory?: (scores: HostScores) => void;
|
|
47
|
-
onGamePauseChange?: (paused: boolean) => void;
|
|
48
|
-
onGamePause?: (byPlayer: HostPlayer | null) => void;
|
|
49
|
-
onGameUnpause?: (byPlayer: HostPlayer | null) => void;
|
|
50
|
-
onPlayerLeave?: (p: HostPlayer) => void;
|
|
51
|
-
onPlayerKicked?: (p: HostPlayer, reason: string, ban: boolean, byPlayer: HostPlayer | null) => void;
|
|
52
|
-
onPlayerActivity?: (p: HostPlayer) => void;
|
|
53
|
-
onPlayerChat?: (p: HostPlayer, text: string) => boolean | void;
|
|
54
|
-
onPlayerBallKick?: (p: HostPlayer) => void;
|
|
55
|
-
onTeamGoal?: (team: 1 | 2) => void;
|
|
56
|
-
onPositionsReset?: () => void;
|
|
57
|
-
onStadiumChange?: (name: string, byPlayer: HostPlayer | null) => void;
|
|
58
|
-
onTeamsLockChange?: (locked: boolean, byPlayer: HostPlayer | null) => void;
|
|
59
|
-
onKickRateLimitSet?: (min: number, rate: number, burst: number, byPlayer: HostPlayer | null) => void;
|
|
60
|
-
onGameTick?: () => void;
|
|
61
|
-
onError?: (message: string) => void;
|
|
62
|
-
private report;
|
|
63
|
-
private invoke;
|
|
64
|
-
private constructor();
|
|
65
|
-
static create(config: HostConfig, runtime?: HostRuntime, signal?: AbortSignal): Promise<HeadlessRoom>;
|
|
66
|
-
private advance;
|
|
67
|
-
private allowed;
|
|
68
|
-
private control;
|
|
69
|
-
private fast;
|
|
70
|
-
private command;
|
|
71
|
-
private roster;
|
|
72
|
-
private sync;
|
|
73
|
-
private state;
|
|
74
|
-
private leave;
|
|
75
|
-
private playerCopy;
|
|
76
|
-
getPlayerList(): HostPlayer[];
|
|
77
|
-
getPlayer(id: number): HostPlayer | null;
|
|
78
|
-
setTeamColors(team: number, angle: number, textColor: number, colors: number[]): void;
|
|
79
|
-
private changeTeamColors;
|
|
80
|
-
reorderPlayers(playerIdList: number[], moveToTop: boolean): void;
|
|
81
|
-
setPlayerAvatar(id: number, avatar: string | null): void;
|
|
82
|
-
setPlayerTeam(id: number, team: 0 | 1 | 2): void;
|
|
83
|
-
private changeTeam;
|
|
84
|
-
setPlayerAdmin(id: number, admin: boolean): void;
|
|
85
|
-
setTeamsLock(locked: boolean): void;
|
|
86
|
-
private changeTeamsLock;
|
|
87
|
-
kickPlayer(id: number, reason?: string, ban?: boolean): void | Promise<void>;
|
|
88
|
-
private banPlayer;
|
|
89
|
-
clearBan(id: number): Promise<void>;
|
|
90
|
-
clearBans(): Promise<void>;
|
|
91
|
-
private removePlayer;
|
|
92
|
-
sendChat(text: string, targetId?: number | null): void;
|
|
93
|
-
sendAnnouncement(text: string, targetId?: number | null, color?: number | null, style?: AnnouncementStyle | null, sound?: number | null): void;
|
|
94
|
-
startGame(): void;
|
|
95
|
-
private beginGame;
|
|
96
|
-
stopGame(): void;
|
|
97
|
-
private endGame;
|
|
98
|
-
pauseGame(paused: boolean): void;
|
|
99
|
-
private changePause;
|
|
100
|
-
setKickRateLimit(min?: number, rate?: number, burst?: number): void;
|
|
101
|
-
private changeKickRateLimit;
|
|
102
|
-
setPassword(password: string | null): Promise<void>;
|
|
103
|
-
get requireVerification(): boolean | null;
|
|
104
|
-
setRequireVerification(required: boolean): Promise<void>;
|
|
105
|
-
/** Migration alias: Ball2D uses Turnstile, not Google's reCAPTCHA. */
|
|
106
|
-
setRequireRecaptcha(required: boolean): Promise<void>;
|
|
107
|
-
setScoreLimit(limit: number): void;
|
|
108
|
-
setTimeLimit(minutes: number): void;
|
|
109
|
-
setDefaultStadium(name: string): Promise<void>;
|
|
110
|
-
setCustomStadium(source: string): void;
|
|
111
|
-
private changeStadium;
|
|
112
|
-
getScores(): HostScores | null;
|
|
113
|
-
getBallPosition(): {
|
|
114
|
-
x: number;
|
|
115
|
-
y: number;
|
|
116
|
-
} | null;
|
|
117
|
-
private readDisc;
|
|
118
|
-
get CollisionFlags(): Readonly<Record<string, number>>;
|
|
119
|
-
getDiscCount(): number;
|
|
120
|
-
getDiscProperties(discIndex: number): HostDiscProperties | null;
|
|
121
|
-
setDiscProperties(discIndex: number, properties: DiscPropertyPatch): void;
|
|
122
|
-
setPlayerDiscProperties(playerId: number, properties: DiscPropertyPatch): void;
|
|
123
|
-
private changeDisc;
|
|
124
|
-
getPlayerDiscProperties(playerId: number): HostDiscProperties | null;
|
|
125
|
-
getState(): MatchState;
|
|
126
|
-
startRecording(): void;
|
|
127
|
-
private finishRecording;
|
|
128
|
-
stopRecording(): Blob | null;
|
|
129
|
-
close(): void;
|
|
130
|
-
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
export interface HostConfig {
|
|
2
|
-
noPlayer?: boolean;
|
|
3
|
-
playerName?: string;
|
|
4
|
-
roomName: string;
|
|
5
|
-
maxPlayers?: number;
|
|
6
|
-
password?: string;
|
|
7
|
-
public?: boolean;
|
|
8
|
-
stadium?: string;
|
|
9
|
-
}
|
|
10
|
-
/** Validate before allocating an engine or making an admission request. */
|
|
11
|
-
export declare function hostConfig(input: unknown): HostConfig;
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import { Engine } from '../core/engine.js';
|
|
2
|
-
import { type NetworkRuntime } from './network-runtime.js';
|
|
3
|
-
/** Internal boundary shared by the browser host and future native SDK adapter. */
|
|
4
|
-
export interface HostRuntime {
|
|
5
|
-
readonly network: NetworkRuntime;
|
|
6
|
-
readonly request: (url: URL, init?: RequestInit) => Promise<Response>;
|
|
7
|
-
readonly loadEngine: (signal: AbortSignal) => Promise<Engine>;
|
|
8
|
-
readonly loadStadium: (name: string) => Promise<string>;
|
|
9
|
-
}
|
|
10
|
-
export declare function browserHostRuntime(): HostRuntime;
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
/** Internal transport boundary. Adapters must preserve browser channel/recovery semantics. */
|
|
2
|
-
export interface NetworkRuntime {
|
|
3
|
-
readonly serviceOrigin: string;
|
|
4
|
-
readonly createWebSocket: (url: URL) => WebSocket;
|
|
5
|
-
readonly createPeerConnection: (config: RTCConfiguration) => RTCPeerConnection;
|
|
6
|
-
}
|
|
7
|
-
export declare function serviceOrigin(value: string): string;
|
|
8
|
-
export declare function browserNetworkRuntime(): NetworkRuntime;
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
import { type NetworkRuntime } from './network-runtime.js';
|
|
2
|
-
/** The service may have committed the operation before confirmation was lost. */
|
|
3
|
-
export declare class UnconfirmedBanError extends Error {
|
|
4
|
-
}
|
|
5
|
-
export interface Peer {
|
|
6
|
-
id: string;
|
|
7
|
-
pc: RTCPeerConnection;
|
|
8
|
-
control?: RTCDataChannel;
|
|
9
|
-
fast?: RTCDataChannel;
|
|
10
|
-
connected: boolean;
|
|
11
|
-
rtt?: number | null;
|
|
12
|
-
admissionTimer?: ReturnType<typeof setTimeout>;
|
|
13
|
-
created: number;
|
|
14
|
-
candidates: RTCIceCandidateInit[];
|
|
15
|
-
lostAt?: number;
|
|
16
|
-
lastRestart: number;
|
|
17
|
-
restarts: number;
|
|
18
|
-
restarting: boolean;
|
|
19
|
-
}
|
|
20
|
-
export interface Hooks {
|
|
21
|
-
verify?: (challenge: {
|
|
22
|
-
siteKey: string;
|
|
23
|
-
roomId: string;
|
|
24
|
-
}, signal: AbortSignal) => Promise<string>;
|
|
25
|
-
allowStadiumUpload?: (peer: Peer) => boolean;
|
|
26
|
-
ready: (id: string, host: boolean) => void;
|
|
27
|
-
open: (peer: Peer) => void;
|
|
28
|
-
control: (peer: Peer, msg: unknown) => void;
|
|
29
|
-
fast: (peer: Peer, data: ArrayBuffer) => void;
|
|
30
|
-
leave: (id: string) => void;
|
|
31
|
-
status: (text: string) => void;
|
|
32
|
-
ended?: (reason: string) => void;
|
|
33
|
-
}
|
|
34
|
-
export declare class Network {
|
|
35
|
-
private room;
|
|
36
|
-
private credentials;
|
|
37
|
-
private hooks;
|
|
38
|
-
private readonly runtime;
|
|
39
|
-
ws: WebSocket;
|
|
40
|
-
peers: Map<string, Peer>;
|
|
41
|
-
id: string;
|
|
42
|
-
host: boolean;
|
|
43
|
-
hostId: string;
|
|
44
|
-
closed: boolean;
|
|
45
|
-
timer: ReturnType<typeof setInterval>;
|
|
46
|
-
bytesSent: number;
|
|
47
|
-
bytesReceived: number;
|
|
48
|
-
private pollingStats;
|
|
49
|
-
private verificationState;
|
|
50
|
-
get requireVerification(): boolean | null;
|
|
51
|
-
private verificationSequence;
|
|
52
|
-
private verificationRequest?;
|
|
53
|
-
private challenge?;
|
|
54
|
-
private rejectVerification;
|
|
55
|
-
setRequireVerification(required: boolean): Promise<boolean>;
|
|
56
|
-
private passwordRequestId;
|
|
57
|
-
private passwordRequest?;
|
|
58
|
-
private rejectPasswordUpdate;
|
|
59
|
-
setPassword(password: string | null): Promise<boolean>;
|
|
60
|
-
private banSequence;
|
|
61
|
-
private banRequest?;
|
|
62
|
-
private rejectBan;
|
|
63
|
-
updateBan(type: 'ban' | 'clearBan' | 'clearBans', target?: string): Promise<void>;
|
|
64
|
-
get rtt(): number | null;
|
|
65
|
-
private signalQueue;
|
|
66
|
-
private lastHeartbeat;
|
|
67
|
-
private controlId;
|
|
68
|
-
private controlAssemblers;
|
|
69
|
-
constructor(room: string, credentials: {
|
|
70
|
-
hostToken?: string;
|
|
71
|
-
password?: string;
|
|
72
|
-
}, hooks: Hooks, runtime?: NetworkRuntime);
|
|
73
|
-
signal(m: unknown): void;
|
|
74
|
-
private message;
|
|
75
|
-
private current;
|
|
76
|
-
private queueCandidate;
|
|
77
|
-
private noteHealthy;
|
|
78
|
-
private flushCandidates;
|
|
79
|
-
/** Host-only ICE repair; preserves channels, player identity and simulation state. */
|
|
80
|
-
restartPeer(id: string): Promise<boolean>;
|
|
81
|
-
private make;
|
|
82
|
-
private bind;
|
|
83
|
-
/** Called by the host only after validating and allocating a player slot. */
|
|
84
|
-
admit(p: Peer): void;
|
|
85
|
-
control(p: Peer, m: unknown): void;
|
|
86
|
-
fast(p: Peer, data: ArrayBuffer): void;
|
|
87
|
-
broadcast(m: unknown): void;
|
|
88
|
-
stats(): Promise<void>;
|
|
89
|
-
remove(id: string): void;
|
|
90
|
-
close(): void;
|
|
91
|
-
}
|
|
@@ -1,4 +0,0 @@
|
|
|
1
|
-
export declare const defaultStadiums: readonly [readonly ['classic', 'Classic'], readonly ['easy', 'Easy'], readonly ['small', 'Small'], readonly ['big', 'Big'], readonly ['rounded', 'Rounded'], readonly ['hockey', 'Hockey'], readonly ['big_easy', 'Big Easy'], readonly ['big_rounded', 'Big Rounded'], readonly ['big_hockey', 'Big Hockey'], readonly ['huge', 'Huge']];
|
|
2
|
-
/** Each loader owns its cache; origins and runtime lifetimes cannot share entries. */
|
|
3
|
-
export declare function createStadiumLoader(load: (path: string) => Promise<Response>): (name: string) => Promise<string>;
|
|
4
|
-
export declare const loadDefaultStadium: (name: string) => Promise<string>;
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
type Budget = 'message' | 'action' | 'chat';
|
|
2
|
-
/** Separate action budgets bound broadcast amplification during normal gameplay traffic. */
|
|
3
|
-
export declare class PeerTraffic {
|
|
4
|
-
private peers;
|
|
5
|
-
allow(id: string, kind: Budget, now?: number): boolean;
|
|
6
|
-
delete(id: string): void;
|
|
7
|
-
clear(): void;
|
|
8
|
-
}
|
|
9
|
-
export {};
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
/** Runtime disc fields in reference action order; -1 denotes the color array. */
|
|
2
|
-
export declare const DISC_PROPERTY_FIELDS: readonly [readonly ['x', 0, -8192, 8192], readonly ['y', 1, -8192, 8192], readonly ['xspeed', 2, -8192, 8192], readonly ['yspeed', 3, -8192, 8192], readonly ['xgravity', 8, -8192, 8192], readonly ['ygravity', 9, -8192, 8192], readonly ['radius', 4, 0.5, 100], readonly ['bCoeff', 7, -1, 8192], readonly ['invMass', 5, 0, 8192], readonly ['damping', 6, 0, 8192], readonly ['color', -1, -1, 16777215], readonly ['cMask', 11, -2147483648, 2147483647], readonly ['cGroup', 10, -2147483648, 2147483647]];
|
|
3
|
-
export type DiscProperty = (typeof DISC_PROPERTY_FIELDS)[number][0];
|
|
4
|
-
export type DiscProperties = Record<DiscProperty, number>;
|
|
5
|
-
export type DiscPropertyPatch = Partial<Record<DiscProperty, number | null>>;
|
|
6
|
-
/** Validate the entire update before any engine field can be changed. */
|
|
7
|
-
export declare function normalizeDiscProperties(properties: unknown): Partial<DiscProperties>;
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import type { MatchState } from './match-state.js';
|
|
2
|
-
import { type DiscPropertyPatch } from './disc-properties.js';
|
|
3
|
-
import { type Stadium } from './stadium.js';
|
|
4
|
-
export declare const HZ = 60, STRIDE = 18, SLOTS = 32, ENGINE_VERSION = "ball2d-core/1/3de72bdcf92ccb0d235a";
|
|
5
|
-
interface Exports extends WebAssembly.Exports {
|
|
6
|
-
memory: WebAssembly.Memory;
|
|
7
|
-
reset: () => void;
|
|
8
|
-
add_disc: () => number;
|
|
9
|
-
set_disc: (i: number, k: number, v: number) => void;
|
|
10
|
-
data_ptr: () => number;
|
|
11
|
-
count: () => number;
|
|
12
|
-
step: () => void;
|
|
13
|
-
wall: (...v: number[]) => void;
|
|
14
|
-
arc: (...v: number[]) => void;
|
|
15
|
-
plane: (...v: number[]) => void;
|
|
16
|
-
joint: (...v: number[]) => void;
|
|
17
|
-
configure: (...v: number[]) => void;
|
|
18
|
-
goal: (...v: number[]) => void;
|
|
19
|
-
physics_mode: (substeps: number) => void;
|
|
20
|
-
kick_limits: (...v: number[]) => void;
|
|
21
|
-
goal_event: () => number;
|
|
22
|
-
ball_kick_events: () => number;
|
|
23
|
-
}
|
|
24
|
-
export type { MatchState } from './match-state.js';
|
|
25
|
-
export declare class Engine {
|
|
26
|
-
core: Exports;
|
|
27
|
-
stadium: Stadium;
|
|
28
|
-
source: string;
|
|
29
|
-
colors: number[];
|
|
30
|
-
tick: number;
|
|
31
|
-
elapsed: number;
|
|
32
|
-
readonly ballKicks: number[];
|
|
33
|
-
red: number;
|
|
34
|
-
blue: number;
|
|
35
|
-
phase: MatchState['phase'];
|
|
36
|
-
paused: boolean;
|
|
37
|
-
resumeTicks: number;
|
|
38
|
-
countdown: number;
|
|
39
|
-
kickoff: 1 | 2;
|
|
40
|
-
kickoffActive: boolean;
|
|
41
|
-
scoreLimit: number;
|
|
42
|
-
timeLimit: number;
|
|
43
|
-
lastGoal: number;
|
|
44
|
-
kickRate: number;
|
|
45
|
-
setKickRateLimit(min: number, rate: number, burst: number): void;
|
|
46
|
-
constructor(instance: WebAssembly.Instance);
|
|
47
|
-
static create(bytes?: BufferSource, signal?: AbortSignal): Promise<Engine>;
|
|
48
|
-
get data(): Float64Array<ArrayBuffer>;
|
|
49
|
-
load(source: string): void;
|
|
50
|
-
private add;
|
|
51
|
-
index(slot: number): number;
|
|
52
|
-
joinPlayer(slot: number): void;
|
|
53
|
-
setTeam(slot: number, team: number): void;
|
|
54
|
-
input(slot: number, keys: number): void;
|
|
55
|
-
applyDiscProperties(index: number, properties: DiscPropertyPatch): boolean;
|
|
56
|
-
private restoreDiscProperties;
|
|
57
|
-
private spawn;
|
|
58
|
-
resetPositions(newMatch?: boolean): void;
|
|
59
|
-
start(): void;
|
|
60
|
-
stop(): void;
|
|
61
|
-
setPaused(paused: boolean): void;
|
|
62
|
-
private finish;
|
|
63
|
-
step(): void;
|
|
64
|
-
snapshot(): MatchState;
|
|
65
|
-
restore(s: MatchState): void;
|
|
66
|
-
}
|
|
67
|
-
export declare function crosses(a: number[], b: number[], c: number[], d: number[]): boolean;
|
|
68
|
-
export declare function packKickRate(min: number, rate: number, burst: number): number;
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { MatchState } from './engine.js';
|
|
2
|
-
export declare const PROTOCOL = 5, MAX_PACKET = 1200;
|
|
3
|
-
export declare function newer(a: number, b: number): boolean;
|
|
4
|
-
export declare function inputPacket(seq: number, keys: number, time: number, epoch?: number): ArrayBuffer;
|
|
5
|
-
export declare function readInput(b: ArrayBuffer): {
|
|
6
|
-
seq: number;
|
|
7
|
-
keys: number;
|
|
8
|
-
time: number;
|
|
9
|
-
epoch: number;
|
|
10
|
-
};
|
|
11
|
-
export declare function statePackets(state: MatchState, seq: number, epoch?: number): ArrayBuffer[];
|
|
12
|
-
export declare class StateAssembler {
|
|
13
|
-
epoch: number;
|
|
14
|
-
constructor(epoch?: number);
|
|
15
|
-
tick: number;
|
|
16
|
-
parts: Map<number, Uint8Array<ArrayBufferLike>>;
|
|
17
|
-
count: number;
|
|
18
|
-
complete: number;
|
|
19
|
-
reset(epoch?: number, floor?: number): void;
|
|
20
|
-
push(b: ArrayBuffer, baseline: MatchState): {
|
|
21
|
-
state: MatchState;
|
|
22
|
-
ack: number;
|
|
23
|
-
} | null;
|
|
24
|
-
}
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
export declare const MAX_REPLAY_BYTES: number;
|
|
2
|
-
/** B2DZ v1 envelope: magic, version/reserved, raw length, FNV checksum, raw DEFLATE. */
|
|
3
|
-
export declare function encodeReplayText(text: string): Uint8Array<ArrayBuffer>;
|
|
4
|
-
export declare function encodeReplayBytes(raw: Uint8Array): Uint8Array<ArrayBuffer>;
|
|
5
|
-
export declare function decodeReplayText(input: string | ArrayBuffer | Uint8Array): string;
|
|
6
|
-
export declare function decodeReplayBytes(input: string | ArrayBuffer | Uint8Array): Uint8Array;
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import type { Replay } from './replay.js';
|
|
2
|
-
/** B2DP v2 stores checkpoint discs as lossless float64 before delta-tick commands. */
|
|
3
|
-
export declare function encodeReplayDocument(replay: Replay): Uint8Array<ArrayBuffer>;
|
|
4
|
-
export declare function packReplayDocument(replay: Replay): Uint8Array<ArrayBuffer>;
|
|
5
|
-
export declare function decodeReplayDocument(input: string | ArrayBuffer | Uint8Array): Replay;
|
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { type TeamStyles } from './team-colors.js';
|
|
2
|
-
import { Engine, type MatchState } from './engine.js';
|
|
3
|
-
import type { ReplayCommand, Replay } from './replay-types.js';
|
|
4
|
-
export type { ReplayCommand, Replay } from './replay-types.js';
|
|
5
|
-
export declare function stateHash(state: MatchState): string;
|
|
6
|
-
export declare function applyCommand(engine: Engine, c: ReplayCommand): void;
|
|
7
|
-
export declare class Recorder {
|
|
8
|
-
replay: Replay;
|
|
9
|
-
private playerOrder;
|
|
10
|
-
private lastInputs;
|
|
11
|
-
private bytes;
|
|
12
|
-
private full;
|
|
13
|
-
canRecord(engine: Engine): boolean;
|
|
14
|
-
constructor(engine: Engine, players?: {
|
|
15
|
-
slot: number;
|
|
16
|
-
name: string;
|
|
17
|
-
avatar?: string | null;
|
|
18
|
-
}[], styles?: TeamStyles);
|
|
19
|
-
private reserve;
|
|
20
|
-
player(tick: number, slot: number, name: string | null, avatar?: string | null): boolean;
|
|
21
|
-
style(tick: number, teams: TeamStyles): boolean;
|
|
22
|
-
order(tick: number, slots: number[]): boolean;
|
|
23
|
-
command(c: ReplayCommand): boolean;
|
|
24
|
-
step(engine: Engine): void;
|
|
25
|
-
pack(engine: Engine): Uint8Array<ArrayBuffer>;
|
|
26
|
-
finish(engine: Engine): Blob;
|
|
27
|
-
}
|
|
28
|
-
export declare function readReplay(blob: Blob): Promise<Replay>;
|
|
29
|
-
export declare function parseReplay(input: string | ArrayBuffer | Uint8Array): Replay;
|
|
30
|
-
export declare class Playback {
|
|
31
|
-
engine: Engine;
|
|
32
|
-
replay: Replay;
|
|
33
|
-
cursor: number;
|
|
34
|
-
constructor(engine: Engine, replay: Replay);
|
|
35
|
-
teamStyles(): TeamStyles;
|
|
36
|
-
players(): {
|
|
37
|
-
id: string;
|
|
38
|
-
avatar: string | null;
|
|
39
|
-
slot: number;
|
|
40
|
-
name: string;
|
|
41
|
-
team: number;
|
|
42
|
-
admin: boolean;
|
|
43
|
-
}[];
|
|
44
|
-
private commands;
|
|
45
|
-
private final;
|
|
46
|
-
step(): boolean;
|
|
47
|
-
seek(tick: number): void;
|
|
48
|
-
}
|