重新帮我编写整理结构
[@天命系统界面]
{
#if
#act
NEWREADCSV ..\QuestDiary\数据文件\cfg_天命系统.csv
;如果没有初始化成功重新初始化
#if
check [1] 0
#act
#call [主界面相关显示\卡牌系统\天命系统界面.txt] @天命系统个人初始化
#IF
#act
MOV S$已解锁天命ID
MOV S$未解锁天命ID
MOV N$循环索引 1
while N$循环索引 < 13
Goto @刷新天命界面显示
INC N$循环索引
🤖 回答引擎: TXT语法专家 |
🕒 时间: 2026-05-29 20:04:04 |
👁️ 阅读: 2
根据课程日志记录,你的脚本存在以下主要问题需要修正:
1. **WHILE循环内使用#IF/#ACT**:在`[@刷新天命界面显示]`标签中,WHILE循环内直接使用了`#IF`、`#ACT`、`#ELSEACT`。根据规范,WHILE和ENDWHILE之间不能直接使用条件判断和执行语句。需要将判断逻辑通过GOTO跳转到其他标签执行。
2. **#IF条件判断位置错误**:在`[@天命系统界面]`的`#say`部分,混入了多个`#if`条件判断。TXT语法中,`#IF`、`#ACT`、`#SAY`等指令应作为独立的逻辑块,不能嵌套在`#say`输出的界面组件中。界面显示条件应通过变量控制,在`#ACT`中赋值,然后在`#SAY`中统一输出。
3. **变量初始化问题**:`MOV S$已解锁天命ID` 和 `MOV S$未解锁天命ID` 没有赋予初始值。字符串变量应使用 `MOV S$变量名 ""` 进行初始化。
4. **组件ID重复**:多个`<Button>`组件使用了相同的`id`值(如1,2,3...),但在同一界面中,ID应保持唯一。
**结构重写建议:**
将`[@天命系统界面]`的逻辑拆分为清晰的部分:
* **#ACT部分**:负责数据处理、变量初始化和条件判断,为界面显示准备数据。
* **#SAY部分**:只负责输出界面组件,使用`<$STR()>`调用在#ACT部分准备好的变量。
将`[@刷新天命界面显示]`中的条件判断逻辑移到WHILE循环外,或者通过GOTO调用一个专门的处理标签。
**修正后的关键部分示例:**
```txt
[@天命系统界面]
#IF
#ACT
; 初始化变量
MOV S$已解锁天命ID ""
MOV S$未解锁天命ID ""
MOV N$循环索引 1
; 检查并初始化个人数据
NEWREADCSV ..\QuestDiary\数据文件\cfg_天命系统.csv
#IF
check [1] 0
#ACT
#call [主界面相关显示\卡牌系统\天命系统界面.txt] @天命系统个人初始化
; 准备显示数据(循环处理)
WHILE N$循环索引 < 13
GOTO @处理每个槽位显示
INC N$循环索引 1
ENDWHILE
; 根据物品设置颜色
#IF
checkitem 塔罗卷轴 1
#ACT
MOV S$天命物品显示颜色 254
#ELSEACT
MOV S$天命物品显示颜色 58
; 其他界面显示条件判断也放在这里,并设置对应的S变量...
#SAY
<Img|hideMain=1|x=0.0|y=0.0|width=<$SCREENWIDTH>|height=<$SCREENHEIGHT>|img=custom2/tmxt/bg.png|move=0|loadDelay=0|reset=1|bg=1|show=0|opacity=255|scale9r=100|scale9b=100|esc=1|scale9l=100|scale9t=100>
... 其他固定界面组件 ...
<ListView|children={<$STR(S$已解锁天命ID)><$STR(S$未解锁天命ID)>}|x=10.0|y=60.0|width=250|height=<$FORMULATION[<$SCREENHEIGHT>-60-40]>|margin=5>
; 按钮显示根据在#ACT中设置的S$天命描叙信息X和S$天命槽位事件X变量来渲染
<Button|id=btn_1|x=131.0|y=72.0|color=255|nimg=custom2/tmxt/an_1.png|text=<$STR(S$天命描叙信息1)>|size=18|<$STR(S$天命槽位事件1)>>
<Button|id=btn_2|x=131.0|y=72.0|color=255|nimg=custom2/tmxt/an_1.png|text=<$STR(S$天命描叙信息2)>|size=18|<$STR(S$天命槽位事件2)>>
... 其他按钮(注意使用唯一ID,如btn_3, btn_4...) ...
; 根据#ACT中设置的变量显示抽卡区域等
<$STR(S$抽卡区域显示)>
<$STR(S$卡牌选择区域显示)>
[@处理每个槽位显示]
; 这里处理原来在[@刷新天命界面显示]中的逻辑,但不要有#IF
; 使用GOTO跳转到具体的判断标签
#IF
CHECKVAR HUMAN 天命槽位状态<$STR(N$循环索引)> = 1
#ACT
GOTO @槽位已解锁处理
#ELSEACT
GOTO @槽位未解锁处理
[@槽位已解锁处理]
#ACT
INC S$已解锁天命ID <$STR(N$循环索引)>,
MOV S$天命描叙信息<$STR(N$循环索引)> 已解锁<$STR(N$循环索引)>
MOV S$天命槽位事件<$STR(N$循环索引)> link=@切换天命槽位#天命槽位类型=<$STR(N$循环索引)>
; 检查是否有BUFF并更新描述
#IF
CHECKVAR HUMAN 天命槽位状态<$STR(N$循环索引)> = 1
CHECKVAR HUMAN 天命槽位buff<$STR(N$循环索引)> > 10000
#ACT
MOV S$天命描叙信息<$STR(N$循环索引)> <$HUMAN(天命槽位buff<$STR(N$循环索引)>)>
; 处理选中状态
#IF
EQUAL u71 <$STR(N$循环索引)>
#ACT
MOV S$选中槽位状态<$STR(N$循环索引)> 149
#ELSEACT
MOV S$选中槽位状态<$STR(N$循环索引)> 255
[@槽位未解锁处理]
#ACT
INC S$未解锁天命ID <$STR(N$循环索引)>,
MOV S$天命描叙信息<$STR(N$循环索引)> 未解锁<$STR(N$循环索引)>
MOV S$天命槽位事件<$STR(N$循环索引)>
```
请按照此思路,将界面显示的条件逻辑全部移到`#ACT`部分执行并赋值给变量,在`#SAY`中只进行输出。同时确保循环内的判断通过GOTO处理,并修复变量初始化和组件ID唯一性问题。
← 返回问答库