イベント講座 -アイテム解説文分離法-



2行に渡るアイテムの解説文をInfo関数で参照すると、改行コード(?)つきのデータが返ってきてしまうようです。このため、PaintStringコマンドやPrintコマンドを使用する場合に支障が出ます。 そんな解説文を分離する方法を見つけましたので、困っている方は参考までにどうぞ。 (初級編とは違って超難しいです。ご注意下さい)

※ 現在、開発版ver2.1.4 および 安定版ver2.0.32 において改行文字の仕様が変更されたため、アイテム解説文の2行目だけを取得する事が不可能になりました。何かいい方法を思いついた方はご連絡ください。



その1.検証「アイテム解説文を出力してみる」


以下のようなアイテムがあったとします。

検証用アイテム
デバッグ君, 汎用, アイテム
特殊能力
0, 0, 0, 0, 0
*でばっぐ
*専用

まずはLen関数で文字数を調べてみましょう。

Talk プレネール
文字数 = $(Len(Info(アイテム, 検証用アイテム, 解説文)))
End

主語がプレネールなのは単なる趣味です。通常は「システム」を使ってください。

それはさておき、意外なことに「文字数 = 8」としゃべるはずです。実際には6文字しかないのになぜでしょうか? 次はもう少し詳しく調べてみましょう。

For i = 1 To Len(Info(アイテム, 検証用アイテム, 解説文))
 Talk プレネール
 $(i)文字目: $(Mid(Info(アイテム, 検証用アイテム, 解説文),i,1))
 End
Next

BitMap番号算出の時に使った1文字ずつ出力する方法です。これで見てみると、5文字目と6文字目が以下のように表示されると思います。

プレネール「5文字目:

1行目と2行目の間に何か謎の2文字が入っていることが分かります。ということは、BitMap番号算出の時のように先頭から一文字ずつ比較して、この5文字目の部分と一致するかどうか調べればいいわけです。 しかし、ここで問題が発生します。

「この謎文字をテキストデータで表現する手段が存在しない」

つまり、イコールで比較する事ができません。ちなみに、TalkコマンドではなくAskコマンドで出力してみると「・」などと表示されますが、これと比較しても無意味です。



その2.実際にやってみる


あーでもない、こーでもないとやっているうちに多分正解と思われる方法を発見しました。StrComp関数です。

TMP = 0

For i = 1 To Len(Info(アイテム,検証用アイテム,解説文))
 If StrComp(Mid(Info(アイテム,検証用アイテム,解説文),i,1)," ") = -1 Then
  TMP = i - 1
  Break
 Endif
Next

StrComp関数で謎文字と半角スペースを比較した場合、謎文字の方が辞書順が前になることを利用します。半角スペースより辞書順が前になる文字列はたぶんないはずなので、この方法で識別が可能です。 変数:TMP には解説文1行目の最後の文字位置が格納されます。

If TMP > 0 Then
 1行目解説文 = Left(Info(アイテム,検証用アイテム,解説文),TMP)
 2行目解説文 = Mid(Info(アイテム,検証用アイテム,解説文),TMP + 3)
Else
 1行目解説文 = Info(アイテム,検証用アイテム,解説文)
Endif

これでOKです。Ifで分けているのは謎文字が検出されなかった場合(もともと1行だけの解説文 or 解説文なし の場合)は、空文字が返ってしまうためです。



Goto  トップページ