omegga 1.4.0 → 1.5.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/.claude/settings.local.json +39 -0
- package/CHANGELOG.md +690 -0
- package/README.md +23 -2
- package/bin/omegga +1 -1
- package/dist/brickadia/server.js +1 -1
- package/dist/brickadia/server.js.map +1 -1
- package/dist/cli/terminal.js +47 -13
- package/dist/cli/terminal.js.map +1 -1
- package/dist/config/index.js +6 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/types.js +51 -0
- package/dist/config/types.js.map +1 -0
- package/dist/config/validator.js +8 -20
- package/dist/config/validator.js.map +1 -1
- package/dist/index.js +12 -6
- package/dist/index.js.map +1 -1
- package/dist/logger.js +38 -8
- package/dist/logger.js.map +1 -1
- package/dist/main.js +27 -1
- package/dist/main.js.map +1 -1
- package/dist/omegga/matchers/command.js +10 -0
- package/dist/omegga/matchers/command.js.map +1 -1
- package/dist/omegga/plugin/plugin_node_unsafe.js +6 -0
- package/dist/omegga/plugin/plugin_node_unsafe.js.map +1 -1
- package/dist/omegga/server.js +51 -5
- package/dist/omegga/server.js.map +1 -1
- package/dist/omegga/wrapper.js +1 -0
- package/dist/omegga/wrapper.js.map +1 -1
- package/dist/plugin.js +1 -2
- package/dist/plugin.js.map +1 -1
- package/dist/updater/steam.js +175 -68
- package/dist/updater/steam.js.map +1 -1
- package/dist/util/brick/checkBounds.js +1 -2
- package/dist/util/brick/checkBounds.js.map +1 -1
- package/dist/util/brick/displayName.js +1 -2
- package/dist/util/brick/displayName.js.map +1 -1
- package/dist/util/brick/getBounds.js +1 -2
- package/dist/util/brick/getBounds.js.map +1 -1
- package/dist/util/brick/getBrickSize.js +1 -2
- package/dist/util/brick/getBrickSize.js.map +1 -1
- package/dist/util/brick/getScaleAxis.js +1 -2
- package/dist/util/brick/getScaleAxis.js.map +1 -1
- package/dist/util/brick/setOwnership.js +1 -2
- package/dist/util/brick/setOwnership.js.map +1 -1
- package/dist/webserver/backend/database.js +5 -3
- package/dist/webserver/backend/database.js.map +1 -1
- package/dist/webserver/backend/events.js +7 -0
- package/dist/webserver/backend/events.js.map +1 -0
- package/dist/webserver/backend/index.js +64 -26
- package/dist/webserver/backend/index.js.map +1 -1
- package/dist/webserver/backend/metrics.js +122 -11
- package/dist/webserver/backend/metrics.js.map +1 -1
- package/dist/webserver/backend/router/chat.js +58 -0
- package/dist/webserver/backend/router/chat.js.map +1 -0
- package/dist/webserver/backend/router/index.js +23 -0
- package/dist/webserver/backend/router/index.js.map +1 -0
- package/dist/webserver/backend/router/player.js +248 -0
- package/dist/webserver/backend/router/player.js.map +1 -0
- package/dist/webserver/backend/router/plugin.js +150 -0
- package/dist/webserver/backend/router/plugin.js.map +1 -0
- package/dist/webserver/backend/router/role.js +17 -0
- package/dist/webserver/backend/router/role.js.map +1 -0
- package/dist/webserver/backend/router/server.js +181 -0
- package/dist/webserver/backend/router/server.js.map +1 -0
- package/dist/webserver/backend/router/session.js +33 -0
- package/dist/webserver/backend/router/session.js.map +1 -0
- package/dist/webserver/backend/router/user.js +93 -0
- package/dist/webserver/backend/router/user.js.map +1 -0
- package/dist/webserver/backend/router/world.js +139 -0
- package/dist/webserver/backend/router/world.js.map +1 -0
- package/dist/webserver/backend/trpc.js +48 -0
- package/dist/webserver/backend/trpc.js.map +1 -0
- package/dist/webserver/backend/util.js +18 -0
- package/dist/webserver/backend/util.js.map +1 -1
- package/package.json +10 -5
- package/public/app.html +122 -4
- package/public/assets/IconWorldPlus-Dkos72Ws.js +2 -0
- package/public/assets/IconWorldPlus-Dkos72Ws.js.map +1 -0
- package/public/assets/app-CLZ-5FIi.js +6 -0
- package/public/assets/app-CLZ-5FIi.js.map +1 -0
- package/public/assets/client-BT1QYH0O.js.map +1 -1
- package/public/assets/index-DLZ8-XzO.js +4 -0
- package/public/assets/index-DLZ8-XzO.js.map +1 -0
- package/public/assets/shared/@components-DPHARroA.js +2 -0
- package/public/assets/shared/@components-DPHARroA.js.map +1 -0
- package/public/assets/shared/@tabler_icons-react-iQk11eD_.js +3 -0
- package/public/assets/shared/{@tabler_icons-react-B4bN8gHc.js.map → @tabler_icons-react-iQk11eD_.js.map} +1 -1
- package/public/auth.html +13 -1
- package/dist/info/default_commands.json.js +0 -39
- package/dist/info/default_commands.json.js.map +0 -1
- package/dist/webserver/backend/api.js +0 -797
- package/dist/webserver/backend/api.js.map +0 -1
- package/public/assets/IconWorldPlus-DpfueG8_.js +0 -2
- package/public/assets/IconWorldPlus-DpfueG8_.js.map +0 -1
- package/public/assets/app-nJIpyOiP.js +0 -6
- package/public/assets/app-nJIpyOiP.js.map +0 -1
- package/public/assets/index-3dNmNZ9B.js +0 -10
- package/public/assets/index-3dNmNZ9B.js.map +0 -1
- package/public/assets/shared/@components-DdtLZOaA.js +0 -2
- package/public/assets/shared/@components-DdtLZOaA.js.map +0 -1
- package/public/assets/shared/@tabler_icons-react-B4bN8gHc.js +0 -3
package/dist/updater/steam.js
CHANGED
|
@@ -3,22 +3,89 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const logger = require("../logger.js");
|
|
4
4
|
const softconfig = require("../softconfig.js");
|
|
5
5
|
const node_child_process = require("node:child_process");
|
|
6
|
-
const fs = require("node:fs");
|
|
7
6
|
const path = require("node:path");
|
|
7
|
+
const prompts = require("prompts");
|
|
8
8
|
const acfParser = require("steam-acf2json");
|
|
9
|
+
const STEAM_APP_STATES = {
|
|
10
|
+
1: "Uninstalled",
|
|
11
|
+
2: "Update Required",
|
|
12
|
+
4: "Fully Installed",
|
|
13
|
+
8: "Encrypted",
|
|
14
|
+
16: "Locked",
|
|
15
|
+
32: "Files Missing",
|
|
16
|
+
64: "App Running",
|
|
17
|
+
128: "Files Corrupt",
|
|
18
|
+
256: "Update Running",
|
|
19
|
+
512: "Update Paused",
|
|
20
|
+
1024: "Update Started",
|
|
21
|
+
2048: "Uninstalling",
|
|
22
|
+
4096: "Backup Running",
|
|
23
|
+
65536: "Reconfiguring",
|
|
24
|
+
131072: "Validating",
|
|
25
|
+
262144: "Adding Files",
|
|
26
|
+
524288: "Preallocating",
|
|
27
|
+
1048576: "Downloading",
|
|
28
|
+
2097152: "Staging",
|
|
29
|
+
4194304: "Committing",
|
|
30
|
+
8388608: "Update Stopping"
|
|
31
|
+
};
|
|
32
|
+
function decodeAppState(state) {
|
|
33
|
+
const flags = [];
|
|
34
|
+
for (const [bit, name] of Object.entries(STEAM_APP_STATES)) {
|
|
35
|
+
if (state & Number(bit)) flags.push(name);
|
|
36
|
+
}
|
|
37
|
+
return flags;
|
|
38
|
+
}
|
|
9
39
|
function steamcmdDownloadSelf() {
|
|
10
40
|
node_child_process.execSync(path.join(__dirname, "../../tools/install_steamcmd.sh"), {
|
|
11
41
|
stdio: "inherit"
|
|
12
42
|
});
|
|
13
43
|
}
|
|
14
|
-
function
|
|
44
|
+
async function steamcmdInteractiveLogin() {
|
|
45
|
+
if (!process.env.STEAM_USERNAME) {
|
|
46
|
+
logger.default.error("STEAM_USERNAME environment variable is required.");
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
const password = process.env.STEAM_PASSWORD ?? (await prompts({
|
|
50
|
+
type: "password",
|
|
51
|
+
name: "value",
|
|
52
|
+
message: `Steam password for ${process.env.STEAM_USERNAME}`
|
|
53
|
+
})).value;
|
|
54
|
+
if (!password) {
|
|
55
|
+
logger.default.error("No password provided.");
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
const result = node_child_process.spawnSync(
|
|
59
|
+
softconfig.STEAMCMD_PATH,
|
|
60
|
+
["+login", process.env.STEAM_USERNAME, password, "+quit"],
|
|
61
|
+
{ stdio: "inherit" }
|
|
62
|
+
);
|
|
63
|
+
return result.status === 0;
|
|
64
|
+
}
|
|
65
|
+
function handleSteamError(err) {
|
|
66
|
+
if (err instanceof Error && err.message) {
|
|
67
|
+
const stateMatch = err.message.match(
|
|
68
|
+
/state is (0x[0-9A-Fa-f]+) after update job/
|
|
69
|
+
);
|
|
70
|
+
if (stateMatch) {
|
|
71
|
+
const state = parseInt(stateMatch[1], 16);
|
|
72
|
+
const flags = decodeAppState(state);
|
|
73
|
+
logger.default.error(
|
|
74
|
+
`Steam app state ${stateMatch[1]} (${state}):`,
|
|
75
|
+
flags.length > 0 ? flags.join(", ") : "Unknown"
|
|
76
|
+
);
|
|
77
|
+
}
|
|
78
|
+
err.message = err.message.replace(/\+login\s+"[^"]*"\s+"[^"]*"/, "+login <REDACTED>").replace(/\+login\s+(\S+)\s+\S+/, "+login $1 <REDACTED>").replace(/-betapassword\s+\S+/, "-betapassword <REDACTED>");
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
async function steamcmdDownloadGame({
|
|
15
82
|
steambeta,
|
|
16
83
|
steambetaPassword
|
|
17
84
|
} = {}) {
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
85
|
+
const hasCredentials = !!process.env.STEAM_USERNAME;
|
|
86
|
+
const steamLogin = hasCredentials ? `"${process.env.STEAM_USERNAME}"` : "anonymous";
|
|
87
|
+
if (hasCredentials) {
|
|
88
|
+
logger.default.verbose("Using cached Steam credentials for download.");
|
|
22
89
|
}
|
|
23
90
|
const installDir = softconfig.getSteamInstallDir();
|
|
24
91
|
const appId = softconfig.getAppId();
|
|
@@ -32,70 +99,110 @@ function steamcmdDownloadGame({
|
|
|
32
99
|
steambeta && steambetaPassword ? `-betapassword ${steambetaPassword}` : null,
|
|
33
100
|
"+quit"
|
|
34
101
|
].filter(Boolean);
|
|
35
|
-
|
|
36
|
-
}
|
|
37
|
-
async function fetchSteamInfo() {
|
|
38
|
-
const appId = softconfig.getAppId();
|
|
39
|
-
const res = await fetch("https://api.steamcmd.net/v1/info/" + appId);
|
|
40
|
-
const json = await res.json();
|
|
41
|
-
return json;
|
|
42
|
-
}
|
|
43
|
-
function getSteamAcf(steambeta) {
|
|
44
|
-
const appId = softconfig.getAppId();
|
|
45
|
-
const installDir = path.join(softconfig.getSteamInstallDir(), steambeta ?? "main");
|
|
46
|
-
const acfPath = path.join(
|
|
47
|
-
installDir,
|
|
48
|
-
"steamapps",
|
|
49
|
-
`appmanifest_${appId}.acf`
|
|
50
|
-
);
|
|
51
|
-
if (!fs.existsSync(acfPath)) {
|
|
52
|
-
logger.default.verbose(`File not found: ${acfPath}`);
|
|
53
|
-
return null;
|
|
54
|
-
}
|
|
102
|
+
const cmd = `${softconfig.STEAMCMD_PATH} ${args.join(" ")}`;
|
|
55
103
|
try {
|
|
56
|
-
|
|
57
|
-
const json = acfParser.decode(plaintext);
|
|
58
|
-
return json;
|
|
104
|
+
node_child_process.execSync(cmd, { stdio: "inherit" });
|
|
59
105
|
} catch (err) {
|
|
60
|
-
|
|
61
|
-
|
|
106
|
+
if (hasCredentials && err instanceof Error && "status" in err && err.status === 5) {
|
|
107
|
+
logger.default.warnp(
|
|
108
|
+
"Steam login failed — this may require Steam Guard authentication."
|
|
109
|
+
);
|
|
110
|
+
logger.default.warnp("Attempting interactive login...");
|
|
111
|
+
if (await steamcmdInteractiveLogin()) {
|
|
112
|
+
logger.default.logp("Login successful. Retrying download...");
|
|
113
|
+
try {
|
|
114
|
+
node_child_process.execSync(cmd, { stdio: "inherit" });
|
|
115
|
+
return;
|
|
116
|
+
} catch (retryErr) {
|
|
117
|
+
handleSteamError(retryErr);
|
|
118
|
+
throw retryErr;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
logger.default.errorp(
|
|
122
|
+
"Interactive login failed. Run",
|
|
123
|
+
"omegga steamlogin".yellow,
|
|
124
|
+
"to authenticate manually."
|
|
125
|
+
);
|
|
126
|
+
}
|
|
127
|
+
handleSteamError(err);
|
|
128
|
+
throw err;
|
|
62
129
|
}
|
|
63
130
|
}
|
|
64
|
-
function
|
|
65
|
-
|
|
66
|
-
const depot = info.data[appId]?.depots?.branches?.[!branch || branch === "main" ? "public" : branch];
|
|
67
|
-
if (!depot || typeof depot !== "object" || !("buildid" in depot) || !("timeupdated" in depot))
|
|
68
|
-
return null;
|
|
69
|
-
return {
|
|
70
|
-
buildId: depot.buildid,
|
|
71
|
-
timeUpdated: Number(depot.timeupdated)
|
|
72
|
-
};
|
|
131
|
+
function stripAnsi(s) {
|
|
132
|
+
return s.replace(/\x1b\[[0-9;]*m/g, "");
|
|
73
133
|
}
|
|
74
|
-
function
|
|
75
|
-
const
|
|
76
|
-
const
|
|
77
|
-
|
|
78
|
-
|
|
134
|
+
function parseAppStatus(output) {
|
|
135
|
+
const clean = stripAnsi(output);
|
|
136
|
+
const buildMatch = clean.match(/BuildID\s+(\d+)/);
|
|
137
|
+
const stateMatch = clean.match(/install state:\s*(.+)/i);
|
|
138
|
+
const betaMatch = clean.match(/"BetaKey"\s+"([^"]+)"/);
|
|
139
|
+
const updateMatch = clean.match(/update state:\s*(.+)/i);
|
|
140
|
+
if (!buildMatch) return null;
|
|
79
141
|
return {
|
|
80
|
-
|
|
81
|
-
|
|
142
|
+
installState: stateMatch?.[1]?.trim().replace(/,$/, "") ?? "Unknown",
|
|
143
|
+
buildId: buildMatch[1],
|
|
144
|
+
betaKey: betaMatch?.[1] ?? null,
|
|
145
|
+
updateState: updateMatch?.[1]?.trim() ?? "Unknown"
|
|
82
146
|
};
|
|
83
147
|
}
|
|
84
|
-
function
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
return
|
|
148
|
+
function parseAppInfo(output, appId) {
|
|
149
|
+
const clean = stripAnsi(output);
|
|
150
|
+
const vdfStart = clean.indexOf(`"${appId}"`);
|
|
151
|
+
if (vdfStart === -1) return null;
|
|
152
|
+
const braceStart = clean.indexOf("{", vdfStart);
|
|
153
|
+
if (braceStart === -1) return null;
|
|
154
|
+
let depth = 0;
|
|
155
|
+
let braceEnd = -1;
|
|
156
|
+
for (let i = braceStart; i < clean.length; i++) {
|
|
157
|
+
if (clean[i] === "{") depth++;
|
|
158
|
+
if (clean[i] === "}") depth--;
|
|
159
|
+
if (depth === 0) {
|
|
160
|
+
braceEnd = i;
|
|
161
|
+
break;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
if (braceEnd === -1) return null;
|
|
165
|
+
try {
|
|
166
|
+
const vdf = `"${appId}"
|
|
167
|
+
${clean.slice(braceStart, braceEnd + 1)}
|
|
168
|
+
`;
|
|
169
|
+
const parsed = acfParser.decode(vdf);
|
|
170
|
+
const branches = parsed?.[appId]?.depots?.branches;
|
|
171
|
+
if (!branches || typeof branches !== "object") return null;
|
|
172
|
+
return { branches };
|
|
173
|
+
} catch {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
90
176
|
}
|
|
91
|
-
|
|
92
|
-
const
|
|
93
|
-
|
|
177
|
+
function steamcmdCheckUpdate(steambeta) {
|
|
178
|
+
const appId = softconfig.getAppId();
|
|
179
|
+
const installDir = path.join(softconfig.getSteamInstallDir(), steambeta ?? "main");
|
|
180
|
+
const steamLogin = process.env.STEAM_USERNAME ? `"${process.env.STEAM_USERNAME}"` : "anonymous";
|
|
181
|
+
try {
|
|
182
|
+
const output = node_child_process.execSync(
|
|
183
|
+
[
|
|
184
|
+
softconfig.STEAMCMD_PATH,
|
|
185
|
+
`+force_install_dir ${installDir}`,
|
|
186
|
+
`+login ${steamLogin}`,
|
|
187
|
+
"+app_info_update 1",
|
|
188
|
+
`+app_info_print ${appId}`,
|
|
189
|
+
`+app_status ${appId}`,
|
|
190
|
+
"+quit"
|
|
191
|
+
].join(" "),
|
|
192
|
+
{ encoding: "utf-8", stdio: ["inherit", "pipe", "pipe"], timeout: 3e4 }
|
|
193
|
+
);
|
|
194
|
+
const local = parseAppStatus(output);
|
|
195
|
+
if (!local) return null;
|
|
196
|
+
const remote = parseAppInfo(output, appId);
|
|
197
|
+
const branch = steambeta ?? (local.betaKey || null);
|
|
198
|
+
const remoteBranch = branch && branch !== "main" ? branch : "public";
|
|
199
|
+
const remoteBuildId = remote?.branches?.[remoteBranch]?.buildid;
|
|
200
|
+
const hasUpdate = remoteBuildId != null ? remoteBuildId !== local.buildId : null;
|
|
201
|
+
return { local, remote, hasUpdate };
|
|
202
|
+
} catch (err) {
|
|
203
|
+
logger.default.verbose("Failed to check for Steam update via steamcmd:", err);
|
|
94
204
|
return null;
|
|
95
205
|
}
|
|
96
|
-
const depot = getSteamDepot(info, steambeta);
|
|
97
|
-
if (!depot) return null;
|
|
98
|
-
return depot;
|
|
99
206
|
}
|
|
100
207
|
let lastUpdateCheck = 0;
|
|
101
208
|
let lastUpdateAvailable = 0;
|
|
@@ -110,20 +217,20 @@ const clearLastSteamUpdateCheck = () => {
|
|
|
110
217
|
};
|
|
111
218
|
async function hasSteamUpdate(steambeta) {
|
|
112
219
|
lastUpdateCheck = Date.now();
|
|
113
|
-
const
|
|
114
|
-
if (!
|
|
115
|
-
const remoteDepot = await getRemoteSteamDepot(steambeta);
|
|
116
|
-
if (!remoteDepot) return false;
|
|
220
|
+
const check = steamcmdCheckUpdate(steambeta);
|
|
221
|
+
if (!check) return false;
|
|
117
222
|
lastUpdateAvailable = Date.now();
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
223
|
+
if (check.hasUpdate != null) {
|
|
224
|
+
lastUpdateResult = check.hasUpdate;
|
|
225
|
+
return check.hasUpdate;
|
|
226
|
+
}
|
|
227
|
+
return false;
|
|
121
228
|
}
|
|
122
229
|
exports.clearLastSteamUpdateCheck = clearLastSteamUpdateCheck;
|
|
123
230
|
exports.getLastSteamUpdateCheck = getLastSteamUpdateCheck;
|
|
124
|
-
exports.getLocalSteamDepot = getLocalSteamDepot;
|
|
125
|
-
exports.getRemoteSteamDepot = getRemoteSteamDepot;
|
|
126
231
|
exports.hasSteamUpdate = hasSteamUpdate;
|
|
232
|
+
exports.steamcmdCheckUpdate = steamcmdCheckUpdate;
|
|
127
233
|
exports.steamcmdDownloadGame = steamcmdDownloadGame;
|
|
128
234
|
exports.steamcmdDownloadSelf = steamcmdDownloadSelf;
|
|
235
|
+
exports.steamcmdInteractiveLogin = steamcmdInteractiveLogin;
|
|
129
236
|
//# sourceMappingURL=steam.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"steam.js","sources":["../../src/updater/steam.ts"],"sourcesContent":["import Logger from '@/logger';\nimport { getAppId, getSteamInstallDir, STEAMCMD_PATH } from '@/softconfig';\nimport { execSync } from 'node:child_process';\nimport { existsSync, readFileSync } from 'node:fs';\nimport path from 'node:path';\nimport acfParser from 'steam-acf2json';\n\nexport function steamcmdDownloadSelf() {\n execSync(path.join(__dirname, '../../tools/install_steamcmd.sh'), {\n stdio: 'inherit',\n });\n}\n\nexport function steamcmdDownloadGame({\n steambeta,\n steambetaPassword,\n}: {\n steambeta?: string;\n steambetaPassword?: string;\n} = {}) {\n let steamLogin = 'anonymous';\n if (process.env.STEAM_USERNAME && process.env.STEAM_PASSWORD) {\n Logger.verbose('Using provided Steam credentials for download.');\n steamLogin = `\"${process.env.STEAM_USERNAME}\" \"${process.env.STEAM_PASSWORD}\"`;\n }\n const installDir = getSteamInstallDir();\n const appId = getAppId();\n\n Logger.verbose('Using with steam install dir:', installDir.yellow);\n Logger.verbose('Using with app ID:', appId.yellow);\n\n const args = [\n `+force_install_dir ${path.join(installDir, steambeta ?? 'main')}`,\n `+login ${steamLogin}`,\n `+app_update ${appId}`,\n steambeta ? `-beta ${steambeta}` : null,\n steambeta && steambetaPassword\n ? `-betapassword ${steambetaPassword}`\n : null,\n '+quit',\n ].filter(Boolean);\n\n execSync(`${STEAMCMD_PATH} ${args.join(' ')}`, { stdio: 'inherit' });\n}\n\nexport type SteamInfo = {\n data: Record<\n string,\n {\n _change_number: number;\n _missing_token: boolean;\n _sha: string;\n _size: number;\n appid: number;\n common: unknown;\n config: unknown;\n depots: Record<\n string,\n {\n config: { oslist: 'linux' | 'windows' | 'macos' };\n }\n > & {\n branches: Record<\n string,\n {\n buildid: string;\n timeupdated: string;\n description?: string;\n }\n >;\n privatebranches: '1';\n };\n }\n >;\n status: 'success';\n};\n\nasync function fetchSteamInfo() {\n const appId = getAppId();\n const res = await fetch('https://api.steamcmd.net/v1/info/' + appId);\n const json = await res.json();\n return json as SteamInfo;\n}\n\nexport type SteamAcf = {\n AppState: {\n appid: string;\n buildid: string;\n lastupdated: string;\n };\n};\n\nfunction getSteamAcf(steambeta?: string) {\n const appId = getAppId();\n const installDir = path.join(getSteamInstallDir(), steambeta ?? 'main');\n const acfPath = path.join(\n installDir,\n 'steamapps',\n `appmanifest_${appId}.acf`,\n );\n if (!existsSync(acfPath)) {\n Logger.verbose(`File not found: ${acfPath}`);\n return null;\n }\n try {\n const plaintext = readFileSync(acfPath, 'utf-8');\n const json = acfParser.decode(plaintext);\n return json as SteamAcf;\n } catch (err) {\n Logger.error(`Error parsing ACF file ${acfPath}:`, err);\n return null;\n }\n}\n\nfunction getSteamDepot(info: SteamInfo, branch?: string) {\n const appId = getAppId();\n const depot =\n info.data[appId]?.depots?.branches?.[\n !branch || branch === 'main' ? 'public' : branch\n ];\n if (\n !depot ||\n typeof depot !== 'object' ||\n !('buildid' in depot) ||\n !('timeupdated' in depot)\n )\n return null;\n return {\n buildId: depot.buildid,\n timeUpdated: Number(depot.timeupdated),\n };\n}\n\nfunction getSteamAcfDepot(acf: SteamAcf) {\n const appId = getAppId();\n const appState = acf.AppState;\n if (\n !appState ||\n typeof appState !== 'object' ||\n appState.appid !== appId ||\n !('buildid' in appState) ||\n !('lastupdated' in appState)\n )\n return null;\n return {\n buildId: appState.buildid,\n timeUpdated: Number(appState.lastupdated),\n };\n}\n\nexport function getLocalSteamDepot(steambeta?: string) {\n const acf = getSteamAcf(steambeta);\n if (!acf) return null;\n const depot = getSteamAcfDepot(acf);\n if (!depot) return null;\n return depot;\n}\n\nexport async function getRemoteSteamDepot(steambeta?: string) {\n const info = await fetchSteamInfo();\n if (!info || !info.data) {\n return null;\n }\n const depot = getSteamDepot(info, steambeta);\n if (!depot) return null;\n return depot;\n}\n\nlet lastUpdateCheck = 0;\nlet lastUpdateAvailable = 0;\nlet lastUpdateResult = false;\n\nexport const getLastSteamUpdateCheck = () => ({\n attempt: lastUpdateCheck,\n available: lastUpdateAvailable,\n result: lastUpdateResult,\n});\n\nexport const clearLastSteamUpdateCheck = () => {\n lastUpdateResult = false;\n};\n\nexport async function hasSteamUpdate(steambeta?: string) {\n lastUpdateCheck = Date.now();\n const localDepot = getLocalSteamDepot(steambeta);\n if (!localDepot) return false;\n\n const remoteDepot = await getRemoteSteamDepot(steambeta);\n if (!remoteDepot) return false;\n\n lastUpdateAvailable = Date.now();\n const res =\n localDepot.buildId !== remoteDepot.buildId ||\n localDepot.timeUpdated < remoteDepot.timeUpdated;\n lastUpdateResult = res;\n\n return res;\n}\n"],"names":["execSync","Logger","getSteamInstallDir","getAppId","STEAMCMD_PATH","existsSync","readFileSync"],"mappings":";;;;;;;;AAOO,SAAS,uBAAuB;AACrCA,qBAAAA,SAAS,KAAK,KAAK,WAAW,iCAAiC,GAAG;AAAA,IAChE,OAAO;AAAA,EAAA,CACR;AACH;AAEO,SAAS,qBAAqB;AAAA,EACnC;AAAA,EACA;AACF,IAGI,IAAI;AACN,MAAI,aAAa;AACjB,MAAI,QAAQ,IAAI,kBAAkB,QAAQ,IAAI,gBAAgB;AAC5DC,WAAAA,QAAO,QAAQ,gDAAgD;AAC/D,iBAAa,IAAI,QAAQ,IAAI,cAAc,MAAM,QAAQ,IAAI,cAAc;AAAA,EAC7E;AACA,QAAM,aAAaC,WAAAA,mBAAA;AACnB,QAAM,QAAQC,WAAAA,SAAA;AAEdF,SAAAA,QAAO,QAAQ,iCAAiC,WAAW,MAAM;AACjEA,SAAAA,QAAO,QAAQ,sBAAsB,MAAM,MAAM;AAEjD,QAAM,OAAO;AAAA,IACX,sBAAsB,KAAK,KAAK,YAAY,aAAa,MAAM,CAAC;AAAA,IAChE,UAAU,UAAU;AAAA,IACpB,eAAe,KAAK;AAAA,IACpB,YAAY,SAAS,SAAS,KAAK;AAAA,IACnC,aAAa,oBACT,iBAAiB,iBAAiB,KAClC;AAAA,IACJ;AAAA,EAAA,EACA,OAAO,OAAO;AAEhBD,qBAAAA,SAAS,GAAGI,wBAAa,IAAI,KAAK,KAAK,GAAG,CAAC,IAAI,EAAE,OAAO,UAAA,CAAW;AACrE;AAkCA,eAAe,iBAAiB;AAC9B,QAAM,QAAQD,WAAAA,SAAA;AACd,QAAM,MAAM,MAAM,MAAM,sCAAsC,KAAK;AACnE,QAAM,OAAO,MAAM,IAAI,KAAA;AACvB,SAAO;AACT;AAUA,SAAS,YAAY,WAAoB;AACvC,QAAM,QAAQA,WAAAA,SAAA;AACd,QAAM,aAAa,KAAK,KAAKD,WAAAA,mBAAA,GAAsB,aAAa,MAAM;AACtE,QAAM,UAAU,KAAK;AAAA,IACnB;AAAA,IACA;AAAA,IACA,eAAe,KAAK;AAAA,EAAA;AAEtB,MAAI,CAACG,GAAAA,WAAW,OAAO,GAAG;AACxBJ,WAAAA,QAAO,QAAQ,mBAAmB,OAAO,EAAE;AAC3C,WAAO;AAAA,EACT;AACA,MAAI;AACF,UAAM,YAAYK,GAAAA,aAAa,SAAS,OAAO;AAC/C,UAAM,OAAO,UAAU,OAAO,SAAS;AACvC,WAAO;AAAA,EACT,SAAS,KAAK;AACZL,WAAAA,QAAO,MAAM,0BAA0B,OAAO,KAAK,GAAG;AACtD,WAAO;AAAA,EACT;AACF;AAEA,SAAS,cAAc,MAAiB,QAAiB;AACvD,QAAM,QAAQE,WAAAA,SAAA;AACd,QAAM,QACJ,KAAK,KAAK,KAAK,GAAG,QAAQ,WACxB,CAAC,UAAU,WAAW,SAAS,WAAW,MAC5C;AACF,MACE,CAAC,SACD,OAAO,UAAU,YACjB,EAAE,aAAa,UACf,EAAE,iBAAiB;AAEnB,WAAO;AACT,SAAO;AAAA,IACL,SAAS,MAAM;AAAA,IACf,aAAa,OAAO,MAAM,WAAW;AAAA,EAAA;AAEzC;AAEA,SAAS,iBAAiB,KAAe;AACvC,QAAM,QAAQA,WAAAA,SAAA;AACd,QAAM,WAAW,IAAI;AACrB,MACE,CAAC,YACD,OAAO,aAAa,YACpB,SAAS,UAAU,SACnB,EAAE,aAAa,aACf,EAAE,iBAAiB;AAEnB,WAAO;AACT,SAAO;AAAA,IACL,SAAS,SAAS;AAAA,IAClB,aAAa,OAAO,SAAS,WAAW;AAAA,EAAA;AAE5C;AAEO,SAAS,mBAAmB,WAAoB;AACrD,QAAM,MAAM,YAAY,SAAS;AACjC,MAAI,CAAC,IAAK,QAAO;AACjB,QAAM,QAAQ,iBAAiB,GAAG;AAClC,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO;AACT;AAEA,eAAsB,oBAAoB,WAAoB;AAC5D,QAAM,OAAO,MAAM,eAAA;AACnB,MAAI,CAAC,QAAQ,CAAC,KAAK,MAAM;AACvB,WAAO;AAAA,EACT;AACA,QAAM,QAAQ,cAAc,MAAM,SAAS;AAC3C,MAAI,CAAC,MAAO,QAAO;AACnB,SAAO;AACT;AAEA,IAAI,kBAAkB;AACtB,IAAI,sBAAsB;AAC1B,IAAI,mBAAmB;AAEhB,MAAM,0BAA0B,OAAO;AAAA,EAC5C,SAAS;AAAA,EACT,WAAW;AAAA,EACX,QAAQ;AACV;AAEO,MAAM,4BAA4B,MAAM;AAC7C,qBAAmB;AACrB;AAEA,eAAsB,eAAe,WAAoB;AACvD,oBAAkB,KAAK,IAAA;AACvB,QAAM,aAAa,mBAAmB,SAAS;AAC/C,MAAI,CAAC,WAAY,QAAO;AAExB,QAAM,cAAc,MAAM,oBAAoB,SAAS;AACvD,MAAI,CAAC,YAAa,QAAO;AAEzB,wBAAsB,KAAK,IAAA;AAC3B,QAAM,MACJ,WAAW,YAAY,YAAY,WACnC,WAAW,cAAc,YAAY;AACvC,qBAAmB;AAEnB,SAAO;AACT;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"steam.js","sources":["../../src/updater/steam.ts"],"sourcesContent":["import Logger from '@/logger';\nimport { getAppId, getSteamInstallDir, STEAMCMD_PATH } from '@/softconfig';\nimport { execSync, spawnSync } from 'node:child_process';\nimport path from 'node:path';\nimport prompts from 'prompts';\nimport acfParser from 'steam-acf2json';\n\n// Steam EAppState flags (bitmask)\nconst STEAM_APP_STATES: Record<number, string> = {\n 0x1: 'Uninstalled',\n 0x2: 'Update Required',\n 0x4: 'Fully Installed',\n 0x8: 'Encrypted',\n 0x10: 'Locked',\n 0x20: 'Files Missing',\n 0x40: 'App Running',\n 0x80: 'Files Corrupt',\n 0x100: 'Update Running',\n 0x200: 'Update Paused',\n 0x400: 'Update Started',\n 0x800: 'Uninstalling',\n 0x1000: 'Backup Running',\n 0x10000: 'Reconfiguring',\n 0x20000: 'Validating',\n 0x40000: 'Adding Files',\n 0x80000: 'Preallocating',\n 0x100000: 'Downloading',\n 0x200000: 'Staging',\n 0x400000: 'Committing',\n 0x800000: 'Update Stopping',\n};\n\nfunction decodeAppState(state: number): string[] {\n const flags: string[] = [];\n for (const [bit, name] of Object.entries(STEAM_APP_STATES)) {\n if (state & Number(bit)) flags.push(name);\n }\n return flags;\n}\n\nexport function steamcmdDownloadSelf() {\n execSync(path.join(__dirname, '../../tools/install_steamcmd.sh'), {\n stdio: 'inherit',\n });\n}\n\nexport async function steamcmdInteractiveLogin(): Promise<boolean> {\n if (!process.env.STEAM_USERNAME) {\n Logger.error('STEAM_USERNAME environment variable is required.');\n return false;\n }\n\n const password =\n process.env.STEAM_PASSWORD ??\n (\n await prompts({\n type: 'password',\n name: 'value',\n message: `Steam password for ${process.env.STEAM_USERNAME}`,\n })\n ).value;\n\n if (!password) {\n Logger.error('No password provided.');\n return false;\n }\n\n const result = spawnSync(\n STEAMCMD_PATH,\n ['+login', process.env.STEAM_USERNAME, password, '+quit'],\n { stdio: 'inherit' },\n );\n\n return result.status === 0;\n}\n\nfunction handleSteamError(err: unknown) {\n if (err instanceof Error && err.message) {\n const stateMatch = err.message.match(\n /state is (0x[0-9A-Fa-f]+) after update job/,\n );\n if (stateMatch) {\n const state = parseInt(stateMatch[1], 16);\n const flags = decodeAppState(state);\n Logger.error(\n `Steam app state ${stateMatch[1]} (${state}):`,\n flags.length > 0 ? flags.join(', ') : 'Unknown',\n );\n }\n\n err.message = err.message\n .replace(/\\+login\\s+\"[^\"]*\"\\s+\"[^\"]*\"/, '+login <REDACTED>')\n .replace(/\\+login\\s+(\\S+)\\s+\\S+/, '+login $1 <REDACTED>')\n .replace(/-betapassword\\s+\\S+/, '-betapassword <REDACTED>');\n }\n}\n\nexport async function steamcmdDownloadGame({\n steambeta,\n steambetaPassword,\n}: {\n steambeta?: string;\n steambetaPassword?: string;\n} = {}) {\n const hasCredentials = !!process.env.STEAM_USERNAME;\n const steamLogin = hasCredentials\n ? `\"${process.env.STEAM_USERNAME}\"`\n : 'anonymous';\n if (hasCredentials) {\n Logger.verbose('Using cached Steam credentials for download.');\n }\n const installDir = getSteamInstallDir();\n const appId = getAppId();\n\n Logger.verbose('Using with steam install dir:', installDir.yellow);\n Logger.verbose('Using with app ID:', appId.yellow);\n\n const args = [\n `+force_install_dir ${path.join(installDir, steambeta ?? 'main')}`,\n `+login ${steamLogin}`,\n `+app_update ${appId}`,\n steambeta ? `-beta ${steambeta}` : null,\n steambeta && steambetaPassword\n ? `-betapassword ${steambetaPassword}`\n : null,\n '+quit',\n ].filter(Boolean);\n\n const cmd = `${STEAMCMD_PATH} ${args.join(' ')}`;\n\n try {\n execSync(cmd, { stdio: 'inherit' });\n } catch (err) {\n if (\n hasCredentials &&\n err instanceof Error &&\n 'status' in err &&\n (err as NodeJS.ErrnoException & { status: number }).status === 5\n ) {\n Logger.warnp(\n 'Steam login failed — this may require Steam Guard authentication.',\n );\n Logger.warnp('Attempting interactive login...');\n\n if (await steamcmdInteractiveLogin()) {\n Logger.logp('Login successful. Retrying download...');\n try {\n execSync(cmd, { stdio: 'inherit' });\n return;\n } catch (retryErr) {\n handleSteamError(retryErr);\n throw retryErr;\n }\n }\n\n Logger.errorp(\n 'Interactive login failed. Run',\n 'omegga steamlogin'.yellow,\n 'to authenticate manually.',\n );\n }\n\n handleSteamError(err);\n throw err;\n }\n}\n\nexport type SteamAppStatus = {\n installState: string;\n buildId: string;\n betaKey: string | null;\n updateState: string;\n};\n\nexport type SteamAppInfo = {\n branches: Record<string, { buildid: string; timeupdated?: string }>;\n};\n\nfunction stripAnsi(s: string): string {\n return s.replace(/\\x1b\\[[0-9;]*m/g, '');\n}\n\nfunction parseAppStatus(output: string): SteamAppStatus | null {\n const clean = stripAnsi(output);\n const buildMatch = clean.match(/BuildID\\s+(\\d+)/);\n const stateMatch = clean.match(/install state:\\s*(.+)/i);\n const betaMatch = clean.match(/\"BetaKey\"\\s+\"([^\"]+)\"/);\n const updateMatch = clean.match(/update state:\\s*(.+)/i);\n if (!buildMatch) return null;\n return {\n installState: stateMatch?.[1]?.trim().replace(/,$/, '') ?? 'Unknown',\n buildId: buildMatch[1],\n betaKey: betaMatch?.[1] ?? null,\n updateState: updateMatch?.[1]?.trim() ?? 'Unknown',\n };\n}\n\nfunction parseAppInfo(output: string, appId: string): SteamAppInfo | null {\n const clean = stripAnsi(output);\n const vdfStart = clean.indexOf(`\"${appId}\"`);\n if (vdfStart === -1) return null;\n\n const braceStart = clean.indexOf('{', vdfStart);\n if (braceStart === -1) return null;\n\n let depth = 0;\n let braceEnd = -1;\n for (let i = braceStart; i < clean.length; i++) {\n if (clean[i] === '{') depth++;\n if (clean[i] === '}') depth--;\n if (depth === 0) {\n braceEnd = i;\n break;\n }\n }\n if (braceEnd === -1) return null;\n\n try {\n const vdf = `\"${appId}\"\\n${clean.slice(braceStart, braceEnd + 1)}\\n`;\n const parsed = acfParser.decode(vdf);\n const branches = parsed?.[appId]?.depots?.branches;\n if (!branches || typeof branches !== 'object') return null;\n return { branches };\n } catch {\n return null;\n }\n}\n\nexport type SteamUpdateCheck = {\n local: SteamAppStatus;\n remote: SteamAppInfo | null;\n hasUpdate: boolean | null;\n};\n\nexport function steamcmdCheckUpdate(\n steambeta?: string,\n): SteamUpdateCheck | null {\n const appId = getAppId();\n const installDir = path.join(getSteamInstallDir(), steambeta ?? 'main');\n const steamLogin = process.env.STEAM_USERNAME\n ? `\"${process.env.STEAM_USERNAME}\"`\n : 'anonymous';\n\n try {\n const output = execSync(\n [\n STEAMCMD_PATH,\n `+force_install_dir ${installDir}`,\n `+login ${steamLogin}`,\n '+app_info_update 1',\n `+app_info_print ${appId}`,\n `+app_status ${appId}`,\n '+quit',\n ].join(' '),\n { encoding: 'utf-8', stdio: ['inherit', 'pipe', 'pipe'], timeout: 30000 },\n );\n\n const local = parseAppStatus(output);\n if (!local) return null;\n\n const remote = parseAppInfo(output, appId);\n\n const branch = steambeta ?? (local.betaKey || null);\n const remoteBranch = branch && branch !== 'main' ? branch : 'public';\n const remoteBuildId = remote?.branches?.[remoteBranch]?.buildid;\n\n const hasUpdate =\n remoteBuildId != null ? remoteBuildId !== local.buildId : null;\n\n return { local, remote, hasUpdate };\n } catch (err) {\n Logger.verbose('Failed to check for Steam update via steamcmd:', err);\n return null;\n }\n}\n\nlet lastUpdateCheck = 0;\nlet lastUpdateAvailable = 0;\nlet lastUpdateResult = false;\n\nexport const getLastSteamUpdateCheck = () => ({\n attempt: lastUpdateCheck,\n available: lastUpdateAvailable,\n result: lastUpdateResult,\n});\n\nexport const clearLastSteamUpdateCheck = () => {\n lastUpdateResult = false;\n};\n\nexport async function hasSteamUpdate(steambeta?: string) {\n lastUpdateCheck = Date.now();\n\n const check = steamcmdCheckUpdate(steambeta);\n if (!check) return false;\n\n lastUpdateAvailable = Date.now();\n\n if (check.hasUpdate != null) {\n lastUpdateResult = check.hasUpdate;\n return check.hasUpdate;\n }\n\n return false;\n}\n"],"names":["execSync","Logger","spawnSync","STEAMCMD_PATH","getSteamInstallDir","getAppId"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const getScaleAxis = require("./getScaleAxis.js");
|
|
4
4
|
const getBrickSize = require("./getBrickSize.js");
|
|
5
5
|
function checkBound(brick, brick_assets, bounds, axis) {
|
|
@@ -13,5 +13,4 @@ function checkBounds(brick, brick_assets, bounds) {
|
|
|
13
13
|
return checkBound(brick, brick_assets, bounds, 0) && checkBound(brick, brick_assets, bounds, 1) && checkBound(brick, brick_assets, bounds, 2);
|
|
14
14
|
}
|
|
15
15
|
exports.checkBounds = checkBounds;
|
|
16
|
-
exports.default = checkBounds;
|
|
17
16
|
//# sourceMappingURL=checkBounds.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkBounds.js","sources":["../../../src/util/brick/checkBounds.ts"],"sourcesContent":["import { Brick, Vector } from 'brs-js';\n\nimport { getScaleAxis } from './getScaleAxis';\nimport { getBrickSize } from './getBrickSize';\n\nexport interface IBrickBounds {\n minBound: Vector;\n maxBound: Vector;\n center: Vector;\n}\n\n// check if the brick is in bounds for 1 axis\nfunction checkBound(\n brick: Brick,\n brick_assets: string[],\n bounds: IBrickBounds,\n axis: number,\n) {\n const scaleAxis = getScaleAxis(brick, axis);\n const size = getBrickSize(brick, brick_assets);\n const upper = brick.position[axis] + size[scaleAxis];\n const lower = brick.position[axis] - size[scaleAxis];\n return upper <= bounds.maxBound[axis] && lower >= bounds.minBound[axis];\n}\n\n// check if the brick is in bounds\nexport function checkBounds(\n brick: Brick,\n brick_assets: string[],\n bounds: IBrickBounds,\n) {\n return (\n checkBound(brick, brick_assets, bounds, 0) &&\n checkBound(brick, brick_assets, bounds, 1) &&\n checkBound(brick, brick_assets, bounds, 2)\n );\n}\nexport default checkBounds;\n"],"names":["getScaleAxis","getBrickSize"],"mappings":";;;;AAYA,SAAS,WACP,OACA,cACA,QACA,MACA;AACA,QAAM,YAAYA,aAAAA,aAAa,OAAO,IAAI;AAC1C,QAAM,OAAOC,aAAAA,aAAa,OAAO,YAAY;AAC7C,QAAM,QAAQ,MAAM,SAAS,IAAI,IAAI,KAAK,SAAS;AACnD,QAAM,QAAQ,MAAM,SAAS,IAAI,IAAI,KAAK,SAAS;AACnD,SAAO,SAAS,OAAO,SAAS,IAAI,KAAK,SAAS,OAAO,SAAS,IAAI;AACxE;AAGO,SAAS,YACd,OACA,cACA,QACA;AACA,SACE,WAAW,OAAO,cAAc,QAAQ,CAAC,KACzC,WAAW,OAAO,cAAc,QAAQ,CAAC,KACzC,WAAW,OAAO,cAAc,QAAQ,CAAC;AAE7C
|
|
1
|
+
{"version":3,"file":"checkBounds.js","sources":["../../../src/util/brick/checkBounds.ts"],"sourcesContent":["import { Brick, Vector } from 'brs-js';\n\nimport { getScaleAxis } from './getScaleAxis';\nimport { getBrickSize } from './getBrickSize';\n\nexport interface IBrickBounds {\n minBound: Vector;\n maxBound: Vector;\n center: Vector;\n}\n\n// check if the brick is in bounds for 1 axis\nfunction checkBound(\n brick: Brick,\n brick_assets: string[],\n bounds: IBrickBounds,\n axis: number,\n) {\n const scaleAxis = getScaleAxis(brick, axis);\n const size = getBrickSize(brick, brick_assets);\n const upper = brick.position[axis] + size[scaleAxis];\n const lower = brick.position[axis] - size[scaleAxis];\n return upper <= bounds.maxBound[axis] && lower >= bounds.minBound[axis];\n}\n\n// check if the brick is in bounds\nexport function checkBounds(\n brick: Brick,\n brick_assets: string[],\n bounds: IBrickBounds,\n) {\n return (\n checkBound(brick, brick_assets, bounds, 0) &&\n checkBound(brick, brick_assets, bounds, 1) &&\n checkBound(brick, brick_assets, bounds, 2)\n );\n}\nexport default checkBounds;\n"],"names":["getScaleAxis","getBrickSize"],"mappings":";;;;AAYA,SAAS,WACP,OACA,cACA,QACA,MACA;AACA,QAAM,YAAYA,aAAAA,aAAa,OAAO,IAAI;AAC1C,QAAM,OAAOC,aAAAA,aAAa,OAAO,YAAY;AAC7C,QAAM,QAAQ,MAAM,SAAS,IAAI,IAAI,KAAK,SAAS;AACnD,QAAM,QAAQ,MAAM,SAAS,IAAI,IAAI,KAAK,SAAS;AACnD,SAAO,SAAS,OAAO,SAAS,IAAI,KAAK,SAAS,OAAO,SAAS,IAAI;AACxE;AAGO,SAAS,YACd,OACA,cACA,QACA;AACA,SACE,WAAW,OAAO,cAAc,QAAQ,CAAC,KACzC,WAAW,OAAO,cAAc,QAAQ,CAAC,KACzC,WAAW,OAAO,cAAc,QAAQ,CAAC;AAE7C;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const constants = require("./constants.js");
|
|
4
4
|
function genericBrick(name, asset) {
|
|
5
5
|
if (!asset) asset = "B_" + name.replace(/\s/g, "_");
|
|
@@ -213,6 +213,5 @@ function convertDisplayName(name) {
|
|
|
213
213
|
return null;
|
|
214
214
|
}
|
|
215
215
|
exports.convertDisplayName = convertDisplayName;
|
|
216
|
-
exports.default = convertDisplayName;
|
|
217
216
|
exports.displayNameMap = displayNameMap;
|
|
218
217
|
//# sourceMappingURL=displayName.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"displayName.js","sources":["../../../src/util/brick/displayName.ts"],"sourcesContent":["import { brickSizeMap } from './constants';\n\ntype NameConversion = [string, [number, number, number]];\n\nfunction genericBrick(\n name: string,\n asset?: string,\n): (typeof displayNameMap)[number] {\n if (!asset) asset = 'B_' + name.replace(/\\s/g, '_');\n return [name, [asset, brickSizeMap[asset] ?? [0, 0, 0]]];\n}\n\nconst microMap: Record<string, string> = {\n 'Micro-Brick': 'PB_DefaultMicroBrick',\n 'Micro-Wedge 1/2 Inner Corner': 'PB_DefaultMicroWedgeHalfInnerCorner',\n 'Micro-Wedge Inv. 1/2 Inner Corner':\n 'PB_DefaultMicroWedgeHalfInnerCornerInverted',\n 'Micro-Wedge 1/2 Outer Corner': 'PB_DefaultMicroWedgeHalfOuterCorner',\n 'Micro-Wedge Corner': 'PB_DefaultMicroWedgeCorner',\n 'Micro-Wedge Inner Corner': 'PB_DefaultMicroWedgeInnerCorner',\n 'Micro-Wedge Outer Corner': 'PB_DefaultMicroWedgeOuterCorner',\n 'Micro-Wedge Triangle Corner': 'PB_DefaultMicroWedgeTriangleCorner',\n 'Micro-Wedge': 'PB_DefaultMicroWedge',\n};\n\nexport const displayNameMap: [\n string | RegExp,\n NameConversion | ((name: string, ...rest: string[]) => NameConversion),\n][] = [\n // Games\n genericBrick('Checkpoint', 'B_CheckPoint'),\n genericBrick('Goalpoint', 'B_GoalPoint'),\n genericBrick('Spawnpoint', 'B_SpawnPoint'),\n\n // Ramps\n genericBrick('2x1 Slipper'),\n genericBrick('2x2 Slipper'),\n\n // Rounds\n genericBrick('1x Octo'),\n genericBrick('1x Octo 90°', 'B_1x_Octo_90Deg'),\n genericBrick('1x Octo 90° Inv', 'B_1x_Octo_90Deg_Inv'),\n genericBrick('1x Octo T'),\n genericBrick('1x Octo T Inv'),\n genericBrick('1x1f Octo', 'B_1x1F_Octo'),\n genericBrick('1x1 Cone'),\n genericBrick('1x1 Round'),\n genericBrick('1x1f Round', 'B_1x1F_Round'),\n genericBrick('2x Octo'),\n genericBrick('2x Octo 90°', 'B_2x_Octo_90Deg'),\n genericBrick('2x Octo 90° Inv', 'B_2x_Octo_90Deg_Inv'),\n genericBrick('2x Octo Cone'),\n genericBrick('2x Octo T'),\n genericBrick('2x Octo T Inv'),\n genericBrick('2x2f Converter', 'B_2x2F_Octo_Converter'),\n genericBrick('2x2f Converter Inv', 'B_2x2F_Octo_Converter_Inv'),\n genericBrick('2x2f Octo', 'B_2x2F_Octo'),\n genericBrick('2x2 Cone'),\n\n // Special\n genericBrick('1x2f Plate Center'),\n genericBrick('1x2f Plate Center Inv'),\n genericBrick('2x2f Plate Center'),\n genericBrick('2x2f Plate Center Inv'),\n genericBrick('Bishop'),\n genericBrick('King'),\n genericBrick('Knight'),\n genericBrick('Pawn'),\n genericBrick('Queen'),\n genericBrick('Rook'),\n genericBrick('2x2 Corner'),\n genericBrick('8x8 Lattice Plate'),\n genericBrick('Bone', 'B_BoneStraight'),\n genericBrick('Carved Pumpkin', 'B_Pumpkin_Carved'),\n genericBrick('Coffin'),\n genericBrick('Coffin Lid'),\n genericBrick('Diagonal Bone', 'B_Bone'),\n genericBrick('Flame'),\n genericBrick('Gravestone'),\n genericBrick('Handle'),\n genericBrick('Inverted Cone'),\n genericBrick('Ladder Step', 'B_Ladder'),\n genericBrick('Pumpkin'),\n genericBrick('Round Swirl Plate', 'B_Swirl_Plate'),\n genericBrick('Sausage'),\n genericBrick('Turkey Body'),\n genericBrick('Turkey Leg'),\n genericBrick('2x4 Door Frame'),\n genericBrick('Picket Fence'),\n genericBrick('Branch'),\n genericBrick('Bush', 'B_Leaf_Bush'),\n genericBrick('Fern'),\n genericBrick('Flower'),\n genericBrick('Hedge 1x1'),\n genericBrick('Hedge 1x1 Corner'),\n genericBrick('Hedge 1x2'),\n genericBrick('Hedge 1x4'),\n genericBrick('Pine Tree'),\n genericBrick('Shrub', 'B_Bush'),\n genericBrick('Small Flower'),\n genericBrick('Cauldron'),\n genericBrick('Chalice'),\n genericBrick('Jar'),\n genericBrick('1x1 Brick Side'),\n genericBrick('1x1 Brick Side Lip'),\n genericBrick('1x2 Overhang Panel', 'B_1x2_Overhang'),\n genericBrick('1x4 Brick Side'),\n genericBrick('2x2 Overhang Panel', 'B_2x2_Overhang_Panel'),\n\n // Micros\n [\n // 8x Micro-Brick Cube\n /^(\\d+)x (Micro-.+) Cube$/,\n (_, size, micro) => [\n microMap[micro],\n [Number(size) / 2, Number(size) / 2, Number(size) / 2],\n ],\n ],\n [\n // 8x8x10 Micro-Brick\n /^(\\d+)x(\\d+)x(\\d+) (Micro-.+)$/,\n (_, x, y, z, micro) => [\n microMap[micro],\n [Number(x) / 2, Number(y) / 2, Number(z) / 2],\n ],\n ],\n\n // Rounds\n [\n // 4x2 Pole\n /^(\\d+)x(\\d+) Pole$/,\n (_, x, z) => [\n 'PB_DefaultPole',\n [Number(x) / 2, Number(x) / 2, Number(z) / 2],\n ],\n ],\n [\n // 2x Cone\n /^(\\d+)x Pole$/,\n (_, size) => [\n 'PB_DefaultPole',\n [Number(size) / 2, Number(size) / 2, Number(size) / 2],\n ],\n ],\n\n // Ramps\n [\n // 4x Inv. Cube Ramp Corner,\n // weird edge case because Inv. Cube and not Cube Inv. or Cube ... (Inverted)\n /^(\\d+)x Inv. Cube Ramp Corner/,\n (name, size) => [\n 'PB_DefaultRampCornerInverted',\n [Number(size) * 5, Number(size) * 5, Number(size) * 5],\n ],\n ],\n\n // Bricks\n [\n // 4x Cube\n /^(\\d+)}?x Cube/,\n (name, size) => [\n brickTypeSuffix(name),\n [Number(size) * 5, Number(size) * 5, Number(size) * 5],\n ],\n ],\n [\n // 1x1x4f\n /^(\\d+)x(\\d+)x([\\d.]+)f/,\n (name, x, y, z) => [\n brickTypeSuffix(name),\n [Number(x) * 5, Number(y) * 5, Number(z) * 2],\n ],\n ],\n [\n // 1x1x2\n /^(\\d+)x(\\d+)x(\\d+)/,\n (name, x, y, z) => [\n brickTypeSuffix(name),\n [Number(x) * 5, Number(y) * 5, Number(z) * 6],\n ],\n ],\n [\n // 1x1f\n /^(\\d+)x(\\d+)f/,\n (name, x, y) => [brickTypeSuffix(name), [Number(x) * 5, Number(y) * 5, 2]],\n ],\n [\n // 1x1\n /^(\\d+)x(\\d+)/,\n (name, x, y) => [brickTypeSuffix(name), [Number(x) * 5, Number(y) * 5, 6]],\n ],\n];\n\nconst brickTypeSuffixMap: [string, string][] = [\n ['Side Wedge', 'PB_DefaultSideWedge'],\n ['Wedge', 'PB_DefaultWedge'],\n ['Inner Ramp Corner', 'PB_DefaultRampInnerCorner'],\n ['Inv. Ramp Corner', 'PB_DefaultRampCornerInverted'],\n ['Ramp Inner Corner (Inverted)', 'PB_DefaultRampInnerCornerInverted'],\n ['Ramp Corner', 'PB_DefaultRampCorner'],\n ['Ramp Crest', 'PB_DefaultRampCrest'],\n ['Ramp Crest End', 'PB_DefaultRampCrestEnd'],\n ['Ramp Crest Corner', 'PB_DefaultRampCrestCorner'],\n ['Inv. Ramp', 'PB_DefaultRampInverted'],\n ['Ramp', 'PB_DefaultRamp'],\n ['Inv. Arch', 'PB_DefaultArchInverted'],\n ['Arch', 'PB_DefaultArch'],\n ['(Tile)', 'PB_DefaultTile'],\n ['(Smooth Tile)', 'PB_DefaultSmoothTile'],\n];\n\nfunction brickTypeSuffix(name: string): string {\n for (const [test, res] of brickTypeSuffixMap)\n if (name.endsWith(test)) return res;\n\n return 'PB_DefaultBrick';\n}\n\nexport function convertDisplayName(name: string): NameConversion {\n for (const matcher of displayNameMap) {\n let matchDetails: RegExpMatchArray | null = null;\n if (typeof matcher[0] === 'string') {\n if (matcher[0] !== name) continue;\n } else {\n matchDetails = name.match(matcher[0]);\n if (matchDetails == null) continue;\n }\n\n if (typeof matcher[1] === 'function') {\n return matcher[1](name, ...(matchDetails ? matchDetails.slice(1) : []));\n } else {\n return matcher[1];\n }\n }\n\n return null;\n}\n\nexport default convertDisplayName;\n"],"names":["brickSizeMap"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"displayName.js","sources":["../../../src/util/brick/displayName.ts"],"sourcesContent":["import { brickSizeMap } from './constants';\n\ntype NameConversion = [string, [number, number, number]];\n\nfunction genericBrick(\n name: string,\n asset?: string,\n): (typeof displayNameMap)[number] {\n if (!asset) asset = 'B_' + name.replace(/\\s/g, '_');\n return [name, [asset, brickSizeMap[asset] ?? [0, 0, 0]]];\n}\n\nconst microMap: Record<string, string> = {\n 'Micro-Brick': 'PB_DefaultMicroBrick',\n 'Micro-Wedge 1/2 Inner Corner': 'PB_DefaultMicroWedgeHalfInnerCorner',\n 'Micro-Wedge Inv. 1/2 Inner Corner':\n 'PB_DefaultMicroWedgeHalfInnerCornerInverted',\n 'Micro-Wedge 1/2 Outer Corner': 'PB_DefaultMicroWedgeHalfOuterCorner',\n 'Micro-Wedge Corner': 'PB_DefaultMicroWedgeCorner',\n 'Micro-Wedge Inner Corner': 'PB_DefaultMicroWedgeInnerCorner',\n 'Micro-Wedge Outer Corner': 'PB_DefaultMicroWedgeOuterCorner',\n 'Micro-Wedge Triangle Corner': 'PB_DefaultMicroWedgeTriangleCorner',\n 'Micro-Wedge': 'PB_DefaultMicroWedge',\n};\n\nexport const displayNameMap: [\n string | RegExp,\n NameConversion | ((name: string, ...rest: string[]) => NameConversion),\n][] = [\n // Games\n genericBrick('Checkpoint', 'B_CheckPoint'),\n genericBrick('Goalpoint', 'B_GoalPoint'),\n genericBrick('Spawnpoint', 'B_SpawnPoint'),\n\n // Ramps\n genericBrick('2x1 Slipper'),\n genericBrick('2x2 Slipper'),\n\n // Rounds\n genericBrick('1x Octo'),\n genericBrick('1x Octo 90°', 'B_1x_Octo_90Deg'),\n genericBrick('1x Octo 90° Inv', 'B_1x_Octo_90Deg_Inv'),\n genericBrick('1x Octo T'),\n genericBrick('1x Octo T Inv'),\n genericBrick('1x1f Octo', 'B_1x1F_Octo'),\n genericBrick('1x1 Cone'),\n genericBrick('1x1 Round'),\n genericBrick('1x1f Round', 'B_1x1F_Round'),\n genericBrick('2x Octo'),\n genericBrick('2x Octo 90°', 'B_2x_Octo_90Deg'),\n genericBrick('2x Octo 90° Inv', 'B_2x_Octo_90Deg_Inv'),\n genericBrick('2x Octo Cone'),\n genericBrick('2x Octo T'),\n genericBrick('2x Octo T Inv'),\n genericBrick('2x2f Converter', 'B_2x2F_Octo_Converter'),\n genericBrick('2x2f Converter Inv', 'B_2x2F_Octo_Converter_Inv'),\n genericBrick('2x2f Octo', 'B_2x2F_Octo'),\n genericBrick('2x2 Cone'),\n\n // Special\n genericBrick('1x2f Plate Center'),\n genericBrick('1x2f Plate Center Inv'),\n genericBrick('2x2f Plate Center'),\n genericBrick('2x2f Plate Center Inv'),\n genericBrick('Bishop'),\n genericBrick('King'),\n genericBrick('Knight'),\n genericBrick('Pawn'),\n genericBrick('Queen'),\n genericBrick('Rook'),\n genericBrick('2x2 Corner'),\n genericBrick('8x8 Lattice Plate'),\n genericBrick('Bone', 'B_BoneStraight'),\n genericBrick('Carved Pumpkin', 'B_Pumpkin_Carved'),\n genericBrick('Coffin'),\n genericBrick('Coffin Lid'),\n genericBrick('Diagonal Bone', 'B_Bone'),\n genericBrick('Flame'),\n genericBrick('Gravestone'),\n genericBrick('Handle'),\n genericBrick('Inverted Cone'),\n genericBrick('Ladder Step', 'B_Ladder'),\n genericBrick('Pumpkin'),\n genericBrick('Round Swirl Plate', 'B_Swirl_Plate'),\n genericBrick('Sausage'),\n genericBrick('Turkey Body'),\n genericBrick('Turkey Leg'),\n genericBrick('2x4 Door Frame'),\n genericBrick('Picket Fence'),\n genericBrick('Branch'),\n genericBrick('Bush', 'B_Leaf_Bush'),\n genericBrick('Fern'),\n genericBrick('Flower'),\n genericBrick('Hedge 1x1'),\n genericBrick('Hedge 1x1 Corner'),\n genericBrick('Hedge 1x2'),\n genericBrick('Hedge 1x4'),\n genericBrick('Pine Tree'),\n genericBrick('Shrub', 'B_Bush'),\n genericBrick('Small Flower'),\n genericBrick('Cauldron'),\n genericBrick('Chalice'),\n genericBrick('Jar'),\n genericBrick('1x1 Brick Side'),\n genericBrick('1x1 Brick Side Lip'),\n genericBrick('1x2 Overhang Panel', 'B_1x2_Overhang'),\n genericBrick('1x4 Brick Side'),\n genericBrick('2x2 Overhang Panel', 'B_2x2_Overhang_Panel'),\n\n // Micros\n [\n // 8x Micro-Brick Cube\n /^(\\d+)x (Micro-.+) Cube$/,\n (_, size, micro) => [\n microMap[micro],\n [Number(size) / 2, Number(size) / 2, Number(size) / 2],\n ],\n ],\n [\n // 8x8x10 Micro-Brick\n /^(\\d+)x(\\d+)x(\\d+) (Micro-.+)$/,\n (_, x, y, z, micro) => [\n microMap[micro],\n [Number(x) / 2, Number(y) / 2, Number(z) / 2],\n ],\n ],\n\n // Rounds\n [\n // 4x2 Pole\n /^(\\d+)x(\\d+) Pole$/,\n (_, x, z) => [\n 'PB_DefaultPole',\n [Number(x) / 2, Number(x) / 2, Number(z) / 2],\n ],\n ],\n [\n // 2x Cone\n /^(\\d+)x Pole$/,\n (_, size) => [\n 'PB_DefaultPole',\n [Number(size) / 2, Number(size) / 2, Number(size) / 2],\n ],\n ],\n\n // Ramps\n [\n // 4x Inv. Cube Ramp Corner,\n // weird edge case because Inv. Cube and not Cube Inv. or Cube ... (Inverted)\n /^(\\d+)x Inv. Cube Ramp Corner/,\n (name, size) => [\n 'PB_DefaultRampCornerInverted',\n [Number(size) * 5, Number(size) * 5, Number(size) * 5],\n ],\n ],\n\n // Bricks\n [\n // 4x Cube\n /^(\\d+)}?x Cube/,\n (name, size) => [\n brickTypeSuffix(name),\n [Number(size) * 5, Number(size) * 5, Number(size) * 5],\n ],\n ],\n [\n // 1x1x4f\n /^(\\d+)x(\\d+)x([\\d.]+)f/,\n (name, x, y, z) => [\n brickTypeSuffix(name),\n [Number(x) * 5, Number(y) * 5, Number(z) * 2],\n ],\n ],\n [\n // 1x1x2\n /^(\\d+)x(\\d+)x(\\d+)/,\n (name, x, y, z) => [\n brickTypeSuffix(name),\n [Number(x) * 5, Number(y) * 5, Number(z) * 6],\n ],\n ],\n [\n // 1x1f\n /^(\\d+)x(\\d+)f/,\n (name, x, y) => [brickTypeSuffix(name), [Number(x) * 5, Number(y) * 5, 2]],\n ],\n [\n // 1x1\n /^(\\d+)x(\\d+)/,\n (name, x, y) => [brickTypeSuffix(name), [Number(x) * 5, Number(y) * 5, 6]],\n ],\n];\n\nconst brickTypeSuffixMap: [string, string][] = [\n ['Side Wedge', 'PB_DefaultSideWedge'],\n ['Wedge', 'PB_DefaultWedge'],\n ['Inner Ramp Corner', 'PB_DefaultRampInnerCorner'],\n ['Inv. Ramp Corner', 'PB_DefaultRampCornerInverted'],\n ['Ramp Inner Corner (Inverted)', 'PB_DefaultRampInnerCornerInverted'],\n ['Ramp Corner', 'PB_DefaultRampCorner'],\n ['Ramp Crest', 'PB_DefaultRampCrest'],\n ['Ramp Crest End', 'PB_DefaultRampCrestEnd'],\n ['Ramp Crest Corner', 'PB_DefaultRampCrestCorner'],\n ['Inv. Ramp', 'PB_DefaultRampInverted'],\n ['Ramp', 'PB_DefaultRamp'],\n ['Inv. Arch', 'PB_DefaultArchInverted'],\n ['Arch', 'PB_DefaultArch'],\n ['(Tile)', 'PB_DefaultTile'],\n ['(Smooth Tile)', 'PB_DefaultSmoothTile'],\n];\n\nfunction brickTypeSuffix(name: string): string {\n for (const [test, res] of brickTypeSuffixMap)\n if (name.endsWith(test)) return res;\n\n return 'PB_DefaultBrick';\n}\n\nexport function convertDisplayName(name: string): NameConversion {\n for (const matcher of displayNameMap) {\n let matchDetails: RegExpMatchArray | null = null;\n if (typeof matcher[0] === 'string') {\n if (matcher[0] !== name) continue;\n } else {\n matchDetails = name.match(matcher[0]);\n if (matchDetails == null) continue;\n }\n\n if (typeof matcher[1] === 'function') {\n return matcher[1](name, ...(matchDetails ? matchDetails.slice(1) : []));\n } else {\n return matcher[1];\n }\n }\n\n return null;\n}\n\nexport default convertDisplayName;\n"],"names":["brickSizeMap"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const getBrickSize = require("./getBrickSize.js");
|
|
4
4
|
const getScaleAxis = require("./getScaleAxis.js");
|
|
5
5
|
function minMaxBound(brick, brick_assets, bounds, axis) {
|
|
@@ -30,6 +30,5 @@ function getBounds({ bricks, brick_assets }) {
|
|
|
30
30
|
});
|
|
31
31
|
return bounds;
|
|
32
32
|
}
|
|
33
|
-
exports.default = getBounds;
|
|
34
33
|
exports.getBounds = getBounds;
|
|
35
34
|
//# sourceMappingURL=getBounds.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getBounds.js","sources":["../../../src/util/brick/getBounds.ts"],"sourcesContent":["import { Brick, Vector, WriteSaveObject } from 'brs-js';\nimport type { IBrickBounds } from './checkBounds';\nimport { getBrickSize } from './getBrickSize';\nimport { getScaleAxis } from './getScaleAxis';\n\nexport function getAbsoluteSize(\n brick: Brick,\n brick_assets: string[],\n): [number, number, number] {\n const size = getBrickSize(brick, brick_assets);\n return [\n size[getScaleAxis(brick, 0)],\n size[getScaleAxis(brick, 1)],\n size[getScaleAxis(brick, 2)],\n ];\n}\n\n// compare bound to see if it is new min or max, and then replace if it is\nfunction minMaxBound(\n brick: Brick,\n brick_assets: string[],\n bounds: IBrickBounds,\n axis: number,\n) {\n const scaleAxis = getScaleAxis(brick, axis);\n const size = getBrickSize(brick, brick_assets);\n const upper = brick.position[axis] + size[scaleAxis];\n const lower = brick.position[axis] - size[scaleAxis];\n if (upper > bounds.maxBound[axis] || bounds.maxBound[axis] === undefined)\n bounds.maxBound[axis] = upper;\n if (lower < bounds.minBound[axis] || bounds.minBound[axis] === undefined)\n bounds.minBound[axis] = lower;\n}\n\n// returns bounds of the array of the brick\nexport function getBounds({ bricks, brick_assets }: WriteSaveObject) {\n const bounds: IBrickBounds = {\n minBound: [],\n maxBound: [],\n center: [],\n } as unknown as IBrickBounds;\n\n bricks.forEach(brick => {\n minMaxBound(brick, brick_assets, bounds, 0);\n minMaxBound(brick, brick_assets, bounds, 1);\n minMaxBound(brick, brick_assets, bounds, 2);\n });\n\n // calculate center from min and max bounds\n bounds.center = bounds.minBound.map((min, index) => {\n const max = bounds.maxBound[index];\n const avg = (max + min) / 2;\n return Math.round(avg);\n }) as Vector;\n\n return bounds;\n}\nexport default getBounds;\n"],"names":["getScaleAxis","getBrickSize"],"mappings":";;;;AAkBA,SAAS,YACP,OACA,cACA,QACA,MACA;AACA,QAAM,YAAYA,aAAAA,aAAa,OAAO,IAAI;AAC1C,QAAM,OAAOC,aAAAA,aAAa,OAAO,YAAY;AAC7C,QAAM,QAAQ,MAAM,SAAS,IAAI,IAAI,KAAK,SAAS;AACnD,QAAM,QAAQ,MAAM,SAAS,IAAI,IAAI,KAAK,SAAS;AACnD,MAAI,QAAQ,OAAO,SAAS,IAAI,KAAK,OAAO,SAAS,IAAI,MAAM;AAC7D,WAAO,SAAS,IAAI,IAAI;AAC1B,MAAI,QAAQ,OAAO,SAAS,IAAI,KAAK,OAAO,SAAS,IAAI,MAAM;AAC7D,WAAO,SAAS,IAAI,IAAI;AAC5B;AAGO,SAAS,UAAU,EAAE,QAAQ,gBAAiC;AACnE,QAAM,SAAuB;AAAA,IAC3B,UAAU,CAAA;AAAA,IACV,UAAU,CAAA;AAAA,IACV,QAAQ,CAAA;AAAA,EAAC;AAGX,SAAO,QAAQ,CAAA,UAAS;AACtB,gBAAY,OAAO,cAAc,QAAQ,CAAC;AAC1C,gBAAY,OAAO,cAAc,QAAQ,CAAC;AAC1C,gBAAY,OAAO,cAAc,QAAQ,CAAC;AAAA,EAC5C,CAAC;AAGD,SAAO,SAAS,OAAO,SAAS,IAAI,CAAC,KAAK,UAAU;AAClD,UAAM,MAAM,OAAO,SAAS,KAAK;AACjC,UAAM,OAAO,MAAM,OAAO;AAC1B,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,CAAC;AAED,SAAO;AACT
|
|
1
|
+
{"version":3,"file":"getBounds.js","sources":["../../../src/util/brick/getBounds.ts"],"sourcesContent":["import { Brick, Vector, WriteSaveObject } from 'brs-js';\nimport type { IBrickBounds } from './checkBounds';\nimport { getBrickSize } from './getBrickSize';\nimport { getScaleAxis } from './getScaleAxis';\n\nexport function getAbsoluteSize(\n brick: Brick,\n brick_assets: string[],\n): [number, number, number] {\n const size = getBrickSize(brick, brick_assets);\n return [\n size[getScaleAxis(brick, 0)],\n size[getScaleAxis(brick, 1)],\n size[getScaleAxis(brick, 2)],\n ];\n}\n\n// compare bound to see if it is new min or max, and then replace if it is\nfunction minMaxBound(\n brick: Brick,\n brick_assets: string[],\n bounds: IBrickBounds,\n axis: number,\n) {\n const scaleAxis = getScaleAxis(brick, axis);\n const size = getBrickSize(brick, brick_assets);\n const upper = brick.position[axis] + size[scaleAxis];\n const lower = brick.position[axis] - size[scaleAxis];\n if (upper > bounds.maxBound[axis] || bounds.maxBound[axis] === undefined)\n bounds.maxBound[axis] = upper;\n if (lower < bounds.minBound[axis] || bounds.minBound[axis] === undefined)\n bounds.minBound[axis] = lower;\n}\n\n// returns bounds of the array of the brick\nexport function getBounds({ bricks, brick_assets }: WriteSaveObject) {\n const bounds: IBrickBounds = {\n minBound: [],\n maxBound: [],\n center: [],\n } as unknown as IBrickBounds;\n\n bricks.forEach(brick => {\n minMaxBound(brick, brick_assets, bounds, 0);\n minMaxBound(brick, brick_assets, bounds, 1);\n minMaxBound(brick, brick_assets, bounds, 2);\n });\n\n // calculate center from min and max bounds\n bounds.center = bounds.minBound.map((min, index) => {\n const max = bounds.maxBound[index];\n const avg = (max + min) / 2;\n return Math.round(avg);\n }) as Vector;\n\n return bounds;\n}\nexport default getBounds;\n"],"names":["getScaleAxis","getBrickSize"],"mappings":";;;;AAkBA,SAAS,YACP,OACA,cACA,QACA,MACA;AACA,QAAM,YAAYA,aAAAA,aAAa,OAAO,IAAI;AAC1C,QAAM,OAAOC,aAAAA,aAAa,OAAO,YAAY;AAC7C,QAAM,QAAQ,MAAM,SAAS,IAAI,IAAI,KAAK,SAAS;AACnD,QAAM,QAAQ,MAAM,SAAS,IAAI,IAAI,KAAK,SAAS;AACnD,MAAI,QAAQ,OAAO,SAAS,IAAI,KAAK,OAAO,SAAS,IAAI,MAAM;AAC7D,WAAO,SAAS,IAAI,IAAI;AAC1B,MAAI,QAAQ,OAAO,SAAS,IAAI,KAAK,OAAO,SAAS,IAAI,MAAM;AAC7D,WAAO,SAAS,IAAI,IAAI;AAC5B;AAGO,SAAS,UAAU,EAAE,QAAQ,gBAAiC;AACnE,QAAM,SAAuB;AAAA,IAC3B,UAAU,CAAA;AAAA,IACV,UAAU,CAAA;AAAA,IACV,QAAQ,CAAA;AAAA,EAAC;AAGX,SAAO,QAAQ,CAAA,UAAS;AACtB,gBAAY,OAAO,cAAc,QAAQ,CAAC;AAC1C,gBAAY,OAAO,cAAc,QAAQ,CAAC;AAC1C,gBAAY,OAAO,cAAc,QAAQ,CAAC;AAAA,EAC5C,CAAC;AAGD,SAAO,SAAS,OAAO,SAAS,IAAI,CAAC,KAAK,UAAU;AAClD,UAAM,MAAM,OAAO,SAAS,KAAK;AACjC,UAAM,OAAO,MAAM,OAAO;AAC1B,WAAO,KAAK,MAAM,GAAG;AAAA,EACvB,CAAC;AAED,SAAO;AACT;;"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const constants = require("./constants.js");
|
|
4
4
|
function getBrickSize(brick, brick_assets) {
|
|
5
5
|
const asset = brick_assets[brick.asset_name_index];
|
|
6
6
|
return constants.brickSizeMap[asset] || brick.size;
|
|
7
7
|
}
|
|
8
|
-
exports.default = getBrickSize;
|
|
9
8
|
exports.getBrickSize = getBrickSize;
|
|
10
9
|
//# sourceMappingURL=getBrickSize.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getBrickSize.js","sources":["../../../src/util/brick/getBrickSize.ts"],"sourcesContent":["import { Brick } from 'brs-js';\nimport { brickSizeMap } from './constants';\n\n// get brick size for special bricks\nexport function getBrickSize(brick: Brick, brick_assets: string[]) {\n const asset = brick_assets[brick.asset_name_index];\n return brickSizeMap[asset] || brick.size;\n}\nexport default getBrickSize;\n"],"names":["brickSizeMap"],"mappings":";;;AAIO,SAAS,aAAa,OAAc,cAAwB;AACjE,QAAM,QAAQ,aAAa,MAAM,gBAAgB;AACjD,SAAOA,uBAAa,KAAK,KAAK,MAAM;AACtC
|
|
1
|
+
{"version":3,"file":"getBrickSize.js","sources":["../../../src/util/brick/getBrickSize.ts"],"sourcesContent":["import { Brick } from 'brs-js';\nimport { brickSizeMap } from './constants';\n\n// get brick size for special bricks\nexport function getBrickSize(brick: Brick, brick_assets: string[]) {\n const asset = brick_assets[brick.asset_name_index];\n return brickSizeMap[asset] || brick.size;\n}\nexport default getBrickSize;\n"],"names":["brickSizeMap"],"mappings":";;;AAIO,SAAS,aAAa,OAAc,cAAwB;AACjE,QAAM,QAAQ,aAAa,MAAM,gBAAgB;AACjD,SAAOA,uBAAa,KAAK,KAAK,MAAM;AACtC;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
function getScaleAxis(brick, axis) {
|
|
4
4
|
const { direction, rotation } = brick;
|
|
5
5
|
if ([0, 1].includes(direction)) {
|
|
@@ -26,6 +26,5 @@ function getScaleAxis(brick, axis) {
|
|
|
26
26
|
}
|
|
27
27
|
return axis;
|
|
28
28
|
}
|
|
29
|
-
exports.default = getScaleAxis;
|
|
30
29
|
exports.getScaleAxis = getScaleAxis;
|
|
31
30
|
//# sourceMappingURL=getScaleAxis.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"getScaleAxis.js","sources":["../../../src/util/brick/getScaleAxis.ts"],"sourcesContent":["import { Brick } from 'brs-js';\n\n// get scale axis for scale when using rotation and orientation\nexport function getScaleAxis(brick: Brick, axis: number) {\n const { direction, rotation } = brick;\n if ([0, 1].includes(direction)) {\n if (axis === 0) {\n axis = 2;\n } else if (axis === 2) {\n axis = 0;\n }\n } else if ([2, 3].includes(direction)) {\n if (axis === 0) {\n axis = 1;\n } else if (axis === 1) {\n axis = 2;\n } else if (axis === 2) {\n axis = 0;\n }\n }\n\n if ([1, 3].includes(rotation)) {\n if (axis === 0) {\n axis = 1;\n } else if (axis === 1) {\n axis = 0;\n }\n }\n\n return axis;\n}\nexport default getScaleAxis;\n"],"names":[],"mappings":";;AAGO,SAAS,aAAa,OAAc,MAAc;AACvD,QAAM,EAAE,WAAW,SAAA,IAAa;AAChC,MAAI,CAAC,GAAG,CAAC,EAAE,SAAS,SAAS,GAAG;AAC9B,QAAI,SAAS,GAAG;AACd,aAAO;AAAA,IACT,WAAW,SAAS,GAAG;AACrB,aAAO;AAAA,IACT;AAAA,EACF,WAAW,CAAC,GAAG,CAAC,EAAE,SAAS,SAAS,GAAG;AACrC,QAAI,SAAS,GAAG;AACd,aAAO;AAAA,IACT,WAAW,SAAS,GAAG;AACrB,aAAO;AAAA,IACT,WAAW,SAAS,GAAG;AACrB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,CAAC,GAAG,CAAC,EAAE,SAAS,QAAQ,GAAG;AAC7B,QAAI,SAAS,GAAG;AACd,aAAO;AAAA,IACT,WAAW,SAAS,GAAG;AACrB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT
|
|
1
|
+
{"version":3,"file":"getScaleAxis.js","sources":["../../../src/util/brick/getScaleAxis.ts"],"sourcesContent":["import { Brick } from 'brs-js';\n\n// get scale axis for scale when using rotation and orientation\nexport function getScaleAxis(brick: Brick, axis: number) {\n const { direction, rotation } = brick;\n if ([0, 1].includes(direction)) {\n if (axis === 0) {\n axis = 2;\n } else if (axis === 2) {\n axis = 0;\n }\n } else if ([2, 3].includes(direction)) {\n if (axis === 0) {\n axis = 1;\n } else if (axis === 1) {\n axis = 2;\n } else if (axis === 2) {\n axis = 0;\n }\n }\n\n if ([1, 3].includes(rotation)) {\n if (axis === 0) {\n axis = 1;\n } else if (axis === 1) {\n axis = 0;\n }\n }\n\n return axis;\n}\nexport default getScaleAxis;\n"],"names":[],"mappings":";;AAGO,SAAS,aAAa,OAAc,MAAc;AACvD,QAAM,EAAE,WAAW,SAAA,IAAa;AAChC,MAAI,CAAC,GAAG,CAAC,EAAE,SAAS,SAAS,GAAG;AAC9B,QAAI,SAAS,GAAG;AACd,aAAO;AAAA,IACT,WAAW,SAAS,GAAG;AACrB,aAAO;AAAA,IACT;AAAA,EACF,WAAW,CAAC,GAAG,CAAC,EAAE,SAAS,SAAS,GAAG;AACrC,QAAI,SAAS,GAAG;AACd,aAAO;AAAA,IACT,WAAW,SAAS,GAAG;AACrB,aAAO;AAAA,IACT,WAAW,SAAS,GAAG;AACrB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,MAAI,CAAC,GAAG,CAAC,EAAE,SAAS,QAAQ,GAAG;AAC7B,QAAI,SAAS,GAAG;AACd,aAAO;AAAA,IACT,WAAW,SAAS,GAAG;AACrB,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;;"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
Object.
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
function setOwnership(player, saveData) {
|
|
4
4
|
if ("brick_owners" in saveData)
|
|
5
5
|
saveData.brick_owners = [
|
|
@@ -12,6 +12,5 @@ function setOwnership(player, saveData) {
|
|
|
12
12
|
}));
|
|
13
13
|
return saveData;
|
|
14
14
|
}
|
|
15
|
-
exports.default = setOwnership;
|
|
16
15
|
exports.setOwnership = setOwnership;
|
|
17
16
|
//# sourceMappingURL=setOwnership.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"setOwnership.js","sources":["../../../src/util/brick/setOwnership.ts"],"sourcesContent":["import { ReadSaveObject } from 'brs-js';\n\n/**\n * sets all the bricks in saveData to target's ownership\n * @param player - player\n * @param saveData - save data with unknown ownership\n * @return save data with ownership changed\n */\nexport function setOwnership(\n player: { id: string; name: string },\n saveData: ReadSaveObject,\n) {\n if ('brick_owners' in saveData)\n saveData.brick_owners = [\n { id: player.id, name: player.name, bricks: saveData.bricks.length },\n ];\n\n if (saveData.bricks.length > 0 && 'owner_index' in saveData.bricks[0])\n saveData.bricks = saveData.bricks.map(brick => ({\n ...brick,\n owner_index: 1,\n })) as typeof saveData.bricks;\n\n return saveData;\n}\n\nexport default setOwnership;\n"],"names":[],"mappings":";;AAQO,SAAS,aACd,QACA,UACA;AACA,MAAI,kBAAkB;AACpB,aAAS,eAAe;AAAA,MACtB,EAAE,IAAI,OAAO,IAAI,MAAM,OAAO,MAAM,QAAQ,SAAS,OAAO,OAAA;AAAA,IAAO;AAGvE,MAAI,SAAS,OAAO,SAAS,KAAK,iBAAiB,SAAS,OAAO,CAAC;AAClE,aAAS,SAAS,SAAS,OAAO,IAAI,CAAA,WAAU;AAAA,MAC9C,GAAG;AAAA,MACH,aAAa;AAAA,IAAA,EACb;AAEJ,SAAO;AACT
|
|
1
|
+
{"version":3,"file":"setOwnership.js","sources":["../../../src/util/brick/setOwnership.ts"],"sourcesContent":["import { ReadSaveObject } from 'brs-js';\n\n/**\n * sets all the bricks in saveData to target's ownership\n * @param player - player\n * @param saveData - save data with unknown ownership\n * @return save data with ownership changed\n */\nexport function setOwnership(\n player: { id: string; name: string },\n saveData: ReadSaveObject,\n) {\n if ('brick_owners' in saveData)\n saveData.brick_owners = [\n { id: player.id, name: player.name, bricks: saveData.bricks.length },\n ];\n\n if (saveData.bricks.length > 0 && 'owner_index' in saveData.bricks[0])\n saveData.bricks = saveData.bricks.map(brick => ({\n ...brick,\n owner_index: 1,\n })) as typeof saveData.bricks;\n\n return saveData;\n}\n\nexport default setOwnership;\n"],"names":[],"mappings":";;AAQO,SAAS,aACd,QACA,UACA;AACA,MAAI,kBAAkB;AACpB,aAAS,eAAe;AAAA,MACtB,EAAE,IAAI,OAAO,IAAI,MAAM,OAAO,MAAM,QAAQ,SAAS,OAAO,OAAA;AAAA,IAAO;AAGvE,MAAI,SAAS,OAAO,SAAS,KAAK,iBAAiB,SAAS,OAAO,CAAC;AAClE,aAAS,SAAS,SAAS,OAAO,IAAI,CAAA,WAAU;AAAA,MAC9C,GAAG;AAAA,MACH,aAAa;AAAA,IAAA,EACb;AAEJ,SAAO;AACT;;"}
|
|
@@ -284,7 +284,7 @@ class Database extends EventEmitter {
|
|
|
284
284
|
search = "",
|
|
285
285
|
page = 0,
|
|
286
286
|
sort = "name",
|
|
287
|
-
direction =
|
|
287
|
+
direction = 1,
|
|
288
288
|
limitId = void 0
|
|
289
289
|
} = {}) {
|
|
290
290
|
const pattern$1 = pattern.explode(search);
|
|
@@ -354,7 +354,7 @@ class Database extends EventEmitter {
|
|
|
354
354
|
search = "",
|
|
355
355
|
page = 0,
|
|
356
356
|
sort = "name",
|
|
357
|
-
direction =
|
|
357
|
+
direction = 1
|
|
358
358
|
} = {}) {
|
|
359
359
|
const pattern$1 = pattern.explode(search);
|
|
360
360
|
const query = {
|
|
@@ -513,12 +513,14 @@ class Database extends EventEmitter {
|
|
|
513
513
|
autoUpdateIntervalMins: 60,
|
|
514
514
|
announcementEnabled: true,
|
|
515
515
|
playersEnabled: true,
|
|
516
|
-
saveWorld: true
|
|
516
|
+
saveWorld: true,
|
|
517
|
+
crashRestartEnabled: true
|
|
517
518
|
});
|
|
518
519
|
}
|
|
519
520
|
config.autoUpdateEnabled ??= true;
|
|
520
521
|
config.autoUpdateIntervalMins ??= 60;
|
|
521
522
|
config.saveWorld ??= true;
|
|
523
|
+
config.crashRestartEnabled ??= true;
|
|
522
524
|
return config;
|
|
523
525
|
}
|
|
524
526
|
async setAutoRestartConfig(config) {
|