スクリプトを組むといってもやることはUOと全く同じです。
UOで羽を集める流れを見て見ましょう。
死体を捜す
↓
刃物を死体に当てる
↓
死体をダブルクリックして棺おけを開く
↓
羽を捜す
↓
見つけたら自分のバックパックに入れる
↓
刃物を死体に当てる
↓
死体をダブルクリックして棺おけを開く
↓
羽を捜す
↓
見つけたら自分のバックパックに入れる
ということですよね。
それでは1日目のif文、for文、while文
これを使って考えてみましょう。
死体を捜す
if(死体がある)
刃物を死体に当てる
死体をダブルクリックして棺おけを開く
棺おけの中に羽を捜す
if(羽がある)
自分のバックパックに入れる
if(死体がある)
刃物を死体に当てる
死体をダブルクリックして棺おけを開く
棺おけの中に羽を捜す
if(羽がある)
自分のバックパックに入れる
こうなりますね。
そして上の処理全部をずっとまわしっぱなしにします。
死体をずっと捜しつづけるわけですからね
while文で囲んじゃえばいいわけです。
while(true){
死体を捜す
if(死体を見つけたら)
刃物を死体に当てる
死体をダブルクリックして棺おけを開く
棺おけの中に羽を捜す
if(羽を見つけたら)
自分のバックパックに入れる
}
死体を捜す
if(死体を見つけたら)
刃物を死体に当てる
死体をダブルクリックして棺おけを開く
棺おけの中に羽を捜す
if(羽を見つけたら)
自分のバックパックに入れる
}
while文の()の中の「true」というのは真ということです。(反対に偽はfalse)
つまり「もし??なら」という部分が常に真ということで
ずっと「死体を捜す」を続けるわけです。
真と偽。
yesかnoかという意味ですif(???)というのもwhile(???)というのも
常に真か偽か。yesかnoかの2択でしか判断していません。
これは「boolean」という型で
真・yesなら「true」。偽・noなら「false」と丸暗記してください。
それでは今日は死体を捜すところからZeazyUOでやってみましょう。
どのように死体を捜せばいいのでしょうか?
いきなりZzFindという難しい機能を使うしかありません。
このZzFindは難しいですが使いどころは常にあるので少しずつ覚えていきましょう。
まず、死体をZeazyUOで探すには「model(モデル)」という概念が必要です。
これはアイテムの種類と思ってください。
貴方の持っている「刀」や「包帯」もそれぞれmodelが存在します。
他の人の持っている「刀」も「包帯」も色こそ違ったとしても形が同じであれば
同じmodelなのです。
注意:死体はいろんな形がありますが基本的に同じmodelとなっています。
これは少し特殊なのでそう覚えておいてください。他のアイテムは基本的に
違う形であったら違うmodelです。
では死体のmodelはどうやって調べればいいのでしょうか?簡単です。
メインメニューから「game info」を選んでください。

するとこのようなウィンドウが開きます。

+lastをクリックしてください。
いろいろ出てきましたね?

