SSRファイルに記述されたスクリプトは、いったん「不変文字列」と「変換式」の二種類に分けて処理されます。「不変文字列」とは、文字通りループ中でも常に変わらない部分です。それに対し「変換式」は、 [! と !] で囲まれた「ループ中に変化する(と思われる)」部分になります。この変換式をうまく活用することで、様々な置き換えを可能とします。
変換式は、その変換形式によっていくつかの種類に分かれます。以下にその一覧を示します。
式号 | ※ 概要 ※ |
[! n !] | nの16進数値を出力。ただし、出力はバイト数を0でそろえた16進数(仮に「3E7」なら、「03E7」)になります。 |
[! Ln !] | nの10進数値を出力。 |
[! #n !] | nの16進数値(ReverseEndian)を出力。基本は[! n !]と同じですが、演算値(n)のエンディアンを反転してから出力する点が違います。バイト列の場合、表記上リトルエンディアンで記述しますので、そういったときに用いることが多いでしょう。 |
[! #Ln !] | nの10進数値(ReverseEndian)を出力。これも、エンディアン反転を行う[! Ln !]に同じです。 |
[! @,n !] | @ファイル名のn行目の文字列を出力。演算で算出される数値と違い、規則性のない名称などは、一覧にしたファイルから引き出す方が効率的です。その際に、この形式を用います。「@ファイル名」には、文字列を羅列したリストファイルを指定します。ファイル指定の詳細は、《C-ファイル指定》を参照。 |
[! Rn,文字列 !] | 指定した「文字列」を、n回出力。他と異なり、ワードリピート機能と呼ばれます。アドレスコーディングにおけるポインタ変換演算子([: :])などを、条件に応じて複数回重ねたい場合に効果的です。感覚的には、リピートファイル中でさらにリピートをかけるような扱いになります。なお、不変文字列に[!などを使いたい場合は、[ !などとして、間に空白を挟んで対処して下さい。展開時に、自動で空白を除去して連結します。 |
実例を示します。
[subject]主人公:dir
[subject]死亡フラグ:toggle,0x700004,09,00
[subject]デバッグモード:toggle,[:0x710000:],01,00
[replace]0x790000,SSCファイル
[subject]ヒロイン:dir
[subject]死亡フラグ:toggle,0x700008,0A,00
[subject]デバッグモード:toggle,[:[:0x710000:]:],01,00
[replace]0x790004,SSCファイル
[subject]脇役:dir
[subject]死亡フラグ:toggle,0x70000C,0B,00
[subject]デバッグモード:toggle,[:[:[:0x710000:]:]:],01,00
[replace]0x790008,SSCファイル
|
上記のようなスクリプトを[repeat]を用いて最適化すると、
[repeat]SSRファイル,0,3,1
SSRファイル.SSR
[subject][! @キャラ名リスト, $Val !]:dir
[subject]死亡フラグ:toggle,0x[! 0x700004+ $Val*4 !],
[!# 0x09+$Val !],00
//////////////////// ↑実際は一行で書きます
[subject]デバッグモード:toggle,[!R($Val+1), [: !] 0x710000
[!R($Val+1), :] !],01,00
//////////////////// ↑実際は一行で書きます
[replace]0x[! 0x790000+ $Val*4 !],SSCファイル
キャラ名リスト.LST
主人公
ヒロイン
脇役
|
のようになります。元のスクリプトに残るのは、
[repeat]SSRファイル,0,3,1
の一行のみです。このとき、[repeat]のオプションに「0,3,1」と指定しているので、ループ変数($Val)は「0→1→2→終了」と変化していきます。これを踏まえた上で、上記SSRファイルの詳しい説明に移ります。
[subject] | 不変文字列。 |
[! @キャラ名リスト, $Val !] | ループ毎に、「キャラ名リスト.LST」の任意の行に置き換わります。行数を示す部分には「$Val」とあるので、「0行目→1行目→2行目」を順々に引っ張ります。 |
:dir | 不変文字列。 |
[subject]死亡フラグ:toggle,0x | 不変文字列。 |
[! 0x700004+ $Val*4 !] | 最終的に16進数値を出力する計算式です。不変の数値0x700004に、$Val*4を足しあわせた16進値。つまり「700004→700008→70000A」と変化していきます。さらにこれを16進数として認識させるために、直前に不変文字列として「0x」を配してあります。 |
, | 不変文字列。 |
[!# 0x09+$Val !] | 最終的にエンディアン反転をかけた16進数値を出力する計算式です。ちなみにこの例では1バイト固定ですので、実際はエンディアン反転をかける意味はありません。 |
,00 | 不変文字列。 |
[subject]デバッグモード:toggle, | 不変文字列。 |
[!R($Val+1), [: !] | 文字列[:を、$Val+1回出力します。つまり、「[:→[:[:→[:[:[:」と変化します。ちなみに、「$Val+1」を括っている()は、範囲を分かりやすくするために付けただけなので、無くても構いません。 |
0x710000 | 不変文字列。 |
[!R($Val+1), :] !] | 文字列:]を、$Val+1回出力します。つまり、「:]→:]:]→:]:]:]」と変化します。 |
,01,00 | 不変文字列。 |
[replace]0x | 不変文字列。 |
[! 0x790000+ $Val*4 !] | 前述の計算式[! 0x700004+ $Val*4 !]と同様です。 |
,SSCファイル | 不変文字列。 |
変数などのプログラミング的な考えが混じるため、変換式の理解にとまどうかと思いまが、似たようなスクリプトが何十も繰り返されるスクリプトであれば、[repeat]を使うことで大幅に手間を省くことができるでしょう。
さて、ここまでが増加値(開始値・終了値)を用いた場合の説明ですが、「ループ値リストファイル」を用いた場合の説明を付け足しましょう。
リストファイル.LST
1 2 5 7 8
このようなリストファイルを用意した場合、ループ変数$Valは、[1→2→5→7→8]と変化して、5回ループを回ったところで処理を終えます。なお、リストファイル中の空白行は無視されます。
|
|