DNML 仕様(未整理)
どれもこれも 役 立 た ず
ショートカット
Aタグ限界数
乱数
INCLUDE
整数領域
INCLUDE
0除算
変数名制限
{ }
ANSWERにおける{ }の中身
/BGM
ENTER
ALPHA使用時の位置指定バグ
Aタグはヘルプにもある通り、
<A HREF="選択1" ALT="選択肢1">
<A HREF="選択2" ALT="選択肢2">
<A HREF="選択3" ALT="選択肢3">
というように、間にAタグ以外のタグ(コメント行も含む)を挟まずに並べなければならない。逆に言えば、Aタグだけを延々並べて、選択肢を沢山表示する事も出来ることになる。では、それは無限に表示できるのか?
答えはNO。正常に動作するのは、100個目のAタグまでである。検証するには、実際にAタグを並べれば良いわけであるが、それでは画面に収まらない。だが、簡単に検証する方法がある。
<A HREF="選択" ALT="選択肢" VIEW="0">
という文を99個並べてから、続けて
<A HREF="選択" ALT="選択肢">
という文を適当に並べればよい。
結果は選択肢が1つだけ表示される。99個目までの選択肢は、VIEW属性が偽であるため、表示されない。100個目はVIEW属性が真である(省略すると、真として扱われる)為、正常に表示される。101個目以降は、VIEW属性は真だが、限界数をオーバーしている為表示されない。
DNMLで乱数を使用するには、
(@X)
とする事で、0〜Xがランダムで決定される。
しかし、この乱数は非常に偏りがある。戦闘野郎等の乱数を多用するシステム系DNMLで、理論上の確率とは違って感じるのはこの為である。しかし、戦闘野郎で相手ストライカーが遠野志貴の時に防御率が異常に高いのは、偶然にしてはよく起こる。
INCLUDEタグは、大抵『環境設定.dnml』やテンプレートを読み出す時にしか利用されてないのだろうが、非常に便利な物である。但し、制約も多い。
1.パス指定で『{ }』は使えない
<INCLUDE SRC="{変数}/テンプレート.dnml">
例えば、このような文。正常に動作しない。
INCLUDEはそのDNMLブックが読み込まれた時点で、全て最初に読み込まれる(らしい)。その為に、値が変動する可能性がある変数は使用出来ないようになっているのかもしれない。
2.INCLUDEされるファイル内ではHREFを使用してはならない
誤動作の危険がある為、使用してはいけない。
具体的には、HREFが使われているファイルを、ある1つのDNMLから複数回INCLUDEすると、誤動作を起こす。この文章だと、わかりづらいと思われるので、例を挙げる。
HREF.SDNMLの内容
・・・
<A HREF="#1">
・・・
<A NAME="1">
・・・
INCLUDE.DNML
・・・
<INCLUDE SRC="HREF.SDNML">
・・・
<INCLUDE SRC="HREF.SDNML">
・・・
<INCLUDE SRC="HREF.SDNML">
・・・
このINCLUDE.DNMLを実行した時、誤動作を起こす。
回避方法は、HREFを使わずにEVENTで処理する、もしくはINCLUDEを使わずにHREFを使う、のどちらかの手段を用いればよい。
3.INCLUDEされるファイルが実行されるディレクトリはINCLUDEした側が実行されるディレクトリである
説明しづらいので、例を挙げる。
Aというディレクトリ(フォルダ)の中にあるBというディレクトリにB1.SDNMLとB2.SDNMLというファイルがあるとする。B1.SDNMLには、
<INCLUDE SRC="B2.SDNML">
という文を含むとする。
そのAというディレクトリにあるDNMLブックから、B1.SDNMLをINCLUDEするには、
<INCLUDE SRC="B/B1.SDNML">
という文を書けばよい。
これを実行するとエラーが起こる。理由は、B1.SDNMLのINCLUDEではA/B2.SDNMLを読み込もうとしている為である。想定しているのはA/B/B2.SDNMLである。
ただ、これに関しては少々怪しい部分がある。
C言語で言うところの『long int型』の領域と等しい。
16ビットのシステムでは、-231〜231-1 = -2147483648〜2147483647 の範囲。
この範囲で考えておけば、大抵は問題ない(多分)
自分自身をINCLUDEすることは出来ない。
例を挙げると、A.SDNMLというファイルの中でA.SDNMLをINCLUDEするとエラーが起こる。
また、A.SDNMLからB.SDNMLをINCLUDEし、そのB.SDNMLからA.SDNMLをINCLUDEしても、同様にエラーが起こる。
これにより、INCLUDEを使った再帰処理は不可能と言う事になるが、そんなことをしようとする人は少ないと思う。
0で除算を行うと、結果は0となる。
ついでに、剰余も0となる。
半角数字で始まる変数名は、誤動作の可能性がある。
<QUESTION ANSWER="(変数=[aaaa])">
<write src="変数"><NL>
<QUESTION ANSWER="(変数2=変数)">
<write src="変数2"><NL>
<QUESTION ANSWER="(変数3={変数})">
<write src="変数3"><NL>
<QUESTION ANSWER="(変数4=[{変数}])">
<write src="変数4"><NL>
<NL>
<QUESTION ANSWER="(1変数=[aaaa])">
<write src="1変数"><NL>
<QUESTION ANSWER="(2変数=変数)">
<write src="2変数"><NL>
<QUESTION ANSWER="(3変数={変数})">
<write src="3変数"><NL>
<QUESTION ANSWER="(4変数=[{変数}])">
<write src="4変数"><NL>
このようなブックを実行すると、結果は
aaaa
aaaa
0
aaaa
aaaa
1
0
aaaa
となる。
変数2と2変数では処理内容が同じであるにもかかわらず、結果が違っている。
大抵は問題ないが、文字列を扱う時に2変数のような、他の変数の値を代入する時に正常に動作しない。
変数3・3変数の動作については、
{ }の項で述べる。
何かが間違ってる気がしないでもない。
<QUESTION ANSWER="(変数1={変数2})">
これを実行すると、変数1の中身は0となっている。つまり、値を代入する時は、素直に
<QUESTION ANSWER="(変数1=変数2)">
としなければならない
<QUESTION ANSWER="((a=[A])&(b=[B]))">
<QUESTION ANSWER="(c=[{a}{b}])">
<WRITE SRC="c"><NL>
このようなブックを実行した時、実行結果は
AB
となる。
PAW掲示板の過去ログにおいて、文字列連結の方法として書き込まれているものである。確かに連結されているように見えるが、実際には連結されていない。
上のブックに、下記の文を加える。
<QUESTION ANSWER="(a=[α])">
<WRITE ANSWER="c"><NL>
<QUESTION ANSWER="(b=[β])">
<WRITE ANSWER="c"><NL>
これを実行すると、
AB
αB
αβ
となる。
cの値は変えていないのに、aやbの値を変えると実行結果が変わっている。
ここでcに入っている値は、aとbの文字列を連結させた『AB』では無く、『{a}{b}』という文字列である。これは、
<MEMO SRC="c" DEST="BOOK">
として、セーブしてみればわかる。
見かけ上は連結されているので、通常使用する際には影響ないが、MEMOタグによって値をMEMOファイルに出力する時には注意する必要がある。上記の通り、cに入っている値は『{a}{b}』なので、『AB』という値が入っていると思っていても、もう一度開いた時には『AB』をいう出力結果は得られない。この場合は、aとbについてもMEMOファイルに出力しておく必要がある。ここでは2変数の連結について述べているが、1変数でも同様である。
・ANSWERにおける{ }の中身(TINY駄文)
<EVENT ANSWER="((J=(I+1))&(PASS_{I}?PASS_{J}))">
という文で、I=Jの時、結果は常に真となる。
例えばI=J=3の時、この文で想定している動作は、
<EVENT ANSWER="((J=(3+1))&(PASS_3?PASS_4))">
であり、PASS_3とPASS_4を比較する事である。
実際の動作は、
<EVENT ANSWER="((J=(3+1))&(PASS_3?PASS_3))">
となる。右側のJには、値が変わる前のJの値が入っている。その為、PASS_3とPASS_3を比較している。従って、Iがどんな値であろうと、同じ物同士を比べることになる。故に、恒真である。
上ではI=Jのケースを上げたが、I≠Jでも問題は起こる。
例えば、I=2,J=4で、PASS_2=34,PASS_3=34,PASS_4=23の時、想定する動作はPASS_2とPASS_3の比較である。過程の通り、想定する動作は真。実際の動作はPASS_2とPASS_4の比較であり、値は34と23の為、等しくない。つまり偽となる。
これを正常に動作させる為には、
<QUESTION ANSWER="(J=(I+1))">
<EVENT ANSWER="(PASS_{I}?PASS_{J})">
とすればよい。
……まあ、そもそもこんなことする人は少ないでしょうけど。
・/BGM(エルラ氏からの情報)
</BGM TIME="500" MODE="PASS">
のように、BGMをフェードアウトさせている途中で、更に
</BGM>
と入れると、ボリュームコントロールの音量が下がる。
TIMEで指定した時間+200msほど経過していれば、問題ない。
この辺はPCの性能によって誤差があるかも。
OSは98SE(自分)とME(エルラ氏)で確認。他は知らん。
・ENTER (TINY)
一度にENTER出来る人物は、最大20まで。
これはエラーメッセージに出るので、間違いない。
後からENTERされた人物の方が上に来る。
これは正確ではないので、更に具体的に例を挙げて書いておく。
<ENTER NAME="1">
<ENTER NAME="2">
<ACT NAME="1" SRC="〜">
<ACT NAME="2" SRC="〜">
<EXIT NAME="1">
<ENTER NAME="3">
<ACT NAME="3" SRC="〜">
この場合、"3"の画像が"2"より下に来る。
ENTERされると、その時点で最も深い位置に割り当てられる。
"1"がEXITされた時点で、一番深い位置が空く。
ここで新たに"3"がENTERされた時、この時点で空いている最も深い位置は"1"のあった所となり、"3"はここに割り当てられることになる。
このため、後からENTERされたにも関わらず、"3"は"2"よりも深い位置となる。
・ALPHA使用時の位置指定バグ
ACTタグでALPHA属性を指定したとき、LEFT属性もしくはTOP属性に負の値を指定した場合、その値が適用されない。
適用されないだけでなく、画像が歪む場合もある。