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

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

GG CompanionはキャラにEssential(重要人物)設定がされています。このため死んでしまうことは無いのですが、ダウンしても一時気絶するだけでその場ですぐに復活します。これではプレイヤーは穴熊状態になりがちですし、コンパニオンをかばって奮戦という意義もあまりなく、少々退屈に感じらるかもしれません。

ではどうするか? Edit

スクリプト Edit

変数の宣言 Edit

short varDeadMenu
short btnDeadMenu

新たに2つの変数を使用するので冒頭に追加してください。

NPCの設定 Edit

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したときの処理 Edit

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選択後の処理 Edit

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を使って蘇生させるとき、起き上がり時に変なコリジョンを起こして吹っ飛んだり、壁にめり込んだりすることがあるようです。このへんは改善が必要かもしれません。

死亡時の処理 Edit

begin OnDeath
	;------------------------------------------------------------
	;死亡(仮死)報告
	;------------------------------------------------------------
	Message "Valeriaは傷つき倒れました。"
end

これは無くても良いのですが、一応メッセージを出すようにしました。

既存スクリプトとの干渉回避 Edit

	if varDeadMenu != 1
		set pickButton to GetButtonPressed
	endif

GGValeriaScriptの後ろのほうで、Messageboxの押されたボタンを取得する箇所があります。これは今回のMessageboxと干渉する可能性があるので、varDeadMenuが1でないときだけ実行させるようにします。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2007-12-27 (木) 13:04:41