KeyFansClub

首页 » - 特色讨论区 - » 土豆星 » 土卫三 » KeyFC汉化公式论坛 » 請教如何解開SEEN.TXT
ahbi0302 - 2007/7/5 18:36:00
大家好
我才加入沒多久
若有什麼地方做錯還請各位不吝批評指教

我現在正在玩AIR
已裝上貴Club所推出的補丁
可使用
但我想嘗試自行更改人物的對話

無論用notepad或十六進位編輯程式開啟SEEN.TXT都一堆亂碼
只能看到一些像SEEN030.TXT
後來得知SEEN.TXT有編碼過

我已下載RLDev
但 kprl -d SEEN.TXT(原日文版)出現錯誤訊息
Error: not a bytecode file.
不太會用

請教高手
要如何才能解出SEEN.TXT的內容?
還有更改後要如何存回去?
wawa1000 - 2007/7/7 20:09:00
你可以把系统的区域语言中的《高级》选项简体中文选成日语的 !
然后把xp的安装盘放在里面按照提示就可以了!
但再重起之后只支持日文的!
简体的都读不出来了!
要有思想准备啊
ahbi0302 - 2007/7/9 23:31:00
改過來了
現在是可以用日文版玩
但RLDev仍出現同樣的錯誤訊息...
carrot - 2007/7/11 11:44:00
[quote] 原帖由 [b]ahbi0302[/b] 于 2007-7-5 18:36:00 发表
大家好
我才加入沒多久
若有什麼地方做錯還請各位不吝批評指教

我現在正在玩AIR
已裝上貴Club所推出的補丁
可使用
但我想嘗試自行更改人物的對話

無論用notepad或十六進位編輯程式開啟SEEN.TXT都一堆亂碼...... [/quote]


楼主语句写的不对....

解包顺序是这样的
开始  运行  cmd

set RLDEV=x:\RLdev                      <===设置解包路径  kprl程序需要找一些库文件所以一定要设  注意大小写区分
x:
cd\
cd RLdev
cd bin
kprl -o xxxx -d x:\xxx\seen.txt                    -o 参数后面跟 解包后文件存放目录  最后的 x:\xxx\seen.txt  是seen.txt存放的路径 请根据实际情况更改

到这里seen.txt就解开了  在解包的文件夹中 可以找到 SEEN####.ke SEEN####.sjs 文件
想要更改对话的地方都在*.sjs 文件中
具体要更改的包 这样查找  进入游戏前 配置游戏目录中的GAMEEXE.INI 文件  打开后在最后一行添加  #MEMORY = 1 进入调试模式运行游戏

然后再进行游戏  在游戏窗口标题拦就会出现现在正在进行中的seen

回到解包文件夹 打开对应的SEEN####.sjs 文件 更改即可  (日文版的游戏需要用Microsoft AppLocale用日文语言打开notapad.exe 然后再用notepad.exe打开sjs文件 或者设置windows为日区)

sjs文件更改保存后 需要再编译
cmd 下进入RLdev\bin 文件夹  具体进入方法参考上方
for %a in (xxx\*.ke) rlc %a
完成后
解包文件中 会出SEEN####.txt 文件

打包
进入程序文件夹方法参考上方
kprl -a seen.txt xxx\*.txt                                  seen.txt 为打包后的文件名 不设置路径即存在程序目录下        xxx\*.txt  xxx为解包的路径


整个过程就是这样了....  搂主自己多研究吧
Prz - 2007/7/11 12:26:00
赫赫,楼主说的是AVG32的脚本,RLDev只是针对AVG2000/Reallive引擎的。

这种原始的格式,只有有限的几种工具,而且大部分都已经失传了。
事隔这么多年,具体指令我基本忘光了。
但是,如果你实在想改文字,而且愿意写程序的话,我倒是可以给你相关资料。

** 广告模式 **
试试我N年前写的这个工具,可以满足你的求知欲(不过只能读,不能改):
AVG32脚本解析工具

使用方法请参阅:
初回版说明(基本操作方法)
修订版说明(更新部分操作)
Serw - 2007/7/11 15:50:00
千砂与美纱的神隐 你好. 我是新来的.

这几天我在找 关于一些 AVG 引擎的资料. 我想获得一些有关老版 AIR 使用的 AVG32 引擎在脚本解析方面的文档资料. (关于 PDT 的格式以及解压缩部分已经解决了). 希望你能提供. [email]pi3orama@gmail.com[/email], 谢谢.

另外你当年是通过逆向工程分析脚本的, 还是有 Kpacx 的源码? 后者似乎已经找不到了. 我是最近才知道有 rldev 和一系列开源的 AVG 引擎的, 前一段时间一直在反汇编+调试.
Serw - 2007/7/11 16:17:00
另外 LZ 如果只是想修改文字, 可以看看 xclannad 的代码,  ARCINFO_AVG32::ExecExtract 及相关函数.
ahbi0302 - 2007/7/16 21:38:00
...嗯
謝謝樓上大大們的指導
不好意思今天才看到...
Prz - 2007/7/16 21:59:00
楼上的楼上,rldev里面的那段仅仅是从SEEN.TXT解出单独脚本而已,不能用来直接修改文字。
因为脚本里面包含着许多跳转指令,如果改变了文本而不改变跳转目标地址的话,引擎会"死火"的。

解密: 以下是我N年前苦心搜索整理的AVG32全指令集(基本上是全的,不作保证)

事实上,上面的AVG32脚本解析工具也就是根据这个指令集实现的。
当然,要实现脚本解析,还需要一些更加细节的信息。
这些在我收集的日本牛人为非Windows/Intel 系统/平台写的AVG32兼容引擎中都有详细的实现。
但是因为直接编译多半是不行的,需要人工阅读理解源码,然后自己再实现才行。
  1. 资料的格式为:
  2. 主指令        类型        说明
  3.                 [副指令]        具体说明
  4.                         [子指令]        具体说明

  5. 注意: 禁止无断转载;仅供个人研究学习之用,禁止用于任何其他用途!

  6. $01        User        等待鼠标点击, 然后清除文字
  7. $02        Text        换行
  8.                 $01        清除缩进
  9.                 $02        保留缩进
  10.                 $03        未知
  11. $03        User        等待点击, 然后接着显示
  12. $04        Text        隐藏文本窗口
  13.                 $01        清除消息缓存
  14.                 $02        特效隐藏并清除消息缓存
  15.                 $03        重绘窗口并清除消息缓存
  16.                 $04        等待鼠标点击并清除消息缓存
  17.                 $05        清除消息缓存,但不隐藏窗口
  18. $05        Text        特效文本
  19.                 $01 $11 普通文本
  20.                 $02 $12        两倍大文本
  21. $0B        Graphic        PDT图像
  22.                 $01 $03 $05        以指定编号的特效显示
  23.                 $02 $04 $06        以指定参数的特效显示
  24.                 $08        显示屏后缓冲
  25.                 $09        直接显示画像不屏后缓冲
  26.                 $10        仅载入屏后缓冲
  27.                 $11        载入图像缓存
  28.                 $13        清空图像缓存
  29.                 $22        载入并显示多幅PDT图像 (底图为文件)
  30.                         $01        直接显示
  31.                         $02        以选定区域大小显示
  32.                         $03        以指定区域大小显示
  33.                         $04        以指定区域大小和参数显示
  34.                 $24        载入并显示多幅PDT图像 (底图为缓存)
  35.                         $01        直接显示
  36.                         $02        以选定区域大小显示
  37.                         $03        以指定区域大小显示
  38.                         $04        以指定区域大小和参数显示
  39.                 $30        清除宏缓存
  40.                 $31        清除指定宏
  41.                 $32        宏操作
  42.                 $33        将宏数量写入变量
  43.                 $50        保存屏后缓冲
  44.                 $52        指定编号的特效显示屏后缓冲
  45.                 $54        以另一文件的Mask显示屏后缓冲
  46. $0C        Anime        动画播放
  47.                 $10        从指定位置开始播放
  48.                 $12        动画文件分段播放
  49.                 $13        初始化动画计时器
  50.                 $16        从指定位置开始带参数播放
  51.                 $18        从头开始带参数播放
  52.                 $20 $24        停止动画分段播放段落
  53.                 $21 $25        清空动画分段播放缓存并停止播放
  54.                 $30        动画文件分段播放 (同步语音)
  55. $0E        Sound        播放声音
  56.                 $01        循环播放CD
  57.                 $02        播放CD并等待
  58.                 $03        播放CD
  59.                 $05        渐入循环播放CD
  60.                 $06        渐入播放CD并等待
  61.                 $07        渐入播放CD
  62.                 $10        渐出停止CD
  63.                 $11        停止CD
  64.                 $12        CD寻址播放
  65.                 $20        播放KOE文件并等待
  66.                 $21        播放KOE文件
  67.                 $22        播放KOE文件 (付参数)
  68.                 $30        播放WAV文件
  69.                 $31        播放WAV文件 (付参数)
  70.                 $32        循环播放WAV文件
  71.                 $33        循环播放WAV文件 (付参数)
  72.                 $34        播放WAV文件并等待
  73.                 $35        播放WAV文件并等待 (付参数)
  74.                 $36        停止WAV
  75.                 $37        停止WAV (付参数)
  76.                 $38        停止WAV
  77.                 $39        更改PCM播放方式 (付参数)
  78.                 $3A        更改PCM播放方式 (付编号)
  79.                         #        Bits        Hz        Channel
  80.                         $0        8        11025        2
  81.                         $1        16        11025        2
  82.                         $2        8        22050        2
  83.                         $3        8        44100        2
  84.                         $4        16        44100        2
  85.                         $5        16        22050        2
  86.                 $44        播放SE文件 (GAMEEXE.INI中指定)
  87.                 $50        播放AVI文件
  88.                 $51        循环播放AVI文件
  89.                 $52        播放AVI文件并等待,鼠标终止不能
  90.                 $53        播放AVI文件并等待,鼠标终止可
  91.                 $54        播放AVI文件并等待,鼠标终止不能 (付参数)
  92.                 $55        播放AVI文件并等待,鼠标终止可 (付参数)
  93.                 $60        停止AVI
  94.                 $61        暂停AVI
  95.                 $62        继续AVI
  96.                 $70-$73        播放MPEG文件
  97.                 $78        停止MPEG
  98. $10        Text        作为图像写入
  99.                 $01        将变量写为文字
  100.                 $02        将变量写为文字 (指定位数)
  101.                 $03        将编号的字符串写入
  102. $11        Graphic        图像渐变
  103.                 $01        全屏渐变 (指定色彩编号)
  104.                 $02        全屏渐变 (指定色彩编号,速度)
  105.                 $03        全屏渐变 (指定色彩参数)
  106.                 $04        全屏渐变 (指定色彩参数,速度)
  107.                 $10        高速全屏渐变 (指定色彩编号)
  108.                 $11        高速全屏渐变 (指定色彩参数)
  109. $15        Jump        条件转移
  110. $16        Jump        $01        跳入脚本
  111.                 $02        嵌套脚本
  112. $17        Graphic        $01        画面摇动 (指定参数)
  113. $18        Text        $01        改变字符颜色
  114. $19        Wait        $01        等待指定时间
  115.                 $02        等待指定时间,鼠标终止可
  116.                 $03        设定基准时间
  117.                 $04        等待指定基准时间差
  118.                 $05        等待指定基准时间差,鼠标终止可
  119.                 $06        将基准时间写入变量
  120.                 $10        允许显示文字
  121.                 $11        禁止显示文字
  122.                 $12        暂停显示文字 (?)
  123.                 $13        完成显示文字
  124. $1B        Jump        脚本内嵌入跳转
  125. $1C        Jump        无条件跳转
  126. $1D        Jump        查表格条件嵌入跳转
  127. $1E        Jump        查表格条件跳转
  128. $20        Jump        $01        返回同一嵌入脚本
  129.                 $02        返回前一嵌入脚本
  130.                 $03        取消上一嵌入
  131.                 $06        取消所有嵌入
  132. $37        Var        Bit变量赋值
  133. $39        Var        Bit变量复制
  134. $3B        Var        整数变量赋值
  135. $3C        Var        整数变量+
  136. $3D        Var        整数变量-
  137. $3E        Var        整数变量*
  138. $3F        Var        整数变量/
  139. $40        Var        整数变量%
  140. $41        Var        整数变量AND
  141. $42        Var        整数变量OR
  142. $43        Var        整数变量XOR
  143. $49        Var        整数变量复制
  144. $4A        Var        整数变量+整数变量
  145. $4B        Var        整数变量-整数变量
  146. $4C        Var        整数变量*整数变量
  147. $4D        Var        整数变量/整数变量
  148. $4E        Var        整数变量%整数变量
  149. $4F        Var        整数变量AND整数变量
  150. $50        Var        整数变量OR整数变量
  151. $51        Var        整数变量XOR整数变量
  152. $56        Var        随机Bit变量
  153. $57        Var        随机整数变量
  154. $58        Select        $01        开新窗口选择
  155.                 $02        本窗口选择
  156.                 $04        打开Load菜单
  157. $59        String        字符串操作
  158.                 $01        字符串赋值
  159.                 $02        字符串长度写入变量
  160.                 $03        字符串比较结果写入变量
  161.                 $04        字符串连接
  162.                 $05        字符串复制
  163.                 $06        变量写入字符串 (10/16进制)
  164.                 $07        字符串转换到全角
  165.                 $08        字符串写入变量
  166. $5B        Var        $01        设定多个整数变量
  167.                 $02        设定多个Bit变量
  168. $5C        Var        $01        统一多个整数变量
  169.                 $02        统一多个Bit变量
  170. $5D        Var        $01        多个整数变量顺序复制
  171.                 $02        多个Bit变量顺序复制
  172. $5E        Var        $01-$04        获得当前日期时间
  173.                 $10        获得当前脚本ID
  174. $5F        Var        多变量统计操作
  175.                 $01        多变量求和
  176.                 $10        计算变量百分比
  177.                 $20        多变量变值赋值 (付初始值,差值表)
  178. $60        System        $02        载入进度
  179.                 $03        保存进度
  180.                 $04        设定窗口标题
  181.                 $05        弹出菜单
  182.                 $20        结束游戏
  183.                 $30        设定储存进度标题
  184.                 $31        检查储存进度
  185.                 $35        检查储存进度标题
  186.                 $36        获取储存进度日期
  187.                 $37        获取储存进度时间
  188. $61        System        名称操作
  189.                 $01        名称输入框
  190.                 $02 $03        保存输入名称
  191.                 $04        输入框关闭
  192.                 $11        名称赋值
  193.                 $10 $12        获得名称
  194.                 $20        输入名字
  195.                 $21        选择名字
  196.                 $22        输入姓名
  197. $63        Graphic        图像Get/Put
  198.                 $01        Get PDT图像
  199.                 $02        Put PDT图像
  200. $64        Graphic        图像处理
  201.                 $02        清除指定区域内容
  202.                 $04        画方框直线
  203.                 $07        反转指定区域图像颜色
  204.                 $10        用指定颜色编号对指定区域图像进行Mask处理
  205.                 $11 $12        指定区域图像变暗 (黑色Alpha处理)
  206.                 $15        用指定颜色参数对指定区域图像进行Mask处理
  207.                 $20        指定区域图像灰度化
  208.                 $30        画面放缩
  209.                 $32        画面特效放缩
  210. $66        Graphic        写字符串到图像缓存
  211. $67        Graphic        $00        显示指定区域屏后缓冲内容
  212.                 $01        指定区域图像复制
  213.                 $02        指定区域图像复制 (使用Mask)
  214.                 $03        指定区域图像复制 (使用彩色Mask)
  215.                 $05        指定区域图像交换
  216.                 $11        全屏图像复制
  217.                 $12        全屏图像复制 (使用Mask)
  218.                 $13        全屏图像复制 (使用彩色Mask)
  219.                 $15        全屏图像交换
  220.                 $20        显示数字转换PDT图像
  221.                 $21        显示数字转换PDT图像 (使用Mask)
  222.                 $21        显示数字转换PDT图像 (使用彩色Mask)
  223. $68        Graphic        $01        全屏填充
  224.                 $10        画面闪烁
  225. $69        Graphic        图像滚动切换
  226. $6A        Graphic        多PDT处理
  227.                 $10        多PDT滚动,鼠标终止不能
  228.                 $20        多PDT滚动
  229.                 $30        多PDT滚动,鼠标终止可
  230.                 $03        多PDT顺序显示
  231.                 $04        多PDT顺序循环显示
  232.                 $05        停止多PDT显示
  233. $6C        Area        $02        从ARD/CUR文件读取区域信息
  234.                 $03        初始化区域信息
  235.                 $04 $05        返回鼠标所在区域
  236.                 $10        使指定区域失效
  237.                 $11        使指定区域有效
  238.                 $15        查找指定点所在区域
  239.                 $20        更改区域编号
  240. $6D        Mouse        $01        等待点击后获得鼠标状态
  241.                 $02        获得鼠标状态
  242.                 $03        清除鼠标点击状态
  243.                 $20        鼠标光标关闭
  244.                 $21        鼠标光标打开
  245. $6E        Graphic        CG模式控制
  246.                 $01        获取CG总数
  247.                 $02        显示过的CG数目
  248.                 $03        CG完成度
  249.                 $04        CG显示
  250.                 $05        获取CG名称,状态
  251. $70        System        $01        获得文字窗口的半透明状态,参数
  252.                 $02        设定文字窗口的半透明状态,参数
  253.                 $03 $04        获得/设定[Window Move]
  254.                 $05 $06        获得/设定[Window Clear Box]
  255.                 $10 $11        获得/设定[Window Waku Type]
  256. $72        System        $01        获得文字窗口的位置
  257.                 $02        获得[COM]窗口的位置
  258.                 $03        获得[SYS]窗口的位置
  259.                 $04        获得[SUB]窗口的位置
  260.                 $05        获得[GRP]窗口的位置
  261.                 $11        设定文字窗口的位置
  262.                 $12        设定[COM]窗口的位置
  263.                 $13        设定[SYS]窗口的位置
  264.                 $14        设定[SUB]窗口的位置
  265.                 $15        设定[GRP]窗口的位置
  266. $73        System        $01        获得当前文字窗口显示文字数
  267.                 $02        设定文字窗口显示文字数
  268.                 $05        获得当前文字窗口字体大小
  269.                 $06        设定文字窗口字体大小
  270.                 $10        获得当前文字窗口字体颜色
  271.                 $11        设定文字窗口字体颜色
  272.                 $12        获得当前文字窗口鼠标取消状态
  273.                 $13        设定文字窗口鼠标取消状态
  274.                 $16        获得当前文字窗口文字阴影状态
  275.                 $17        设定文字窗口文字阴影状态
  276.                 $18        获得当前文字窗口文字阴影颜色
  277.                 $19        设定文字窗口文字阴影颜色
  278.                 $1A        获得当前文字窗口选择取消状态
  279.                 $1B        设定文字窗口选择取消状态
  280.                 $1C        获得当前Ctrl键状态
  281.                 $1D        设定Ctrl键有效状态
  282.                 $1E        获得当前保存开始位置
  283.                 $1F        设定保存开始位置
  284.                 $20        获得当前取消Novel文字状态
  285.                 $21        设定取消Novel文字状态
  286.                 $22        获得当前[Fade Time]
  287.                 $23        设定[Fade Time]
  288.                 $24        获得当前[Cursor Mono]状态
  289.                 $25        设定[Cursor Mono]状态
  290.                 $26        获得当前[Copy Wind SW]状态
  291.                 $27        设定[Copy Wind SW]状态
  292.                 $28 $2A        获得当前文字速度
  293.                 $29 $2B        设定文字速度
  294.                 $2C        获得当前[Return Key Wait]状态
  295.                 $2D        设定[Return Key Wait]状态
  296.                 $2E        获得当前[KOE Text Type]状态
  297.                 $2F        设定[KOE Text Type]状态
  298.                 $30 $33        获得当前[Game Speck Init]状态
  299.                 $31        设定光标位置
  300.                 $32        设定禁止键盘鼠标状态
  301.                 $34        设定[Game Speck Init]状态
  302. $74        System        弹出菜单控制
  303.                 $01        获得当前禁止弹出菜单状态
  304.                 $02        设定禁止弹出菜单状态
  305.                 $03        获得当前弹出菜单项状态
  306.                 $04        设定弹出菜单项状态
  307. $75        Sound        音量控制
  308.                 $01        获得当前CD音量
  309.                 $02        获得当前WAV音量
  310.                 $03        获得当前KOE音量
  311.                 $04        获得当前SE音量
  312.                 $11        设定CD音量
  313.                 $12        设定WAV音量
  314.                 $13        设定KOE音量
  315.                 $14        设定SE音量
  316.                 $21        CD禁音
  317.                 $22        WAV禁音
  318.                 $23        KOE禁音
  319.                 $24        SE禁音
  320. $76        System        Novel模式控制
  321.                 $01        设定[Novel Mode]状态
  322. $FE        Text        半角文字显示
  323. $FF        Text        全角文字显示

  324. 注意: 禁止无断转载;仅供个人研究学习之用,禁止用于任何其他用途!
