sonolus-pjsekai-js 1.1.12 → 1.2.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.
Binary file
Binary file
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
- exports.version = "1.1.12";
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.0';
24
26
  exports.databaseEngineItem = {
25
- name: "prosekaR",
27
+ name: 'prosekaR',
26
28
  version: 13,
27
29
  title: {
28
- en: "ProSeka R",
29
- ja: "プロセカ R",
30
- ko: "프로세카 R",
31
- zhs: "世界计划 R",
32
- zht: "世界計劃 R",
30
+ en: 'ProSeka R',
31
+ ja: 'プロセカ R',
32
+ ko: '프로세카 R',
33
+ zhs: '世界计划 R',
34
+ zht: '世界計劃 R',
33
35
  },
34
36
  subtitle: {
35
- en: "ProSeka Rush",
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: "Hyeon2#7895",
44
+ en: 'Hyeon2#7895',
43
45
  },
44
46
  description: {
45
47
  en: [
46
- "A recreation of Project Sekai: Colorful Stage! engine in Sonolus.",
48
+ 'A recreation of Project Sekai: Colorful Stage! engine in Sonolus.',
47
49
  `Version: ${exports.version}`,
48
- "",
49
- "Forked from the pjsekai engine by Burrito#1000.",
50
- "https://github.com/NonSpicyBurrito/sonolus-pjsekai-engine",
51
- "",
52
- "Github:",
53
- "https://github.com/hyeon2006/sonolus-pjsekai-js",
54
- ].join("\n"),
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
- "프로젝트 세카이: 컬러풀 스테이지! 엔진을 Sonolus로 재현했습니다.",
58
+ '프로젝트 세카이: 컬러풀 스테이지! 엔진을 Sonolus로 재현했습니다.',
57
59
  `버전: ${exports.version}`,
58
- "",
59
- "Burrito#1000의 pjsekai 엔진에서 포크되었습니다.",
60
- "https://github.com/NonSpicyBurrito/sonolus-pjsekai-engine",
61
- "",
62
- "깃허브:",
63
- "https://github.com/hyeon2006/sonolus-pjsekai-js",
64
- ].join("\n"),
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 "./sus/convert.cjs";
2
- export { uscToLevelData } from "./usc/convert.cjs";
3
- export * from "./usc/index.cjs";
4
- export declare const version = "1.1.12";
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.0";
5
6
  export declare const databaseEngineItem: {
6
7
  readonly name: "prosekaR";
7
8
  readonly version: 13;
@@ -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("WAVEOFFSET") || "0");
7
+ const offset = -+(meta.get('WAVEOFFSET') || '0');
8
8
  if (Number.isNaN(offset))
9
- throw new Error("Unexpected offset");
9
+ throw new Error('Unexpected offset');
10
10
  const ticksPerBeat = getTicksPerBeat(meta);
11
11
  if (!ticksPerBeat)
12
- throw new Error("Missing or unexpected ticks per beat");
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("TIL")) {
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("BPM")) {
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("08")) {
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] === "1") {
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] === "3" || header[3] === "9")) {
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] === "5") {
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("\n")
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 === "MEASUREBS") {
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("REQUEST");
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("02"))
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("Unexpected missing bar");
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("Unexpected time scale changes");
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
- Number.isNaN(tick) ||
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 !== "00" && {
213
+ .map((value, i, values) => value !== '00' && {
216
214
  tick: toTick(measure, i, values.length),
217
215
  value,
218
216
  })
@@ -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, "up");
35
+ flickMods.set(key, 'up');
36
36
  break;
37
37
  case 3:
38
- flickMods.set(key, "left");
38
+ flickMods.set(key, 'left');
39
39
  break;
40
40
  case 4:
41
- flickMods.set(key, "right");
41
+ flickMods.set(key, 'right');
42
42
  break;
43
43
  case 2:
44
- easeMods.set(key, "in");
44
+ easeMods.set(key, 'in');
45
45
  break;
46
46
  case 5:
47
47
  case 6:
48
- easeMods.set(key, "out");
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: "timeScale",
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: "bpm",
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: "single",
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: "slide",
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) ?? "linear";
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: "ignore",
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: "start",
148
+ type: 'start',
152
149
  beat,
153
150
  lane,
154
151
  size,
155
152
  trace,
156
153
  critical,
157
- ease: easeMods.get(key) ?? "linear",
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: "ignore",
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: "end",
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: "attach",
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: "tick",
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: "ignore",
214
+ type: 'ignore',
218
215
  beat,
219
216
  lane,
220
217
  size,
@@ -1,2 +1,2 @@
1
- import { USC } from "../usc/index.cjs";
1
+ import { USC } from '../usc/index.cjs';
2
2
  export declare const susToUSC: (sus: string) => USC;