指令参考 #
本页列出了所有可用的脚本指令,包括 Naninovel 官方指令、游戏特有指令以及 MOD 新增功能。
指令分类速查 #
| 分类 | 指令 |
|---|---|
| 显示控制 | @back, @char, @hide, @hidechars, @show |
| 动画效果 | @animate, @blur, @shake |
| 对话文本 | @print, @printDebate, @ResetText, @printer, @HidePrinter |
| 音频 | @bgm, @sfx, @voice, @stopBgm, @stopSfx, @StopVoice |
| 流程控制 | @goto, @gosub, @return, @stop, @StopForChoice, @CancelGosub, @Skip |
| 选择分支 | @choice |
| 变量条件 | @set, @if |
| 等待 | @wait, @WaitForNextFrame, @i |
| 审判系统 | @printDebate, @evidence, @timer, @pauseTrial, @debate, @stageCamera, @showStageScreen / @hideStageScreen, @gosubModifyCamera, @gosubCutIn, @courtFire, @badId |
| 魔女图鉴 | @update, @spawn / @despawn, @toast, @gosubResetBook |
| 地图搜查 | @map, @setFlag |
| 视频播放 | @movie |
| UI控制 | @HideUI, @ShowUI, @ProcessInput, @ReturnToTitle |
| 角色动作 | @EmoteJumpDouble |
显示控制指令 #
@back #
功能: 设置背景元素
常用参数:
| 参数 | 类型 | 说明 | 示例 |
|---|---|---|---|
| (外观) | String | 背景外观名称 | 1_1, SolidColor, Transparent |
| Id | String | 背景处理器 | "Stills" (CG图鉴用) |
| SubId | String | 层级,靠前层级遮挡靠后 | "Overlay", "Middle" |
| pos | Vector2 | 位置偏移 (X,Y 百分比) | 50,50, -5,-10 |
| Scale | Float | 缩放比例,支持表达式 | 1.8, {g_backgroundDefaultScale} |
| Rotation | Vector3 | 旋转角度 (X,Y,Z) | ,,0 (仅 Z 轴) |
| tint | Color | 颜色叠加 (RGBA) | "#000000", "#FFFFFFFF" |
| dissolve | String | 自定义转场纹理 | "VerticalBlindGradually" |
| transition | String | 转场效果 | CrossFade, RadialBlur |
| time | Float | 转场时长 (秒) | 1.5, 0 (立即) |
| Lazy | Bool | 从当前状态过渡 (而非重置) | false |
外观类型说明:
| 外观 | 说明 | 用途 |
|---|---|---|
背景ID | 普通背景图片 | @back 5_1 |
Transparent | 完全透明 | 淡入/淡出遮罩层 |
Transparent.Custom | 带自定义转场的透明 | 配合 dissolve 使用特殊转场 |
SolidColor | 纯色背景 (默认黑色) | 场景过渡暗转 |
SolidColor.Custom | 自定义颜色纯色背景 | 配合 tint 指定 RGBA 颜色 |
示例:
; ===== 基础用法 =====
@back 5_1
@back 5_1 Scale:{g_backgroundDefaultScale} time:0 Lazy:false
; ===== CG 图鉴背景 =====
; 使用 Id:"Stills" 加载 CG 图片
@back 270_1 Id:"Stills"
@back 500_1 Id:"Stills" Scale:{g_backgroundDefaultScale} time:0 Lazy:false
; ===== 多层背景 =====
; Middle 层: 实现视差效果或前景遮挡
@back SubId:"Middle" 500_1 pos:50,50 Id:"Stills" Rotation:,,0 Scale:{g_backgroundDefaultScale} time:0.6 Lazy:false
@back SubId:"Middle" 270_1 pos:95,75 Id:"Stills" Scale:3 time:0.6 Lazy:false
; ===== Overlay 遮罩层 =====
; 黑色遮罩 → 透明 (淡入效果)
@back SubId:"Overlay" Transparent tint:"#000000" time:1.2 Lazy:false
; 透明 → 黑色纯色 (淡出效果)
@back SubId:"Overlay" SolidColor time:0.9 Lazy:false
; 自定义转场效果 (百叶窗)
@back SubId:"Overlay" Transparent.Custom dissolve:"VerticalBlindGradually" tint:"#000000" time:0.99 Lazy:false
@back SubId:"Overlay" SolidColor.Custom dissolve:"VerticalBlindGradually" tint:"#000000" time:0.9 Lazy:false
; 白屏闪烁效果
@back SubId:"Overlay" SolidColor.Custom tint:"#FFFFFF00" time:0 Lazy:false
@back SubId:"Overlay" SolidColor.Custom tint:"#FFFFFFFF" time:0.2 Lazy:false
@back SubId:"Overlay" SolidColor.Custom tint:"#FFFFFF00" time:0.2 Lazy:false
; ===== 带位置和旋转 =====
@back 270_1 pos:-5,-10 Id:"Stills" Scale:2.5 time:0 Lazy:false
@back 270_1 pos:50,50 Id:"Stills" Rotation:,,0 Scale:1.5 time:0 Lazy:false
Overlay 遮罩层:
SubId:"Overlay"是最上层遮罩,用于实现淡入淡出和场景过渡效果。Transparent使遮罩变透明 (显示背景),SolidColor使遮罩变为纯色 (遮挡背景)。
Lazy 参数: 游戏脚本中几乎所有
@back和@char都使用了Lazy:false。Lazy 控制动画是否从当前状态过渡 (true) 还是先重置再过渡 (false)。MOD 中建议统一使用Lazy:false。
@char #
功能: 修改人物立绘和表情
常用参数:
| 参数 | 类型 | 说明 | 示例 |
|---|---|---|---|
| id | String | 角色ID.表情 | Ema.4, Sherry.Smile1 |
| SubId | String | 层级 | "Middle" |
| pos | Vector2 | 位置 (百分比) | 50, 50,50, 70,30 |
| Scale | Float | 缩放 | 1.25, 0.75 |
| look | String | 转向 | Left, Right |
| visible | Bool | 是否可见 | true, false |
| transition | String | 转场效果 | DropFade |
| time | Float | 转场时长 | 0.5, 0 (立即) |
| Lazy | Bool | 从当前状态过渡 | false |
表情与部件组合语法:
游戏角色使用分层立绘系统,可以自由组合面部表情、手臂状态和其他部件:
; ===== 基础表情 =====
@char Ema.Normal1 pos:50 Lazy:false
@char Sherry.Smile1 pos:30 Lazy:false
@char Yuki.6 Lazy:false
; ===== 手臂状态组合 =====
; 角色.表情,右手,左手
@char Sherry.Smile1,ArmR16 pos:70 Lazy:false
@char Ema.Smile1,ArmR1,ArmL1 pos:50 Lazy:false
@char Hanna.Angry1,ArmR2,ArmL2 pos:70,50 Lazy:false
; ===== 特殊部件 =====
; Option 前缀用于可选部件
@char Alisa.Normal1,Option-ArmL-Off pos:50 Lazy:false
@char AnAn.Normal1,Angle01/Option_Arms- pos:50 Lazy:false
; ===== 高级分层表情 (Angle 路径语法) =====
; 格式: Angle路径/部件组>具体状态
; 可精确控制眼睛、嘴巴、脸红、汗水等
@char Hiro.Head1,Pale1-Off,Sweat1-Off,Cheeks1-Normal,Angle01/Head01/Facial01/Eyes01>Eyes01_Angry_Open,Angle01/Head01/Facial01/Mouth01>Mouth01_Fearful_Open pos:70 Lazy:false
; 组合面部状态
@char Ema.Determined2,ArmR3,ArmL10,Angle01/Head02/Facial02/Mouth02>Mouth02_Angry_Open time:0 Lazy:false
; 多部件组合
@char Coco.Fearful1,ArmR6,ArmL7,Angle01/Facial/Eyes>Eyes_Surprised_Open,Angle01/Facial/Mouth>Mouth_Normal_Open,Angle01/Facial/Sweat>Sweat01 Lazy:false
; ===== SubId 层级 =====
; 使用 Middle 层实现近景特写
@char SubId:"Middle" Hiro.Smile1 pos:30,30 Scale:1.25 Lazy:false
@char SubId:"Middle" Ema.Smile1,ArmR1,ArmL1 pos:70,30 Scale:1.25 Lazy:false
; ===== 隐藏角色 =====
@char Warden visible:false
自定义角色: 支持加载外部立绘,参见 加载外部立绘资源
Angle 路径语法: 格式为
Angle编号/部件组/子部件>状态名。常见部件:
Eyes— 眼睛:Eyes_Angry_Open,Eyes_Surprised_Open,Eyes_Pensive_Open01Mouth— 嘴巴:Mouth_Normal_Open,Mouth_Yell_Open,Mouth_Smile_Closed1Sweat— 汗水:Sweat01,Sweat01_01Option_Arms— 手臂:Option_Arms01_05,Option_ArmR01_02并非所有角色都支持 Angle 路径语法,取决于角色立绘的分层设计。
@hide #
功能: 隐藏指定的 Actor (角色/背景/文字框/选择框)
常用参数:
| 参数 | 类型 | 说明 | 示例 |
|---|---|---|---|
| (目标) | String | 要隐藏的 Actor ID | Ema, Stills |
| time | Float | 隐藏动画时长 | 0, 0.6 |
| Lazy | Bool | 从当前状态过渡 | false |
示例:
; 隐藏角色
@hide Ema Lazy:false
; 立即隐藏 (time:0)
@hide Stills time:0 Lazy:false
; 隐藏 Middle 层背景
@hide Stills-Middle time:0.6 Lazy:false
@hide MainBackground-Middle Lazy:false
; 带转场效果
@hide Sherry transition:RadialBlur time:1.0
@hidechars #
功能: 隐藏所有可见的角色
示例:
@hideChars
@hideChars Lazy:false
@hideChars time:0 Lazy:false
@hideChars time:1.5
@show #
功能: 显示之前隐藏的 Actor
示例:
@show Ema
@show Printer
动画效果指令 #
@animate #
功能: 通过关键帧动画修改 Actor 的属性 (位置、缩放等)
常用参数:
| 参数 | 类型 | 说明 | 示例 |
|---|---|---|---|
| (目标) | String | Actor ID | Stills, MainBackground |
| Loop | Bool | 是否循环 | false |
| posX | String | X 轴位置 | "15", "80" |
| posY | String | Y 轴位置 | "50" |
| Scale | String | 缩放 | "1.15" |
| easing | String | 缓动函数 | "EaseOutQuad" |
| time | String | 动画时长 | "1.5", "20" |
示例:
; 背景平移动画 (CG 镜头移动效果)
@back 270_1 pos:-5,-10 Id:"Stills" Scale:2.5 time:0 Lazy:false
@animate Stills Loop:false posX:"15" easing:"EaseOutQuad" time:"1.5"
@Wait "2.4"
; 停止动画
@animate Stills Loop:false
; Middle 层动画
@animate Stills-Middle Loop:false posX:"80" easing:"EaseOutQuad" time:"1.5"
@Wait "2.4"
@animate Stills-Middle Loop:false
; 缩放动画 (放大效果)
@animate Stills Loop:false Scale:"1.15" easing:"EaseOutQuad" time:"2.4"
; 长时间缓慢平移 (用于审判庭场景)
@animate MainBackground Loop:false posX:"25" time:"20"
注意:
@animate的参数值需要用引号包裹。动画完成后建议使用@animate 目标名 Loop:false(不带其他参数) 来停止动画,避免状态冲突。
@blur #
功能: 为 Actor (角色/背景) 添加模糊效果
常用参数:
| 参数 | 类型 | 说明 | 示例 |
|---|---|---|---|
| (目标) | String | Actor ID | Yuki, "Stills" |
| power | Float | 模糊强度 (0-1) | 1 (强模糊), 0 (取消) |
| time | Float | 过渡时长 | 0 (立即), 1.8 |
示例:
; 模糊角色
@blur Yuki power:1
; 取消模糊
@blur Yuki power:0
; 立即模糊背景
@blur "Stills" time:0
@blur "MainBackground-Middle" time:0
; 渐变取消模糊
@blur "Stills" power:0 time:1.8
; 模糊 Middle 层角色
@blur "Jailer-Middle"
@shake #
功能: 让 Actor 产生震动效果
常用参数:
| 参数 | 类型 | 说明 | 示例 |
|---|---|---|---|
| (目标) | String | 震动目标 | Debate |
| hor | Bool | 水平震动 | true |
| ver | Bool | 垂直震动 | true |
| count | Int | 震动次数 (0=循环,-1=停止) | 0, -1 |
示例:
; 开始震动 (循环)
@shake Debate hor:true ver:true count:0
; 停止震动
@shake Debate count:-1
对话文本指令 #
@print #
功能: 打印文本到对话框
常用参数:
| 参数 | 类型 | 说明 |
|---|---|---|
| text | String | 要显示的文本 |
| author | String | 说话角色ID |
| speed | Float | 文本显示速度 |
| reset | Bool | 是否清空之前的文本 |
| waitInput | Bool | 是否等待玩家输入 |
| Wait | Bool | 是否等待文本显示完成 |
示例:
; 简写形式 (推荐)
雪莉: 我是完美的名侦探雪莉!
; 完整形式 (游戏脚本常用)
@print "我是完美的名侦探雪莉!" author:"Sherry" speed:1 waitInput:true Wait:true
; 不带角色名 (叙述)
@print "进入会客厅后,<br>我观察着陆续进来的少女们。" speed:1 waitInput:true Wait:true
; 带角色名的独白
@print "(她们就是【魔女】……?)" author:"Hiro" speed:1 waitInput:true Wait:true
; 带富文本标签
雪莉: 这是<color=#ff0000>红色</color>的文字!
简写与完整形式: 简写形式
角色名: 对话更简洁,适合简单对话。完整形式speed、waitInput、Wait等参数。游戏原始脚本统一使用完整形式。
@printDebate #
功能: 显示审判辩论对话 (3D法庭专用)
常用参数:
| 参数 | 类型 | 说明 | 示例 |
|---|---|---|---|
| text | String | 辩论文本 | "这就是证据!" |
| pos | Vector2 | 屏幕位置 (百分比) | 65,50 |
| Roll | Float | 旋转角度 | 4, -3 |
| speed | Float | 文本速度 | 1.0 |
链接语法: 使用 <link="标签">文本</link> 创建可点击区域
示例:
; 基础辩论
@printDebate pos:65,50 Roll:4 "被告自始至终就对艾玛……" speed:1
; 带可点击链接
@printDebate pos:65,50 Roll:3 "抱有<br><link=\"LoveEvidence\"><size=175%>爱意</size></link>!" speed:1
; 反方辩论 (负角度)
@printDebate pos:30,50 Roll:-4 "等、等一下……<br>这种事怎么能当众说!" speed:1
@ResetText #
功能: 清空当前显示的文本
示例:
; 清空默认打印器
@ResetText
; 清空指定打印器
@ResetText "Debate"
@printer #
功能: 切换文本打印器
示例:
; 切换到默认打印器,隐藏其他打印器
@printer Normal.Default default:true HideOther:true Lazy:false
游戏使用两种打印器:
Normal.Default(普通对话) 和Debate(辩论文本)。切换场景时需要切回对应的打印器。
@HidePrinter #
功能: 隐藏文本打印器
示例:
; 隐藏默认打印器
@HidePrinter
; 隐藏辩论打印器
@HidePrinter "Debate"
音频指令 #
@bgm #
功能: 播放背景音乐
常用参数:
| 参数 | 类型 | 说明 |
|---|---|---|
| path | String | 音频文件名 (不含扩展名) |
| intro | String | 前奏音轨 (播放一次后循环主音轨) |
| volume | Float | 音量 (0-1) |
| loop | Bool | 是否循环 |
| fade | Float | 淡入时长 (秒) |
示例:
; 基础用法
@bgm "Bgm_26_1" Volume:1 Loop:true fade:0
; 带前奏的BGM (前奏播放一次,然后循环主音轨)
@bgm "Bgm_12_1_Loop" intro:"Bgm_12_1_Intro" Volume:1 Loop:true fade:0
@bgm "Bgm_2_1_Loop" intro:"Bgm_2_1_Intro" Volume:1 Loop:true fade:0
; 带淡入
@bgm "Trial_1" volume:0.8 fade:2.0
@sfx #
功能: 播放音效
常用参数:
| 参数 | 类型 | 说明 |
|---|---|---|
| path | String | 音效文件名 |
| Volume | Float | 音量 (0-1) |
| Loop | Bool | 是否循环 |
| fade | Float | 淡入时长 |
示例:
@sfx "Sfx_8" Volume:1 Loop:false fade:0
@sfx "Sfx_Common_1" Volume:1 Loop:false fade:0
@sfx "DoorOpen" volume:0.5
@voice #
功能: 播放角色对话语音
示例:
; 基础用法
@voice "Ema_001"
; 使用子目录路径 (MOD名/文件名)
@voice "TaffyStory001/Hiro_00"
@voice "TaffyStory000/Sherry_01"
自定义语音: 参见 加载语音
@StopVoice #
功能: 停止当前正在播放的语音
示例:
@StopVoice
@stopBgm #
功能: 停止背景音乐
示例:
@stopBgm
@stopBgm fade:1.5
@stopSfx #
功能: 停止音效
示例:
@stopSfx "DoorOpen"
流程控制指令 #
@goto #
功能: 跳转到指定脚本位置
常用参数:
| 参数 | 类型 | 说明 |
|---|---|---|
| path | String | 跳转路径 (脚本名.标签) |
| soft | Bool | 软跳转,不重置状态 |
示例:
; 跳转到当前文件的标签
@goto .LabelName
; 跳转到其他文件
@goto ModName/ScriptFile.LabelName
; 软跳转 (不重置引擎状态,适合审判场景间跳转)
@goto soft:true SherryAppleJuice_IfAlive001/Trial01
@goto soft:true SherryAppleJuice_IfAlive000/Trial00
soft 参数: 使用
soft:true时,跳转不会重置引擎状态 (背景、角色、音乐等保持不变)。适用于审判场景中的幕间跳转。
@gosub #
功能: 跳转到子程序,遇到 @return 后返回
示例:
@gosub .SubRoutine
; 跳转到其他文件
@gosub Common/DialogueUtils.ShowChoice
@return #
功能: 从 @gosub 调用中返回
示例:
# SubRoutine
雪莉: 这是子程序!
@return
@stop #
功能: 停止脚本执行
示例:
; 坏结局
雪莉: 审判失败了……
@stop
@StopForChoice #
功能: 等待选择 (通常与 @choice 配合)
常用参数:
| 参数 | 类型 | 说明 |
|---|---|---|
| Clear | Bool | 是否清除选项 |
示例:
@StopForChoice Clear:false
@CancelGosub #
功能: 取消 gosub 调用栈,使 @return 不再回到之前的位置
示例:
; 在审判选对答案后,取消 gosub 栈并跳转到下一阶段
@CancelGosub
@goto .NextPhase
@Skip #
功能: 控制玩家是否可以跳过文本
示例:
; 禁止跳过 (审判弱点选择时使用)
@Skip false
选择分支指令 #
@choice #
功能: 显示选项按钮
常用参数:
| 参数 | 类型 | 说明 |
|---|---|---|
| text | String | 选项文本 |
| goto | String | 跳转目标 |
| set | String | 设置变量 |
| do | String | 执行指令 |
| Lock | Bool | 是否锁定 (禁用) |
| button | String | 按钮预制体路径 |
| handler | String | 选择处理器ID |
| play | Bool | 选择后是否自动继续 |
| show | Bool | 是否显示选择面板 |
审判按钮类型:
| button 路径 | 说明 |
|---|---|
ChoiceButtons/Trial/Objection | 异议 (指出问题) |
ChoiceButtons/Trial/Cancel | 取消/返回 |
ChoiceButtons/Trial/Perjury | 伪证 (指出伪证) |
示例:
; ===== 普通选项 =====
@choice "继续审判" goto:.ContinueTrial
@choice "回到主菜单" do:"@returntotitle"
; 带变量设置
@choice "选择A" set:"playerChoice=A" goto:.ResultA
@choice "选择B" set:"playerChoice=B" goto:.ResultB
@StopForChoice
; ===== 审判选项 (完整格式) =====
; 异议按钮
@choice "人是无罪的" Lock:false button:"ChoiceButtons/Trial/Objection" handler:"TrialHiro" play:true show:true
@sfx "Sfx_System_SaveData_001_2x" Volume:1 Loop:false fade:0
@StopVoice
@pauseTrial false timer:true
@printDebate pos:70,50 Roll:4 "你的反驳无效。" speed:1
@return
; 返回按钮
@choice "返回" Lock:false button:"ChoiceButtons/Trial/Cancel" handler:"TrialHiro" play:true show:true
@pauseTrial false timer:true
@Wait "i{debateWaitTime}"
@Return
@StopForChoice Clear:false
; ===== 伪证按钮 =====
@choice "艾玛不可能有勇气" Lock:false button:"ChoiceButtons/Trial/Perjury" handler:"TrialHiro" play:true show:true
@sfx "Sfx_System_SaveData_001_2x" Volume:1 Loop:false fade:0
@StopVoice
@CancelGosub
@goto .NextPhase
审判选项嵌套: 审判中的
@choice使用嵌套命令 (缩进),选择后直接执行嵌套内的指令。handler:"TrialHiro"指定审判专用的选择处理器。
变量和条件指令 #
@set #
功能: 设置变量
示例:
; 设置变量
@set counter=0
@set playerName="雪莉"
@set hasKey=true
; 变量运算
@set counter=counter+1
@set score=score*2
详细说明: 参见 变量与表达式
@if #
功能: 条件判断
示例:
@if counter>5
雪莉: 计数器大于5!
@endif
@if hasKey
@goto .OpenDoor
@else
雪莉: 没有钥匙……
@endif
等待指令 #
@wait #
功能: 等待指定时长或条件
示例:
; 等待秒数
@wait 2.5
; 等待带 i 前缀 (忽略跳过)
@wait i1.5
; 等待用户点击
@wait i
@WaitForNextFrame #
功能: 等待下一帧 (极短时间)
示例:
@WaitForNextFrame
@i #
功能: 等待用户输入 (点击/按键)
示例:
@i
审判系统指令 🎯 #
@evidence #
功能: 出示证据 (审判中的证物/人物档案)
常用参数:
| 参数 | 类型 | 说明 |
|---|---|---|
| correct | String | 正确答案的ID |
| type | String | 类型: Clue (证物) 或 Profile (人物档案) |
示例:
; 出示证物
@evidence correct:"MaxMixAlex_ManosabaModEnhance_1-1" Clue
; 出示人物档案
@evidence correct:"Hiro" Profile
; 出示原版证物
@evidence correct:"1-1" Clue
注意: 必须与 @printDebate 的链接标签配合使用
@timer #
功能: 设置审判倒计时
参数: 时长 (秒)
示例:
; 设置 720 秒 (12分钟) 倒计时
@timer 720
; 设置超长倒计时 (几乎无限)
@timer 5999
@pauseTrial #
功能: 暂停/恢复审判状态和计时器
常用参数:
| 参数 | 类型 | 说明 |
|---|---|---|
| (暂停) | Bool | true 暂停,false 恢复 |
| timer | Bool | 是否同时暂停/恢复计时器 |
示例:
; 恢复审判和计时器 (辩论开始)
@pauseTrial false timer:true
; 暂停审判和计时器 (辩论结束)
@pauseTrial true timer:true
; 恢复审判但不恢复计时器 (特殊场景)
@pauseTrial false timer:false
@debate #
功能: 开启/关闭辩论模式
示例:
; 关闭辩论模式 (结束时调用)
@debate false
@stageCamera #
功能: 控制 3D 审判法庭的摄像机位置和旋转
常用参数:
| 参数 | 类型 | 说明 | 示例 |
|---|---|---|---|
| (索引) | Int | 摄像机索引 (0 或 1) | 0, 1 |
| Height | Float | 摄像机高度 | 5.6, 3, 4 |
| Rotation | Vector3 | 旋转角度 (X,Y,Z) | 0,{expr},0 |
| Distance | Float | 距离中心的距离 | 12, 4, 7 |
| time | Float | 过渡时长 | 0 (立即), 1 |
| easing | String | 缓动函数 | "OutQuad" |
Rotation Y 轴公式:
审判庭为圆形布局,角色按索引分布在圆周上。使用公式 { (角色索引 / courtStandCount * 360) } 计算 Y 轴旋转角度,使摄像机面向指定角色。
示例:
; ===== TrialInit 中设置法庭参数 =====
@set "courtStandCount = 12"
@set "emaIdx = 0"
@set "hiroIdx = 8"
; ===== 摄像机设置 =====
; 立即定位到角色 (time:0)
@stageCamera 0 Height:5.6 Rotation:0,{ (8 / courtStandCount * 360) },0 Distance:12 time:0
@WaitForNextFrame
; 缓慢旋转到相邻位置 (动画效果)
@stageCamera 0 Rotation:0,{ (7.9 / courtStandCount * 360) },0 time:1 easing:"OutQuad"
; 近距离特写摄像机
@stageCamera 1 Height:3 Rotation:-2,{ (2.2 / courtStandCount * 360) },-2 Distance:4 time:0
; 环绕旋转 (长时间动画)
@stageCamera 1 Height:4 Rotation:-1,{ (5.8 / courtStandCount * 360) } time:25
; 全景摄像机
@stageCamera 0 Height:5 Distance:7 time:0
双摄像机系统: 索引
0和1分别对应两个摄像机,配合@showStageScreen/@hideStageScreen实现分屏和镜头切换效果。
@showStageScreen / @hideStageScreen #
功能: 显示/隐藏 3D 法庭场景的渲染画面
常用参数:
| 参数 | 类型 | 说明 | 示例 |
|---|---|---|---|
| (索引) | Int | 画面索引 (0 或 1) | 0, 1 |
| time | Float | 过渡时长 | 0 (立即) |
| Reset | Bool | 是否重置状态 | true |
示例:
; 显示 3D 法庭画面
@showStageScreen 1
; 隐藏 3D 法庭画面
@hideStageScreen 1 Reset:true
; 立即隐藏
@hideStageScreen 1 time:0 Reset:true
@hideStageScreen 0 time:0 Reset:true
@unloadStage #
功能: 卸载 3D 法庭场景 (释放资源)
示例:
; 审判结束时调用
@unloadStage
@gosubModifyCamera #
功能: 控制 3D 法庭镜头聚焦到指定角色
常用参数:
| 参数 | 类型 | 说明 | 可选值 |
|---|---|---|---|
| (索引) | Int | 摄像机索引 | 0 |
| look | String | 聚焦角色 | 角色名 (如 "Hiro", "Yuki", "Ema") |
| comp | String | 镜头构图方向 | "Left", "Right", "Center" |
| rollDir | String | 旋转方向 | "Left", "Right" |
| zoomLvl | Float | 缩放等级 | 2, 3 |
示例:
; 聚焦到角色 (基础用法)
@gosubModifyCamera 0 look:"Hiro" comp:"Center"
@gosubModifyCamera 0 look:"Yuki" comp:"Right"
@gosubModifyCamera 0 look:"Ema" comp:"Left"
; 带旋转方向和缩放 (特写)
@gosubModifyCamera 0 look:"Yuki" comp:"Left" rollDir:"Right" zoomLvl:3
@gosubModifyCamera 0 look:"Alisa" comp:"Right" rollDir:"Left" zoomLvl:3
; 中距离缩放
@gosubModifyCamera 0 look:"Ema" comp:"Center" zoomLvl:2
comp 参数:
"Left"/"Right"/"Center"控制角色在画面中的位置偏移方向,不是角色朝向。配合rollDir可以制造倾斜镜头效果。
@gosubCutIn #
功能: 播放审判切入演出 (如异议、伪证等动画效果)
常用参数:
| 参数 | 类型 | 说明 |
|---|---|---|
| (角色) | String | 演出角色 |
| Index | Int | 演出动画编号 |
示例:
; 异议切入演出
@gosubCutIn "Hiro" Index:2
; 伪证切入演出
@gosubCutIn "Hiro" Index:1
@courtFire #
功能: 开启/关闭法庭火焰特效
示例:
; 开启火焰特效
@courtFire true
@printDebate pos:70,50 Roll:4 "不要妨碍我!" speed:1
; 关闭火焰特效
@courtFire false
@badId #
功能: 设置坏结局 ID (用于分支结局判断)
示例:
@badId 1
魔女图鉴指令 ✨ #
@update #
功能: 更新魔女图鉴条目
常用参数:
| 参数 | 类型 | 说明 | 可选值 |
|---|---|---|---|
| id | String | 条目ID | - |
| Category | String | 分类 | Clue, Profile, Rule, Note |
| Version | Int | 版本号 | 1, 2, 3… |
示例:
; 更新证物
@update "MaxMixAlex_ManosabaModEnhance_1-1" Category:"Clue" Version:1
; 更新人物档案
@update "Ema" Category:"Profile" Version:2
; 更新规定
@update "MaxMixAlex_ManosabaModEnhance_1" Category:"Rule" Version:1
; 更新记录
@update "MaxMixAlex_ManosabaModEnhance_1" Category:"Note" Version:1
配合使用: 参见 魔女图鉴
@spawn / @despawn #
功能: 显示/关闭证物弹窗 (带动画)
示例:
; 完整的搜证流程
@spawn "Clue" Params:MaxMixAlex_ManosabaModEnhance_1-1
@toast "魔女图鉴 更新…"
@update "MaxMixAlex_ManosabaModEnhance_1-1" Category:"Clue" Version:1
@Wait "i1.2"
@despawn "Clue"
@Wait "0.6"
@toast #
功能: 显示屏幕提示文本 (黑底白字)
示例:
@toast "魔女图鉴 更新…"
@toast "获得新证物!"
@gosubResetBook #
功能: 重置魔女图鉴到指定版本 (审判开始前调用)
常用参数:
| 参数 | 类型 | 说明 |
|---|---|---|
| Version | Int | 重置到的版本号 |
| (路径) | String | 重置子程序的脚本路径 |
示例:
; 审判开始前重置图鉴
@gosubResetBook Version:1 System/System_ResetWitchBook
地图搜查指令 #
@map #
功能: 打开地图搜查菜单
常用参数:
| 参数 | 类型 | 说明 |
|---|---|---|
| flag | String | 标记变量前缀 |
| Back | String | 返回标签 |
| Global | Bool | 是否全局变量 |
示例:
@map flag:"F1_Prison" Back:".BackFromMap" Global:true
详细说明: 参见 地图搜查示例
@setFlag #
功能: 设置地图标记变量
示例:
@setFlag F1_Prison_Room1=true
视频播放指令 🎬 #
@movie #
功能: 播放视频文件
参数: 视频文件名 (不含扩展名)
支持格式: mp4, webm, ogv
文件路径:
[MOD文件夹]/Movie/[filename].[ext]
示例:
; 播放开场动画
@movie "Opening"
; 播放过场视频
@movie "Cutscene_01"
详细说明: 参见 视频播放
UI控制指令 #
@HideUI #
功能: 隐藏指定的 UI 元素
常用参数:
| 参数 | 类型 | 说明 |
|---|---|---|
| (UI名) | String | 要隐藏的 UI 名称,可逗号分隔多个 |
| AllowToggle | Bool | 是否允许玩家手动切换 |
常见 UI 名称:
| UI 名称 | 说明 |
|---|---|
ControlPanel | 控制面板 (暂停、跳过等按钮) |
DebateUI | 辩论界面 |
AutoToggle | 自动播放切换 |
WitchBookButtonUI | 魔女图鉴按钮 |
示例:
; 隐藏控制面板 (禁止玩家操作)
@HideUI ControlPanel AllowToggle:false
; 隐藏辩论 UI
@HideUI DebateUI AllowToggle:false
; 隐藏多个 UI
@HideUI ControlPanel,AutoToggle,WitchBookButtonUI,DebateUI AllowToggle:false
@ShowUI #
功能: 显示指定的 UI 元素
示例:
; 显示辩论 UI
@ShowUI DebateUI
; 显示控制面板
@ShowUI ControlPanel
@ProcessInput #
功能: 控制玩家输入权限 (哪些操作可用)
常用参数:
| 参数 | 类型 | 说明 |
|---|---|---|
| (启用) | Bool | 是否启用输入 |
| set | String | 各输入操作的开关 (逗号分隔) |
示例:
; 启用输入 (默认状态)
@ProcessInput true
; 精细控制各项输入权限
@ProcessInput true set:Continue.true,Pause.false,Skip.true,ToggleSkip.true,SkipMovie.true,AutoPlay.false,ToggleUI.false,ShowBacklog.false,Rollback.false
set 参数格式:
操作名.true/false,多个操作用逗号分隔。常见操作:Continue(继续)、Pause(暂停)、Skip(跳过)、AutoPlay(自动播放)、ToggleUI(切换 UI)、ShowBacklog(显示记录)、Rollback(回退)。
@ReturnToTitle #
功能: 返回标题菜单
示例:
@ReturnToTitle
角色动作指令 #
@EmoteJumpDouble #
功能: 角色跳跃表情动作
常用参数:
| 参数 | 类型 | 说明 |
|---|---|---|
| Speed | Float | 动画速度 |
| (角色) | String | 角色 Actor ID |
| Loop | Bool | 是否循环 |
示例:
; 雪莉跳跃
@EmoteJumpDouble Speed:1 Sherry Loop:false
; Middle 层角色跳跃
@EmoteJumpDouble Speed:1 Sherry-Middle Loop:false
常见问题 #
Q: 指令参数的格式是什么?
A:
- 字符串: 用引号
"文本"或不加引号文本 - 数字: 直接写
1.5,720 - 布尔值:
true,false - 坐标:
50,30(X,Y) - 颜色:
"#ff0000"(HEX格式,带引号),"#RRGGBBAA"(含透明度) - 表达式:
{g_backgroundDefaultScale},{counter + 1}
参数赋值: 使用冒号 参数:值 或等号 参数=值
Q: Lazy 参数是什么意思?
A: Lazy 控制动画过渡方式:
Lazy:true(默认): 从当前动画状态继续过渡到新目标Lazy:false: 先立即完成当前动画,再过渡到新目标
游戏脚本中几乎所有 @back 和 @char 都使用 Lazy:false,建议 MOD 中也统一使用。
Q: SubId 参数怎么用?
A: SubId 用于多层渲染:
SubId:"Overlay"— 最上层遮罩 (用于淡入淡出效果)SubId:"Middle"— 中间层 (用于特写、视差效果)- 无 SubId — 默认层 (主背景/主角色)
层级从前到后: Overlay > Middle > Default。靠前的层会遮挡靠后的层。
; 背景在默认层
@back 5_1 Scale:{g_backgroundDefaultScale} Lazy:false
; 遮罩在最上层
@back SubId:"Overlay" Transparent tint:"#000000" time:1.2 Lazy:false
; 角色特写在中间层
@char SubId:"Middle" Hiro.Smile1 pos:30,30 Scale:1.25 Lazy:false
Q: @printDebate 的 Roll 参数如何使用?
A:
- 正数 (1~5): 文本框向右倾斜,用于检察官 (左侧)
- 负数 (-1~-5): 文本框向左倾斜,用于辩方 (右侧)
- 0: 不旋转
示例:
; 检察官发言 (右倾)
@printDebate pos:70,50 Roll:4 "这就是证据!"
; 辩方发言 (左倾)
@printDebate pos:30,50 Roll:-3 "有异议!"
Q: 审判脚本的基本流程是什么?
A: 审判流程的典型结构:
; 1. 初始化
@gosubResetBook Version:1 System/System_ResetWitchBook
@Gosub ModName/TrialInit00
@timer 720
; 2. 隐藏普通 UI,显示辩论 UI
@HideUI ControlPanel AllowToggle:false
@ShowUI DebateUI
; 3. 开始辩论
@Gosub System/System_Subroutine.BeginDebate-First
@Gosub System/System_Subroutine.BeginDebate-Effect
@Gosub System/System_Subroutine.BeginDebate-Last
@pauseTrial false timer:true
; 4. 辩论文本 (带弱点链接)
@gosubModifyCamera 0 look:"Yuki" comp:"Left" rollDir:"Right" zoomLvl:3
@printDebate pos:70,50 Roll:4 "人生而有<link=\"Objection_00_00\">罪</link>。" speed:1
; 5. 弱点选项
# Objection_00_00
@Skip false
@pauseTrial true timer:true
@choice "异议内容" Lock:false button:"ChoiceButtons/Trial/Objection" handler:"TrialHiro" play:true show:true
@sfx "Sfx_System_SaveData_001_2x" Volume:1 Loop:false fade:0
@StopVoice
@pauseTrial false timer:true
@printDebate pos:70,50 Roll:4 "反驳内容" speed:1
@return
@choice "返回" Lock:false button:"ChoiceButtons/Trial/Cancel" handler:"TrialHiro" play:true show:true
@pauseTrial false timer:true
@Wait "i{debateWaitTime}"
@Return
@StopForChoice Clear:false
; 6. 结束辩论
@Gosub System/System_Subroutine.EndDebate-First
@pauseTrial true timer:true
@Gosub System/System_Subroutine.EndDebate-Effect
@Gosub System/System_Subroutine.EndDebate-Last