复制代码
Serw - 2007/7/17 13:23:00
问题是上文还有你的AVG32脚本解析工具都只能得到指令, 看不到操作数的格式. 比如 $1C        Jump        无条件跳转, 最后会跳转到什么地方? $37        Var        Bit变量赋值 是给哪个变量赋什么值?

如果你提到的引擎源码还有的话, 能不能给我发一份? google 上实在找不到了. 没有也没关系, 有了这些信息再 debug 就容易多了.

多谢.
Prz - 2007/7/17 13:52:00
原帖由 Serw 于 2007-7-17 13:23:00 发表
问题是上文还有你的AVG32脚本解析工具都只能得到指令, 看不到操作数的格式. 比如 $1C        Jump        无条件跳转, 最后会跳转到什么地方? $37        Var        Bit变量赋值 是给哪个变量赋什么值?


快速的回顾了一下我的解析器的源码,每一个指令的参数在解析器内部好像都分析出来了的。
我记得当时是因为没有工夫去写详细的界面,于是没有把所有的信息都显示出来(但是解析器二进制窗口中你点每条指令就会把对应的参数源码显示出来,这样很方便用眼睛瞄得:D)

鉴于楼上应该已经能够解包SEEN了,我这里只把对解开后的每个脚本的解析代码列出来:
  1. // Copyright 2001-2004 Misha @ Keyfc.net
  2. // 仅供个人研究学习,严禁他用
  3. // 未经作者许可,请勿转载

  4. Unit SCENUnpack;

  5. Interface

  6. Uses SysUtils, ComCtrls, Contnrs, MD5Service;

  7. Const
  8.   ScenFileSignature: String = 'TPC32';

  9. ResourceString
  10.   SeenScriptSignError = '脚本签名错误';
  11.   SeenHeaderMenuCountError = '脚本菜单数量错误 (%d)';
  12.   SeenHeaderSubMenuCountError = '脚本子菜单数量错误 (%d:%d)';
  13.   SeenHeaderSubMenuMaxError = '脚本子菜单最值错误 (%d-%d:%d)';
  14.   SeenHeaderSubMenuLoopError = '脚本循环子菜单标记数量错误 (%d-%d-%d:%d)';
  15.   SeenHeaderGetTextError = '错误的行号';
  16.   SeenCMDTextExtractNIL = '无效文字提取过程';
  17.   SeenCMDNIL = '空指令序列';
  18.   SeenCMDSelectListError = '选项列表没有开始';
  19.   SeenCMDSumError = '不能识别的求和指令';
  20.   SeenCMDValueHeaderError = '无效数值头';
  21.   SeenCMDConditionLevelOverflow = '太多的条件嵌套';
  22.   SeenCMDConditionLOperPosError = '无效的逻辑指令位置';
  23.   SeenCMDConditionPropertyUnExp = '意外的属性指令';
  24.   SeenCMDConditionPropertyPosError = '无效的属性指令位置';
  25.   SeenCMDConditionPropertyError = '无效的属性指令参数';
  26.   SeenCMDConditionError = '无效的条件指令';
  27.   SeenCMDFStringConditionError = '同一分支出现多个条件';
  28.   SeenCMDFString10hSubCMDError = '无效的字符串格式 ($10子指令)';
  29.   SeenCMDFStringError = '无效的字符串格式';

  30.   SeenCMDExplainDetailUnImp = '$%.2x:$%.2x 的详细资料 (不可用功能)';
  31.   SeenCMDFaultHeader = '出错命令:';
  32.   SeenCMDExpEmpty = '空指令记录';

  33.   SeenCMDExpCat01 = '全部脚本结束';
  34.   SeenCMDExpCat02 = '等待鼠标点击, 然后换行或者清除文字';
  35.   SeenCMDExpCat03 = '换行 {...}';
  36.   SeenCMDExpCat04 = '等待点击, 然后继续脚本';
  37.   SeenCMDExpCat05 = '文本窗口操作 {...}';
  38.   SeenCMDExpCat06 = '特效文本 {...}';
  39.   SeenCMDExpCat07 = '图像/PDT文件操作 {...}';
  40.   SeenCMDExpCat08 = '动画操作 {...}';
  41.   SeenCMDExpCat09 = '声音/媒体操作 {...}';
  42.   SeenCMDExpCat10 = '变量文字写入 {...}';
  43.   SeenCMDExpCat11 = '图像渐变操作 {...}';
  44.   SeenCMDExpCat12 = '条件转移';
  45.   SeenCMDExpCat13 = '指令转移 {...}';
  46.   SeenCMDExpCat14 = '图像摇动 {...}';
  47.   SeenCMDExpCat15 = '文字颜色';
  48.   SeenCMDExpCat16 = '等待 {...}';
  49.   SeenCMDExpCat17 = '脚本内嵌入';
  50.   SeenCMDExpCat18 = '无条件跳转';
  51.   SeenCMDExpCat19 = '查询表格条件嵌入';
  52.   SeenCMDExpCat20 = '查询表格条件跳转';
  53.   SeenCMDExpCat21 = '嵌入返回';
  54.   SeenCMDExpCat22 = 'Bit变量赋值';
  55.   SeenCMDExpCat23 = 'Bit变量复制';
  56.   SeenCMDExpCat24 = '整数变量赋值';
  57.   SeenCMDExpCat25 = '整数变量 +';
  58.   SeenCMDExpCat26 = '整数变量 -';
  59.   SeenCMDExpCat27 = '整数变量 *';
  60.   SeenCMDExpCat28 = '整数变量 /';
  61.   SeenCMDExpCat29 = '整数变量 %';
  62.   SeenCMDExpCat30 = '整数变量 AND';
  63.   SeenCMDExpCat31 = '整数变量 OR';
  64.   SeenCMDExpCat32 = '整数变量 XOR';
  65.   SeenCMDExpCat33 = '整数变量复制';
  66.   SeenCMDExpCat34 = '整数变量 + 整数变量';
  67.   SeenCMDExpCat35 = '整数变量 - 整数变量';
  68.   SeenCMDExpCat36 = '整数变量 * 整数变量';
  69.   SeenCMDExpCat37 = '整数变量 / 整数变量';
  70.   SeenCMDExpCat38 = '整数变量 % 整数变量';
  71.   SeenCMDExpCat39 = '整数变量 AND 整数变量';
  72.   SeenCMDExpCat40 = '整数变量 OR 整数变量';
  73.   SeenCMDExpCat41 = '整数变量 XOR 整数变量';
  74.   SeenCMDExpCat42 = 'Bit变量随机赋值';
  75.   SeenCMDExpCat43 = '整数变量随机赋值';
  76.   SeenCMDExpCat44 = '用户选择操作 {...}';
  77.   SeenCMDExpCat45 = '字符串操作 {...}';
  78.   SeenCMDExpCat46 = '多变量赋值 {...}';
  79.   SeenCMDExpCat47 = '多变量初始化 {...}';
  80.   SeenCMDExpCat48 = '多变量顺序复制 {...}';
  81.   SeenCMDExpCat49 = '获得脚本信息 {...}';
  82.   SeenCMDExpCat50 = '多变量统计操作 {...}';
  83.   SeenCMDExpCat51 = '系统杂项操作 {...}';
  84.   SeenCMDExpCat52 = '名称操作 {...}';
  85.   SeenCMDExpCat53 = '图像Get/Put操作 {...}';
  86.   SeenCMDExpCat54 = '图像处理 {...}';
  87.   SeenCMDExpCat55 = '写字符串到图像缓存';
  88.   SeenCMDExpCat56 = '图像缓存操作 {...}';
  89.   SeenCMDExpCat57 = '图像画面操作 {...}';
  90.   SeenCMDExpCat58 = '图像滚动切换';
  91.   SeenCMDExpCat59 = '多图像滚动处理 {...}';
  92.   SeenCMDExpCat60 = '区域信息操作 {...}';
  93.   SeenCMDExpCat61 = '鼠标操作 {...}';
  94.   SeenCMDExpCat62 = 'CG模式操作 {...}';
  95.   SeenCMDExpCat63 = '系统窗口状态操作 {...}';
  96.   SeenCMDExpCat64 = '系统窗口位置操作 {...}';
  97.   SeenCMDExpCat65 = '系统状态操作 {...}';
  98.   SeenCMDExpCat66 = '弹出菜单控制 {...}';
  99.   SeenCMDExpCat67 = '音量控制 {...}';
  100.   SeenCMDExpCat68 = 'Novel模式控制 {...}';
  101.   SeenCMDExpCat69 = '显示半角文字';
  102.   SeenCMDExpCat70 = '显示全角文字';
  103.   SeenCMDExpCatXX = '未知命令 $%.2x:$%.2x';

  104. Type
  105.   RMixInt = Record
  106.   Case Boolean of
  107.     True:  ( Bytes: Array[0..3] of Char );
  108.     False: ( AInt: Integer );
  109.   END;

  110.   RScenHeader = Record
  111.   Sign: Array [1..16] of Char;
  112.   Resv: Array [1..8] of Char;
  113.   LineCount: Integer;
  114.   END;

  115.   RScenMenu = Record
  116.   Start, LoopBack: Integer;
  117.   Num: Byte;

  118.   SubNum, ID, StrID: Array[1..8] of Byte;
  119.   SubCnt, SubCntMax, SubID, SubStrID: Array[1..8, 1..8] of Byte;
  120.   Flag: Array[1..8, 1..8, 1..8] of Byte;
  121.   SubStart: Array[1..8, 1..8, 1..8] of Integer;
  122.   Str: Array[0..71] of ANSIString;

  123.   Cur, CurSub, CurSubSub: Integer;
  124.   Bit, BitCnt, SubBit, SubBitCnt: Byte;
  125.   END;

  126.   RLine = Record
  127.   Index: Integer;
  128.   Text: ANSIString;
  129.   END;

  130.   RValue = Record
  131.   IsRegister: Boolean;
  132.   Spacing: Byte;
  133.   Value: Integer;
  134.   END;

  135.   RText = Record
  136.   IsRegister: Boolean;
  137.   IsIndirect: Boolean;
  138.   Value: Integer;
  139.   Spacing: Integer;
  140.   Text: ANSIString;
  141.   END;

  142.   SCondType = ( CPRInt, CPRBit, CPImm, CPAttr, CPLOp );

  143.   RCondRec = Record
  144.   CType:  SCondType;
  145.   CValue: Integer;
  146.   END;

  147.   RConR = Array of RCondRec;

  148.   RCond = Record
  149.   Spacing: Integer;
  150.   Condition: RConR;
  151.   END;

  152.   RSelect = Record
  153.   Text: ANSIString;
  154.   Condition: RConR;
  155.   END;

  156.   PPutLineProc = Procedure(Index: Integer; Text: ANSIString) of Object;

  157.   RScenCMD = Class
  158.   Private
  159.     Offset: Integer;
  160.     Source: ANSIString;

  161.     CMD, SCMD, SSCMD: Byte;

  162.     CMDIntR: Array[1..32] of RValue;
  163.     CMDStrR: Array[1..4]  of RText;
  164.     CMDStr:  Array[1..2]  of ANSIString;
  165.     CMDInt:  Array[1..16] of Integer;

  166.     CMDAInt:  Array of Integer;
  167.     CMDAByte: Array of Byte;
  168.     CMDAStr:  Array of ANSIString;

  169.     CMDAIntR:  Array of RValue;
  170.     CMDAIntDR: Array of Array of RValue;
  171.     CMDAStrR:  Array of RText;
  172.     CMDACond:  Array of RCond;
  173.     CMDASelR:  Array of RSelect;

  174.     Function IntReader(Pos: Integer): Integer;
  175.     Function ValueReader(Pos: Integer): RValue;
  176.     Function TextReader(Pos: Integer): RText;
  177.     Function Conditioner(Pos: Integer; ExpectAttr: Boolean = False): RCond;
  178.     Function ReadFString(Pos: Integer; ExpectAttr: Boolean = False): Integer;
  179.     Function Han2Zen(StrIn: ANSIString): ANSIString;

  180.     Procedure Fault(Error: String; Pos: Integer = 256);
  181.   Public
  182.     Constructor Create(OrigLen, LineMax: Integer; PutLine:PPutLineProc; Var CMDString: ANSIString);
  183.     Destructor  Destroy; Override;

  184.     Function  Explain(Detail: Boolean): String;
  185.     Procedure ExpressTree(Tree: TTreeView; Root: TTreeNode);

  186.     Property RAWText: ANSIString read Source;
  187.     Property Start: Integer read Offset;
  188.   END;

  189.   RCMDTerm = Class
  190.   Private
  191.     ErrorMSG: String;

  192.   Public
  193.     Constructor Create(LError: String);
  194.     Destructor Destroy; Override;

  195.     Property Error: String read ErrorMSG;
  196.   END;

  197.   TScenario = Class
  198.   Private
  199.     SourceLen: Integer;
  200.     SourceMD5: String;

  201.     Source: ANSIString;
  202.     Header: RScenHeader;
  203.     IndexedLines: Array of RLine;

  204.     MenuPad:  Integer;
  205.     Version:  Integer;
  206.     ExtraPad: Integer;
  207.     Counter:  Integer;
  208.     JumpBase: Integer;
  209.     StartPos: Integer;

  210.     Menu: RScenMenu;
  211.     CMDS: TObjectList;

  212.     Function IntReader(Pos: Integer): Integer;
  213.     Function GetLine(Index: Integer): RLine;
  214.     Procedure PutLine(Index: Integer; Text: ANSIString);
  215.   Public
  216.     Constructor Create(SeenFile: ANSIString);
  217.     Destructor Destroy; Override;

  218.     Property SLen: Integer read SourceLen;
  219.     Property SMD5: String  read SourceMD5;
  220.     Property RAWText: ANSIString read Source;

  221.     Property MPad:  Integer read MenuPad;
  222.     Property Ver:  Integer read Version;
  223.     Property ExPad: Integer read ExtraPad;
  224.     Property Cntr:  Integer read Counter;
  225.     Property JMase: Integer read JumpBase;
  226.     Property Start: Integer read StartPos;

  227.     Property SHeader: RScenHeader read Header;
  228.     Property SMenu: RScenMenu read Menu;
  229.     Property SCMDS: TObjectList read CMDS;
  230.     Property Lines[Index: Integer]: RLine read GetLine;
  231.   end;

  232. Implementation

  233. Constructor RCMDTerm.Create(LError: String);
  234.   BEGIN
  235.   Inherited Create;

  236.   ErrorMSG:= LError;
  237.   END;

  238. Destructor RCMDTerm.Destroy;
  239.   BEGIN
  240.   Inherited;
  241.   END;

  242. Constructor TScenario.Create(SeenFile: ANSIString);
  243.   Var
  244.   I, J, K, L: Integer;
  245.   Pos, Str, Loop: Integer;

  246.   CMDSerial: ANSIString;
  247.   CMDItem: RScenCMD;
  248.   BEGIN
  249.   Inherited Create;
  250.   Source:= SeenFile;
  251.   SourceLen:= Length(Source);
  252.   SourceMD5:= MD5(Source);

  253.   Move(PChar(Source)^,Header,Sizeof(RScenHeader));
  254.   IF Trim(String(Header.Sign)) <> ScenFileSignature then
  255.     Raise Exception.Create(SeenScriptSignError);

  256.   SetLength(IndexedLines,Header.LineCount);
  257.   For I:= 0 to Header.LineCount-1 do
  258.     IndexedLines[I].Index:= IntReader($21+I*4);

  259.   MenuPad:= Header.LineCount * 4 + $50;
  260.   Pos:= MenuPad+1;
  261.   Version:= IntReader(Pos);
  262.   if Version = 5 then ExtraPad:= 4
  263.                   else ExtraPad:= 0;

  264.   Menu.Num:= IntReader(Pos-$24);
  265.   Counter:= IntReader(Pos-$28)-1;

  266.   // Reading Menu...
  267.   Str:= 0;
  268.   if Menu.Num > 8 then
  269.     Raise Exception.Create(Format(SeenHeaderMenuCountError, [ Menu.Num ]));

  270.   For I:= 1 to Menu.Num do
  271.     BEGIN
  272.     Menu.ID[I]:= ORD(Source[Pos]);
  273.     Menu.SubNum[I]:= ORD(Source[Pos+1]);
  274.     Inc(Pos,2);
  275.     Menu.StrID[I]:= Str; Inc(Str);

  276.     if Menu.SubNum[I] > 8 then
  277.       Raise Exception.Create(Format(SeenHeaderSubMenuCountError, [ I, Menu.SubNum[I] ]));

  278.     For J:= 1 to Menu.SubNum[I] do
  279.       BEGIN
  280.       Menu.SubID[I][J]:= ORD(Source[Pos]);
  281.       Menu.SubCntMax[I][J]:= ORD(Source[Pos+1]);
  282.       Inc(Pos,2);
  283.       Menu.SubStrID[I][J]:= Str; Inc(Str);

  284.       if Menu.SubCntMax[I][J] > 8 then
  285.         Raise Exception.Create(Format(SeenHeaderSubMenuMaxError, [ I, J, Menu.SubCntMax[I][J] ]));

  286.       For K:= 1 to Menu.SubCntMax[I][J] do
  287.         BEGIN
  288.         Loop:= ORD(Source[Pos]); Inc(Pos);

  289.         if Loop > 8 then
  290.           Raise Exception.Create(Format(SeenHeaderSubMenuLoopError, [ I, J, K, Loop ]));

  291.         For L:= 1 to Loop do
  292.           BEGIN
  293.           Menu.Flag[I][J][K]:= ORD(Source[Pos]);
  294.           Inc(Pos,3);
  295.           END;
  296.         END;
  297.       END;
  298.     END;

  299.   For I:= 1 to Str do
  300.     BEGIN
  301.     Menu.Str[I]:= PChar(Copy(Source,Pos+1,SourceLen));
  302.     Inc(Pos,ORD(Source[Pos])+1);
  303.     END;

  304.   Menu.Start:= IntReader(MenuPad+ExtraPad+$F+1) - 1;
  305.   Loop:= Menu.Start + 1;
  306.   StartPos:= MenuPad + ExtraPad + $13;
  307.   IF Counter > 0 then
  308.     BEGIN
  309.     Menu.LoopBack:= Loop + 4;
  310.     For I:= 1 to Counter do
  311.       Inc(Loop,IntReader(StartPos + Loop + 1)+4);
  312.     END;

  313.   For I:= 1 to Menu.Num do
  314.     For J:= 1 to Menu.SubNum[I] do
  315.     For K:= 1 to Menu.SubCntMax[I][J] do
  316.       BEGIN
  317.       Menu.SubStart[I][J][K]:= Loop + 4;
  318.       Inc(Loop,IntReader(StartPos + Loop + 1)+4);
  319.       END;

  320.   Menu.Cur:= -1;
  321.   Menu.Bit:= 1;
  322.   Menu.BitCnt:= 0;
  323.   Menu.SubBit:= 1;
  324.   Menu.SubBitCnt:= 0;
  325.   JumpBase:= 0;

  326.   CMDS:= TObjectList.Create(True);
  327.   CMDSerial:= Copy(Source,StartPos+1,Length(Source));
  328.   L:= Length(CMDSerial);
  329.   Repeat
  330.     Try
  331.     CMDItem:= RScenCMD.Create(L, Header.LineCount, PutLine, CMDSerial);
  332.     CMDS.Add(CMDItem);
  333.     Except
  334.     On E:Exception do
  335.       BEGIN
  336.       CMDS.Add(RCMDTerm.Create(E.Message));
  337.       Break;
  338.       END;
  339.     END;
  340.   Until CMDSerial = '';
  341.   END;

  342. Destructor TScenario.Destroy;
  343.   BEGIN
  344.   FreeAndNIL(CMDS);
  345.   SetLength(IndexedLines,0);

  346.   Inherited;
  347.   END;

  348. Function TScenario.IntReader(Pos: Integer): Integer;
  349.   Var
  350.   Cache: RMixInt;
  351.   BEGIN
  352.   Cache.Bytes[0]:= Source[Pos];
  353.   Cache.Bytes[1]:= Source[Pos+1];
  354.   Cache.Bytes[2]:= Source[Pos+2];
  355.   Cache.Bytes[3]:= Source[Pos+3];
  356.   Result:= Cache.AInt;
  357.   END;

  358. Function TScenario.GetLine(Index: Integer): RLine;
  359.   BEGIN
  360.   IF Index < Length(IndexedLines) then
  361.     Result:= IndexedLines[Index]
  362.   else
  363.     BEGIN
  364.     Result.Index:= -1;
  365.     Result.Text:= SeenHeaderGetTextError;
  366.     END;
  367.   END;

  368. Procedure TScenario.PutLine(Index: Integer; Text: ANSIString);
  369.   BEGIN
  370.   IndexedLines[Index].Text:= Text;
  371.   END;

  372. Constructor RScenCMD.Create(OrigLen, LineMax: Integer; PutLine:PPutLineProc; Var CMDString: ANSIString);
  373.   Var
  374.   Counter: Integer;
  375.   SizeCache: Integer;
  376.   J, K, L, M: Integer;
  377.   BEGIN
  378.   Inherited Create;

  379.   Source:= CMDString;
  380.   SizeCache:= Length(Source);
  381.   Offset:= OrigLen - SizeCache;

  382.   IF NOT Assigned(PutLine) then Fault(SeenCMDTextExtractNIL,0);
  383.   IF CMDString = '' then Fault(SeenCMDNIL,0);

  384.   Counter:= 1;
  385.   CMD:= ORD(Source[Counter]);
  386.   Inc(Counter);
  387.   Try
  388.     Case CMD of
  389.     $00, $01, $03, $06, $1A, $22..$29, $65:
  390.       BEGIN
  391.       Dec(Counter);
  392.       END;
  393.     $02, $04, $20, $30:
  394.       BEGIN
  395.       SCMD:= ORD(Source[Counter]);
  396.       END;
  397.     $05, $7F:
  398.       BEGIN
  399.       CMDIntR[1]:= ValueReader(Counter);
  400.       Inc(Counter,CMDIntR[1].Spacing-1);
  401.       END;
  402.     $08:
  403.       BEGIN
  404.       SCMD:= ORD(Source[Counter]);
  405.       Inc(Counter);
  406.       Case SCMD of
  407.         $01:
  408.         BEGIN
  409.           Dec(Counter);
  410.         END;
  411.         $10, $11:
  412.         BEGIN
  413.           CMDIntR[1]:= ValueReader(Counter);
  414.           Inc(Counter,CMDIntR[1].Spacing-1);
  415.         END;
  416.         ELSE Dec(Counter);
  417.       END;
  418.       END;
  419.     $0B:
  420.       BEGIN
  421.       SCMD:= ORD(Source[Counter]);
  422.       Inc(Counter);
  423.       Case SCMD of
  424.         $01, $03, $05, $09, $10, $54:
  425.         BEGIN
  426.           CMDStrR[1]:= TextReader(Counter);
  427.           Inc(Counter,CMDStrR[1].Spacing);

  428.           CMDIntR[1]:= ValueReader(Counter);
  429.           Inc(Counter,CMDIntR[1].Spacing-1);
  430.         END;
  431.         $02, $04, $06:
  432.         BEGIN
  433.           CMDStrR[1]:= TextReader(Counter);
  434.           Inc(Counter,CMDStrR[1].Spacing);

  435.           For J:= 1 to 15 do
  436.           BEGIN
  437.             CMDIntR[J]:= ValueReader(Counter);
  438.             Inc(Counter,CMDIntR[J].Spacing);
  439.           END;

  440.           Dec(Counter);
  441.         END;
  442.         $08, $13, $30, $50:
  443.         BEGIN
  444.           Dec(Counter);
  445.         END;
  446.         $11:
  447.         BEGIN
  448.           CMDStrR[1]:= TextReader(Counter);
  449.           Inc(Counter,CMDStrR[1].Spacing-1);
  450.         END;
  451.         $22:
  452.         BEGIN
  453.           K:= ORD(Source[Counter]);

  454.           SetLength(CMDAStrR,K);
  455.           SetLength(CMDAByte,K);
  456.           SetLength(CMDAIntDR,K,7);
  457.           Inc(Counter);

  458.           CMDStrR[1]:= TextReader(Counter);
  459.           Inc(Counter,CMDStrR[1].Spacing);

  460.           CMDIntR[1]:= ValueReader(Counter);
  461.           Inc(Counter,CMDIntR[1].Spacing);

  462.           For J:= 0 to K-1 do
  463.           BEGIN
  464.             L:= ORD(Source[Counter]);
  465.             Inc(Counter);

  466.             CMDAByte[J]:= L;
  467.             CMDAStrR[J]:= TextReader(Counter);
  468.             Inc(Counter,CMDAStrR[J].Spacing);

  469.             Case L of
  470.             $01:
  471.               BEGIN
  472.               { NOTHING }
  473.               END;
  474.             $02:
  475.               BEGIN
  476.               CMDAIntDR[J][0]:= ValueReader(Counter);
  477.               Inc(Counter,CMDAIntDR[J][0].Spacing);
  478.               END;
  479.             $03:
  480.               BEGIN
  481.               For M:= 0 to 5 do
  482.                 BEGIN
  483.                 CMDAIntDR[J][M]:= ValueReader(Counter);
  484.                 Inc(Counter,CMDAIntDR[J][M].Spacing);
  485.                 END;
  486.               END;
  487.             $04:
  488.               BEGIN
  489.               For M:= 0 to 6 do
  490.                 BEGIN
  491.                 CMDAIntDR[J][M]:= ValueReader(Counter);
  492.                 Inc(Counter,CMDAIntDR[J][M].Spacing);
  493.                 END;
  494.               END;
  495.             END;
  496.           END;
  497.           Dec(Counter);
  498.         END;
  499.         $24:
  500.         BEGIN
  501.           K:= ORD(Source[Counter]);

  502.           SetLength(CMDAStrR,K);
  503.           SetLength(CMDAByte,K);
  504.           SetLength(CMDAIntDR,K,7);
  505.           Inc(Counter);

  506.           CMDIntR[1]:= ValueReader(Counter);
  507.           Inc(Counter,CMDIntR[1].Spacing);

  508.           CMDIntR[2]:= ValueReader(Counter);
  509.           Inc(Counter,CMDIntR[2].Spacing);

  510.           For J:= 0 to K-1 do
  511.           BEGIN
  512.             L:= ORD(Source[Counter]);
  513.             Inc(Counter);

  514.             CMDAByte[J]:= L;
  515.             CMDAStrR[J]:= TextReader(Counter);
  516.             Inc(Counter,CMDAStrR[J].Spacing);

  517.             Case L of
  518.             $01:
  519.               BEGIN
  520.               { NOTHING }
  521.               END;
  522.             $02:
  523.               BEGIN
  524.               CMDAIntDR[J][0]:= ValueReader(Counter);
  525.               Inc(Counter,CMDAIntDR[J][0].Spacing);
  526.               END;
  527.             $03:
  528.               BEGIN
  529.               For M:= 0 to 5 do
  530.                 BEGIN
  531.                 CMDAIntDR[J][M]:= ValueReader(Counter);
  532.                 Inc(Counter,CMDAIntDR[J][M].Spacing);
  533.                 END;
  534.               END;
  535.             $04:
  536.               BEGIN
  537.               For M:= 0 to 6 do
  538.                 BEGIN
  539.                 CMDAIntDR[J][M]:= ValueReader(Counter);
  540.                 Inc(Counter,CMDAIntDR[J][M].Spacing);
  541.                 END;
  542.               END;
  543.             END;
  544.           END;
  545.           Dec(Counter);
  546.         END;
  547.         $31, $32, $33, $52:
  548.         BEGIN
  549.           CMDIntR[1]:= ValueReader(Counter);
  550.           Inc(Counter,CMDIntR[1].Spacing-1);
  551.         END;
  552.         ELSE Dec(Counter);
  553.       END;
  554.       END;
  555.     $0C:
  556.       BEGIN
  557.       SCMD:= ORD(Source[Counter]);
  558.       Inc(Counter);
  559.       Case SCMD of
  560.         $10:
  561.         BEGIN
  562.           CMDStrR[1]:= TextReader(Counter);
  563.           Inc(Counter,CMDStrR[1].Spacing);

  564.           CMDIntR[1]:= ValueReader(Counter);
  565.           Inc(Counter,CMDIntR[1].Spacing-1);
  566.         END;
  567.         $18:
  568.         BEGIN
  569.           CMDStrR[1]:= TextReader(Counter);
  570.           Inc(Counter,CMDStrR[1].Spacing);

  571.           CMDIntR[1]:= ValueReader(Counter);
  572.           Inc(Counter,CMDIntR[1].Spacing);

  573.           CMDStrR[2]:= TextReader(Counter);
  574.           Inc(Counter,CMDStrR[2].Spacing-1);
  575.         END;
  576.         $12, $30, $20, $24:
  577.         BEGIN
  578.           CMDStrR[1]:= TextReader(Counter);
  579.           Inc(Counter,CMDStrR[1].Spacing);

  580.           K:= 1; L:= 0;
  581.           While Source[Counter] <> #00 do
  582.           BEGIN
  583.             SetLength(CMDAIntR,K);
  584.             CMDAIntR[L]:= ValueReader(Counter);
  585.             Inc(Counter,CMDAIntR[L].Spacing);
  586.             Inc(K); Inc(L);
  587.           END;
  588.           Dec(Counter);
  589.         END;
  590.         $13, $21, $25:
  591.         BEGIN
  592.           Dec(Counter);
  593.         END;
  594.         $16:
  595.         BEGIN
  596.           CMDStrR[1]:= TextReader(Counter);
  597.           Inc(Counter,CMDStrR[1].Spacing);

  598.           CMDIntR[1]:= ValueReader(Counter);
  599.           Inc(Counter,CMDIntR[1].Spacing);

  600.           CMDStrR[2]:= TextReader(Counter);
  601.           Inc(Counter,CMDStrR[2].Spacing);

  602.           CMDIntR[2]:= ValueReader(Counter);
  603.           Inc(Counter,CMDIntR[2].Spacing-1);
  604.         END;
  605.         ELSE Dec(Counter);
  606.       END;
  607.       END;
  608.     $0E:
  609.       BEGIN
  610.       SCMD:= ORD(Source[Counter]);
  611.       Inc(Counter);
  612.       Case SCMD of
  613.         $01, $02, $03, $30, $32, $34:
  614.         BEGIN
  615.           CMDStrR[1]:= TextReader(Counter);
  616.           Inc(Counter,CMDStrR[1].Spacing-1);
  617.         END;
  618.         $05, $06, $07, $31, $33, $35:
  619.         BEGIN
  620.           CMDStrR[1]:= TextReader(Counter);
  621.           Inc(Counter,CMDStrR[1].Spacing);

  622.           CMDIntR[1]:= ValueReader(Counter);
  623.           Inc(Counter,CMDIntR[1].Spacing-1);
  624.         END;
  625.         $10, $20, $21, $37, $39, $40:
  626.         BEGIN
  627.           CMDIntR[1]:= ValueReader(Counter);
  628.           Inc(Counter,CMDIntR[1].Spacing-1);
  629.         END;
  630.         $11, $12, $36, $38:
  631.         BEGIN
  632.           Dec(Counter);
  633.         END;
  634.         $22:
  635.         BEGIN
  636.           CMDIntR[1]:= ValueReader(Counter);
  637.           Inc(Counter,CMDIntR[1].Spacing);

  638.           CMDIntR[2]:= ValueReader(Counter);
  639.           Inc(Counter,CMDIntR[2].Spacing-1);
  640.         END;
  641.         $50, $51, $52, $53:
  642.         BEGIN
  643.           CMDStrR[1]:= TextReader(Counter);
  644.           Inc(Counter,CMDStrR[1].Spacing);

  645.           For J:= 1 to 4 do
  646.           BEGIN
  647.             CMDIntR[J]:= ValueReader(Counter);
  648.             Inc(Counter,CMDIntR[J].Spacing);
  649.           END;
  650.           Dec(Counter);
  651.         END;
  652.         $54, $55:
  653.         BEGIN
  654.           CMDStrR[1]:= TextReader(Counter);
  655.           Inc(Counter,CMDStrR[1].Spacing);

  656.           CMDStrR[2]:= TextReader(Counter);
  657.           Inc(Counter,CMDStrR[2].Spacing);

  658.           For J:= 1 to 4 do
  659.           BEGIN
  660.             CMDIntR[J]:= ValueReader(Counter);
  661.             Inc(Counter,CMDIntR[J].Spacing);
  662.           END;
  663.           Dec(Counter);
  664.         END;
  665.         ELSE Dec(Counter);
  666.       END;
  667.       END;
  668.     $10:
  669.       BEGIN
  670.       SCMD:= ORD(Source[Counter]);
  671.       Inc(Counter);
  672.       Case SCMD of
  673.         $01, $03:
  674.         BEGIN
  675.           CMDIntR[1]:= ValueReader(Counter);
  676.           Inc(Counter,CMDIntR[1].Spacing-1);
  677.         END;
  678.         $02:
  679.         BEGIN
  680.           CMDIntR[1]:= ValueReader(Counter);
  681.           Inc(Counter,CMDIntR[1].Spacing);

  682.           CMDIntR[2]:= ValueReader(Counter);
  683.           Inc(Counter,CMDIntR[2].Spacing-1);
  684.         END;
  685.         ELSE Dec(Counter);
  686.       END;
  687.       END;
  688.     $13:
  689.       BEGIN
  690.       SCMD:= ORD(Source[Counter]);
  691.       Inc(Counter);
  692.       Case SCMD of
  693.         $01, $10:
  694.         BEGIN
  695.           CMDIntR[1]:= ValueReader(Counter);
  696.           Inc(Counter,CMDIntR[1].Spacing-1);
  697.         END;
  698.         $02:
  699.         BEGIN
  700.           CMDIntR[1]:= ValueReader(Counter);
  701.           Inc(Counter,CMDIntR[1].Spacing);

  702.           CMDIntR[2]:= ValueReader(Counter);
  703.           Inc(Counter,CMDIntR[2].Spacing-1);
  704.         END;
  705.         $03, $11:
  706.         BEGIN
  707.           CMDIntR[1]:= ValueReader(Counter);
  708.           Inc(Counter,CMDIntR[1].Spacing);

  709.           CMDIntR[2]:= ValueReader(Counter);
  710.           Inc(Counter,CMDIntR[2].Spacing);

  711.           CMDIntR[3]:= ValueReader(Counter);
  712.           Inc(Counter,CMDIntR[3].Spacing-1);
  713.         END;
  714.         $04:
  715.         BEGIN
  716.           CMDIntR[1]:= ValueReader(Counter);
  717.           Inc(Counter,CMDIntR[1].Spacing);

  718.           CMDIntR[2]:= ValueReader(Counter);
  719.           Inc(Counter,CMDIntR[2].Spacing);

  720.           CMDIntR[3]:= ValueReader(Counter);
  721.           Inc(Counter,CMDIntR[3].Spacing);

  722.           CMDIntR[4]:= ValueReader(Counter);
  723.           Inc(Counter,CMDIntR[4].Spacing-1);
  724.         END;
  725.         ELSE Dec(Counter);
  726.       END;
  727.       END;
  728.     $15:
  729.       BEGIN
  730.       SetLength(CMDACond,1);
  731.       CMDACond[0]:= Conditioner(Counter);
  732.       Inc(Counter,CMDACond[0].Spacing);

  733.       CMDInt[1]:= IntReader(Counter);
  734.       Inc(Counter,3);
  735.       END;
  736.     $16:
  737.       BEGIN
  738.       SCMD:= ORD(Source[Counter]);
  739.       Inc(Counter);

  740.       CMDIntR[1]:= ValueReader(Counter);
  741.       Inc(Counter,CMDIntR[1].Spacing-1);
  742.       END;
  743.     $17, $18, $2C, $31:
  744.       BEGIN
  745.       SCMD:= ORD(Source[Counter]);
  746.       Inc(Counter);
  747.       Case SCMD of
  748.         $01:
  749.         BEGIN
  750.           CMDIntR[1]:= ValueReader(Counter);
  751.           Inc(Counter,CMDIntR[1].Spacing-1);
  752.         END;
  753.         ELSE Dec(Counter);
  754.       END;
  755.       END;
  756.     $19:
  757.       BEGIN
  758.       SCMD:= ORD(Source[Counter]);
  759.       Inc(Counter);
  760.       Case SCMD of
  761.         $01, $04, $06:
  762.         BEGIN
  763.           CMDIntR[1]:= ValueReader(Counter);
  764.           Inc(Counter,CMDIntR[1].Spacing-1);
  765.         END;
  766.         $02, $05:
  767.         BEGIN
  768.           CMDIntR[1]:= ValueReader(Counter);
  769.           Inc(Counter,CMDIntR[1].Spacing);

  770.           CMDIntR[2]:= ValueReader(Counter);
  771.           Inc(Counter,CMDIntR[2].Spacing-1);
  772.         END;
  773.         $03, $10, $11, $12, $13:
  774.         BEGIN
  775.           Dec(Counter);
  776.         END;
  777.         ELSE Dec(Counter);
  778.       END;
  779.       END;
  780.     $1B, $1C:
  781.       BEGIN
  782.       CMDInt[1]:= IntReader(Counter);
  783.       Inc(Counter,3);
  784.       END;
  785.     $1D, $1E:
  786.       BEGIN
  787.       M:= ORD(Source[Counter]);
  788.       CMDInt[1]:= M;
  789.       Inc(Counter);

  790.       CMDIntR[1]:= ValueReader(Counter);
  791.       Inc(Counter,CMDIntR[1].Spacing);

  792.       SetLength(CMDAInt,M);
  793.       For L:= 0 to M-2 do
  794.         BEGIN
  795.         CMDAInt[L]:= IntReader(Counter);
  796.         Inc(Counter,4);
  797.         END;

  798.       CMDInt[2]:= IntReader(Counter);
  799.       Inc(Counter,3);
  800.       END;
  801.     $2D:
  802.       BEGIN
  803.       SCMD:= ORD(Source[Counter]);
  804.       Inc(Counter);
  805.       Case SCMD of
  806.         $01, $02:
  807.         BEGIN
  808.           CMDIntR[1]:= ValueReader(Counter);
  809.           Inc(Counter,CMDIntR[1].Spacing-1);
  810.         END;
  811.         $03, $04:
  812.         BEGIN
  813.           CMDIntR[1]:= ValueReader(Counter);
  814.           Inc(Counter,CMDIntR[1].Spacing);

  815.           CMDIntR[2]:= ValueReader(Counter);
  816.           Inc(Counter,CMDIntR[2].Spacing-1);
  817.         END;
  818.         ELSE Dec(Counter);
  819.       END;
  820.       END;
  821.     $2E:
  822.       BEGIN
  823.       SCMD:= ORD(Source[Counter]);
  824.       Inc(Counter);
  825.       Case SCMD of
  826.         $01:
  827.         BEGIN
  828.           CMDIntR[1]:= ValueReader(Counter);
  829.           Inc(Counter,CMDIntR[1].Spacing-1);
  830.         END;
  831.         $02:
  832.         BEGIN
  833.           CMDIntR[1]:= ValueReader(Counter);
  834.           Inc(Counter,CMDIntR[1].Spacing);

  835.           CMDIntR[2]:= ValueReader(Counter);
  836.           Inc(Counter,CMDIntR[2].Spacing-1);
  837.         END;
  838.         ELSE Dec(Counter);
  839.       END;
  840.       END;
  841.     $2F:
  842.       BEGIN
  843.       SCMD:= ORD(Source[Counter]);
  844.       Inc(Counter);
  845.       Case SCMD of
  846.         $01:
  847.         BEGIN
  848.           CMDIntR[1]:= ValueReader(Counter);
  849.           Inc(Counter,CMDIntR[1].Spacing);

  850.           CMDIntR[2]:= ValueReader(Counter);
  851.           Inc(Counter,CMDIntR[2].Spacing);

  852.           CMDIntR[3]:= ValueReader(Counter);
  853.           Inc(Counter,CMDIntR[3].Spacing-1);
  854.         END;
  855.         ELSE Dec(Counter);
  856.       END;
  857.       END;
  858.     $37, $39, $3B..$43, $49..$51:
  859.       BEGIN
  860.       CMDIntR[1]:= ValueReader(Counter);
  861.       Inc(Counter,CMDIntR[1].Spacing);

  862.       CMDIntR[2]:= ValueReader(Counter);
  863.       Inc(Counter,CMDIntR[2].Spacing-1);
  864.       END;
  865.     $56:
  866.       BEGIN
  867.       CMDIntR[1]:= ValueReader(Counter);
  868.       Inc(Counter,CMDIntR[1].Spacing-1);
  869.       END;
  870.     $57:
  871.       BEGIN
  872.       CMDIntR[1]:= ValueReader(Counter);
  873.       Inc(Counter,CMDIntR[1].Spacing);

  874.       CMDIntR[2]:= ValueReader(Counter);
  875.       Inc(Counter,CMDIntR[2].Spacing);

  876.       CMDIntR[3]:= ValueReader(Counter);
  877.       Inc(Counter,CMDIntR[3].Spacing-1);
  878.       END;
  879.     $58:
  880.       BEGIN
  881.       SCMD:= ORD(Source[Counter]);
  882.       Inc(Counter);
  883.       Case SCMD of
  884.         $01, $02:
  885.         BEGIN
  886.           CMDIntR[1]:= ValueReader(Counter);
  887.           Inc(Counter,CMDIntR[1].Spacing);
  888.          
  889.           SSCMD:= ORD(Source[Counter]);
  890.           Inc(Counter);
  891.           Case SSCMD of
  892.           $22:
  893.             BEGIN
  894.             L:= 0;
  895.             IF Source[Counter] = #$00 then Inc(Counter);
  896.             Repeat
  897.               SetLength(CMDASelR,L+1);
  898.               CMDASelR[L].Text:= '';

  899.               M:= ReadFString(Counter, True);
  900.               Inc(Counter,M);

  901.               IF Length(CMDACond) = 1 then
  902.               CMDASelR[L].Condition:= CMDACond[0].Condition;

  903.               For J:= 0 to High(CMDAStrR) do
  904.               CMDASelR[L].Text:= CMDASelR[L].Text + CMDAStrR[J].Text;

  905.             IF Source[Counter] = #$00 then Inc(Counter);
  906.             Until Source[Counter] = #$23;
  907.             END;
  908.           ELSE Fault(SeenCMDSelectListError,Counter);
  909.           END;
  910.         END;
  911.         $04:
  912.         BEGIN
  913.           CMDIntR[1]:= ValueReader(Counter);
  914.           Inc(Counter,CMDIntR[1].Spacing-1);
  915.         END;
  916.         ELSE Dec(Counter);
  917.       END;
  918.       END;
  919.     $59:
  920.       BEGIN
  921.       SCMD:= ORD(Source[Counter]);
  922.       Inc(Counter);

  923.       CMDIntR[1]:= ValueReader(Counter);
  924.       Inc(Counter,CMDIntR[1].Spacing);

  925.       Case SCMD of
  926.         $01:
  927.         BEGIN
  928.           CMDStrR[1]:= TextReader(Counter);
  929.           Inc(Counter,CMDStrR[1].Spacing-1);
  930.         END;
  931.         $02, $04, $05, $08:
  932.         BEGIN
  933.           CMDIntR[2]:= ValueReader(Counter);
  934.           Inc(Counter,CMDIntR[2].Spacing-1);
  935.         END;
  936.         $03, $06:
  937.         BEGIN
  938.           CMDIntR[2]:= ValueReader(Counter);
  939.           Inc(Counter,CMDIntR[2].Spacing);

  940.           CMDIntR[3]:= ValueReader(Counter);
  941.           Inc(Counter,CMDIntR[3].Spacing-1);
  942.         END;
  943.         $07:
  944.         BEGIN
  945.           Dec(Counter);
  946.         END;
  947.         ELSE Dec(Counter);
  948.       END;
  949.       END;
  950.     $5B:
  951.       BEGIN
  952.       SCMD:= ORD(Source[Counter]);
  953.       Inc(Counter);

  954.       CMDIntR[1]:= ValueReader(Counter);
  955.       Inc(Counter,CMDIntR[1].Spacing);

  956.       Case SCMD of
  957.         $01, $02:
  958.         BEGIN
  959.           L:= 0;
  960.           Repeat
  961.           SetLength(CMDAIntR,L+1);
  962.           CMDAIntR[L]:= ValueReader(Counter);
  963.           Inc(Counter,CMDAIntR[L].Spacing);
  964.           Until Source[Counter] = #$00;
  965.         END;
  966.         ELSE Dec(Counter);
  967.       END;
  968.       END;
  969.     $5C, $5D:
  970.       BEGIN
  971.       SCMD:= ORD(Source[Counter]);
  972.       Inc(Counter);

  973.       CMDIntR[1]:= ValueReader(Counter);
  974.       Inc(Counter,CMDIntR[1].Spacing);

  975.       CMDIntR[2]:= ValueReader(Counter);
  976.       Inc(Counter,CMDIntR[2].Spacing);

  977.       CMDIntR[3]:= ValueReader(Counter);
  978.       Inc(Counter,CMDIntR[3].Spacing-1);
  979.       END;
  980.     $5E:
  981.       BEGIN
  982.       SCMD:= ORD(Source[Counter]);
  983.       Inc(Counter);

  984.       CMDIntR[1]:= ValueReader(Counter);
  985.       Inc(Counter,CMDIntR[1].Spacing-1);
  986.       END;
  987.     $5F:
  988.       BEGIN
  989.       SCMD:= ORD(Source[Counter]);
  990.       Inc(Counter);
  991.       Case SCMD of
  992.         $01:
  993.         BEGIN
  994.           CMDIntR[1]:= ValueReader(Counter);
  995.           Inc(Counter,CMDIntR[1].Spacing);

  996.           L:= 0; M:= 0;
  997.           SetLength(CMDAByte,L+1);
  998.           CMDAByte[L]:= ORD(Source[Counter]);
  999.           Inc(Counter); Inc(L);
  1000.           Repeat
  1001.           Case CMDAByte[L-1] of
  1002.             $01, $11:
  1003.             BEGIN
  1004.               SetLength(CMDAIntR,M+1);
  1005.               CMDAIntR[M]:= ValueReader(Counter);
  1006.               Inc(Counter,CMDAIntR[M].Spacing); Inc(M);
  1007.             END;
  1008.             $02, $12:
  1009.             BEGIN
  1010.               SetLength(CMDAIntR,M+2);
  1011.               CMDAIntR[M]:= ValueReader(Counter);
  1012.               Inc(Counter,CMDAIntR[M].Spacing); Inc(M);
  1013.               CMDAIntR[M]:= ValueReader(Counter);
  1014.               Inc(Counter,CMDAIntR[M].Spacing); Inc(M);
  1015.             END;
  1016.             ELSE Fault(SeenCMDSumError,Counter);
  1017.           END;

  1018.           SetLength(CMDAByte,L+1);
  1019.           CMDAByte[L]:= ORD(Source[Counter]);
  1020.           Inc(Counter); Inc(L);
  1021.           Until CMDAByte[L-1] = 0;
  1022.           Dec(Counter);
  1023.         END;
  1024.         $10:
  1025.         BEGIN
  1026.           CMDIntR[1]:= ValueReader(Counter);
  1027.           Inc(Counter,CMDIntR[1].Spacing);

  1028.           CMDIntR[2]:= ValueReader(Counter);
  1029.           Inc(Counter,CMDIntR[2].Spacing);

  1030.           CMDIntR[3]:= ValueReader(Counter);
  1031.           Inc(Counter,CMDIntR[3].Spacing-1);
  1032.         END;
  1033.         $20:
  1034.         BEGIN
  1035.           M:= ORD(Source[Counter]);
  1036.           CMDInt[1]:= M;
  1037.           Inc(Counter);

  1038.           CMDIntR[1]:= ValueReader(Counter);
  1039.           Inc(Counter,CMDIntR[1].Spacing);

  1040.           CMDIntR[2]:= ValueReader(Counter);
  1041.           Inc(Counter,CMDIntR[2].Spacing);

  1042.           SetLength(CMDAIntR,M);
  1043.           For L:= 0 to M-1 do
  1044.           BEGIN
  1045.             CMDAIntR[L]:= ValueReader(Counter);
  1046.             Inc(Counter,CMDAIntR[L].Spacing);
  1047.           END;
  1048.           Dec(Counter);
  1049.         END;
  1050.         ELSE Dec(Counter);
  1051.       END;
  1052.       END;
  1053.     $60:
  1054.       BEGIN
  1055.       SCMD:= ORD(Source[Counter]);
  1056.       Inc(Counter);
  1057.       Case SCMD of
  1058.         $02, $03:
  1059.         BEGIN
  1060.           CMDIntR[1]:= ValueReader(Counter);
  1061.           Inc(Counter,CMDIntR[1].Spacing-1);
  1062.         END;
  1063.         $04:
  1064.         BEGIN
  1065.           M:= ReadFString(Counter);
  1066.           Inc(Counter, M);
  1067.         END;
  1068.         $05, $20:
  1069.         BEGIN
  1070.           Dec(Counter)
  1071.         END;
  1072.         $30, $31, $35, $36, $37:
  1073.         BEGIN
  1074.           CMDIntR[1]:= ValueReader(Counter);
  1075.           Inc(Counter,CMDIntR[1].Spacing);

  1076.           CMDIntR[2]:= ValueReader(Counter);
  1077.           Inc(Counter,CMDIntR[2].Spacing-1);
  1078.         END;
  1079.         ELSE Dec(Counter);
  1080.       END;
  1081.       END;
  1082.     $61:
  1083.       BEGIN
  1084.       SCMD:= ORD(Source[Counter]);
  1085.       Inc(Counter);
  1086.       Case SCMD of
  1087.         $01:
  1088.         BEGIN
  1089.           For L:= 1 to 10 do
  1090.           BEGIN
  1091.             CMDIntR[L]:= ValueReader(Counter);
  1092.             Inc(Counter,CMDIntR[L].Spacing);
  1093.           END;
  1094.           Dec(Counter);
  1095.         END;
  1096.         $02, $03, $20:
  1097.         BEGIN
  1098.           CMDIntR[1]:= ValueReader(Counter);
  1099.           Inc(Counter,CMDIntR[1].Spacing-1);
  1100.         END;
  1101.         $04:
  1102.         BEGIN
  1103.           Dec(Counter);
  1104.         END;
  1105.         $10,$11,$12:
  1106.         BEGIN
  1107.           CMDIntR[1]:= ValueReader(Counter);
  1108.           Inc(Counter,CMDIntR[1].Spacing);

  1109.           CMDIntR[2]:= ValueReader(Counter);
  1110.           Inc(Counter,CMDIntR[2].Spacing-1);
  1111.         END;
  1112.         $21:
  1113.         BEGIN
  1114.           CMDIntR[1]:= ValueReader(Counter);
  1115.           Inc(Counter,CMDIntR[1].Spacing);

  1116.           CMDStrR[1]:= TextReader(Counter);
  1117.           Inc(Counter,CMDStrR[1].Spacing);

  1118.           For L:= 2 to 10 do
  1119.           BEGIN
  1120.             CMDIntR[L]:= ValueReader(Counter);
  1121.             Inc(Counter,CMDIntR[L].Spacing);
  1122.           END;
  1123.           Dec(Counter);
  1124.         END;
  1125.         $24:
  1126.         BEGIN
  1127.           M:= ORD(Source[Counter]);
  1128.           CMDInt[1]:= M;
  1129.           Inc(Counter);

  1130.           SetLength(CMDAIntR,M);
  1131.           SetLength(CMDAStr,M);
  1132.           For L:= 0 to M-1 do
  1133.           BEGIN
  1134.             CMDAIntR[L]:= ValueReader(Counter);
  1135.             Inc(Counter,CMDAIntR[L].Spacing);

  1136.             J:= ReadFString(Counter);
  1137.             Inc(Counter,J);
  1138.             CMDAStr[L]:= '';
  1139.             For K:= 0 to High(CMDAStrR) do
  1140.             CMDAStr[L]:= CMDAStr[L] + CMDAStrR[K].Text;
  1141.             IF Source[Counter] = #00 then Inc(Counter);
  1142.           END;
  1143.           Dec(Counter);
  1144.         END;
  1145.         ELSE Dec(Counter);
  1146.       END;
  1147.       END;
  1148.     $63:
  1149.       BEGIN
  1150.       SCMD:= ORD(Source[Counter]);
  1151.       Inc(Counter);
  1152.       Case SCMD of
  1153.         $01:
  1154.         BEGIN
  1155.           For L:= 1 to 5 do
  1156.           BEGIN
  1157.             CMDIntR[L]:= ValueReader(Counter);
  1158.             Inc(Counter,CMDIntR[L].Spacing);
  1159.           END;
  1160.           Dec(Counter);
  1161.         END;
  1162.         $02:
  1163.         BEGIN
  1164.           For L:= 1 to 3 do
  1165.           BEGIN
  1166.             CMDIntR[L]:= ValueReader(Counter);
  1167.             Inc(Counter,CMDIntR[L].Spacing);
  1168.           END;
  1169.           Dec(Counter);
  1170.         END;
  1171.         $20:
  1172.         BEGIN
  1173.           CMDInt[1]:= ORD(Source[Counter]);
  1174.           Inc(Counter);

  1175.           CMDIntR[1]:= ValueReader(Counter);
  1176.           Inc(Counter,CMDIntR[1].Spacing-1);
  1177.         END;
  1178.         ELSE Dec(Counter);
  1179.       END;
  1180.       END;
  1181.     $64:
  1182.       BEGIN
  1183.       SCMD:= ORD(Source[Counter]);
  1184.       Inc(Counter);
  1185.       Case SCMD of
  1186.         $02, $04, $10:
  1187.         BEGIN
  1188.           For L:= 1 to 8 do
  1189.           BEGIN
  1190.             CMDIntR[L]:= ValueReader(Counter);
  1191.             Inc(Counter,CMDIntR[L].Spacing);
  1192.           END;
  1193.           Dec(Counter);
  1194.         END;
  1195.         $07, $11, $12, $20:
  1196.         BEGIN
  1197.           For L:= 1 to 5 do
  1198.           BEGIN
  1199.             CMDIntR[L]:= ValueReader(Counter);
  1200.             Inc(Counter,CMDIntR[L].Spacing);
  1201.           END;
  1202.           Dec(Counter);
  1203.         END;
  1204.         $15:
  1205.         BEGIN
  1206.           For L:= 1 to 9 do
  1207.           BEGIN
  1208.             CMDIntR[L]:= ValueReader(Counter);
  1209.             Inc(Counter,CMDIntR[L].Spacing);
  1210.           END;
  1211.           Dec(Counter);
  1212.         END;
  1213.         $30:
  1214.         BEGIN
  1215.           For L:= 1 to 10 do
  1216.           BEGIN
  1217.             CMDIntR[L]:= ValueReader(Counter);
  1218.             Inc(Counter,CMDIntR[L].Spacing);
  1219.           END;
  1220.           Dec(Counter);
  1221.         END;
  1222.         $32:
  1223.         BEGIN
  1224.           For L:= 1 to 16 do
  1225.           BEGIN
  1226.             CMDIntR[L]:= ValueReader(Counter);
  1227.             Inc(Counter,CMDIntR[L].Spacing);
  1228.           END;
  1229.           Dec(Counter);
  1230.         END;
  1231.         ELSE Dec(Counter);
  1232.       END;
  1233.       END;
  1234.     $66:
  1235.       BEGIN
  1236.       SCMD:= ORD(Source[Counter]);
  1237.       Inc(Counter);

  1238.       For L:= 1 to 6 do
  1239.         BEGIN
  1240.         CMDIntR[L]:= ValueReader(Counter);
  1241.         Inc(Counter,CMDIntR[L].Spacing);
  1242.         END;

  1243.       J:= ReadFString(Counter);
  1244.       CMDStr[1]:= '';
  1245.       For L:= 1 to High(CMDAStrR) do
  1246.         BEGIN
  1247.         CMDStr[1]:= CMDStr[1] + CMDAStrR[L].Text;
  1248.         END;
  1249.       Inc(Counter,J-1);
  1250.       END;
  1251.     $67:
  1252.       BEGIN
  1253.       SCMD:= ORD(Source[Counter]);
  1254.       Inc(Counter);
  1255.       Case SCMD of
  1256.         $00:
  1257.         BEGIN
  1258.           For L:= 1 to 6 do
  1259.           BEGIN
  1260.             CMDIntR[L]:= ValueReader(Counter);
  1261.             Inc(Counter,CMDIntR[L].Spacing);
  1262.           END;
  1263.           Dec(Counter);
  1264.         END;
  1265.         $01:
  1266.         BEGIN
  1267.           For L:= 1 to 9 do  { 8 for earlier than 3217D }
  1268.           BEGIN
  1269.             CMDIntR[L]:= ValueReader(Counter);
  1270.             Inc(Counter,CMDIntR[L].Spacing);
  1271.           END;
  1272.           Dec(Counter);
  1273.         END;
  1274.         $02:
  1275.         BEGIN
  1276.           For L:= 1 to 9 do { 8 for earlier than 3216M }
  1277.           BEGIN
  1278.             CMDIntR[L]:= ValueReader(Counter);
  1279.             Inc(Counter,CMDIntR[L].Spacing);
  1280.           END;
  1281.           Dec(Counter);
  1282.         END;
  1283.         $03:
  1284.         BEGIN
  1285.           For L:= 1 to 11 do
  1286.           BEGIN
  1287.             CMDIntR[L]:= ValueReader(Counter);
  1288.             Inc(Counter,CMDIntR[L].Spacing);
  1289.           END;
  1290.           Dec(Counter);
  1291.         END;
  1292.         $05:
  1293.         BEGIN
  1294.           For L:= 1 to 8 do
  1295.           BEGIN
  1296.             CMDIntR[L]:= ValueReader(Counter);
  1297.             Inc(Counter,CMDIntR[L].Spacing);
  1298.           END;
  1299.           Dec(Counter);
  1300.         END;
  1301.         $08:
  1302.         BEGIN
  1303.           For L:= 1 to 9 do
  1304.           BEGIN
  1305.             CMDIntR[L]:= ValueReader(Counter);
  1306.             Inc(Counter,CMDIntR[L].Spacing);
  1307.           END;
  1308.           Dec(Counter);
  1309.         END;
  1310.         $11:
  1311.         BEGIN
  1312.           For L:= 1 to 3 do  { 2 for earlier than 3217D }
  1313.           BEGIN
  1314.             CMDIntR[L]:= ValueReader(Counter);
  1315.             Inc(Counter,CMDIntR[L].Spacing);
  1316.           END;
  1317.           Dec(Counter);
  1318.         END;
  1319.         $12:
  1320.         BEGIN
  1321.           For L:= 1 to 3 do  { 2 for earlier than 3216M }
  1322.           BEGIN
  1323.             CMDIntR[L]:= ValueReader(Counter);
  1324.             Inc(Counter,CMDIntR[L].Spacing);
  1325.           END;
  1326.           Dec(Counter);
  1327.         END;
  1328.         $20:
  1329.         BEGIN
  1330.           For L:= 1 to 15 do
  1331.           BEGIN
  1332.             CMDIntR[L]:= ValueReader(Counter);
  1333.             Inc(Counter,CMDIntR[L].Spacing);
  1334.           END;
  1335.           Dec(Counter);
  1336.         END;
  1337.         $21:
  1338.         BEGIN
  1339.           For L:= 1 to 16 do
  1340.           BEGIN
  1341.             CMDIntR[L]:= ValueReader(Counter);
  1342.             Inc(Counter,CMDIntR[L].Spacing);
  1343.           END;
  1344.           Dec(Counter);
  1345.         END;
  1346.         $22:
  1347.         BEGIN
  1348.           For L:= 1 to 18 do
  1349.           BEGIN
  1350.             CMDIntR[L]:= ValueReader(Counter);
  1351.             Inc(Counter,CMDIntR[L].Spacing);
  1352.           END;
  1353.           Dec(Counter);
  1354.         END;
  1355.         ELSE Dec(Counter);
  1356.       END;
  1357.       END;
  1358.     $68:
  1359.       BEGIN
  1360.       SCMD:= ORD(Source[Counter]);
  1361.       Inc(Counter);
  1362.       Case SCMD of
  1363.         $01:
  1364.         BEGIN
  1365.           For L:= 1 to 4 do
  1366.           BEGIN
  1367.             CMDIntR[L]:= ValueReader(Counter);
  1368.             Inc(Counter,CMDIntR[L].Spacing);
  1369.           END;
  1370.           Dec(Counter);
  1371.         END;
  1372.         $10:
  1373.         BEGIN
  1374.           For L:= 1 to 5 do
  1375.           BEGIN
  1376.             CMDIntR[L]:= ValueReader(Counter);
  1377.             Inc(Counter,CMDIntR[L].Spacing);
  1378.           END;
  1379.           Dec(Counter);
  1380.         END;
  1381.         ELSE Dec(Counter);
  1382.       END;
  1383.       END;
  1384.     $69:
  1385.       BEGIN
  1386.       CMDInt[1]:= ORD(Source[Counter]);
  1387.       Inc(Counter);

  1388.       CMDInt[2]:= ORD(Source[Counter]);
  1389.       Inc(Counter);

  1390.       For L:= 1 to 6 do
  1391.         BEGIN
  1392.         CMDIntR[L]:= ValueReader(Counter);
  1393.         Inc(Counter,CMDIntR[L].Spacing);
  1394.         END;
  1395.       Dec(Counter);
  1396.       END;
  1397.     $6A:
  1398.       BEGIN
  1399.       SCMD:= ORD(Source[Counter]);
  1400.       Inc(Counter);
  1401.       Case SCMD of
  1402.         $10, $20, $30:
  1403.         BEGIN
  1404.           CMDInt[1]:= ORD(Source[Counter]);
  1405.           Inc(Counter);

  1406.           M:= ORD(Source[Counter]);
  1407.           CMDInt[2]:= M;
  1408.           Inc(Counter);

  1409.           CMDIntR[1]:= ValueReader(Counter);
  1410.           Inc(Counter,CMDIntR[1].Spacing);

  1411.           CMDIntR[2]:= ValueReader(Counter);
  1412.           Inc(Counter,CMDIntR[2].Spacing);

  1413.           CMDIntR[3]:= ValueReader(Counter);
  1414.           Inc(Counter,CMDIntR[3].Spacing);

  1415.           IF SCMD = $30 then
  1416.           BEGIN
  1417.             CMDIntR[4]:= ValueReader(Counter);
  1418.             Inc(Counter,CMDIntR[4].Spacing);
  1419.           END;

  1420.           SetLength(CMDAIntR, M);
  1421.           SetLength(CMDAStrR, M);

  1422.           For L:= 0 to M-1 do
  1423.           BEGIN
  1424.             CMDAStrR[L]:= TextReader(Counter);
  1425.             Inc(Counter,CMDAStrR[L].Spacing);

  1426.             CMDAIntR[L]:= ValueReader(Counter);
  1427.             Inc(Counter,CMDAIntR[L].Spacing);
  1428.           END;
  1429.           { 1 Byte Extra Intended }
  1430.         END;
  1431.         $03, $04:
  1432.         BEGIN
  1433.           M:= ORD(Source[Counter]);
  1434.           CMDInt[1]:= M;
  1435.           Inc(Counter);

  1436.           CMDIntR[1]:= ValueReader(Counter);
  1437.           Inc(Counter,CMDIntR[1].Spacing);

  1438.           CMDIntR[2]:= ValueReader(Counter);
  1439.           Inc(Counter,CMDIntR[2].Spacing);

  1440.           SetLength(CMDAIntR, M);
  1441.           SetLength(CMDAStrR, M);

  1442.           For L:= 0 to M-1 do
  1443.           BEGIN
  1444.             CMDAStrR[L]:= TextReader(Counter);
  1445.             Inc(Counter,CMDAStrR[L].Spacing);

  1446.             CMDAIntR[L]:= ValueReader(Counter);
  1447.             Inc(Counter,CMDAIntR[L].Spacing);
  1448.           END;
  1449.           { 1 Byte Extra Intended }
  1450.         END;
  1451.         $05:
  1452.         BEGIN
  1453.           Dec(Counter);
  1454.         END;
  1455.         ELSE Dec(Counter);
  1456.       END;
  1457.       END;
  1458.     $6C:
  1459.       BEGIN
  1460.       SCMD:= ORD(Source[Counter]);
  1461.       Inc(Counter);
  1462.       Case SCMD of
  1463.         $02:
  1464.         BEGIN
  1465.           CMDStrR[1]:= TextReader(Counter);
  1466.           Inc(Counter,CMDStrR[1].Spacing);

  1467.           CMDStrR[2]:= TextReader(Counter);
  1468.           Inc(Counter,CMDStrR[2].Spacing-1);
  1469.         END;
  1470.         $03:
  1471.         BEGIN
  1472.           Dec(Counter);
  1473.         END;
  1474.         $04, $20:
  1475.         BEGIN
  1476.           CMDIntR[1]:= ValueReader(Counter);
  1477.           Inc(Counter,CMDIntR[1].Spacing);

  1478.           CMDIntR[2]:= ValueReader(Counter);
  1479.           Inc(Counter,CMDIntR[2].Spacing-1);
  1480.         END;
  1481.         $05:
  1482.         BEGIN
  1483.           CMDIntR[1]:= ValueReader(Counter);
  1484.           Inc(Counter,CMDIntR[1].Spacing);

  1485.           CMDIntR[2]:= ValueReader(Counter);
  1486.           Inc(Counter,CMDIntR[2].Spacing);

  1487.           CMDIntR[3]:= ValueReader(Counter);
  1488.           Inc(Counter,CMDIntR[3].Spacing);

  1489.           CMDIntR[4]:= ValueReader(Counter);
  1490.           Inc(Counter,CMDIntR[4].Spacing-1);
  1491.         END;
  1492.         $10, $11:
  1493.         BEGIN
  1494.           CMDIntR[1]:= ValueReader(Counter);
  1495.           Inc(Counter,CMDIntR[1].Spacing-1);
  1496.         END;
  1497.         $15:
  1498.         BEGIN
  1499.           CMDIntR[1]:= ValueReader(Counter);
  1500.           Inc(Counter,CMDIntR[1].Spacing);

  1501.           CMDIntR[2]:= ValueReader(Counter);
  1502.           Inc(Counter,CMDIntR[2].Spacing);

  1503.           CMDIntR[3]:= ValueReader(Counter);
  1504.           Inc(Counter,CMDIntR[3].Spacing-1);
  1505.         END;
  1506.         ELSE Dec(Counter);
  1507.       END;
  1508.       END;
  1509.     $6D:
  1510.       BEGIN
  1511.       SCMD:= ORD(Source[Counter]);
  1512.       Inc(Counter);
  1513.       Case SCMD of
  1514.         $01, $02:
  1515.         BEGIN
  1516.           CMDIntR[1]:= ValueReader(Counter);
  1517.           Inc(Counter,CMDIntR[1].Spacing);

  1518.           CMDIntR[2]:= ValueReader(Counter);
  1519.           Inc(Counter,CMDIntR[2].Spacing);

  1520.           CMDIntR[3]:= ValueReader(Counter);
  1521.           Inc(Counter,CMDIntR[3].Spacing-1);
  1522.         END;
  1523.         $03, $20, $21:
  1524.         BEGIN
  1525.           Dec(Counter);
  1526.         END;
  1527.         ELSE Dec(Counter);
  1528.       END;
  1529.       END;
  1530.     $6E:
  1531.       BEGIN
  1532.       SCMD:= ORD(Source[Counter]);
  1533.       Inc(Counter);
  1534.       Case SCMD of
  1535.         $01..$04:
  1536.         BEGIN
  1537.           CMDIntR[1]:= ValueReader(Counter);
  1538.           Inc(Counter,CMDIntR[1].Spacing-1);
  1539.         END;
  1540.         $05:
  1541.         BEGIN
  1542.           CMDIntR[1]:= ValueReader(Counter);
  1543.           Inc(Counter,CMDIntR[1].Spacing);

  1544.           CMDIntR[2]:= ValueReader(Counter);
  1545.           Inc(Counter,CMDIntR[2].Spacing);

  1546.           CMDIntR[3]:= ValueReader(Counter);
  1547.           Inc(Counter,CMDIntR[3].Spacing-1);
  1548.         END;
  1549.         ELSE Dec(Counter);
  1550.       END;
  1551.       END;
  1552.     $6F:
  1553.       BEGIN
  1554.       CMDIntR[1]:= ValueReader(Counter);
  1555.       Inc(Counter,CMDIntR[1].Spacing);

  1556.       CMDIntR[2]:= ValueReader(Counter);
  1557.       Inc(Counter,CMDIntR[2].Spacing);

  1558.       CMDIntR[3]:= ValueReader(Counter);
  1559.       Inc(Counter,CMDIntR[3].Spacing);

  1560.       CMDIntR[4]:= ValueReader(Counter);
  1561.       Inc(Counter,CMDIntR[4].Spacing-1);
  1562.       END;
  1563.     $70:
  1564.       BEGIN
  1565.       SCMD:= ORD(Source[Counter]);
  1566.       Inc(Counter);
  1567.       Case SCMD of
  1568.         $01, $02:
  1569.         BEGIN
  1570.           CMDIntR[1]:= ValueReader(Counter);
  1571.           Inc(Counter,CMDIntR[1].Spacing);

  1572.           CMDIntR[2]:= ValueReader(Counter);
  1573.           Inc(Counter,CMDIntR[2].Spacing);

  1574.           CMDIntR[3]:= ValueReader(Counter);
  1575.           Inc(Counter,CMDIntR[3].Spacing);

  1576.           CMDIntR[4]:= ValueReader(Counter);
  1577.           Inc(Counter,CMDIntR[4].Spacing-1);
  1578.         END;
  1579.         $03..$06, $10, $11:
  1580.         BEGIN
  1581.           CMDIntR[1]:= ValueReader(Counter);
  1582.           Inc(Counter,CMDIntR[1].Spacing-1);
  1583.         END;
  1584.         ELSE Dec(Counter);
  1585.       END;
  1586.       END;
  1587.     $72:
  1588.       BEGIN
  1589.       SCMD:= ORD(Source[Counter]);
  1590.       Inc(Counter);
  1591.       Case SCMD of
  1592.         $01..$05, $11..$15:
  1593.         BEGIN
  1594.           CMDIntR[1]:= ValueReader(Counter);
  1595.           Inc(Counter,CMDIntR[1].Spacing);

  1596.           CMDIntR[2]:= ValueReader(Counter);
  1597.           Inc(Counter,CMDIntR[2].Spacing-1);
  1598.         END;
  1599.         ELSE Dec(Counter);
  1600.       END;
  1601.       END;
  1602.     $73:
  1603.       BEGIN
  1604.       SCMD:= ORD(Source[Counter]);
  1605.       Inc(Counter);
  1606.       Case SCMD of
  1607.         $01, $02, $05, $06, $31:
  1608.         BEGIN
  1609.           CMDIntR[1]:= ValueReader(Counter);
  1610.           Inc(Counter,CMDIntR[1].Spacing);

  1611.           CMDIntR[2]:= ValueReader(Counter);
  1612.           Inc(Counter,CMDIntR[2].Spacing-1);
  1613.         END;
  1614.         $10..$13, $16..$30, $32..$34:
  1615.         BEGIN
  1616.           CMDIntR[1]:= ValueReader(Counter);
  1617.           Inc(Counter,CMDIntR[1].Spacing-1);
  1618.         END;
  1619.         ELSE Dec(Counter);
  1620.       END;
  1621.       END;
  1622.     $74:
  1623.       BEGIN
  1624.       SCMD:= ORD(Source[Counter]);
  1625.       Inc(Counter);
  1626.       Case SCMD of
  1627.         $01, $02:
  1628.         BEGIN
  1629.           CMDIntR[1]:= ValueReader(Counter);
  1630.           Inc(Counter,CMDIntR[1].Spacing-1);
  1631.         END;
  1632.         $03, $04:
  1633.         BEGIN
  1634.           CMDIntR[1]:= ValueReader(Counter);
  1635.           Inc(Counter,CMDIntR[1].Spacing);

  1636.           CMDIntR[2]:= ValueReader(Counter);
  1637.           Inc(Counter,CMDIntR[2].Spacing-1);
  1638.         END;
  1639.         ELSE Dec(Counter);
  1640.       END;
  1641.       END;
  1642.     $75:
  1643.       BEGIN
  1644.       SCMD:= ORD(Source[Counter]);
  1645.       Inc(Counter);

  1646.       CMDIntR[1]:= ValueReader(Counter);
  1647.       Inc(Counter,CMDIntR[1].Spacing-1);
  1648.       END;
  1649.     $76:
  1650.       BEGIN
  1651.       SCMD:= ORD(Source[Counter]);
  1652.       Inc(Counter);
  1653.       Case SCMD of
  1654.         $01, $02:
  1655.         BEGIN
  1656.           CMDIntR[1]:= ValueReader(Counter);
  1657.           Inc(Counter,CMDIntR[1].Spacing-1);
  1658.         END;
  1659.         $04, $05:
  1660.         BEGIN
  1661.           Dec(Counter);
  1662.         END;
  1663.         ELSE Dec(Counter);
  1664.       END;
  1665.       END;
  1666.     $FE, $FF:
  1667.       BEGIN
  1668.       CMDInt[1]:= IntReader(Counter);
  1669.       IF (CMDInt[1] >= 0) AND (CMDInt[1] < LineMax) then
  1670.         BEGIN
  1671.         Inc(Counter,4);
  1672.         CMDStrR[1]:= TextReader(Counter);
  1673.         Inc(Counter,CMDStrR[1].Spacing-1);

  1674.         IF Assigned(PutLine) then
  1675.           IF CMD = $FE then PutLine(CMDInt[1],Han2Zen(CMDStrR[1].Text))
  1676.                       else PutLine(CMDInt[1],CMDStrR[1].Text);
  1677.         END
  1678.       else
  1679.         BEGIN
  1680.         CMDStrR[1]:= TextReader(Counter);
  1681.         Inc(Counter,CMDStrR[1].Spacing-1);
  1682.         END;
  1683.       END;
  1684.     ELSE
  1685.       BEGIN
  1686.       Dec(Counter);
  1687.       END;
  1688.     END;
  1689.   Finally
  1690.     Source:= Copy(Source,1,Counter);
  1691.     Delete(CMDString,1,Counter);
  1692.   END;
  1693.   END;

  1694. Destructor RScenCMD.Destroy;
  1695.   Var
  1696.   Count: Integer;
  1697.   BEGIN
  1698.   SetLength(CMDAInt,0);
  1699.   SetLength(CMDAByte,0);

  1700.   SetLength(CMDAIntR,0);
  1701.   SetLength(CMDAIntDR,0,0);
  1702.   SetLength(CMDAStrR,0);

  1703.   For Count:= High(CMDACond) downto 0 do
  1704.     SetLength(CMDACond[Count].Condition,0);
  1705.   SetLength(CMDACond,0);

  1706.   For Count:= High(CMDASelR) downto 0 do
  1707.     SetLength(CMDASelR[Count].Condition,0);
  1708.   SetLength(CMDASelR,0);

  1709.   Inherited;
  1710.   END;

  1711. Function RScenCMD.IntReader(Pos: Integer): Integer;
  1712.   Var
  1713.   Cache: RMixInt;
  1714.   BEGIN
  1715.   Cache.Bytes[0]:= Source[Pos];
  1716.   Cache.Bytes[1]:= Source[Pos+1];
  1717.   Cache.Bytes[2]:= Source[Pos+2];
  1718.   Cache.Bytes[3]:= Source[Pos+3];
  1719.   Result:= Cache.AInt;
  1720.   END;

  1721. Function RScenCMD.ValueReader(Pos: Integer): RValue;
  1722.   Var
  1723.   VHeader: Byte;
  1724.   Count: Byte;
  1725.   BEGIN
  1726.   With Result do
  1727.     BEGIN
  1728.     VHeader:= ORD(Source[Pos]);
  1729.     Spacing:= ((VHeader SHR 4) AND $7);
  1730.     IF (Spacing = 0) OR (Spacing > 5) then Fault(SeenCMDValueHeaderError,Pos);

  1731.     IsRegister:= (VHeader AND $80) <> 0;
  1732.     Value:= 0;
  1733.     For Count:= 1 to Spacing - 1 do
  1734.       Value:= (Value SHL 8) + ORD(Source[Pos+Count]);
  1735.     Value:= (Value SHL 4) OR (VHeader AND $F);
  1736.     END;
  1737.   END;

  1738. Function RScenCMD.TextReader(Pos: Integer): RText;
  1739.   Var
  1740.   ValueCache: RValue;
  1741.   BEGIN
  1742.   With Result do
  1743.     BEGIN
  1744.     Spacing:= 1;
  1745.     IF Source[Pos] = '@' then
  1746.       BEGIN
  1747.       IsRegister:= True;
  1748.       ValueCache:= ValueReader(Pos+Spacing);
  1749.       Inc(Spacing,ValueCache.Spacing);
  1750.       IsIndirect:= ValueCache.IsRegister;
  1751.       Value:= ValueCache.Value;
  1752.       END
  1753.     else
  1754.       BEGIN
  1755.       IsRegister:= False;
  1756.       Text:= PChar(Copy(Source,Pos,Length(Source)));
  1757.       Inc(Spacing,Length(Text));
  1758.       END;
  1759.     END;
  1760.   END;

  1761. Function RScenCMD.Conditioner(Pos: Integer; ExpectAttr: Boolean): RCond;
  1762.   Const
  1763.   MAXLevels = 256;
  1764.   Var
  1765.   LevelCnt, OutCnt: Integer;
  1766.   AppendCond: Array[1..MAXLevels] of Byte;
  1767.   PastChar: Char;
  1768.   AttrVal: RValue;
  1769.   CMPVal1, CMPVal2: RValue;

  1770.   BEGIN
  1771.   With Result do
  1772.     BEGIN
  1773.     Spacing:= 0;
  1774.     LevelCnt:= 0;
  1775.     OutCnt:= 0;
  1776.     PastChar:= #$00;
  1777.     Repeat
  1778.       Case Source[Pos+Spacing] of
  1779.       #$28:
  1780.         BEGIN
  1781.         Inc(LevelCnt);
  1782.         IF LevelCnt > 256 then Fault(SeenCMDConditionLevelOverflow,Pos+Spacing);
  1783.         AppendCond[LevelCnt]:= 0;
  1784.         END;
  1785.       #$29:
  1786.         BEGIN
  1787.         IF LevelCnt >= 1 then
  1788.           IF AppendCond[LevelCnt] <> 0 then
  1789.           BEGIN
  1790.             SetLength(Condition,OutCnt+1);
  1791.             Condition[OutCnt].CType:= CPLOp;
  1792.             Condition[OutCnt].CValue:= AppendCond[LevelCnt];
  1793.             Inc(OutCnt);
  1794.           END;
  1795.         Dec(LevelCnt);
  1796.         END;
  1797.       #$26, #$27:
  1798.         BEGIN
  1799.         IF LevelCnt < 0 then Fault(SeenCMDConditionLOperPosError,Pos+Spacing);
  1800.         IF AppendCond[LevelCnt] <> 0 then                // Slack Logic!! >_<
  1801.           BEGIN
  1802.           SetLength(Condition,OutCnt+1);
  1803.           Condition[OutCnt].CType:= CPLOp;
  1804.           Condition[OutCnt].CValue:= AppendCond[LevelCnt];
  1805.           Inc(OutCnt);
  1806.           END;
  1807.         AppendCond[LevelCnt]:= ORD(Source[Pos+Spacing]);
  1808.         END;
  1809.       #$58:
  1810.         BEGIN
  1811.         IF NOT ExpectAttr then Fault(SeenCMDConditionPropertyUnExp,Pos+Spacing);
  1812.         IF PastChar <> #$29 then Fault(SeenCMDConditionPropertyPosError,Pos+Spacing);

  1813.         SetLength(Condition,OutCnt+2);
  1814.         Condition[OutCnt+1].CType:= CPAttr;
  1815.         Condition[OutCnt+1].CValue:= ORD(Source[Pos+Spacing+1]);

  1816.         Case Source[Pos+Spacing+1] of
  1817.           #$20, #$22:
  1818.           BEGIN
  1819.             AttrVal:= ValueReader(Pos+Spacing+2);
  1820.             Condition[OutCnt].CType:= CPImm;
  1821.             Condition[OutCnt].CValue:= AttrVal.Value;
  1822.           END;
  1823.           #$21:
  1824.           BEGIN
  1825.             AttrVal.Spacing:= 0;
  1826.             Condition[OutCnt].CType:= CPImm;
  1827.             Condition[OutCnt].CValue:= 0;
  1828.           END;
  1829.           ELSE Fault(SeenCMDConditionPropertyError,Pos+Spacing);
  1830.         END;

  1831.         Inc(Spacing,AttrVal.Spacing+1);
  1832.         Inc(OutCnt,2);
  1833.         END;
  1834.         #$36..#$3B, #$41..#$49, #$4F..#$55:
  1835.         BEGIN
  1836.           CMPVal1:= ValueReader(Pos+Spacing+1);
  1837.           CMPVal2:= ValueReader(Pos+Spacing+CMPVal1.Spacing+1);

  1838.           SetLength(Condition,OutCnt+3);
  1839.           Condition[OutCnt].CValue:= CMPVal1.Value;
  1840.           Condition[OutCnt+1].CValue:= CMPVal2.Value;
  1841.           Condition[OutCnt+2].CValue:= ORD(Source[Pos+Spacing]);
  1842.           Condition[OutCnt+2].CType:= CPLOp;
  1843.           Case Source[Pos+Spacing] of
  1844.           #$36, #$37:
  1845.             BEGIN
  1846.             Condition[OutCnt].CType:= CPRBit;
  1847.             Condition[OutCnt+1].CType:= CPImm;
  1848.             END;
  1849.           #$38, #$39:
  1850.             BEGIN
  1851.             Condition[OutCnt].CType:= CPRBit;
  1852.             Condition[OutCnt+1].CType:= CPRBit
  1853.             END;
  1854.           #$3A, #$3B, #$41..#$47:
  1855.             BEGIN
  1856.             Condition[OutCnt].CType:= CPRInt;
  1857.             Condition[OutCnt+1].CType:= CPImm;
  1858.             END;
  1859.           #$48, #$49, #$4F..#$55:
  1860.             BEGIN
  1861.             Condition[OutCnt].CType:= CPRInt;
  1862.             Condition[OutCnt+1].CType:= CPRInt;
  1863.             END;
  1864.           END;
  1865.           Inc(Spacing,CMPVal1.Spacing+CMPVal2.Spacing);
  1866.           Inc(OutCnt,3);
  1867.         END;
  1868.       ELSE Fault(SeenCMDConditionError,Pos+Spacing);
  1869.       END;
  1870.       PastChar:= Source[Pos+Spacing];
  1871.       Inc(Spacing);
  1872.     Until (LevelCnt <= 0);
  1873.     END;
  1874.   END;

  1875. Function RScenCMD.ReadFString(Pos: Integer; ExpectAttr: Boolean = False): Integer;
  1876.   Var
  1877.   CondCounter: Integer;
  1878.   TextCounter: Integer;
  1879.   ValueCache: RValue;
  1880.   BEGIN
  1881.   SetLength(CMDAStrR,0);
  1882.   For CondCounter:= High(CMDACond) downto 0 do
  1883.     SetLength(CMDACond[CondCounter].Condition,0);
  1884.   SetLength(CMDACond,0);

  1885.   CondCounter:= 0;
  1886.   TextCounter:= 0;
  1887.   Result:= 0;

  1888.   Repeat
  1889.     Case Source[Pos+Result] of
  1890.     #$FF, #$FE:
  1891.       BEGIN
  1892.       SetLength(CMDAStrR,TextCounter+1);
  1893.       CMDAStrR[TextCounter].IsRegister:= False;
  1894.       CMDAStrR[TextCounter].Text:= PChar(Copy(Source,Pos+Result+1,Length(Source)));
  1895.       CMDAStrR[TextCounter].Spacing:= Length(CMDAStrR[TextCounter].Text);
  1896.       IF Source[Pos+Result] = #$FE then
  1897.         CMDAStrR[TextCounter].Text:= Han2Zen(CMDAStrR[TextCounter].Text);
  1898.       Inc(Result,CMDAStrR[TextCounter].Spacing+1);
  1899.       Inc(TextCounter);
  1900.       END;
  1901.     #$FD:
  1902.       BEGIN
  1903.       SetLength(CMDAStrR,TextCounter+1);
  1904.       CMDAStrR[TextCounter].IsRegister:= True;
  1905.       ValueCache:= ValueReader(Pos+Result+1);
  1906.       CMDAStrR[TextCounter].Spacing:= ValueCache.Spacing;
  1907.       CMDAStrR[TextCounter].IsIndirect:= ValueCache.IsRegister;
  1908.       CMDAStrR[TextCounter].Value:= ValueCache.Value;
  1909.       Inc(Result,CMDAStrR[TextCounter].Spacing+1);
  1910.       Inc(TextCounter);
  1911.       END;
  1912.     #$28:
  1913.       BEGIN
  1914.       IF CondCounter <> 0 then Fault(SeenCMDFStringConditionError,Pos+Result);
  1915.       SetLength(CMDACond,CondCounter+1);
  1916.       CMDACond[CondCounter]:= Conditioner(Pos+Result,ExpectAttr);
  1917.       Inc(Result,CMDACond[CondCounter].Spacing);
  1918.       Inc(CondCounter);
  1919.       END;
  1920.     #$10:
  1921.       BEGIN
  1922.       Inc(Result);
  1923.       Case Source[Result] of
  1924.         #$03:
  1925.         BEGIN
  1926.           SetLength(CMDAStrR,TextCounter+1);
  1927.           CMDAStrR[TextCounter].IsRegister:= True;
  1928.           ValueCache:= ValueReader(Pos+Result+1);
  1929.           CMDAStrR[TextCounter].Spacing:= ValueCache.Spacing;
  1930.           CMDAStrR[TextCounter].IsIndirect:= ValueCache.IsRegister;
  1931.           CMDAStrR[TextCounter].Value:= ValueCache.Value;
  1932.           Inc(Result,CMDAStrR[TextCounter].Spacing+1);
  1933.           Inc(TextCounter);
  1934.         END;
  1935.         ELSE Fault(SeenCMDFString10hSubCMDError,Pos+Result);
  1936.       END;
  1937.       END;
  1938.     ELSE Break; // Fault(SeenCMDFStringError,Pos+Result); { Allow for NO String }
  1939.     END;
  1940.     Inc(Result);
  1941.   Until Source[Pos+Result] = #0;
  1942.   END;

  1943. Function RScenCMD.Han2Zen(StrIn: ANSIString): ANSIString;
  1944.   Const
  1945.   H2ZTable: Array[#$20..#$7F] of Char = (
  1946.     #$40, #$49, #$68, #$94, #$90, #$93, #$95, #$66, #$69, #$6A, #$96, #$7B, #$43, #$7C, #$44, #$5E,
  1947.     #$4F, #$50, #$51, #$52, #$53, #$54, #$55, #$56, #$57, #$58, #$46, #$47, #$83, #$81, #$84, #$48,
  1948.     #$97, #$60, #$61, #$62, #$63, #$64, #$65, #$66, #$67, #$68, #$69, #$6A, #$6B, #$6C, #$6D, #$6E,
  1949.     #$6F, #$70, #$71, #$72, #$73, #$74, #$75, #$76, #$77, #$78, #$79, #$6D, #$8F, #$6E, #$4F, #$51,
  1950.     #$65, #$81, #$82, #$83, #$84, #$85, #$86, #$87, #$88, #$89, #$8A, #$8B, #$8C, #$8D, #$8E, #$8F,
  1951.     #$90, #$91, #$92, #$93, #$94, #$95, #$96, #$97, #$98, #$99, #$9A, #$6F, #$62, #$70, #$60, #$45
  1952.     );
  1953.   Var
  1954.   Count, Len: Integer;
  1955.   Ch: Char;
  1956.   BEGIN
  1957.   Len:= Length(StrIn);
  1958.   Result:= '';
  1959.   For Count:= 1 to Len do
  1960.     BEGIN
  1961.     Ch:= StrIn[Count];
  1962.     IF Ch in [#$20..#$80] then
  1963.       IF (Ch in ['0'..'9']) OR (Ch in ['0'..'9']) OR (Ch in ['0'..'9']) then
  1964.       Result:= Result + #$82 + H2ZTable[Ch]
  1965.       else Result:= Result + #$81 + H2ZTable[Ch]
  1966.     else Result:= Result + Ch;
  1967.     END;
  1968.   END;

  1969. Function RScenCMD.Explain(Detail: Boolean): String;
  1970.   BEGIN
  1971.   IF Source = '' then Result:= SeenCMDExpEmpty;

  1972.   Detail:= False;
  1973.   IF NOT Detail then
  1974.     Case CMD of
  1975.     $00: Result:= SeenCMDExpCat01;
  1976.     $01: Result:= SeenCMDExpCat02;
  1977.     $02: Result:= SeenCMDExpCat03;
  1978.     $03: Result:= SeenCMDExpCat04;
  1979.     $04: Result:= SeenCMDExpCat05;
  1980.     $05: Result:= SeenCMDExpCat06;
  1981.     $0B: Result:= SeenCMDExpCat07;
  1982.     $0C: Result:= SeenCMDExpCat08;
  1983.     $0E: Result:= SeenCMDExpCat09;
  1984.     $10: Result:= SeenCMDExpCat10;
  1985.     $13: Result:= SeenCMDExpCat11;
  1986.     $15: Result:= SeenCMDExpCat12;
  1987.     $16: Result:= SeenCMDExpCat13;
  1988.     $17: Result:= SeenCMDExpCat14;
  1989.     $18: Result:= SeenCMDExpCat15;
  1990.     $19: Result:= SeenCMDExpCat16;
  1991.     $1B: Result:= SeenCMDExpCat17;
  1992.     $1C: Result:= SeenCMDExpCat18;
  1993.     $1D: Result:= SeenCMDExpCat19;
  1994.     $1E: Result:= SeenCMDExpCat20;
  1995.     $20: Result:= SeenCMDExpCat21;
  1996.     $37: Result:= SeenCMDExpCat22;
  1997.     $39: Result:= SeenCMDExpCat23;
  1998.     $3B: Result:= SeenCMDExpCat24;
  1999.     $3C: Result:= SeenCMDExpCat25;
  2000.     $3D: Result:= SeenCMDExpCat26;
  2001.     $3E: Result:= SeenCMDExpCat27;
  2002.     $3F: Result:= SeenCMDExpCat28;
  2003.     $40: Result:= SeenCMDExpCat29;
  2004.     $41: Result:= SeenCMDExpCat30;
  2005.     $42: Result:= SeenCMDExpCat31;
  2006.     $43: Result:= SeenCMDExpCat32;
  2007.     $49: Result:= SeenCMDExpCat33;
  2008.     $4A: Result:= SeenCMDExpCat34;
  2009.     $4B: Result:= SeenCMDExpCat35;
  2010.     $4C: Result:= SeenCMDExpCat36;
  2011.     $4D: Result:= SeenCMDExpCat37;
  2012.     $4E: Result:= SeenCMDExpCat38;
  2013.     $4F: Result:= SeenCMDExpCat39;
  2014.     $50: Result:= SeenCMDExpCat40;
  2015.     $51: Result:= SeenCMDExpCat41;
  2016.     $56: Result:= SeenCMDExpCat42;
  2017.     $57: Result:= SeenCMDExpCat43;
  2018.     $58: Result:= SeenCMDExpCat44;
  2019.     $59: Result:= SeenCMDExpCat45;
  2020.     $5B: Result:= SeenCMDExpCat46;
  2021.     $5C: Result:= SeenCMDExpCat47;
  2022.     $5D: Result:= SeenCMDExpCat48;
  2023.     $5E: Result:= SeenCMDExpCat49;
  2024.     $5F: Result:= SeenCMDExpCat50;
  2025.     $60: Result:= SeenCMDExpCat51;
  2026.     $61: Result:= SeenCMDExpCat52;
  2027.     $63: Result:= SeenCMDExpCat53;
  2028.     $64: Result:= SeenCMDExpCat54;
  2029.     $66: Result:= SeenCMDExpCat55;
  2030.     $67: Result:= SeenCMDExpCat56;
  2031.     $68: Result:= SeenCMDExpCat57;
  2032.     $69: Result:= SeenCMDExpCat58;
  2033.     $6A: Result:= SeenCMDExpCat59;
  2034.     $6C: Result:= SeenCMDExpCat60;
  2035.     $6D: Result:= SeenCMDExpCat61;
  2036.     $6E: Result:= SeenCMDExpCat62;
  2037.     $70: Result:= SeenCMDExpCat63;
  2038.     $72: Result:= SeenCMDExpCat64;
  2039.     $73: Result:= SeenCMDExpCat65;
  2040.     $74: Result:= SeenCMDExpCat66;
  2041.     $75: Result:= SeenCMDExpCat67;
  2042.     $76: Result:= SeenCMDExpCat68;
  2043.     $FE: Result:= SeenCMDExpCat69;
  2044.     $FF: Result:= SeenCMDExpCat70;
  2045.     ELSE Result:= Format(SeenCMDExpCatXX, [ CMD, SCMD ]);
  2046.     END
  2047.   ELSE
  2048.     Result:= Format(SeenCMDExplainDetailUnImp, [ CMD, SCMD ]);

  2049.   Result:= '[' + IntToStr(Offset) + ':' + IntToStr(Length(Source))+ '] ' + Result;
  2050.   END;

  2051. Procedure RScenCMD.Fault(Error: String; Pos: Integer);
  2052.   Var
  2053.   RAWDump: String;
  2054.   Count, Len: Integer;
  2055.   BEGIN
  2056.   RAWDump:= '';
  2057.   IF Source <> '' then
  2058.     BEGIN
  2059.     RAWDump:= SeenCMDFaultHeader;
  2060.     Len:= Length(Source);
  2061.     For Count:= 1 to Pos do
  2062.       IF Count <= Len then
  2063.       RAWDump:= RAWDump + ' ' + IntToHex(ORD(Source[Count]),2);
  2064.     END;

  2065.   Raise Exception.Create('[' + IntToStr(Offset) + '] $' + IntToHex(CMD,2) + ':$' + IntToHex(SCMD,2) + ' ' + Error + ' | ' + RAWDump);
  2066.   END;

  2067. Procedure RScenCMD.ExpressTree(Tree: TTreeView; Root: TTreeNode);
  2068.   Var
  2069.   TempRoot: TTreeNode;
  2070.   TempChild: TTreeNode;
  2071.   BEGIN
  2072.   IF Source = '' then
  2073.     BEGIN
  2074.     TempRoot:= Tree.Items.AddChild(Root,SeenCMDExpEmpty);
  2075.     TempRoot.ImageIndex:= 3;
  2076.     TempRoot.SelectedIndex:= 3;
  2077.     Exit;
  2078.     END;

  2079.   TempRoot:= Tree.Items.AddChild(Root,Explain(True));
  2080.   Case CMD of
  2081.     $00:
  2082.     BEGIN
  2083.       TempRoot.ImageIndex:= 20;
  2084.       TempRoot.SelectedIndex:= 20;
  2085.     END;
  2086.     $01:
  2087.     BEGIN
  2088.       TempRoot.ImageIndex:= 6;
  2089.       TempRoot.SelectedIndex:= 6;
  2090.     END;
  2091.     $02:
  2092.     BEGIN
  2093.       TempRoot.ImageIndex:= 8;
  2094.       TempRoot.SelectedIndex:= 8;
  2095.     END;
  2096.     $03:
  2097.     BEGIN
  2098.       TempRoot.ImageIndex:= 6;
  2099.       TempRoot.SelectedIndex:= 6;
  2100.     END;
  2101.     $04:
  2102.     BEGIN
  2103.       TempRoot.ImageIndex:= 8;
  2104.       TempRoot.SelectedIndex:= 8;
  2105.     END;
  2106.     $05:
  2107.     BEGIN
  2108.       TempRoot.ImageIndex:= 8;
  2109.       TempRoot.SelectedIndex:= 8;
  2110.     END;
  2111.     $0B:
  2112.     BEGIN
  2113.       TempRoot.ImageIndex:= 2;
  2114.       TempRoot.SelectedIndex:= 10;
  2115.     END;
  2116.     $0C:
  2117.     BEGIN
  2118.       TempRoot.ImageIndex:= 9;
  2119.       TempRoot.SelectedIndex:= 10;
  2120.     END;
  2121.     $0E:
  2122.     BEGIN
  2123.       TempRoot.ImageIndex:= 0;
  2124.       TempRoot.SelectedIndex:= 10;
  2125.     END;
  2126.     $10:
  2127.     BEGIN
  2128.       TempRoot.ImageIndex:= 8;
  2129.       TempRoot.SelectedIndex:= 8;
  2130.     END;
  2131.     $13:
  2132.     BEGIN
  2133.       TempRoot.ImageIndex:= 2;
  2134.       TempRoot.SelectedIndex:= 10;
  2135.     END;
  2136.     $15:
  2137.     BEGIN
  2138.       TempRoot.ImageIndex:= 14;
  2139.       TempRoot.SelectedIndex:= 14;
  2140.     END;
  2141.     $16:
  2142.     BEGIN
  2143.       TempRoot.ImageIndex:= 14;
  2144.       TempRoot.SelectedIndex:= 14;
  2145.     END;
  2146.     $17:
  2147.     BEGIN
  2148.       TempRoot.ImageIndex:= 2;
  2149.       TempRoot.SelectedIndex:= 2;
  2150.     END;
  2151.     $18:
  2152.     BEGIN
  2153.       TempRoot.ImageIndex:= 8;
  2154.       TempRoot.SelectedIndex:= 8;
  2155.     END;
  2156.     $19:
  2157.     BEGIN
  2158.       TempRoot.ImageIndex:= 18;
  2159.       TempRoot.SelectedIndex:= 18;
  2160.     END;
  2161.     $1B:
  2162.     BEGIN
  2163.       TempRoot.ImageIndex:= 14;
  2164.       TempRoot.SelectedIndex:= 14;
  2165.     END;
  2166.     $1C:
  2167.     BEGIN
  2168.       TempRoot.ImageIndex:= 14;
  2169.       TempRoot.SelectedIndex:= 14;
  2170.     END;
  2171.     $1D:
  2172.     BEGIN
  2173.       TempRoot.ImageIndex:= 14;
  2174.       TempRoot.SelectedIndex:= 14;
  2175.     END;
  2176.     $1E:
  2177.     BEGIN
  2178.       TempRoot.ImageIndex:= 14;
  2179.       TempRoot.SelectedIndex:= 14;
  2180.     END;
  2181.     $20:
  2182.     BEGIN
  2183.       TempRoot.ImageIndex:= 14;
  2184.       TempRoot.SelectedIndex:= 14;
  2185.     END;
  2186.     $37:
  2187.     BEGIN
  2188.       TempRoot.ImageIndex:= 4;
  2189.       TempRoot.SelectedIndex:= 4;
  2190.     END;
  2191.     $39:
  2192.     BEGIN
  2193.       TempRoot.ImageIndex:= 4;
  2194.       TempRoot.SelectedIndex:= 4;
  2195.     END;
  2196.     $3B:
  2197.     BEGIN
  2198.       TempRoot.ImageIndex:= 4;
  2199.       TempRoot.SelectedIndex:= 4;
  2200.     END;
  2201.     $3C:
  2202.     BEGIN
  2203.       TempRoot.ImageIndex:= 4;
  2204.       TempRoot.SelectedIndex:= 4;
  2205.     END;
  2206.     $3D:
  2207.     BEGIN
  2208.       TempRoot.ImageIndex:= 4;
  2209.       TempRoot.SelectedIndex:= 4;
  2210.     END;
  2211.     $3E:
  2212.     BEGIN
  2213.       TempRoot.ImageIndex:= 4;
  2214.       TempRoot.SelectedIndex:= 4;
  2215.     END;
  2216.     $3F:
  2217.     BEGIN
  2218.       TempRoot.ImageIndex:= 4;
  2219.       TempRoot.SelectedIndex:= 4;
  2220.     END;
  2221.     $40:
  2222.     BEGIN
  2223.       TempRoot.ImageIndex:= 4;
  2224.       TempRoot.SelectedIndex:= 4;
  2225.     END;
  2226.     $41:
  2227.     BEGIN
  2228.       TempRoot.ImageIndex:= 4;
  2229.       TempRoot.SelectedIndex:= 4;
  2230.     END;
  2231.     $42:
  2232.     BEGIN
  2233.       TempRoot.ImageIndex:= 4;
  2234.       TempRoot.SelectedIndex:= 4;
  2235.     END;
  2236.     $43:
  2237.     BEGIN
  2238.       TempRoot.ImageIndex:= 4;
  2239.       TempRoot.SelectedIndex:= 4;
  2240.     END;
  2241.     $49:
  2242.     BEGIN
  2243.       TempRoot.ImageIndex:= 4;
  2244.       TempRoot.SelectedIndex:= 4;
  2245.     END;
  2246.     $4A:
  2247.     BEGIN
  2248.       TempRoot.ImageIndex:= 4;
  2249.       TempRoot.SelectedIndex:= 4;
  2250.     END;
  2251.     $4B:
  2252.     BEGIN
  2253.       TempRoot.ImageIndex:= 4;
  2254.       TempRoot.SelectedIndex:= 4;
  2255.     END;
  2256.     $4C:
  2257.     BEGIN
  2258.       TempRoot.ImageIndex:= 4;
  2259.       TempRoot.SelectedIndex:= 4;
  2260.     END;
  2261.     $4D:
  2262.     BEGIN
  2263.       TempRoot.ImageIndex:= 4;
  2264.       TempRoot.SelectedIndex:= 4;
  2265.     END;
  2266.     $4E:
  2267.     BEGIN
  2268.       TempRoot.ImageIndex:= 4;
  2269.       TempRoot.SelectedIndex:= 4;
  2270.     END;
  2271.     $4F:
  2272.     BEGIN
  2273.       TempRoot.ImageIndex:= 4;
  2274.       TempRoot.SelectedIndex:= 4;
  2275.     END;
  2276.     $50:
  2277.     BEGIN
  2278.       TempRoot.ImageIndex:= 4;
  2279.       TempRoot.SelectedIndex:= 4;
  2280.     END;
  2281.     $51:
  2282.     BEGIN
  2283.       TempRoot.ImageIndex:= 4;
  2284.       TempRoot.SelectedIndex:= 4;
  2285.     END;
  2286.     $56:
  2287.     BEGIN
  2288.       TempRoot.ImageIndex:= 4;
  2289.       TempRoot.SelectedIndex:= 4;
  2290.     END;
  2291.     $57:
  2292.     BEGIN
  2293.       TempRoot.ImageIndex:= 4;
  2294.       TempRoot.SelectedIndex:= 4;
  2295.     END;
  2296.     $58:
  2297.     BEGIN
  2298.       TempRoot.ImageIndex:= 22;
  2299.       TempRoot.SelectedIndex:= 10;
  2300.     END;
  2301.     $59:
  2302.     BEGIN
  2303.       TempRoot.ImageIndex:= 4;
  2304.       TempRoot.SelectedIndex:= 4;
  2305.     END;
  2306.     $5B:
  2307.     BEGIN
  2308.       TempRoot.ImageIndex:= 4;
  2309.       TempRoot.SelectedIndex:= 4;
  2310.     END;
  2311.     $5C:
  2312.     BEGIN
  2313.       TempRoot.ImageIndex:= 4;
  2314.       TempRoot.SelectedIndex:= 4;
  2315.     END;
  2316.     $5D:
  2317.     BEGIN
  2318.       TempRoot.ImageIndex:= 4;
  2319.       TempRoot.SelectedIndex:= 4;
  2320.     END;
  2321.     $5E:
  2322.     BEGIN
  2323.       TempRoot.ImageIndex:= 12;
  2324.       TempRoot.SelectedIndex:= 12;
  2325.     END;
  2326.     $5F:
  2327.     BEGIN
  2328.       TempRoot.ImageIndex:= 4;
  2329.       TempRoot.SelectedIndex:= 4;
  2330.     END;
  2331.     $60:
  2332.     BEGIN
  2333.       TempRoot.ImageIndex:= 13;
  2334.       TempRoot.SelectedIndex:= 13;
  2335.     END;
  2336.     $61:
  2337.     BEGIN
  2338.       TempRoot.ImageIndex:= 6;
  2339.       TempRoot.SelectedIndex:= 10;
  2340.     END;
  2341.     $63:
  2342.     BEGIN
  2343.       TempRoot.ImageIndex:= 2;
  2344.       TempRoot.SelectedIndex:= 2;
  2345.     END;
  2346.     $64:
  2347.     BEGIN
  2348.       TempRoot.ImageIndex:= 2;
  2349.       TempRoot.SelectedIndex:= 10;
  2350.     END;
  2351.     $66:
  2352.     BEGIN
  2353.       TempRoot.ImageIndex:= 2;
  2354.       TempRoot.SelectedIndex:= 2;
  2355.     END;
  2356.     $67:
  2357.     BEGIN
  2358.       TempRoot.ImageIndex:= 2;
  2359.       TempRoot.SelectedIndex:= 2;
  2360.     END;
  2361.     $68:
  2362.     BEGIN
  2363.       TempRoot.ImageIndex:= 2;
  2364.       TempRoot.SelectedIndex:= 2;
  2365.     END;
  2366.     $69:
  2367.     BEGIN
  2368.       TempRoot.ImageIndex:= 2;
  2369.       TempRoot.SelectedIndex:= 10;
  2370.     END;
  2371.     $6A:
  2372.     BEGIN
  2373.       TempRoot.ImageIndex:= 2;
  2374.       TempRoot.SelectedIndex:= 10;
  2375.     END;
  2376.     $6C:
  2377.     BEGIN
  2378.       TempRoot.ImageIndex:= 19;
  2379.       TempRoot.SelectedIndex:= 10;
  2380.     END;
  2381.     $6D:
  2382.     BEGIN
  2383.       TempRoot.ImageIndex:= 5;
  2384.       TempRoot.SelectedIndex:= 5;
  2385.     END;
  2386.     $6E:
  2387.     BEGIN
  2388.       TempRoot.ImageIndex:= 2;
  2389.       TempRoot.SelectedIndex:= 10;
  2390.     END;
  2391.     $70:
  2392.     BEGIN
  2393.       TempRoot.ImageIndex:= 7;
  2394.       TempRoot.SelectedIndex:= 10;
  2395.     END;
  2396.     $72:
  2397.     BEGIN
  2398.       TempRoot.ImageIndex:= 7;
  2399.       TempRoot.SelectedIndex:= 10;
  2400.     END;
  2401.     $73:
  2402.     BEGIN
  2403.       TempRoot.ImageIndex:= 7;
  2404.       TempRoot.SelectedIndex:= 10;
  2405.     END;
  2406.     $74:
  2407.     BEGIN
  2408.       TempRoot.ImageIndex:= 15;
  2409.       TempRoot.SelectedIndex:= 10;
  2410.     END;
  2411.     $75:
  2412.     BEGIN
  2413.       TempRoot.ImageIndex:= 11;
  2414.       TempRoot.SelectedIndex:= 11;
  2415.     END;
  2416.     $76:
  2417.     BEGIN
  2418.       TempRoot.ImageIndex:= 7;
  2419.       TempRoot.SelectedIndex:= 7;
  2420.     END;
  2421.     $FE:
  2422.     BEGIN
  2423.       TempRoot.ImageIndex:= 8;
  2424.       TempRoot.SelectedIndex:= 8;
  2425.     END;
  2426.     $FF:
  2427.     BEGIN
  2428.       TempRoot.ImageIndex:= 8;
  2429.       TempRoot.SelectedIndex:= 8;
  2430.     END;
  2431.     ELSE
  2432.     BEGIN
  2433.       TempRoot.ImageIndex:= 17;
  2434.       TempRoot.SelectedIndex:= 17;
  2435.     END;
  2436.   END;
  2437.   END;

  2438. END.
复制代码
注:
1. MD5什么的可以忽略不计,脚本中没有这个指令,引擎也不会做这个操作,是我后来(心血来潮)加进去的 =v=
2. Tree / Node什么的也可以忽略掉,这个是为了将指令映射到图形界面上,和引擎/指令没有关系。
3. 关键就在TScenario(分析脚本头部格式)和RScenCMD(对每个指令进行解码)。
  其中RScenCMD实现了对命令流的自动解析,在构建指令对象的时候,新的指令的类型和参数就被自动分析出来放到对应的成员中去了。
kizunaXD - 2007/7/23 15:27:00
其他的还顺利,可是在最后一步出错了:
fatal error: exception Sys_error(&amp;quot;permission denied&amp;quot;)

怎么回事啊啊啊啊啊~又是哪里出错了???
1
查看完整版本: 請教如何解開SEEN.TXT