これはlast系の情報です。最後に使ったアイテム、最後に開いた鞄、等の情報が満載です。
ここでは「死体のmodel」さえ分かればいいので
「lastTargetModel」を見てください。
これは名前そのまま「最後にターゲットした物のmodel」です。
人によってはいろんな数字が出ているかと思いますがなにも操作していなければ
lastTargetModel: 0 (0x0)
となっているはずです。
では手持ちのダガーか何かを使って死体をターゲットしてください。
lastTargetModel: 8198 (0x2006)
このようになったはずです。これが死体のmodelです。
8198というのが10進数。0x2006というのが16進数。数字の最初に0xと付ければ
ZeazyUOはその後に続く数字を16進数と判断します。
どちらを使うかは個人個人の好きにして下さって大丈夫です。
さあ、modelが分かったところで早速書いてみましょう
以下のようにテキストエディタを使って入力してください。
find = new ZzFind();
find.find('m8198');
fRes = find.result;
for ( i = 0; i < fRes.length ; i++)
println (fRes[i]);
find.find('m8198');
fRes = find.result;
for ( i = 0; i < fRes.length ; i++)
println (fRes[i]);
これで死体を捜して見つけたら一つずつ表示する。という機能ができました。
1行ずつ説明していきます。
find = new ZzFind();
new ZzFind()
これはクラスといいます。ZeazyUO公式のwikiの左側のメニューに並んでいるものは
全てクラスというものだと思ってください。深く考えなくてもいいです。
new というのは新しくこの機能を使い始めますよ。という意味で。
初めて使うときは必ずnewが必要です。
そしてそれを x = 10;と同じように(少し意味が違いますが)
find という入れ物に ZzFind() を入れてしまっているわけです。
※ x = 10;というのは
「x という入れ物に 10 を入れる」
ということ(代入と言う)なのですが
find = new ZzFind(); は
「ZzFind() という機能に find という名前を付ける」ということです。
これをオブジェクト化といいます。
数字や文字列等の色々変化するものの場合は前者
クラス等「ある機能を持ったもの」の場合は後者と覚えておいてください。
find.find('m8198');
.find()
これはメソッドです。ZzFindの機能の一つと覚えておいてください。
いろいろなクラスには色々なメソッドがあります。膨大な量ですので
一つ一つは説明できませんがwikiにどのようなものがあるか説明がありますので
慣れてきたらwikiを見ながら色々試してみるといいでしょう。
'm8198'
これはmodelが8198の物を探すという意味です。
後ほどmodelだけでなく他の条件での検索もしますので
深く説明することはありませんが
公式wikiの「ZzFindCondition」から
「void loadText (string conditionText, bool doClear = true)」
を読んでみるといいでしょう。 (直リンはこちら)
fRes = find.result;
find.result
少し理解しづらいと思いますが公式wikiにある「プロパティ」という物です。
ZzFindでいうと
* Array result
* Int limit
ですね。
limitは今回使いどころはありませんが。Array resultはよく使います。
Array result
Arrayとはなんでしょうか?これは配列といいます
x = 10;
というのはxという入れ物に10を入れるというのは分かりますよね?
このxという入れ物をいくつにも区切ることで
その区切られた中に数字や文字を入れることができるようになるのが最大の特徴です。
たとえばxの一つ目の区切りに10を入れて二つ目の区切りに40を入れる。
ということです。
つまり、findで得られた結果を配列として取得できるfind.resultに
fResという名前を付けたということです。
for ( i = 0; i < fRes.length ; i++)
println (fRes[i]);
for ( i = 0; i < fRes.length ; i++)
for文は覚えてますか?この場合ですと
「iに0を入れて iがfRes.lengthより大きくなるまでiに1を足していく)
となっています。
fRes.lengthとはなんでしょう?
fRes.length
fResというのはfind.resultでしたよね?ですからfRes.lengthというのは
find.result.length
と同じ意味になります。(もちろんスクリプト内でこのように書いても問題ありません)
さて、.length
ですがこれはその名前のとおり「長さ」ということです。
find.resultというのはarray(配列)で、findで死体を捜したので死体の配列です。
死体1、死体2、死体3・・・
これの長さということはつまり「死体の数」ということです。
ということでこれは
「iに0を入れて iが死体の数よりも大きくなるまでiに1を足していく」
ということになります。
println (fRes[i]);
さて、死体が3つや4つ見つかった場合に全ての棺おけを同時に開くことは出来ないですよね?
一つ一つ開くしかありません。
今回は「棺おけを開く」という動作の変わりに「println で表示」しています。
println (fRes);
だと
001234,001235,001236
と、このように一度に全部出てきてしまいます。
この配列一つ一つをどうやって表示すればいいのかというと
この配列の一つ目は
println (fRes[0]);
2つ目の入れ物だと
println (fRes[1]);
このように
[]の中に番号を入れていけばいいだけです。
注意しなければいけないのはこの番号は1から始まるのではなく
0から始まるということだけです。
分かりましたでしょうか?
つまり
for ( i = 0; i < fRes.length ; i++)
println (fRes[i]);
とは
「iに0を入れて iが死体の数以上になるまで
(fResという死体の配列の[i]番目を表示して)iに1を足す」
という機能になっているわけです。
実際に時間軸に処理されるのは
死体が3つ見つかった場合でしたら
iに0を入れる
i(0)が死体の数(3)未満なので死体の[0]番目を表示する
iに1を足す
i(1)が死体の数(3)未満なので死体の[1]番目を表示する
iに1を足す
i(2)が死体の数(3)未満なので死体の[2]番目を表示する
iに1を足す
i(3)が死体の数(3)未満ではない(等しい)ので終わる
となっているわけです。
この場合はfor文は別の書き方でもいけますよね
for ( i = 0; i != fRes.length ; i++)
iに0を入れる
i(0)が死体の数(3)と等しくないので死体の[0]番目を表示する
iに1を足す
i(1)が死体の数(3)と等しくないので死体の[1]番目を表示する
iに1を足す
i(2)が死体の数(3)と等しくないので死体の[2]番目を表示する
iに1を足す
i(3)が死体の数(3)と等しいので終わる
こうなるわけです。
ちっともUOでの反応が見られなくて飽きてきた方。
次回でやっと実際に操作しているという感じをつかむことができますので
がんばってください。