sonolus-next-rush-engine 1.0.16 → 1.0.17

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
@@ -60,6 +60,13 @@ const activeConnectorKindMapping = {
60
60
  NormalSlideConnector: ConnectorKind.ACTIVE_NORMAL,
61
61
  CriticalSlideConnector: ConnectorKind.ACTIVE_CRITICAL,
62
62
  };
63
+ const activeSlideStartArchetypes = new Set([
64
+ 'NormalSlideStartNote',
65
+ 'CriticalSlideStartNote',
66
+ 'HiddenSlideStartNote',
67
+ 'NormalTraceSlideStartNote',
68
+ 'CriticalTraceSlideStartNote',
69
+ ]);
63
70
  const flickDirectionMapping = {
64
71
  [-1]: FlickDirection.UP_LEFT,
65
72
  0: FlickDirection.UP_OMNI,
@@ -378,7 +385,7 @@ export const extendedToLevelData = (data, offset = 0) => {
378
385
  return false;
379
386
  if (head.archetype !== 'HiddenSlideStartNote')
380
387
  return false;
381
- if (!['NormalSlideStartNote', 'CriticalSlideStartNote'].includes(start.archetype))
388
+ if (!activeSlideStartArchetypes.has(start.archetype))
382
389
  return false;
383
390
  return (nearlyEqual(getNum(start, '#BEAT'), getNum(head, '#BEAT')) &&
384
391
  nearlyEqual(getNum(start, 'lane'), getNum(head, 'lane')) &&
@@ -483,16 +490,45 @@ export const extendedToLevelData = (data, offset = 0) => {
483
490
  return ultimateTailRef;
484
491
  }
485
492
  function setInferredActiveHead(note, activeHead) {
486
- if (note === activeHead)
487
- return;
488
493
  if (note.refs.activeHead)
489
494
  return;
490
495
  note.set('activeHead', activeHead);
491
496
  }
497
+ function isIgnoredSlideTickRef(ref) {
498
+ return resolveOriginal(ext, ref)?.archetype === 'IgnoredSlideTickNote';
499
+ }
500
+ function getNextConnectorWithHead(startRef, headRef) {
501
+ return ext.connectors.find(({ e }) => getField(e, 'start') === startRef && getField(e, 'head') === headRef);
502
+ }
503
+ function resolveConnectorTailRef(startRef, tailRef) {
504
+ const skippedNoteRefs = [];
505
+ const skippedConnectors = [];
506
+ const visited = new Set();
507
+ let resolvedTailRef = tailRef;
508
+ while (isIgnoredSlideTickRef(resolvedTailRef)) {
509
+ if (resolvedTailRef === undefined)
510
+ break;
511
+ const key = String(resolvedTailRef);
512
+ if (visited.has(key))
513
+ break;
514
+ visited.add(key);
515
+ skippedNoteRefs.push(resolvedTailRef);
516
+ const nextConnector = getNextConnectorWithHead(startRef, resolvedTailRef);
517
+ if (!nextConnector)
518
+ break;
519
+ skippedConnectors.push(nextConnector);
520
+ resolvedTailRef = getField(nextConnector.e, 'tail');
521
+ }
522
+ return { tailRef: resolvedTailRef, skippedNoteRefs, skippedConnectors };
523
+ }
492
524
  for (const { idx, e } of ext.connectors) {
493
525
  const startRef = getField(e, 'start');
494
526
  const headRef = getField(e, 'head');
495
- const tailRef = getField(e, 'tail');
527
+ if (isIgnoredSlideTickRef(headRef))
528
+ continue;
529
+ const { tailRef, skippedNoteRefs, skippedConnectors } = resolveConnectorTailRef(startRef, getField(e, 'tail'));
530
+ if (isIgnoredSlideTickRef(tailRef))
531
+ continue;
496
532
  const tail = getNote(tailRef);
497
533
  const rawHeadOriginal = resolveOriginal(ext, headRef);
498
534
  const tailOriginal = resolveOriginal(ext, tailRef);
@@ -504,7 +540,7 @@ export const extendedToLevelData = (data, offset = 0) => {
504
540
  const endRef = getField(e, 'end');
505
541
  let activeTail = getNote(endRef);
506
542
  if (!activeTail) {
507
- activeTail = getNote(getUltimateTailRef(startRef, getField(e, 'tail')));
543
+ activeTail = getNote(getUltimateTailRef(startRef, tailRef));
508
544
  }
509
545
  if (!activeTail) {
510
546
  activeTail = tail;
@@ -532,6 +568,7 @@ export const extendedToLevelData = (data, offset = 0) => {
532
568
  connector.set('activeHead', activeHead);
533
569
  connector.set('activeTail', activeTail);
534
570
  finalEntities.push(connector);
571
+ setInferredActiveHead(segmentHead, activeHead);
535
572
  segments.push({ head: segmentHead, tail });
536
573
  }
537
574
  else {
@@ -568,9 +605,23 @@ export const extendedToLevelData = (data, offset = 0) => {
568
605
  setInferredActiveHead(segmentNote, activeHead);
569
606
  }
570
607
  setInferredActiveHead(activeTail, activeHead);
608
+ for (const skippedNoteRef of skippedNoteRefs) {
609
+ const skippedNote = getNote(skippedNoteRef);
610
+ if (!skippedNote)
611
+ continue;
612
+ skippedNote.set('attachHead', head);
613
+ skippedNote.set('attachTail', tail);
614
+ skippedNote.set('isAttached', 1);
615
+ setInferredActiveHead(skippedNote, activeHead);
616
+ }
571
617
  connectorsByIndex.set(idx, connectorLink);
572
618
  if (e.name)
573
619
  connectorsByName.set(e.name, connectorLink);
620
+ for (const skippedConnector of skippedConnectors) {
621
+ connectorsByIndex.set(skippedConnector.idx, connectorLink);
622
+ if (skippedConnector.e.name)
623
+ connectorsByName.set(skippedConnector.e.name, connectorLink);
624
+ }
574
625
  }
575
626
  function getConn(ref) {
576
627
  if (typeof ref === 'number')
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.16";
10
+ export declare const version = "1.0.17";
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.16';
68
+ export const version = '1.0.17';
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.16",
3
+ "version": "1.0.17",
4
4
  "description": "Perspective-lane rhythm game for Sonolus",
5
5
  "author": "Hyeon2",
6
6
  "repository": {