アドレスには2種類ある、と言っておきながらすっかり忘れていましたので記事にします。
1つはBase ID。SteelArmorは00013952だとか、リディアさんは000A2C8Eだとか、今まで触ってきたアドレスです。
もう1つはRef ID。これは実際にゲーム上に現れたオブジェクトに対して割り振られるアドレスです。SteelArmorは00013952って決まってるんだから、そのままゲームで使えばよくない?という気もしますが、それだと不都合が出てきます。というわけで、なぜ2種類のアドレスが必要なのかを説明します。長めです。
※NPCのID知りたくて検索ランディングした場合は、こちらの記事をどうぞ。
- アドレスが1種類だと困る理由
- オブジェクトを区別するための「Ref ID」
- もしRef IDが無かったら?
- 「オリジナル」と「ショートカット」のようなBase IDとRef ID
- CKでリディアさんのRef IDを見る
アドレスが1種類だと困る理由
みんな大好きSweetRollです。アドレスは00064B3Dです。TES5Editで見ればすぐ分かります。コンソールで「player.additem.00064B3D 1」でゲットしました。
他のアドレスなど要らない気がしちゃいます。
コンソールでもう1個追加します。再度「player.additem.00064B3D 1」です。
ポケットの中にはSweeRollが2つです。2つ位なら食べられるでしょうか。
さて、2個見るとちょっと困りません?この「00064B3D」というのはどっちのSweetRollを指しているのでしょうか?両方SweetRollなので、どっちも00064B3Dな気がします。コンソールでもそのように打ってます。だとすると、片方食べて無くなった場合、もう片方も同時に消える?片方を拾うともう片方も拾ったことになる?それだとちょっと困ります(拾う分にはいいかもですが)。つまり問題は、同じ物2つをどう区別したらいいか?ということです。
オブジェクトを区別するための「Ref ID」
さっきのSweetRollを、MfgConsloeの機能を使って表示を拡張します。少し画像を加工しています。そのままだと無駄に大きな画像になるので。
右側に情報が表示されています。「Base ID」はコンソールに入力した通り、00064B3Dです。その上にもう1つ、ただ「ID」と書いてあります。これがRef IDです。「FF000D4F」となっています。なんのこっちゃと、1個だけではピンとこないかもしれませんので、もう1個のSweetRollも見てみます。
もう1個の情報です。Base IDはもちろん同じですが、「ID」ことRef IDは、「FF000C98」となっています。1個目のSweetRollとは違うRef IDが割り当てられています。Base IDでは、両方ともSweetRollという同一のオブジェクトを指していますが、Ref IDで見た場合は、「別の固体」として識別されることになります。
もしRef IDが無かったら?
分かったような分からないような、微妙!?かもしれません。逆にRef ID無しでSweetRollの固体識別をするとしたら、どうなるか考えてみます。「00064b3d」が1つのSweetRollだけを表すなら、このままではゲーム中に存在できるSweetRollは、全世界で1個だけです。2個目以降が欲しい場合は、CKやTES5Editで「SweetRoll2」といった別のデータを作らなければなりません。2個でも困るので100個ほど作ってみましょうか。「SweetRoll」、「SweetRoll2」、・・・「SweetRoll100」。TES5Editで書くだけでも大変な作業です。しかしこれだけやっても、世界で存在できるのは100個までです。101個目のSweetRollはありません。
これが山賊の鎧や武器にも当てはまるので、すべての装備を必要な数だけ全部作るハメになります。全く同じ外見、同じ性能なのに、100人の山賊が使うなら100個、データを作らなくてはなりません。それでも101人目には使えない、と。やってられませんよね?そんなの。MODのファイルも大きくなるし、アドレス枯渇しそうだし、いいこと無いです。
「オリジナル」と「ショートカット」のようなBase IDとRef ID
オリジナルを「Base」にしてRef IDを量産
Base IDで設定されているオブジェクトは、ゲーム内では絶対に無くならない「見本」のようなものです。SweetRollを持ったNPCがスポーンしたり、新しく導入したMODの家にSweetRollがあったりと、ゲーム内で必要になった場合は、「見本」を参照(Reference)して、ユニークなRef IDを作り、さながらWindowsのショートカットのように(MacOSだとエイリアスですが、Skyrimでエイリアスというと別の意味になってしまうので)、NPCや家の中に配置します。下の図のようなイメージです。
一番最初の「player.additem.00064B3D 1」で取得したときのように、Ref IDは自動的に割り振ってくれます。3個目以降を取得しても同じです。Ref IDを割り振るアルゴリズムを考えてMODに実装する、なんてことは無いので大丈夫です。
ショートカットが消えても他に影響は無い
当たり前ですが、ゲーム内に置かれたSweetRollを1個食べても、他のRef IDのSweetRollが消えたり、ましてやオリジナルであるBase IDのSweetRollが消えたりしません。ショートカットが1個消えるだけです。
Base IDが無くなれば、Ref IDのオブジェクトは全て消える
ゲーム内でBase IDが消えることは有りませんが、SweetRollのBase IDを消すようなMODを入れた場合は、ゲーム内にある全てのRef IDが消滅します。絶滅です。
すべて無かったことになります。オリジナルとクローンみたいな関係を連想した人いるかもですが、オリジナルが消えるとクローンも全て消えてしまいます。2万個のSweetRollがあったとしても、Base ID無くなったら全部幻です。ただしセーブデータにゴミが残る、と思います。
CKでリディアさんのRef IDを見る
最後にCKでリディアさんのアドレスを見てみます。さんざん見てるよ!と言われそうですが、まあそう言わずに。CKでリディアさんのRef ID見られるんです。珍しく1stepづついってみます。
Actorからリディアさんを探す
CKのActor欄にあるリディアさんです。右クリックで「Use Info」を見てみます。
ゲーム内に配置されたリディアさんの居場所を探す
Use Infoの窓です。Base IDとしてのリディアさんを使っている、なんらかのオブジェクト一覧になってます。
下段に「Used in these Cells」という項目があります。リディアさんを使ってるセル、つまりゲーム内に配置されてるリディアさんの居る場所になります。みんな知ってることですけどBreezehomeに居ますね。
セルに移動してリディアさんを調べる
俗世に光臨されたリディアさんです。強そうですね。これをEditしてみます。
こんなのが出てきます。BaseObjectのところに、ご存知リディアさんのBase ID、000A2C8Eが書いてあります。その上のReferenceEditor IDの欄外に、(000A2C94)と書いてあります。これがゲーム内で実際に出会うリディアさんのRef IDです。
どっちが偽者だ!?正体を現せ!などと言わずとも、Ref IDで一発です。
あらかじめ配置がesmやesp内で配置されているオブジェクトは、CKやTES5EditでRef IDを確認できます。Base IDと同様にRef IDの上位2桁はロードオーダーです。
ゲーム内で新規に生成されたオブジェクトのRef IDの上位2桁はFFになるようです。冒頭のSweetRollがそうでした。だからプラグインの上限は256個じゃなくて255個なんですね。(上位2桁00~FE)
お疲れ様でした。