sonolus-next-rush-engine 1.0.7 → 1.0.9

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
@@ -87,8 +87,6 @@ const guideKindMapping = {
87
87
  6: ConnectorKind.GUIDE_CYAN,
88
88
  7: ConnectorKind.GUIDE_BLACK,
89
89
  };
90
- const LEGACY_HIDDEN_POP_NOTE_SPEED = 10;
91
- const LEGACY_MIN_HIDDEN_POP_WINDOW = 1 / 30;
92
90
  class ExtData {
93
91
  constructor(entities) {
94
92
  this.byArch = new Map();
@@ -157,9 +155,6 @@ function unlerp(a, b, x) {
157
155
  function clamp01(x) {
158
156
  return Math.min(1, Math.max(0, x));
159
157
  }
160
- function legacyNoteDuration(noteSpeed) {
161
- return lerp(0.35, 4, unlerp(12, 1, noteSpeed) ** 1.31);
162
- }
163
158
  function applyEase(type, x) {
164
159
  const t = clamp01(x);
165
160
  switch (type) {
@@ -339,28 +334,6 @@ export const extendedToLevelData = (data, offset = 0) => {
339
334
  }
340
335
  return scaledTime;
341
336
  }
342
- function createHideUntilTimescaleGroup(showBeat) {
343
- const group = new EntityBuilder('#TIMESCALE_GROUP');
344
- const hide = new EntityBuilder('#TIMESCALE_CHANGE');
345
- const show = new EntityBuilder('#TIMESCALE_CHANGE');
346
- const hideBeat = Math.min(0, showBeat - 1e-6);
347
- hide.set('#BEAT', hideBeat);
348
- hide.set('#TIMESCALE', 1);
349
- hide.set('#TIMESCALE_SKIP', 0);
350
- hide.set('#TIMESCALE_GROUP', group);
351
- hide.set('#TIMESCALE_EASE', 0);
352
- hide.set('hideNotes', 1);
353
- hide.set('next', show);
354
- show.set('#BEAT', showBeat);
355
- show.set('#TIMESCALE', 1);
356
- show.set('#TIMESCALE_SKIP', 0);
357
- show.set('#TIMESCALE_GROUP', group);
358
- show.set('#TIMESCALE_EASE', 0);
359
- show.set('hideNotes', 0);
360
- group.set('first', hide);
361
- finalEntities.push(group, hide, show);
362
- return group;
363
- }
364
337
  const notesByIndex = new Map();
365
338
  const notesByName = new Map();
366
339
  const connectorsByIndex = new Map();
@@ -472,12 +445,6 @@ export const extendedToLevelData = (data, offset = 0) => {
472
445
  return false;
473
446
  return getNum(tailOriginal, '#BEAT') < getNum(headOriginal, '#BEAT') - 1e-6;
474
447
  }
475
- function getLegacyHiddenPopWindow(headOriginal, tailOriginal) {
476
- const headTime = beatToTime(getNum(headOriginal, '#BEAT'));
477
- const tailTime = beatToTime(getNum(tailOriginal, '#BEAT'));
478
- const noteDuration = legacyNoteDuration(LEGACY_HIDDEN_POP_NOTE_SPEED);
479
- return Math.max(LEGACY_MIN_HIDDEN_POP_WINDOW, noteDuration - (headTime - tailTime));
480
- }
481
448
  for (const { idx, e } of ext.connectors) {
482
449
  const startRef = getField(e, 'start');
483
450
  const headRef = getField(e, 'head');
@@ -518,27 +485,21 @@ export const extendedToLevelData = (data, offset = 0) => {
518
485
  const ease = easeTypeMapping[getNum(e, 'ease')] ?? EaseType.LINEAR;
519
486
  const tsg = headOriginal ? getTSG(getField(headOriginal, 'timeScaleGroup')) : undefined;
520
487
  const reverseHiddenPopConnector = isReverseHiddenPopConnector(rawHeadOriginal, tailOriginal);
521
- const hasActiveSlide = !reverseHiddenPopConnector;
522
488
  const splitAnchors = headOriginal && tailOriginal && !reverseHiddenPopConnector
523
489
  ? getConnectorSplitAnchors(headOriginal, tailOriginal, tsg, kind, ease)
524
490
  : [];
525
491
  const segmentEase = splitAnchors.length > 0 ? EaseType.LINEAR : ease;
526
492
  const segmentNotes = [head, ...splitAnchors, tail];
527
493
  if (reverseHiddenPopConnector && rawHeadOriginal && tailOriginal) {
528
- const popWindow = getLegacyHiddenPopWindow(rawHeadOriginal, tailOriginal);
529
- const showTime = beatToTime(getNum(tailOriginal, '#BEAT')) - popWindow;
530
- const showBeat = timeToBeat(showTime);
531
- const gateTsg = createHideUntilTimescaleGroup(showBeat);
532
- const segmentHead = createConnectorAnchor(getNum(rawHeadOriginal, '#BEAT'), getNum(rawHeadOriginal, 'lane'), getNum(rawHeadOriginal, 'size'), gateTsg, kind);
494
+ const segmentHead = createConnectorAnchor(getNum(rawHeadOriginal, '#BEAT'), getNum(rawHeadOriginal, 'lane'), getNum(rawHeadOriginal, 'size'), getTSG(getField(rawHeadOriginal, 'timeScaleGroup')) ?? tsg, kind);
533
495
  const connector = new EntityBuilder('Connector');
534
496
  connector.set('head', head);
535
497
  connector.set('tail', tail);
536
498
  connector.set('segmentHead', segmentHead);
537
499
  connector.set('segmentTail', tail);
538
- if (hasActiveSlide) {
539
- connector.set('activeHead', activeHead);
540
- connector.set('activeTail', activeTail);
541
- }
500
+ connector.set('legacyHiddenPop', 1);
501
+ connector.set('activeHead', activeHead);
502
+ connector.set('activeTail', activeTail);
542
503
  finalEntities.push(connector);
543
504
  }
544
505
  else {
@@ -550,20 +511,16 @@ export const extendedToLevelData = (data, offset = 0) => {
550
511
  connector.set('tail', segmentTail);
551
512
  connector.set('segmentHead', segmentHead);
552
513
  connector.set('segmentTail', segmentTail);
553
- if (hasActiveSlide) {
554
- connector.set('activeHead', activeHead);
555
- connector.set('activeTail', activeTail);
556
- }
514
+ connector.set('activeHead', activeHead);
515
+ connector.set('activeTail', activeTail);
557
516
  finalEntities.push(connector);
558
517
  }
559
518
  }
560
519
  const connectorLink = new EntityBuilder('Connector');
561
520
  connectorLink.set('head', head);
562
521
  connectorLink.set('tail', tail);
563
- if (hasActiveSlide) {
564
- connectorLink.set('activeHead', activeHead);
565
- connectorLink.set('activeTail', activeTail);
566
- }
522
+ connectorLink.set('activeHead', activeHead);
523
+ connectorLink.set('activeTail', activeTail);
567
524
  for (const segmentHead of segmentNotes.slice(0, -1)) {
568
525
  segmentHead.set('connectorEase', segmentEase);
569
526
  segmentHead.set('segmentKind', kind);
@@ -571,9 +528,7 @@ export const extendedToLevelData = (data, offset = 0) => {
571
528
  }
572
529
  tail.set('segmentKind', kind);
573
530
  tail.set('segmentAlpha', 1);
574
- if (hasActiveSlide) {
575
- activeHead.set('segmentKind', kind);
576
- }
531
+ activeHead.set('segmentKind', kind);
577
532
  connectorsByIndex.set(idx, connectorLink);
578
533
  if (e.name)
579
534
  connectorsByName.set(e.name, connectorLink);
package/dist/index.d.ts CHANGED
@@ -7,7 +7,7 @@ import { USC } from './usc/index.js';
7
7
  export * from './usc/index.js';
8
8
  export { type ExtendedEntityData, type ExtendedEntityDataField, extendedToLevelData, mmwsToUSC, susToUSC, ucmmwsToLevelData, uscToLevelData, };
9
9
  export declare const convertToLevelData: (input: string | Uint8Array | USC | LevelData, offset?: number) => LevelData;
10
- export declare const version = "1.0.7";
10
+ export declare const version = "1.0.9";
11
11
  export declare const databaseEngineItem: {
12
12
  readonly name: "next-rush";
13
13
  readonly version: 13;
package/dist/index.js CHANGED
@@ -65,7 +65,7 @@ export const convertToLevelData = (input, offset = 0) => {
65
65
  }
66
66
  return uscToLevelData(usc, offset, true, true);
67
67
  };
68
- export const version = '1.0.7';
68
+ export const version = '1.0.9';
69
69
  export const databaseEngineItem = {
70
70
  name: 'next-rush',
71
71
  version: 13,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sonolus-next-rush-engine",
3
- "version": "1.0.7",
3
+ "version": "1.0.9",
4
4
  "description": "Perspective-lane rhythm game for Sonolus",
5
5
  "author": "Hyeon2",
6
6
  "repository": {