sonolus-next-rush-engine 1.1.0 → 1.1.2

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.
@@ -530,7 +530,6 @@ export const extendedToLevelData = (data, offset = 0) => {
530
530
  if (!isSlideTickRef(headRef))
531
531
  return startRef;
532
532
  let ultimateStartRef = startRef;
533
- let ultimateStartBeat = getNum(resolveOriginal(ext, startRef) ?? { archetype: '', data: [] }, '#BEAT');
534
533
  const visited = new Set();
535
534
  function visit(currentHeadRef) {
536
535
  const key = `${archetype}|${String(currentHeadRef)}`;
@@ -539,14 +538,14 @@ export const extendedToLevelData = (data, offset = 0) => {
539
538
  visited.add(key);
540
539
  if (!isSlideTickRef(currentHeadRef))
541
540
  return;
542
- const previousConnectors = ext.connectors.filter((c) => c.e.archetype === archetype && getField(c.e, 'tail') === currentHeadRef);
541
+ let previousConnectors = ext.connectors.filter((c) => c.e.archetype === archetype && getField(c.e, 'tail') === currentHeadRef);
542
+ if (previousConnectors.length === 0) {
543
+ previousConnectors = ext.connectors.filter((c) => c.e.archetype in activeConnectorKindMapping &&
544
+ getField(c.e, 'tail') === currentHeadRef);
545
+ }
543
546
  for (const previousConnector of previousConnectors) {
544
547
  const previousStartRef = getField(previousConnector.e, 'start');
545
- const previousStartBeat = getNum(resolveOriginal(ext, previousStartRef) ?? { archetype: '', data: [] }, '#BEAT');
546
- if (previousStartBeat <= ultimateStartBeat) {
547
- ultimateStartBeat = previousStartBeat;
548
- ultimateStartRef = previousStartRef;
549
- }
548
+ ultimateStartRef = previousStartRef;
550
549
  visit(getField(previousConnector.e, 'head'));
551
550
  }
552
551
  }
@@ -588,6 +587,46 @@ export const extendedToLevelData = (data, offset = 0) => {
588
587
  }
589
588
  return { tailRef: resolvedTailRef, skippedNoteRefs, skippedConnectors };
590
589
  }
590
+ function refKey(ref) {
591
+ const original = resolveOriginal(ext, ref);
592
+ const index = original ? ext.entities.indexOf(original) : -1;
593
+ return index >= 0 ? `index:${index}` : `${typeof ref}:${String(ref)}`;
594
+ }
595
+ function getRefBeat(ref) {
596
+ return getNum(resolveOriginal(ext, ref) ?? { archetype: '', data: [] }, '#BEAT');
597
+ }
598
+ function getConnectorActiveStartRef(archetype, startRef, headRef, endRef) {
599
+ if (endRef !== undefined)
600
+ return startRef;
601
+ return getUltimateStartRef(archetype, startRef, headRef);
602
+ }
603
+ const activeTailRefsByStart = new Map();
604
+ function getActiveTailRef(activeStartRef) {
605
+ const key = refKey(activeStartRef);
606
+ if (activeTailRefsByStart.has(key))
607
+ return activeTailRefsByStart.get(key);
608
+ let activeTailRef;
609
+ let activeTailBeat = Number.NEGATIVE_INFINITY;
610
+ for (const { e } of ext.connectors) {
611
+ const startRef = getField(e, 'start');
612
+ const headRef = getField(e, 'head');
613
+ if (isIgnoredSlideTickRef(headRef))
614
+ continue;
615
+ const endRef = getField(e, 'end');
616
+ const connectorActiveStartRef = getConnectorActiveStartRef(e.archetype, startRef, headRef, endRef);
617
+ if (refKey(connectorActiveStartRef) !== key)
618
+ continue;
619
+ const { tailRef } = resolveConnectorTailRef(e.archetype, startRef, getField(e, 'tail'));
620
+ const candidateTailRef = endRef ?? getUltimateTailRef(e.archetype, activeStartRef, tailRef);
621
+ const candidateTailBeat = getRefBeat(candidateTailRef);
622
+ if (candidateTailBeat >= activeTailBeat) {
623
+ activeTailBeat = candidateTailBeat;
624
+ activeTailRef = candidateTailRef;
625
+ }
626
+ }
627
+ activeTailRefsByStart.set(key, activeTailRef);
628
+ return activeTailRef;
629
+ }
591
630
  for (const { idx, e } of ext.connectors) {
592
631
  const startRef = getField(e, 'start');
593
632
  const headRef = getField(e, 'head');
@@ -600,15 +639,15 @@ export const extendedToLevelData = (data, offset = 0) => {
600
639
  const rawHeadOriginal = resolveOriginal(ext, headRef);
601
640
  const tailOriginal = resolveOriginal(ext, tailRef);
602
641
  const rawHead = getNote(headRef);
603
- const activeStartRef = getUltimateStartRef(e.archetype, startRef, headRef);
642
+ const endRef = getField(e, 'end');
643
+ const activeStartRef = getConnectorActiveStartRef(e.archetype, startRef, headRef, endRef);
604
644
  const activeHead = getNote(activeStartRef);
605
645
  const usesStartAsHead = shouldUseStartAsHead(startRef, headRef);
606
646
  const head = usesStartAsHead ? activeHead : rawHead;
607
647
  const headOriginal = resolveOriginal(ext, usesStartAsHead ? startRef : headRef);
608
- const endRef = getField(e, 'end');
609
- let activeTail = getNote(endRef);
648
+ let activeTail = getNote(endRef ?? getActiveTailRef(activeStartRef));
610
649
  if (!activeTail) {
611
- activeTail = getNote(getUltimateTailRef(e.archetype, activeStartRef, tailRef));
650
+ activeTail = getNote(getActiveTailRef(activeStartRef));
612
651
  }
613
652
  if (!activeTail) {
614
653
  activeTail = tail;
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.1.0";
10
+ export declare const version = "1.1.2";
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.1.0';
68
+ export const version = '1.1.2';
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.1.0",
3
+ "version": "1.1.2",
4
4
  "description": "Perspective-lane rhythm game for Sonolus",
5
5
  "author": "Hyeon2",
6
6
  "repository": {