開発資料/コンパニオン改造手引/非無敵化 の変更点


*無敵コンパニオンであることの問題

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でないときだけ実行させるようにします。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS