sonolus-pjsekai-js 1.2.0 → 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.
Binary file
Binary file
Binary file
package/dist/index.cjs CHANGED
@@ -22,7 +22,7 @@ Object.defineProperty(exports, "uscToLevelData", { enumerable: true, get: functi
22
22
  __exportStar(require("./usc/index.cjs"), exports);
23
23
  var revert_cjs_1 = require("./usc/revert.cjs");
24
24
  Object.defineProperty(exports, "uscToUSC", { enumerable: true, get: function () { return revert_cjs_1.uscToUSC; } });
25
- exports.version = '1.2.0';
25
+ exports.version = '1.2.1';
26
26
  exports.databaseEngineItem = {
27
27
  name: 'prosekaR',
28
28
  version: 13,
package/dist/index.d.cts CHANGED
@@ -2,7 +2,7 @@ export { susToUSC } from './sus/convert.cjs';
2
2
  export { uscToLevelData } from './usc/convert.cjs';
3
3
  export * from './usc/index.cjs';
4
4
  export { uscToUSC } from './usc/revert.cjs';
5
- export declare const version = "1.2.0";
5
+ export declare const version = "1.2.1";
6
6
  export declare const databaseEngineItem: {
7
7
  readonly name: "prosekaR";
8
8
  readonly version: 13;
@@ -1,12 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.uscToUSC = void 0;
4
- /**
5
- * B 타입의 USC Easing 값을 A 타입으로 변환합니다.
6
- * 'inout'은 'in'으로, 'outin'은 'out'으로 매핑됩니다.
7
- * @param ease B 타입의 Easing 값
8
- * @returns A 타입의 Easing 값
9
- */
10
4
  /**
11
5
  * B 타입의 USC 슬라이드 연결 노드를 A 타입으로 변환합니다.
12
6
  * @param connection B 타입의 연결 노트
@@ -70,8 +64,6 @@ const convertConnection = (connection) => {
70
64
  beat: connection.beat,
71
65
  lane: connection.lane,
72
66
  size: connection.size,
73
- // A타입의 ignore 노트는 ease 속성이 필요하지만, B의 end 노트는 없습니다.
74
- // 따라서 'linear'를 기본값으로 사용합니다.
75
67
  ease: 'linear',
76
68
  };
77
69
  }
@@ -86,6 +78,17 @@ const convertConnection = (connection) => {
86
78
  };
87
79
  }
88
80
  };
81
+ /**
82
+ * 정렬을 위해 객체의 대표 beat 값을 가져옵니다.
83
+ * @param obj A 타입 USCObject
84
+ * @returns 정렬에 사용될 beat 값
85
+ */
86
+ const getBeatForSort = (obj) => {
87
+ if (obj.type === 'slide') {
88
+ return obj.connections[0]?.beat ?? 0;
89
+ }
90
+ return obj.beat;
91
+ };
89
92
  /**
90
93
  * B 타입의 USC 객체를 A 타입 USC 객체로 변환합니다.
91
94
  * @param uscB B 타입 USC 객체
@@ -93,6 +96,7 @@ const convertConnection = (connection) => {
93
96
  */
94
97
  const uscToUSC = (uscB) => {
95
98
  const newObjects = [];
99
+ let timeScaleGroupConverted = false; // 첫 번째 timeScaleGroup만 변환하기 위한 플래그
96
100
  for (const object of uscB.objects) {
97
101
  switch (object.type) {
98
102
  case 'bpm':
@@ -103,14 +107,10 @@ const uscToUSC = (uscB) => {
103
107
  });
104
108
  break;
105
109
  case 'single':
110
+ // A타입에는 timeScaleGroup 속성이 없으므로 제거하고 변환합니다.
111
+ const { timeScaleGroup: _, ...singleProps } = object;
106
112
  newObjects.push({
107
- type: 'single',
108
- beat: object.beat,
109
- lane: object.lane,
110
- size: object.size,
111
- critical: object.critical,
112
- trace: object.trace,
113
- // B타입의 'none' 방향은 A타입에 없으므로 undefined로 처리합니다.
113
+ ...singleProps,
114
114
  direction: object.direction === 'none' ? undefined : object.direction,
115
115
  });
116
116
  break;
@@ -118,7 +118,6 @@ const uscToUSC = (uscB) => {
118
118
  {
119
119
  const newSlide = {
120
120
  type: 'slide',
121
- // B타입의 모든 slide는 A타입의 active slide로 간주합니다.
122
121
  active: true,
123
122
  critical: object.critical,
124
123
  connections: object.connections.map(convertConnection),
@@ -127,18 +126,22 @@ const uscToUSC = (uscB) => {
127
126
  }
128
127
  break;
129
128
  case 'timeScaleGroup':
130
- // B타입의 timeScaleGroup A타입의 개별 timeScale 변경점으로 변환합니다.
131
- for (const change of object.changes) {
132
- newObjects.push({
133
- type: 'timeScale',
134
- beat: change.beat,
135
- timeScale: change.timeScale,
136
- });
129
+ // 번째 timeScaleGroup 아직 변환되지 않았다면 변환합니다.
130
+ if (!timeScaleGroupConverted) {
131
+ const sortedChanges = [...object.changes].sort((a, b) => a.beat - b.beat);
132
+ for (const change of sortedChanges) {
133
+ newObjects.push({
134
+ type: 'timeScale',
135
+ beat: change.beat,
136
+ timeScale: change.timeScale,
137
+ });
138
+ }
139
+ // 플래그를 true로 설정하여 이후의 timeScaleGroup들은 무시하도록 합니다.
140
+ timeScaleGroupConverted = true;
137
141
  }
138
142
  break;
139
143
  case 'guide':
140
144
  {
141
- // B타입의 guide를 A타입의 비활성(active: false) 슬라이드로 변환합니다.
142
145
  const guideConnections = object.midpoints.map((midpoint) => ({
143
146
  type: 'ignore',
144
147
  beat: midpoint.beat,
@@ -149,18 +152,17 @@ const uscToUSC = (uscB) => {
149
152
  const newGuideSlide = {
150
153
  type: 'slide',
151
154
  active: false,
152
- // B타입의 guide color가 'yellow'이면 critical로 판단합니다.
153
155
  critical: object.color === 'yellow',
154
156
  connections: guideConnections,
155
157
  };
156
158
  newObjects.push(newGuideSlide);
157
159
  }
158
160
  break;
159
- // 'damage' 노트는 A타입에 없으므로 무시합니다.
160
161
  case 'damage':
161
162
  break;
162
163
  }
163
164
  }
165
+ newObjects.sort((a, b) => getBeatForSort(a) - getBeatForSort(b));
164
166
  return {
165
167
  offset: uscB.offset,
166
168
  objects: newObjects,
@@ -1,5 +1,5 @@
1
- import * as B from './ccIndex.cjs';
2
1
  import * as A from './index.cjs';
2
+ import * as B from './ccIndex.cjs';
3
3
  /**
4
4
  * B 타입의 USC 객체를 A 타입 USC 객체로 변환합니다.
5
5
  * @param uscB B 타입 USC 객체
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sonolus-pjsekai-js",
3
- "version": "1.2.0",
3
+ "version": "1.2.1",
4
4
  "description": "A recreation of Project Sekai: Colorful Stage! engine in Sonolus",
5
5
  "type": "module",
6
6
  "files": [