sonolus-pjsekai-js 1.1.12 → 1.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/dist/EngineConfiguration +0 -0
- package/dist/EnginePlayData +0 -0
- package/dist/EnginePreviewData +0 -0
- package/dist/EngineWatchData +0 -0
- package/dist/index.cjs +32 -30
- package/dist/index.d.cts +5 -4
- package/dist/sus/analyze.cjs +23 -25
- package/dist/sus/convert.cjs +19 -22
- package/dist/sus/convert.d.cts +1 -1
- package/dist/sus/decode.cjs +318 -0
- package/dist/sus/decode.d.cts +1 -0
- package/dist/sus/index.cjs +18 -0
- package/dist/{usc/index.d.ts → sus/index.d.cts} +19 -19
- package/dist/sus/revert.cjs +339 -0
- package/dist/sus/revert.d.cts +1 -0
- package/dist/usc/ccIndex.cjs +18 -0
- package/dist/usc/ccIndex.d.cts +91 -0
- package/dist/usc/convert.cjs +56 -142
- package/dist/usc/convert.d.cts +2 -2
- package/dist/usc/index.cjs +0 -16
- package/dist/usc/index.d.cts +16 -42
- package/dist/usc/revert.cjs +171 -0
- package/dist/usc/revert.d.cts +8 -0
- package/package.json +39 -39
- package/dist/sus/analyze.d.ts +0 -29
- package/dist/sus/analyze.js +0 -262
- package/dist/sus/convert.d.ts +0 -5
- package/dist/sus/convert.js +0 -301
- package/dist/usc/convert.d.ts +0 -3
- package/dist/usc/convert.js +0 -542
- package/dist/usc/index.js +0 -15
package/dist/EngineConfiguration
CHANGED
Binary file
|
package/dist/EnginePlayData
CHANGED
Binary file
|
package/dist/EnginePreviewData
CHANGED
Binary file
|
package/dist/EngineWatchData
CHANGED
Binary file
|
package/dist/index.cjs
CHANGED
@@ -14,53 +14,55 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
14
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
15
15
|
};
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
17
|
-
exports.databaseEngineItem = exports.version = exports.uscToLevelData = exports.susToUSC = void 0;
|
17
|
+
exports.databaseEngineItem = exports.version = exports.uscToUSC = exports.uscToLevelData = exports.susToUSC = void 0;
|
18
18
|
var convert_cjs_1 = require("./sus/convert.cjs");
|
19
19
|
Object.defineProperty(exports, "susToUSC", { enumerable: true, get: function () { return convert_cjs_1.susToUSC; } });
|
20
20
|
var convert_cjs_2 = require("./usc/convert.cjs");
|
21
21
|
Object.defineProperty(exports, "uscToLevelData", { enumerable: true, get: function () { return convert_cjs_2.uscToLevelData; } });
|
22
22
|
__exportStar(require("./usc/index.cjs"), exports);
|
23
|
-
|
23
|
+
var revert_cjs_1 = require("./usc/revert.cjs");
|
24
|
+
Object.defineProperty(exports, "uscToUSC", { enumerable: true, get: function () { return revert_cjs_1.uscToUSC; } });
|
25
|
+
exports.version = '1.2.1';
|
24
26
|
exports.databaseEngineItem = {
|
25
|
-
name:
|
27
|
+
name: 'prosekaR',
|
26
28
|
version: 13,
|
27
29
|
title: {
|
28
|
-
en:
|
29
|
-
ja:
|
30
|
-
ko:
|
31
|
-
zhs:
|
32
|
-
zht:
|
30
|
+
en: 'ProSeka R',
|
31
|
+
ja: 'プロセカ R',
|
32
|
+
ko: '프로세카 R',
|
33
|
+
zhs: '世界计划 R',
|
34
|
+
zht: '世界計劃 R',
|
33
35
|
},
|
34
36
|
subtitle: {
|
35
|
-
en:
|
36
|
-
ja:
|
37
|
-
ko:
|
38
|
-
zhs:
|
39
|
-
zht:
|
37
|
+
en: 'ProSeka Rush',
|
38
|
+
ja: 'プロセカ ラッシュ',
|
39
|
+
ko: '프로세카 러쉬',
|
40
|
+
zhs: '世界计划 匆忙',
|
41
|
+
zht: '世界計劃 匆忙',
|
40
42
|
},
|
41
43
|
author: {
|
42
|
-
en:
|
44
|
+
en: 'Hyeon2#7895',
|
43
45
|
},
|
44
46
|
description: {
|
45
47
|
en: [
|
46
|
-
|
48
|
+
'A recreation of Project Sekai: Colorful Stage! engine in Sonolus.',
|
47
49
|
`Version: ${exports.version}`,
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
].join(
|
50
|
+
'',
|
51
|
+
'Forked from the pjsekai engine by Burrito#1000.',
|
52
|
+
'https://github.com/NonSpicyBurrito/sonolus-pjsekai-engine',
|
53
|
+
'',
|
54
|
+
'Github:',
|
55
|
+
'https://github.com/hyeon2006/sonolus-pjsekai-js',
|
56
|
+
].join('\n'),
|
55
57
|
ko: [
|
56
|
-
|
58
|
+
'프로젝트 세카이: 컬러풀 스테이지! 엔진을 Sonolus로 재현했습니다.',
|
57
59
|
`버전: ${exports.version}`,
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
].join(
|
60
|
+
'',
|
61
|
+
'Burrito#1000의 pjsekai 엔진에서 포크되었습니다.',
|
62
|
+
'https://github.com/NonSpicyBurrito/sonolus-pjsekai-engine',
|
63
|
+
'',
|
64
|
+
'깃허브:',
|
65
|
+
'https://github.com/hyeon2006/sonolus-pjsekai-js',
|
66
|
+
].join('\n'),
|
65
67
|
},
|
66
68
|
};
|
package/dist/index.d.cts
CHANGED
@@ -1,7 +1,8 @@
|
|
1
|
-
export { susToUSC } from
|
2
|
-
export { uscToLevelData } from
|
3
|
-
export * from
|
4
|
-
export
|
1
|
+
export { susToUSC } from './sus/convert.cjs';
|
2
|
+
export { uscToLevelData } from './usc/convert.cjs';
|
3
|
+
export * from './usc/index.cjs';
|
4
|
+
export { uscToUSC } from './usc/revert.cjs';
|
5
|
+
export declare const version = "1.2.1";
|
5
6
|
export declare const databaseEngineItem: {
|
6
7
|
readonly name: "prosekaR";
|
7
8
|
readonly version: 13;
|
package/dist/sus/analyze.cjs
CHANGED
@@ -4,12 +4,12 @@ exports.analyze = void 0;
|
|
4
4
|
const analyze = (sus) => {
|
5
5
|
const { lines, measureChanges, meta } = parse(sus);
|
6
6
|
// eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing
|
7
|
-
const offset = -+(meta.get(
|
7
|
+
const offset = -+(meta.get('WAVEOFFSET') || '0');
|
8
8
|
if (Number.isNaN(offset))
|
9
|
-
throw new Error(
|
9
|
+
throw new Error('Unexpected offset');
|
10
10
|
const ticksPerBeat = getTicksPerBeat(meta);
|
11
11
|
if (!ticksPerBeat)
|
12
|
-
throw new Error(
|
12
|
+
throw new Error('Missing or unexpected ticks per beat');
|
13
13
|
const barLengths = getBarLengths(lines, measureChanges);
|
14
14
|
const toTick = getToTick(barLengths, ticksPerBeat);
|
15
15
|
const bpms = new Map();
|
@@ -22,27 +22,27 @@ const analyze = (sus) => {
|
|
22
22
|
const [header, data] = line;
|
23
23
|
const measureOffset = measureChanges.find(([changeIndex]) => changeIndex <= index)?.[1] ?? 0;
|
24
24
|
// Time Scale Changes
|
25
|
-
if (header.length === 5 && header.startsWith(
|
25
|
+
if (header.length === 5 && header.startsWith('TIL')) {
|
26
26
|
timeScaleChanges.push(...toTimeScaleChanges(line, toTick));
|
27
27
|
continue;
|
28
28
|
}
|
29
29
|
// BPM
|
30
|
-
if (header.length === 5 && header.startsWith(
|
30
|
+
if (header.length === 5 && header.startsWith('BPM')) {
|
31
31
|
bpms.set(header.substring(3), +data);
|
32
32
|
continue;
|
33
33
|
}
|
34
34
|
// BPM Changes
|
35
|
-
if (header.length === 5 && header.endsWith(
|
35
|
+
if (header.length === 5 && header.endsWith('08')) {
|
36
36
|
bpmChanges.push(...toBpmChanges(line, measureOffset, bpms, toTick));
|
37
37
|
continue;
|
38
38
|
}
|
39
39
|
// Tap Notes
|
40
|
-
if (header.length === 5 && header[3] ===
|
40
|
+
if (header.length === 5 && header[3] === '1') {
|
41
41
|
tapNotes.push(...toNotes(line, measureOffset, toTick));
|
42
42
|
continue;
|
43
43
|
}
|
44
44
|
// Streams
|
45
|
-
if (header.length === 6 && (header[3] ===
|
45
|
+
if (header.length === 6 && (header[3] === '3' || header[3] === '9')) {
|
46
46
|
const key = `${header[5]}-${header[3]}`;
|
47
47
|
const stream = streams.get(key);
|
48
48
|
if (stream) {
|
@@ -57,7 +57,7 @@ const analyze = (sus) => {
|
|
57
57
|
continue;
|
58
58
|
}
|
59
59
|
// Directional Notes
|
60
|
-
if (header.length === 5 && header[3] ===
|
60
|
+
if (header.length === 5 && header[3] === '5') {
|
61
61
|
directionalNotes.push(...toNotes(line, measureOffset, toTick));
|
62
62
|
continue;
|
63
63
|
}
|
@@ -79,11 +79,11 @@ const parse = (sus) => {
|
|
79
79
|
const measureChanges = [];
|
80
80
|
const meta = new Map();
|
81
81
|
for (const line of sus
|
82
|
-
.split(
|
82
|
+
.split('\n')
|
83
83
|
.map((line) => line.trim())
|
84
|
-
.filter((line) => line.startsWith(
|
85
|
-
const isLine = line.includes(
|
86
|
-
const index = line.indexOf(isLine ?
|
84
|
+
.filter((line) => line.startsWith('#'))) {
|
85
|
+
const isLine = line.includes(':');
|
86
|
+
const index = line.indexOf(isLine ? ':' : ' ');
|
87
87
|
if (index === -1)
|
88
88
|
continue;
|
89
89
|
const left = line.substring(1, index).trim();
|
@@ -91,7 +91,7 @@ const parse = (sus) => {
|
|
91
91
|
if (isLine) {
|
92
92
|
lines.push([left, right]);
|
93
93
|
}
|
94
|
-
else if (left ===
|
94
|
+
else if (left === 'MEASUREBS') {
|
95
95
|
measureChanges.unshift([lines.length, +right]);
|
96
96
|
}
|
97
97
|
else {
|
@@ -105,7 +105,7 @@ const parse = (sus) => {
|
|
105
105
|
};
|
106
106
|
};
|
107
107
|
const getTicksPerBeat = (meta) => {
|
108
|
-
const request = meta.get(
|
108
|
+
const request = meta.get('REQUEST');
|
109
109
|
if (!request)
|
110
110
|
return;
|
111
111
|
if (!request.startsWith('"ticks_per_beat ') || !request.endsWith('"'))
|
@@ -118,7 +118,7 @@ const getBarLengths = (lines, measureChanges) => {
|
|
118
118
|
const [header, data] = line;
|
119
119
|
if (header.length !== 5)
|
120
120
|
continue;
|
121
|
-
if (!header.endsWith(
|
121
|
+
if (!header.endsWith('02'))
|
122
122
|
continue;
|
123
123
|
const measure = +header.substring(0, 3) +
|
124
124
|
(measureChanges.find(([changeIndex]) => changeIndex <= index)?.[1] ?? 0);
|
@@ -143,7 +143,7 @@ const getToTick = (barLengths, ticksPerBeat) => {
|
|
143
143
|
return (measure, p, q) => {
|
144
144
|
const bar = bars.find((bar) => measure >= bar.measure);
|
145
145
|
if (!bar)
|
146
|
-
throw new Error(
|
146
|
+
throw new Error('Unexpected missing bar');
|
147
147
|
return (bar.ticks +
|
148
148
|
(measure - bar.measure) * bar.ticksPerMeasure +
|
149
149
|
(p * bar.ticksPerMeasure) / q);
|
@@ -155,22 +155,20 @@ const toBpmChanges = (line, measureOffset, bpms, toTick) => toRaws(line, measure
|
|
155
155
|
}));
|
156
156
|
const toTimeScaleChanges = ([, data], toTick) => {
|
157
157
|
if (!data.startsWith('"') || !data.endsWith('"'))
|
158
|
-
throw new Error(
|
158
|
+
throw new Error('Unexpected time scale changes');
|
159
159
|
return data
|
160
160
|
.slice(1, -1)
|
161
|
-
.split(
|
161
|
+
.split(',')
|
162
162
|
.map((segment) => segment.trim())
|
163
163
|
.filter((segment) => !!segment)
|
164
164
|
.map((segment) => {
|
165
165
|
const [l, rest] = segment.split("'");
|
166
|
-
const [m, r] = rest.split(
|
166
|
+
const [m, r] = rest.split(':');
|
167
167
|
const measure = +l;
|
168
168
|
const tick = +m;
|
169
169
|
const timeScale = +r;
|
170
|
-
if (Number.isNaN(measure) ||
|
171
|
-
|
172
|
-
Number.isNaN(timeScale))
|
173
|
-
throw new Error("Unexpected time scale change");
|
170
|
+
if (Number.isNaN(measure) || Number.isNaN(tick) || Number.isNaN(timeScale))
|
171
|
+
throw new Error('Unexpected time scale change');
|
174
172
|
return {
|
175
173
|
tick: toTick(measure, 0, 1) + tick,
|
176
174
|
timeScale,
|
@@ -212,7 +210,7 @@ const toSlides = (stream) => {
|
|
212
210
|
const toRaws = ([header, data], measureOffset, toTick) => {
|
213
211
|
const measure = +header.substring(0, 3) + measureOffset;
|
214
212
|
return (data.match(/.{2}/g) ?? [])
|
215
|
-
.map((value, i, values) => value !==
|
213
|
+
.map((value, i, values) => value !== '00' && {
|
216
214
|
tick: toTick(measure, i, values.length),
|
217
215
|
value,
|
218
216
|
})
|
package/dist/sus/convert.cjs
CHANGED
@@ -32,20 +32,20 @@ const susToUSC = (sus) => {
|
|
32
32
|
const key = getKey(note);
|
33
33
|
switch (note.type) {
|
34
34
|
case 1:
|
35
|
-
flickMods.set(key,
|
35
|
+
flickMods.set(key, 'up');
|
36
36
|
break;
|
37
37
|
case 3:
|
38
|
-
flickMods.set(key,
|
38
|
+
flickMods.set(key, 'left');
|
39
39
|
break;
|
40
40
|
case 4:
|
41
|
-
flickMods.set(key,
|
41
|
+
flickMods.set(key, 'right');
|
42
42
|
break;
|
43
43
|
case 2:
|
44
|
-
easeMods.set(key,
|
44
|
+
easeMods.set(key, 'in');
|
45
45
|
break;
|
46
46
|
case 5:
|
47
47
|
case 6:
|
48
|
-
easeMods.set(key,
|
48
|
+
easeMods.set(key, 'out');
|
49
49
|
break;
|
50
50
|
}
|
51
51
|
}
|
@@ -77,14 +77,14 @@ const susToUSC = (sus) => {
|
|
77
77
|
const objects = [];
|
78
78
|
for (const timeScaleChange of score.timeScaleChanges) {
|
79
79
|
objects.push({
|
80
|
-
type:
|
80
|
+
type: 'timeScale',
|
81
81
|
beat: timeScaleChange.tick / score.ticksPerBeat,
|
82
82
|
timeScale: timeScaleChange.timeScale,
|
83
83
|
});
|
84
84
|
}
|
85
85
|
for (const bpmChange of score.bpmChanges) {
|
86
86
|
objects.push({
|
87
|
-
type:
|
87
|
+
type: 'bpm',
|
88
88
|
beat: bpmChange.tick / score.ticksPerBeat,
|
89
89
|
bpm: bpmChange.bpm,
|
90
90
|
});
|
@@ -92,10 +92,7 @@ const susToUSC = (sus) => {
|
|
92
92
|
for (const note of score.tapNotes) {
|
93
93
|
if (note.lane <= 1 || note.lane >= 14)
|
94
94
|
continue;
|
95
|
-
if (note.type !== 1 &&
|
96
|
-
note.type !== 2 &&
|
97
|
-
note.type !== 5 &&
|
98
|
-
note.type !== 6)
|
95
|
+
if (note.type !== 1 && note.type !== 2 && note.type !== 5 && note.type !== 6)
|
99
96
|
continue;
|
100
97
|
const key = getKey(note);
|
101
98
|
if (preventSingles.has(key))
|
@@ -104,7 +101,7 @@ const susToUSC = (sus) => {
|
|
104
101
|
continue;
|
105
102
|
dedupeSingles.add(key);
|
106
103
|
const object = {
|
107
|
-
type:
|
104
|
+
type: 'single',
|
108
105
|
beat: note.tick / score.ticksPerBeat,
|
109
106
|
lane: note.lane - 8 + note.width / 2,
|
110
107
|
size: note.width / 2,
|
@@ -121,7 +118,7 @@ const susToUSC = (sus) => {
|
|
121
118
|
if (!startNote)
|
122
119
|
continue;
|
123
120
|
const object = {
|
124
|
-
type:
|
121
|
+
type: 'slide',
|
125
122
|
active: slide.type === 3,
|
126
123
|
critical: criticalMods.has(getKey(startNote)),
|
127
124
|
connections: [],
|
@@ -133,12 +130,12 @@ const susToUSC = (sus) => {
|
|
133
130
|
const size = note.width / 2;
|
134
131
|
const trace = traceMods.has(key);
|
135
132
|
const critical = object.critical || criticalMods.has(key);
|
136
|
-
const ease = easeMods.get(key) ??
|
133
|
+
const ease = easeMods.get(key) ?? 'linear';
|
137
134
|
switch (note.type) {
|
138
135
|
case 1: {
|
139
136
|
if (!object.active || slideStartEndRemoveMods.has(key)) {
|
140
137
|
const connection = {
|
141
|
-
type:
|
138
|
+
type: 'ignore',
|
142
139
|
beat,
|
143
140
|
lane,
|
144
141
|
size,
|
@@ -148,13 +145,13 @@ const susToUSC = (sus) => {
|
|
148
145
|
}
|
149
146
|
else {
|
150
147
|
const connection = {
|
151
|
-
type:
|
148
|
+
type: 'start',
|
152
149
|
beat,
|
153
150
|
lane,
|
154
151
|
size,
|
155
152
|
trace,
|
156
153
|
critical,
|
157
|
-
ease: easeMods.get(key) ??
|
154
|
+
ease: easeMods.get(key) ?? 'linear',
|
158
155
|
};
|
159
156
|
object.connections.push(connection);
|
160
157
|
}
|
@@ -163,7 +160,7 @@ const susToUSC = (sus) => {
|
|
163
160
|
case 2: {
|
164
161
|
if (!object.active || slideStartEndRemoveMods.has(key)) {
|
165
162
|
const connection = {
|
166
|
-
type:
|
163
|
+
type: 'ignore',
|
167
164
|
beat,
|
168
165
|
lane,
|
169
166
|
size,
|
@@ -173,7 +170,7 @@ const susToUSC = (sus) => {
|
|
173
170
|
}
|
174
171
|
else {
|
175
172
|
const connection = {
|
176
|
-
type:
|
173
|
+
type: 'end',
|
177
174
|
beat,
|
178
175
|
lane,
|
179
176
|
size,
|
@@ -190,7 +187,7 @@ const susToUSC = (sus) => {
|
|
190
187
|
case 3: {
|
191
188
|
if (tickRemoveMods.has(key)) {
|
192
189
|
const connection = {
|
193
|
-
type:
|
190
|
+
type: 'attach',
|
194
191
|
beat,
|
195
192
|
critical,
|
196
193
|
};
|
@@ -198,7 +195,7 @@ const susToUSC = (sus) => {
|
|
198
195
|
}
|
199
196
|
else {
|
200
197
|
const connection = {
|
201
|
-
type:
|
198
|
+
type: 'tick',
|
202
199
|
beat,
|
203
200
|
lane,
|
204
201
|
size,
|
@@ -214,7 +211,7 @@ const susToUSC = (sus) => {
|
|
214
211
|
if (tickRemoveMods.has(key))
|
215
212
|
break;
|
216
213
|
const connection = {
|
217
|
-
type:
|
214
|
+
type: 'ignore',
|
218
215
|
beat,
|
219
216
|
lane,
|
220
217
|
size,
|
package/dist/sus/convert.d.cts
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
import { USC } from
|
1
|
+
import { USC } from '../usc/index.cjs';
|
2
2
|
export declare const susToUSC: (sus: string) => USC;
|