*無敵コンパニオンであることの問題
GG CompanionはキャラにEssential(重要人物)設定がされています。このため死んでしまうことは無いのですが、ダウンしても一時気絶するだけでその場ですぐに復活します。これではプレイヤーは穴熊状態になりがちですし、コンパニオンをかばって奮戦という意義もあまりなく、少々退屈に感じらるかもしれません。
*ではどうするか?
-Essential状態を外して、実際に死亡するようにします。
-死亡したときのために「蘇生」メニューを作成します。
-ゲームの縛りとして、いったん戦闘状態を終わらせないと蘇生できないようにします。
*スクリプト
**変数の宣言
short varDeadMenu
short btnDeadMenu
新たに2つの変数を使用するので冒頭に追加してください。
**NPCの設定
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回だけ)に記述すべきなのではないかと思うのですが、いまいちうまくいかなかったのでこちらにしています。
**死体をActivateしたときの処理
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を出すようにします。
**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でないときだけ実行させるようにします。