GG CompanionはキャラにEssential(重要人物)設定がされています。このため死んでしまうことは無いのですが、ダウンしても一時気絶するだけでその場ですぐに復活します。これではプレイヤーは穴熊状態になりがちですし、コンパニオンをかばって奮戦という意義もあまりなく、少々退屈に感じらるかもしれません。
short varDeadMenu short btnDeadMenu
新たに2つの変数を使用するので冒頭に追加してください。
begin GameMode ;------------------------------------------------------------ ;■essential設定 ;essentialを解除して死亡するようにする。 ;------------------------------------------------------------ ; SetEssential GGValeria 1 SetEssential GGValeria 0 ;------------------------------------------------------------ ;■QuestObject設定 ;死亡しても死体が消えないようにする。 ;------------------------------------------------------------ SetQuestObject GGValeria 1
デフォルトのGG CompanionスクリプトでSetEssential 1になっているところを0にします。
また、死亡後にキャラが消滅しないようにクエストオブジェクト扱いにします。
この2つはbegin GameMode(毎フレーム)ではなくてbegin OnLoad(ロード時1回だけ)に記述すべきなのではないかと思うのですが、いまいちうまくいかなかったのでこちらにしています。
begin OnActivate if IsActionRef player == 1 ;------------------------------------------------------------ ;死亡時:蘇生にトライするメニューを開く ;------------------------------------------------------------ if GetDead == 1 MessageBox "Valeriaは意識を失っています。" "装備をさぐる" "蘇生させる" set varDeadMenu to 1 ;------------------------------------------------------------ ;スニーク時:盗み防止のためActivateさせない ;------------------------------------------------------------ elseif player.IsSneaking == 1 Message "自分の仲間から盗みはできません。" else Activate endif else Activate endif
プレイヤーがアクションしたときに判定するのがこの部分です。コンパニオンの状態を調べて、もし死亡していたら(if GetDead == 1)特別なMessageBoxを出すようにします。
begin GameMode ;============================================================ ;■死亡時のactivateメニュー実行中 ;------------------------------------------------------------ ;押されたボタンNo.を取得。次フレームで処理。 ;------------------------------------------------------------ if varDeadMenu == 1 set btnDeadMenu to GetButtonPressed if btnDeadMenu > -1 if btnDeadMenu == 0 ; choice 1 "装備をさぐる" set varDeadMenu to 2 elseif btnDeadMenu == 1 ; choice 2 "蘇生させる" set varDeadMenu to 3 endif endif ;------------------------------------------------------------ ;選択1:通常の死体Activate(インベントリを開く) ;------------------------------------------------------------ elseif varDeadMenu == 2 Activate set varDeadMenu to 0 ;------------------------------------------------------------ ;選択2:蘇生 ;------------------------------------------------------------ elseif varDeadMenu == 3 if player.IsInCombat == 1 MessageBox "安全な場所でないと蘇生できません。" set varDeadMenu to 0 else MessageBox "Valeriaは意識を取り戻しました。" Resurrect 1 ;------------------------------------------------------------ ;HPを1にする ;------------------------------------------------------------ set bTemp to (GetAV Health - 1) * -1 ModAV Health bTemp set varDeadMenu to 0 endif endif ;============================================================
今回のMessageBoxは「装備をさぐる」と「蘇生させる」の2択にしています。
このうち前者は、通常の死体をActivateしたときと同様にインベントリを開くだけです。後者を選ぶと蘇生処理に入ります。
このとき、もしプレイヤーが戦闘状態であれば「安全な場所でない」と表示し、蘇生を実行できないようにします。周囲の敵をクリアにして戦闘状態を終了させていれば、蘇生に入ります。
※Resurrect 1を使って蘇生させるとき、起き上がり時に変なコリジョンを起こして吹っ飛んだり、壁にめり込んだりすることがあるようです。このへんは改善が必要かもしれません。
begin OnDeath ;------------------------------------------------------------ ;死亡(仮死)報告 ;------------------------------------------------------------ Message "Valeriaは傷つき倒れました。" end
これは無くても良いのですが、一応メッセージを出すようにしました。
if varDeadMenu != 1 set pickButton to GetButtonPressed endif
GGValeriaScriptの後ろのほうで、Messageboxの押されたボタンを取得する箇所があります。これは今回のMessageboxと干渉する可能性があるので、varDeadMenuが1でないときだけ実行させるようにします。