sonolus-next-rush-engine 1.0.5 → 1.0.7

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.
@@ -87,7 +87,8 @@ const guideKindMapping = {
87
87
  6: ConnectorKind.GUIDE_CYAN,
88
88
  7: ConnectorKind.GUIDE_BLACK,
89
89
  };
90
- const LEGACY_HIDDEN_POP_WINDOW = 1 / 30;
90
+ const LEGACY_HIDDEN_POP_NOTE_SPEED = 10;
91
+ const LEGACY_MIN_HIDDEN_POP_WINDOW = 1 / 30;
91
92
  class ExtData {
92
93
  constructor(entities) {
93
94
  this.byArch = new Map();
@@ -156,6 +157,9 @@ function unlerp(a, b, x) {
156
157
  function clamp01(x) {
157
158
  return Math.min(1, Math.max(0, x));
158
159
  }
160
+ function legacyNoteDuration(noteSpeed) {
161
+ return lerp(0.35, 4, unlerp(12, 1, noteSpeed) ** 1.31);
162
+ }
159
163
  function applyEase(type, x) {
160
164
  const t = clamp01(x);
161
165
  switch (type) {
@@ -468,6 +472,12 @@ export const extendedToLevelData = (data, offset = 0) => {
468
472
  return false;
469
473
  return getNum(tailOriginal, '#BEAT') < getNum(headOriginal, '#BEAT') - 1e-6;
470
474
  }
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
+ }
471
481
  for (const { idx, e } of ext.connectors) {
472
482
  const startRef = getField(e, 'start');
473
483
  const headRef = getField(e, 'head');
@@ -508,13 +518,15 @@ export const extendedToLevelData = (data, offset = 0) => {
508
518
  const ease = easeTypeMapping[getNum(e, 'ease')] ?? EaseType.LINEAR;
509
519
  const tsg = headOriginal ? getTSG(getField(headOriginal, 'timeScaleGroup')) : undefined;
510
520
  const reverseHiddenPopConnector = isReverseHiddenPopConnector(rawHeadOriginal, tailOriginal);
521
+ const hasActiveSlide = !reverseHiddenPopConnector;
511
522
  const splitAnchors = headOriginal && tailOriginal && !reverseHiddenPopConnector
512
523
  ? getConnectorSplitAnchors(headOriginal, tailOriginal, tsg, kind, ease)
513
524
  : [];
514
525
  const segmentEase = splitAnchors.length > 0 ? EaseType.LINEAR : ease;
515
526
  const segmentNotes = [head, ...splitAnchors, tail];
516
527
  if (reverseHiddenPopConnector && rawHeadOriginal && tailOriginal) {
517
- const showTime = beatToTime(getNum(tailOriginal, '#BEAT')) - LEGACY_HIDDEN_POP_WINDOW;
528
+ const popWindow = getLegacyHiddenPopWindow(rawHeadOriginal, tailOriginal);
529
+ const showTime = beatToTime(getNum(tailOriginal, '#BEAT')) - popWindow;
518
530
  const showBeat = timeToBeat(showTime);
519
531
  const gateTsg = createHideUntilTimescaleGroup(showBeat);
520
532
  const segmentHead = createConnectorAnchor(getNum(rawHeadOriginal, '#BEAT'), getNum(rawHeadOriginal, 'lane'), getNum(rawHeadOriginal, 'size'), gateTsg, kind);
@@ -523,8 +535,10 @@ export const extendedToLevelData = (data, offset = 0) => {
523
535
  connector.set('tail', tail);
524
536
  connector.set('segmentHead', segmentHead);
525
537
  connector.set('segmentTail', tail);
526
- connector.set('activeHead', activeHead);
527
- connector.set('activeTail', activeTail);
538
+ if (hasActiveSlide) {
539
+ connector.set('activeHead', activeHead);
540
+ connector.set('activeTail', activeTail);
541
+ }
528
542
  finalEntities.push(connector);
529
543
  }
530
544
  else {
@@ -536,16 +550,20 @@ export const extendedToLevelData = (data, offset = 0) => {
536
550
  connector.set('tail', segmentTail);
537
551
  connector.set('segmentHead', segmentHead);
538
552
  connector.set('segmentTail', segmentTail);
539
- connector.set('activeHead', activeHead);
540
- connector.set('activeTail', activeTail);
553
+ if (hasActiveSlide) {
554
+ connector.set('activeHead', activeHead);
555
+ connector.set('activeTail', activeTail);
556
+ }
541
557
  finalEntities.push(connector);
542
558
  }
543
559
  }
544
560
  const connectorLink = new EntityBuilder('Connector');
545
561
  connectorLink.set('head', head);
546
562
  connectorLink.set('tail', tail);
547
- connectorLink.set('activeHead', activeHead);
548
- connectorLink.set('activeTail', activeTail);
563
+ if (hasActiveSlide) {
564
+ connectorLink.set('activeHead', activeHead);
565
+ connectorLink.set('activeTail', activeTail);
566
+ }
549
567
  for (const segmentHead of segmentNotes.slice(0, -1)) {
550
568
  segmentHead.set('connectorEase', segmentEase);
551
569
  segmentHead.set('segmentKind', kind);
@@ -553,7 +571,9 @@ export const extendedToLevelData = (data, offset = 0) => {
553
571
  }
554
572
  tail.set('segmentKind', kind);
555
573
  tail.set('segmentAlpha', 1);
556
- activeHead.set('segmentKind', kind);
574
+ if (hasActiveSlide) {
575
+ activeHead.set('segmentKind', kind);
576
+ }
557
577
  connectorsByIndex.set(idx, connectorLink);
558
578
  if (e.name)
559
579
  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.5";
10
+ export declare const version = "1.0.7";
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.5';
68
+ export const version = '1.0.7';
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.5",
3
+ "version": "1.0.7",
4
4
  "description": "Perspective-lane rhythm game for Sonolus",
5
5
  "author": "Hyeon2",
6
6
  "repository": {