Thinking.http://tomose.dynalias.net/RO/index.php?cmd=s&k=266e6e2abf歌屋と万力屋と、その他のコのROページ。変更点お名前:追加された行はこの色です。削除された行はこの色です。オマージュ」なイベント向けの、「宝箱の罠」対策ネタページです。これに関しては、いわゆるWebサービスも存在しているのですが、そちらでキータイプするのがめんどくさいので、Windowsアプリを作ってみました。~ROCALFO単体での今後バージョンアップの予定はありません。''~''ROCALFO単体での今後バージョンアップの予定はありません。[#ddb9af4a]このイベントでは、宝箱を調べると「お」「け」というような形で「罠の名前の1文字〜数文字」がわかり、そこから罠の正確な名前を推測していくメカニズムが提供されています。機能で出力されたテキストから自動判定するようにしているのが大きな特徴です。[#p254b891]ROクライアント上に、RO_CALFOとの連携用のチャットウィンドウを作成する必要があります。ROクライアントのチャット領域の右上のほうに小さな+アイコンがあります。ような感じのはず)>''補足''~>正確には、この「専用ウィンドウ」を作る必要はなく、既存ウィンドウでも構いません。~>ただし、友瀬の提供しているホムAI「Glenelg」を使用している場合は、人間がチャット入力した際に表示されるウィンドウは使用しないでください。Glenelgは動作上、このチャットファイルを監視しているため、ROCALFOと互いに干渉してしまいます。いうような場所)を見てください。そこに、準備1で作成したウィンドウの名前がついたテキストファイルができていることを確認してください。いうウィンドウを作っていたら、Chat_NewTab_2.txtというファイルがあるはずです。[#c09cb90d]RO_CALFOを起動してください。「設定」タブを開くと、そこに「監視対象ファイル」という入力欄があります。[編集]ボタンを押して編集画面を開き、準備2で確認したファイルをフルパスで指定してしてください。:C:\Gravity\Ragnarok\Chat\Chat_NewTab_2.txt・・・というようにです。「調査結果」タブに移動。~「●監視開始」と表示されているステータスバーをクリックすると「●監視中...」となります:この状態になると、RO_CALFOが動作を開始します。----#divregion(参考:技術的な話,h1)*技術的な話。[#pcb2d258]基本的には、単にチャットファイルを検索しているだけです。ROシステムが自動生成している定型フォーマットなので、わりと簡単です。ファイル内の文字列を、最終行から順にさかのぼって・・・-『モンスターを全滅させた。宝箱が出現した』となっている行を、終端として利用します。~このログ以降〜最新行が、現在の宝箱用のヒント、ということです。-先頭が『......[』で始まる行が、いわゆるヒントの行。~--複数プレイヤー==ヒント行も複数行ありうるので、とりあえずバッファにため込みます。[#mb16c683]今回の場合、ヒント・罠名に出てくる文字に「同じ文字が複数回入りうる」ことが面倒でした。~例えば、2人のヒントが以下だった場合。最終的なヒントはどうするか。~+して+くししん--期待値は、「くししてん」。単純に足し算しちゃうと、「し」が多くなりすぎる。~「すでにあるものは足さない」という考え方だと、うまくやらないと2個目の「し」が載せられない。人間だと直感的にできるものですが、プログラムにするにはアルゴリズムを考えないとならんので。~結局友瀬は、いろいろ考えて、以下のようなやりかたを実施しました。~もっとうまい手はあるかもしれんけど。1回のヒント文字群は1文字ずつソートしておく。~ROから受けたヒントが「て」「ん」「し」なら、「してん」にソート。左ほど『若い』ようにしておくわけです。~で、1つの「マージ元」に対して、「追加ヒント」をマージするんだけど、ここが肝。1手ずつ、動きを説明する。~+まず、「マージ元」および「追加ヒント」、それぞれ先頭の1文字目に注目する。+注目している1文字同士を、比較する。++もし「一致」した場合、「すでに知っているヒント」。~「最終結果」にこの文字を追加して、「マージ元」と「追加ヒント」、それぞれ注目点を1つ後ろにずらす。---これによって追加ヒントが全て終わったら、マージ元の現在位置から後ろの全てを「最終結果」に追加して、マージ終了。---これによってマージ元が全て終わったら、追加ヒントの現在位置から後ろの全てを「最終結果」に追加して、マージ終了。++一致せず、かつマージ元のほうが「若い」場合、「マージ元だけが知っているヒント」。~マージ元の現在文字を「最終結果」に追加、マージ元の注目文字を1文字進めて、2に戻る。---もちろん、ここでマージ元が最後になる可能性がある。~追加ヒントの現在位置から後ろの全てを「最終結果」に追加して、マージ終了。++一致せず、かつ追加ヒントのほうが「若い」場合、「追加ヒントだけが知っている」ヒント。追加ヒントの現在文字を「最終結果」に追加、追加ヒントのの注目文字を1文字進めて、2に戻る。---もちろん、ここで追加ヒントが最後になる可能性がある。~マージ元の現在位置から後ろの全てを「最終結果」に追加して、マージ終了。→期待される最終結果:くししてん上記ルールに従って、1文字ずつチェックしていく。+マージ元「く」、追加ヒント「し」--上記「マージ元のほうが若い」ケース。~「く」を最終文字に追加して、マージ元注目点を2文字目に。--最終結果:く+マージ元「し」、追加ヒント「し」--上記「一致」のケース。~「し」を最終文字に追加して、マージ元注目点を3文字目、ヒント注目点を2文字目に。--最終結果:くし+マージ元「し(3文字目)」、追加ヒント「て」--上記「マージ元のほうが若い」ケース。~「し(3文字目)」を最終文字に追加して、マージ元注目点を4文字目に。--最終結果:くしし+マージ元「ん」、追加ヒント「て」--上記「追加ヒントのほうが若い」ケース。~「て」を最終文字に追加して、追加ヒント注目点を1つ後ろに・・・で、追加ヒント終了。~マージ元の残りのヒントを全部マージして終了。[#vf7ef627]上記ヒントのマージに近い形で「1文字ずつ」比較するように実装しました。~同じ文字が複数回続くケースも、上記と同じように「進める」感じで処理したわけです。~改めて考えると、このマッチングは正規表現でできたな(笑)~そっちのほうがスマートだ(^^;;;まあそんな感じ。バックアップある名言。恐れる者は恐れることなかれ。