webgal-parser 4.6.3-beta.1 → 4.6.3

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,19 @@
1
1
  # WebGAL Parser Changelog
2
2
 
3
+ ## [4.6.3] - 2026-08-01
4
+
5
+ 正式发布 4.6.3-beta.1 / beta.2 的多行语句支持,另含以下改动。
6
+
7
+ ### Added
8
+ - 新增 `return` 命令,用于从被 `callScene` 调用的场景提前返回
9
+ - `sceneEntry` 新增 `locals` / `writeReturnTo`,承载 `callScene` 传入的局部变量与返回值写回目标
10
+ - 语音参数识别 `.opus` 扩展名
11
+
12
+ ## [4.6.3-beta.2] - 2026-07-31
13
+
14
+ ### Fixed
15
+ - `sceneTextPreProcess`:折叠序列的首行是空行时(例如空行后面紧跟一条续行),整条序列会被静默丢弃,导致预处理后行数变少。这会击穿「解析后语句 index == 文件行号」,进而让存档进度错位。改用 `null` 哨兵区分「不在折叠序列中」与「首行内容为空串」
16
+
3
17
  ## [4.6.3-beta.1] - 2026-07-31
4
18
 
5
19
  ### Added
@@ -607,7 +607,10 @@ function isEmptyLine(line) {
607
607
  */
608
608
  function sceneTextPreProcessPassTwo(lines) {
609
609
  const processedLines = [];
610
- let currentMultilineContent = "";
610
+ // null 表示当前不在多行序列里。这里不能用空串来判断:
611
+ // 序列的首行本身可能就是空行(比如空行后面紧跟着一条续行),
612
+ // 那样整条序列会被静默丢弃,破坏「预处理前后行数一致」这个前提。
613
+ let currentMultilineContent = null;
611
614
  let placeHolderLines = [];
612
615
  function concat(line) {
613
616
  let trimmed = line.trim();
@@ -617,10 +620,16 @@ function sceneTextPreProcessPassTwo(lines) {
617
620
  currentMultilineContent = currentMultilineContent + trimmed;
618
621
  placeHolderLines.push(placeholderLine(line));
619
622
  }
623
+ /** 把折叠好的整条语句连同补齐行数的占位行一起输出 */
624
+ function flushMultiline() {
625
+ processedLines.push(currentMultilineContent, ...placeHolderLines);
626
+ placeHolderLines = [];
627
+ currentMultilineContent = null;
628
+ }
620
629
  for (const line of lines) {
621
630
  if (line.endsWith('\\')) {
622
631
  const trueLine = line.slice(0, -1);
623
- if (currentMultilineContent === "") {
632
+ if (currentMultilineContent === null) {
624
633
  // first line
625
634
  currentMultilineContent = trueLine;
626
635
  }
@@ -630,20 +639,17 @@ function sceneTextPreProcessPassTwo(lines) {
630
639
  }
631
640
  continue;
632
641
  }
633
- if (currentMultilineContent !== "") {
642
+ if (currentMultilineContent !== null) {
634
643
  // end line
635
644
  concat(line);
636
- processedLines.push(currentMultilineContent);
637
- processedLines.push(...placeHolderLines);
638
- placeHolderLines = [];
639
- currentMultilineContent = "";
645
+ flushMultiline();
640
646
  continue;
641
647
  }
642
648
  processedLines.push(line);
643
649
  }
644
650
  // 场景末行仍以 \ 结尾时循环里没有机会收尾,在这里把累积的内容补出去。
645
- if (currentMultilineContent !== "") {
646
- processedLines.push(currentMultilineContent, ...placeHolderLines);
651
+ if (currentMultilineContent !== null) {
652
+ flushMultiline();
647
653
  }
648
654
  return processedLines;
649
655
  }
package/build/es/index.js CHANGED
@@ -603,7 +603,10 @@ function isEmptyLine(line) {
603
603
  */
604
604
  function sceneTextPreProcessPassTwo(lines) {
605
605
  const processedLines = [];
606
- let currentMultilineContent = "";
606
+ // null 表示当前不在多行序列里。这里不能用空串来判断:
607
+ // 序列的首行本身可能就是空行(比如空行后面紧跟着一条续行),
608
+ // 那样整条序列会被静默丢弃,破坏「预处理前后行数一致」这个前提。
609
+ let currentMultilineContent = null;
607
610
  let placeHolderLines = [];
608
611
  function concat(line) {
609
612
  let trimmed = line.trim();
@@ -613,10 +616,16 @@ function sceneTextPreProcessPassTwo(lines) {
613
616
  currentMultilineContent = currentMultilineContent + trimmed;
614
617
  placeHolderLines.push(placeholderLine(line));
615
618
  }
619
+ /** 把折叠好的整条语句连同补齐行数的占位行一起输出 */
620
+ function flushMultiline() {
621
+ processedLines.push(currentMultilineContent, ...placeHolderLines);
622
+ placeHolderLines = [];
623
+ currentMultilineContent = null;
624
+ }
616
625
  for (const line of lines) {
617
626
  if (line.endsWith('\\')) {
618
627
  const trueLine = line.slice(0, -1);
619
- if (currentMultilineContent === "") {
628
+ if (currentMultilineContent === null) {
620
629
  // first line
621
630
  currentMultilineContent = trueLine;
622
631
  }
@@ -626,20 +635,17 @@ function sceneTextPreProcessPassTwo(lines) {
626
635
  }
627
636
  continue;
628
637
  }
629
- if (currentMultilineContent !== "") {
638
+ if (currentMultilineContent !== null) {
630
639
  // end line
631
640
  concat(line);
632
- processedLines.push(currentMultilineContent);
633
- processedLines.push(...placeHolderLines);
634
- placeHolderLines = [];
635
- currentMultilineContent = "";
641
+ flushMultiline();
636
642
  continue;
637
643
  }
638
644
  processedLines.push(line);
639
645
  }
640
646
  // 场景末行仍以 \ 结尾时循环里没有机会收尾,在这里把累积的内容补出去。
641
- if (currentMultilineContent !== "") {
642
- processedLines.push(currentMultilineContent, ...placeHolderLines);
647
+ if (currentMultilineContent !== null) {
648
+ flushMultiline();
643
649
  }
644
650
  return processedLines;
645
651
  }
@@ -606,7 +606,10 @@ var webgalParser = (function (exports) {
606
606
  */
607
607
  function sceneTextPreProcessPassTwo(lines) {
608
608
  const processedLines = [];
609
- let currentMultilineContent = "";
609
+ // null 表示当前不在多行序列里。这里不能用空串来判断:
610
+ // 序列的首行本身可能就是空行(比如空行后面紧跟着一条续行),
611
+ // 那样整条序列会被静默丢弃,破坏「预处理前后行数一致」这个前提。
612
+ let currentMultilineContent = null;
610
613
  let placeHolderLines = [];
611
614
  function concat(line) {
612
615
  let trimmed = line.trim();
@@ -616,10 +619,16 @@ var webgalParser = (function (exports) {
616
619
  currentMultilineContent = currentMultilineContent + trimmed;
617
620
  placeHolderLines.push(placeholderLine(line));
618
621
  }
622
+ /** 把折叠好的整条语句连同补齐行数的占位行一起输出 */
623
+ function flushMultiline() {
624
+ processedLines.push(currentMultilineContent, ...placeHolderLines);
625
+ placeHolderLines = [];
626
+ currentMultilineContent = null;
627
+ }
619
628
  for (const line of lines) {
620
629
  if (line.endsWith('\\')) {
621
630
  const trueLine = line.slice(0, -1);
622
- if (currentMultilineContent === "") {
631
+ if (currentMultilineContent === null) {
623
632
  // first line
624
633
  currentMultilineContent = trueLine;
625
634
  }
@@ -629,20 +638,17 @@ var webgalParser = (function (exports) {
629
638
  }
630
639
  continue;
631
640
  }
632
- if (currentMultilineContent !== "") {
641
+ if (currentMultilineContent !== null) {
633
642
  // end line
634
643
  concat(line);
635
- processedLines.push(currentMultilineContent);
636
- processedLines.push(...placeHolderLines);
637
- placeHolderLines = [];
638
- currentMultilineContent = "";
644
+ flushMultiline();
639
645
  continue;
640
646
  }
641
647
  processedLines.push(line);
642
648
  }
643
649
  // 场景末行仍以 \ 结尾时循环里没有机会收尾,在这里把累积的内容补出去。
644
- if (currentMultilineContent !== "") {
645
- processedLines.push(currentMultilineContent, ...placeHolderLines);
650
+ if (currentMultilineContent !== null) {
651
+ flushMultiline();
646
652
  }
647
653
  return processedLines;
648
654
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "webgal-parser",
3
- "version": "4.6.3-beta.1",
3
+ "version": "4.6.3",
4
4
  "description": "WebGAL script parser",
5
5
  "scripts": {
6
6
  "test": "vitest",
@@ -94,7 +94,10 @@ function isEmptyLine(line: string): boolean {
94
94
  */
95
95
  function sceneTextPreProcessPassTwo(lines: string[]): string[] {
96
96
  const processedLines: string[] = [];
97
- let currentMultilineContent = "";
97
+ // null 表示当前不在多行序列里。这里不能用空串来判断:
98
+ // 序列的首行本身可能就是空行(比如空行后面紧跟着一条续行),
99
+ // 那样整条序列会被静默丢弃,破坏「预处理前后行数一致」这个前提。
100
+ let currentMultilineContent: string | null = null;
98
101
  let placeHolderLines: string[] = [];
99
102
 
100
103
  function concat(line: string) {
@@ -106,11 +109,18 @@ function sceneTextPreProcessPassTwo(lines: string[]): string[] {
106
109
  placeHolderLines.push(placeholderLine(line));
107
110
  }
108
111
 
112
+ /** 把折叠好的整条语句连同补齐行数的占位行一起输出 */
113
+ function flushMultiline() {
114
+ processedLines.push(currentMultilineContent as string, ...placeHolderLines);
115
+ placeHolderLines = [];
116
+ currentMultilineContent = null;
117
+ }
118
+
109
119
  for (const line of lines) {
110
120
  if (line.endsWith('\\')) {
111
121
  const trueLine = line.slice(0, -1);
112
122
 
113
- if (currentMultilineContent === "") {
123
+ if (currentMultilineContent === null) {
114
124
  // first line
115
125
  currentMultilineContent = trueLine;
116
126
  } else {
@@ -120,14 +130,10 @@ function sceneTextPreProcessPassTwo(lines: string[]): string[] {
120
130
  continue;
121
131
  }
122
132
 
123
- if (currentMultilineContent !== "") {
133
+ if (currentMultilineContent !== null) {
124
134
  // end line
125
135
  concat(line);
126
- processedLines.push(currentMultilineContent);
127
- processedLines.push(...placeHolderLines);
128
-
129
- placeHolderLines = [];
130
- currentMultilineContent = "";
136
+ flushMultiline();
131
137
  continue;
132
138
  }
133
139
 
@@ -135,8 +141,8 @@ function sceneTextPreProcessPassTwo(lines: string[]): string[] {
135
141
  }
136
142
 
137
143
  // 场景末行仍以 \ 结尾时循环里没有机会收尾,在这里把累积的内容补出去。
138
- if (currentMultilineContent !== "") {
139
- processedLines.push(currentMultilineContent, ...placeHolderLines);
144
+ if (currentMultilineContent !== null) {
145
+ flushMultiline();
140
146
  }
141
147
 
142
148
  return processedLines;