ベンダー(PCと商品を売買してくれる人)のしくみを見ながら、Reference、Reference ID(参照用ID)の感覚を掴んでいきましょう。もっとシャッキリ説明できる方がいたら、どうかニュアンスが正しく伝わるようにどんどん修正していってください。それだけが俺の願いです。
ベンダーは店舗などに配置されたNPCのことを便宜上そう呼ぶだけで、「売買する機能を持ったNPC」のことだと考えていただければ十分です。ベンダーと他のNPCの違いはなんでしょうか?
それは、NPCのAIで売買がチェックされている点と、PCと売買をする時、自分の所持品とは別に在庫コンテナを持つ点です。前者はNPCのAIを開いてみれば一目瞭然なので、後者を実際に見ていきましょう。
まず、Imperial CityのMarket Districtにある、Fighting ChanceのRohssanを例にとって見ていきます。
オブジェクトウィンドウのNPCからRohssanを探し、右クリック→Use Infoを表示してみてください。上半分にNPCRohssanと関連づけられているオブジェクトのリスト、下半分にNPCRohssanが配置されているセルの一覧が表示されます。Rohssanならセル一覧にはFighting Chanceの店内セル一つだけだと思いますので、それをダブルクリックします。
画像の対訳表
使用リスト | Use Report |
以下のオブジェクトに使用されています | Use by these objects |
以下のセルで使用されています | Used in these cells |
このUse Infoは、そのオブジェクトがどこに配置されているかを知ることができて便利です。何個配置されているか、だけなら「基本操作」でも述べたように、オブジェクトウィンドウの表で確認できます。
レンダウィンドウにRohssanとFighting Chanceの内装が描画されたら、レンダウィンドウのRohssanのオブジェクトをダブルクリックしてください。以下のようなReferenceダイアログが表示されるはずです。
参照用Editor ID | Refence Editor ID |
オブジェクト | Base Object |
オブジェクト本体を編集 | Edit Base |
場所 | Space |
Referenceをレンダウィンドウから選ぶ | Select Reference in Render Window |
セル | Cell |
スクリプトから参照できるようにする | Persistent Reference |
開いている(ドア) | Open By Default |
表示限界距離より遠くても表示 | Visible When Distant |
Disableとして配置 | Initially Disabled |
今表示しているのはMerchant Containerのタブです。なんとなく、今回話題となっているフレーズが出揃った気がしますね。Referenceにあるのは、ベンダーとしてのNPCに関連づけられているコンテナです。
ここで特定のコンテナを指定することにより、これを在庫としてNPCRohssanが売買を行うのです。
CS Wiki (The Elder Scrolls Construction Set Wiki)にも記載されていますが、NPCがベンダーとしての機能を持つためには、以下の条件が必要とされます。
他にも、どの時間帯に商売をしてくれるかなどのスケジュール処理は必要になってきますが。
さて、よく見るとReferenceの項目には’*****’ ’******’のように、なぜか名前が二つ続けて表示されているのがわかると思いますが、これは次の項で述べることにします。
ここでは、NPCが商品を売買するにあたり、どこから商品を出し入れしているのか、理解できていれば十分です。
referenceは「参照する」などの意味です。
前項では、NPCが「参照する」コンテナを指定する際に登場しました。
他にも、ドアマーカーで別のセルとの移動ポイントを作る際、ドアマーカーとドアマーカーを対応させるためにreferenceとして移動先のドアマーカーを指定します。
また、オブジェクトやドアの所有権が誰にあるのか、というOwnershipの指定も、ある種の参照として扱われているようです。
この上半分に表示されているのは、Rohssanと関連づけられているオブジェクトだと説明しましたが、言い代えるなら、これは所有権の持ち主としてRohssanを参照していると表現することもできるわけです。
一方、Reference IDとはなんなのでしょうか。簡単に言ってしまえば、「いくつも存在する同一のオブジェクトを区別するための便宜上のEditor ID」となります。
これだけではわかりにくいと思いますが、では次の場合を考えてみましょう。
ここに、ChestVendorSmithBladesI01というEditor IDのコンテナがあります。Rohssanの店に存在するコンテナですが、実はこのコンテナ、Use Infoを見ればわかるようにImperial CityのSlash 'n Smashにも、LeyawiinのThe Dividing Lineにも同じEditor IDを持つコンテナが配置されています。いずれもベンダーのMerchant ContainerとしてReferenceに指定されていますから、それぞれの在庫になっているということです。
ではこういう時、Slash 'n Smashで何かを購入すると、他の店では同じ品が同じだけ減ってしまったりしているのでしょうか? 結果的に同じEditor IDを持つのですから、そうなってしまいそうなものです。
ところが、ここでReference IDの存在が重要になってきます。
全てのオブジェクトにはEditor IDとForm IDを持つことを以前説明しましたが、残念ながらスクリプトやReferenceで16進数のForm IDを指定することはできません。英数字で構成されたEditor IDを指定することはできます。
オブジェクトを配置すると個別のForm IDが新たに割り振られます。コンソールなどからであればForm IDだけで十分ですが、前述のようにスクリプトなどから特定のオブジェクトを参照したい場合、Form IDだけでは用が足りないので困ってしまいます。
そこで、それぞれに異なるReference IDをつけてあげることによって、改めて別々の存在としてスクリプトから参照したりできるようになります。いわば、とあるEditor IDを持つ全く同じオブジェクトたちの中から、スクリプトが特定の一つを識別するための新しいIDとなるわけです。