Condition Functionについて過去何度かつまずいたため、こちらの記事にまとめておきます。
CKwikiでは、「Condition Functionはスクリプトを介さずに使える特別な関数」と説明されています。実際の例として、会話、魔法、クエストなどそのほか様々なところで、それがどのような状況で有効になるかの条件設定Condition Itemsで見ることができます。
非常に多くのFunctionがあり、「IsInInterior」や「GetDead」など分かりやすいものもあれば、「IsPlayerMovingIntoNewSpace」や「IsCarryable」などどういった状態をさすのか、使い方自体も分かりにくいものもあります。さらには、実際にはうまく動作しない関数や、プレイヤーに対してのみ正しい結果を返すものなどもあり、自分が使おうとする関数の取り扱いに困ることが多々あります。
Condition Functionはゲーム内にてコンソールを使用して確認できます。実際の戻り値が確認できる場合もあるので、不慣れな関数を取り扱うときは事前に下調べをしておくといいかもしれません。意外な落とし穴もあったりするので、使い慣れた関数でも時には再確認すると解決にたどりつけることがあります。
AI PackageのUseMagicによって回復魔法を使わされているイリアに、様々なCondition Functionを試しているところ。
上から順に「IsDualCasting」「IsBleedingOut」「IsHostileToActor」「IsAttacking」「IsCasting」です。
「>>0」など具体的な戻り値を表示してくれるものもあれば、「is NOT bleeding out.」と文章で返しているものもあります。否定的な文章はFalseなので「0」を返しているんだと取ればいいでしょう。
「IsCasting」は魔法を充填している間は「0」、手を伸ばして放った(放っている)状態ではじめて「1」になるようです。地味に分かり辛い「IsInCombat」についても引数は特にいらないことが分かります。
このようにコンソールからCondition Functionの新鮮な結果を一本釣りできるので、結構面白いです。
以下、個人的に一番困った例を挙げておきます。
「GetKeywordItemCount KeywordID」
対象のインベントリにあるアイテムを特定のKeywordを目印に数える関数です。これを使用した条件を設定したところどうもうまく動作しなかったため、最終的にCondition Function自体を疑った経緯があります。
Keywordに"WeapTypeBow(1E715)"と"VendorItemArrow(917E7)"を使って、弓と矢を所持しているかそれぞれ調べてみました。
一番シンプルな例。対象は虐殺者エリク。武器に関してはインベントリに表示されているものしか持っていません。
「狩人の弓」を1本、矢はデイドラの矢と鋼鉄の矢を合計11本持っています。Condition Functionの戻り値も(当然ですが)一致しています。
対象はジェナッサ。こちらはインベントリに見えない(Playableでない)弓と矢を持っている例。バニラの雇用システムで雇用と同時に強制的に与えられるフォロワー専用の弓矢です。
Playableでない装備でも問題なく数えてくれています。
ここから本番。IsChild属性を持つ子ども種族です。しかもこの子は初期装備として、Playableでない弓と、普通の鉄の矢12本を与えられています。非常に特殊な例ですが、自作Modではこういう特殊な例を扱うことが多くなるので仕方ないです。
(当初、IsChild属性をもっているのが「GetKeywordItemCount KeywordID」がうまく動かない原因なのかと誤解していたための試行です)
で、これは彼女にPlayableな弓を1本渡して確認した画面。
弓が1本、矢が0本と認識されています。すでに数の数え方がおかしいです。
次に、以下の操作を行いました。
- Playableでない弓と先ほどのフローキの弓をインベントリから取り上げる。
- 鉄の矢を12本取り、オークの矢を34本与える。
弓の数がおかしいですが、「-1」のことだと思います(2
32-1)。矢の数は「-12+34=22」の計算ですね。初期状態がどちらもゼロの扱いになっていたため、こんな差が出たようです。初期装備に弓矢を持たない子どもでは、正常にカウントできました。
ご覧のとおり、Child属性持ちに「GetKeywordItemCount」はあまり信用できない結果しか得られないことが分かります。ただしこれはあまりに早急な結論。本当にChild属性がいけないのか? 大人で初期装備に弓矢を持っている場合については調べてないぞ。とここで気づきます。
初期装備としてPlayableでない弓1本、矢24本持っているごく普通の成人ブレトンで試した結果。弓と矢を持った状態ではいずれもゼロの戻り値。弓矢を全て取り上げたときの戻り値が上のSSです。
初期装備としてPlayableな弓を持ったNPCでも同じ結果が出ました。Keywordを「WeapTypeSword(1E711)」にかえて、初期装備に片手剣を持っているNPCで似たようなことを試しても同じことになります。
以上から、初期所持品によっては正しくカウントしてくれないことが分かりました(まだ調べ足りませんが……)。使うKeywordに気をつけないと不具合の原因にもなりかねないFunctionかもしれません。
Condition Itemsを何度見直しても設定自体に間違いは無いし、他の部分でもミスはないのになぜかうまく動かない。そんな時は、このように自分が使おうとしてるCondition Functionが意図したとおりの結果を返してくれているか、思いもしなかった例外を含めて確認することが必要になってくる場合もあります。