脚本示例
INI_SORT 排行读取脚本
直接用 INI_SORT 系列命令,对 IniNameRank.ini 的 NameRank 节做排序并循环输出名次的完整脚本。
用途
用 INI_SORT 系列命令对 QuestDiary\IniNameRank.ini 的 NameRank 节做排序读取,再把名次逐条拼成对话文本回显。示例给了两个入口:[@GetNameRank] 一次取“名字+数值”组合,[@GetNameRankEx] 把名字和数值分开取。
参考脚本
[@main]
<当前NameRank的排名(名字+数值)/@GetNameRank> <当前NameRank的排名(名字)/@GetNameRankEx>\ \<关闭/@exit>
[@GetNameRank]
#IF
CHECKLEVEL 0
#ACT
INI_SORT_READ_SECTION_VALUES ..\QuestDiary\IniNameRank.ini NameRank 1 1 0 INI_SORTED_FLAG__NameRank_IV 0
INI_SORT_SECTION_VALUES_COUNT INI_SORTED_FLAG__NameRank_IV D0
SENDMSG 5 获取到排行数据:<$STR(D0)>条
#IF
LARGE D0 1
#ACT
INI_SORT_GET_SECTION_STRING INI_SORTED_FLAG__NameRank_IV S0
;;P0用于限制最多的排名次数
MOV P0 1
;;S92用于累计排名,#ELSESAY的显示调用
MOV S92
SENDMSG 5 排行数据为:<$STR(S0)>
goto @GetIdentValueLoop
;按顺序获取排行字符串(IDENT_VALUE)到S1~S20
[@GetIdentValueLoop]
#IF
LARGE D0 1
SMALL P0 21
#ACT
MOV S90 S
INC S90 <$STR(P0)>
INI_SORT_GET_IDENT_VALUE_STRING INI_SORTED_FLAG__NameRank_IV <$STR(P0)> <$STR(S90)>
MOV S91 <$STR(S
INC S91 <$STR(P0)>
INC S91 )>
INC S92 <$STR(S91)>
INC S92 \
;;SENDMSG 5 排名<$STR(P0)>:<$STR(S91)>
DEC D0 1
INC P0 1
;;如果这里的排行计算太多,可能引起引擎报死循环的错误,可以替换为:DELAYGOTO 1 @GetIdentValueLoop
GOTO @GetIdentValueLoop
#ELSESAY
<$STR(S0)>的当前排名是:\<$STR(S92)> \ \<关闭/@exit>
#ELSEACT
;;SENDMSG 5 排行信息结束
BREAK
[@GetNameRankEx]
#IF
CHECKLEVEL 0
#ACT
INI_SORT_READ_SECTION_VALUES ..\QuestDiary\IniNameRank.ini NameRank 1 1 0 INI_SORTED_FLAG__NameRank_IVEX 0
INI_SORT_SECTION_VALUES_COUNT INI_SORTED_FLAG__NameRank_IVEX D0
SENDMSG 5 获取到排行数据:<$STR(D0)>条
#IF
LARGE D0 1
#ACT
INI_SORT_GET_SECTION_STRING INI_SORTED_FLAG__NameRank_IVEX S0
;;P0用于限制最多的排名次数
MOV P0 1
;;S92用于累计排名,#ELSESAY的显示调用
MOV S92
SENDMSG 5 排行数据为:<$STR(S0)>
goto @GetIdentValueLoopEx
;按顺序获取排行,分别获取IDENT和VALUE到S1~S20
[@GetIdentValueLoopEx]
#IF
LARGE D0 1
SMALL P0 21
#ACT
MOV S90 S
INC S90 <$STR(P0)>
MOV S95 M
INC S95 <$STR(P0)>
INI_SORT_GET_IDENT_STRING INI_SORTED_FLAG__NameRank_IVEX <$STR(P0)> <$STR(S90)>
INI_SORT_GET_VALUE_INTEGER INI_SORTED_FLAG__NameRank_IVEX <$STR(P0)> <$STR(S95)>
MOV S91 <$STR(S
INC S91 <$STR(P0)>
INC S91 )>
MOV S93 <$STR(M
INC S93 <$STR(P0)>
INC S93 )>
INC S92 <$STR(S91)>
INC S92 " - 整数值:"
INC S92 <$STR(S93)>
INC S92 \
;;SENDMSG 5 排名<$STR(P0)>:<$STR(S91)>
DEC D0 1
INC P0 1
;;如果这里的排行计算太多,可能引起引擎报死循环的错误,可以替换为:DELAYGOTO 1 @GetIdentValueLoop
GOTO @GetIdentValueLoopEx
#ELSESAY
<$STR(S0)>的当前排名是:\<$STR(S92)> \ \<关闭/@exit>
#ELSEACT
;;SENDMSG 5 排行信息结束
BREAK
关键点
- 这套写法用的是
INI_SORT系列命令本身:先INI_SORT_READ_SECTION_VALUES 文件 节 1 1 0 排序结果标识 0生成排序结果,再用INI_SORT_SECTION_VALUES_COUNT 标识 D0取到条数,之后靠读结果命令逐条取出。命令参数含义见 INI 排序读取。 - 两个入口的取数方式不同:
[@GetNameRank]用INI_SORT_GET_IDENT_VALUE_STRING一次取“键+值”组合;[@GetNameRankEx]分别用INI_SORT_GET_IDENT_STRING与INI_SORT_GET_VALUE_INTEGER取键名和整数值。 - 循环控制思路:
P0是名次计数(SMALL P0 21,即最多取 20 名),D0每轮DEC D0 1递减;S90、S95靠MOV S90 S再INC S90 <$STR(P0)>在运行时拼出S1、S2…… 这类变量名,S92负责累计最终要显示的名次文本,最后在#ELSESAY里回显。 - 数据来源是
..\QuestDiary\IniNameRank.ini的NameRank节;这段脚本只负责排序读取与显示,节里的数据要靠其它脚本写入并保存。 - 附件在
[@GetIdentValueLoopEx]末尾照抄了上一条循环的提示“可以替换为DELAYGOTO 1 @GetIdentValueLoop”,标签名没有同步改成@GetIdentValueLoopEx;直接照抄会跳错标签,实际使用时要把这句改成当前段对应的标签。 - 与同主题的另一份完整示范(含清空数据、查自己名次)见 新INI功能示范脚本。
