diff --git a/packages/parser/src/scriptParser/argsParser.ts b/packages/parser/src/scriptParser/argsParser.ts index 019ecbabb..c9b998d0e 100644 --- a/packages/parser/src/scriptParser/argsParser.ts +++ b/packages/parser/src/scriptParser/argsParser.ts @@ -35,36 +35,39 @@ export function argsParser( key: 'vocal', value: assetSetter(e, fileType.vocal), }); - } else { - // 判断是不是省略参数 - if (argValue === undefined) { - returnArrayList.push({ - key: argName, - value: true, - }); - } else { - // 是字符串描述的布尔值 - if (argValue === 'true' || argValue === 'false') { - returnArrayList.push({ - key: argName, - value: argValue === 'true', - }); - } else { - // 是数字 - if (!isNaN(Number(argValue))) { - returnArrayList.push({ - key: argName, - value: Number(argValue), - }); - } else { - // 是普通参数 - returnArrayList.push({ - key: argName, - value: argValue, - }); - } - } - } + } else if (argName === 'vocal' && argValue !== undefined) { + returnArrayList.push({ + key: argName, + value: assetSetter(argValue, fileType.vocal), + }); + } + // 判断是不是省略参数 + else if (argValue === undefined) { + returnArrayList.push({ + key: argName, + value: true, + }); + } + // 是字符串描述的布尔值 + else if (argValue === 'true' || argValue === 'false') { + returnArrayList.push({ + key: argName, + value: argValue === 'true', + }); + } + // 是数字 + else if (!isNaN(Number(argValue))) { + returnArrayList.push({ + key: argName, + value: Number(argValue), + }); + } + // 是普通参数 + else { + returnArrayList.push({ + key: argName, + value: argValue, + }); } }); return returnArrayList; diff --git a/packages/parser/test/parser.test.ts b/packages/parser/test/parser.test.ts index 87d1cd94b..f2cafaa39 100644 --- a/packages/parser/test/parser.test.ts +++ b/packages/parser/test/parser.test.ts @@ -202,6 +202,27 @@ test("say statement", async () => { expect(result.sentenceList).toContainEqual(expectSentenceItem); }); +test("say statement applies asset setter to vocal named argument", async () => { + const parser = new SceneParser((assetList) => { + }, (fileName, assetType) => { + if (assetType === fileType.vocal) { + return `./game/vocal/${fileName}`; + } + return fileName; + }, ADD_NEXT_ARG_LIST, SCRIPT_CONFIG); + + const result = parser.parse(`say:123 -speaker=xx -vocal=a.mp3;`, 'test', 'test'); + const sentence = result.sentenceList[0]; + + expect(sentence.args).toContainEqual({ key: 'vocal', value: './game/vocal/a.mp3' }); + expect(sentence.sentenceAssets).toContainEqual({ + name: './game/vocal/a.mp3', + url: './game/vocal/a.mp3', + type: fileType.vocal, + lineNumber: 0, + }); +}); + test("wait command", async () => { const parser = new SceneParser((assetList) => { }, (fileName, assetType) => {