オープニングのキャラ作成を調べてみた

環境構築

Nanakochan環境では以下のように

  • 最初のキャラクタ作成画面では性別だけ変更して抜ける
  • コンソールからSLM 14を実行して改めてカスタマイズする

という操作がお約束になっていると思います。

1回限りであればどうでもよいことですが、周回プレイだと何十回と繰り返すことになるため面倒です。

そこでなんとかできないかと調べてみました。

オープニングの実装

クエスト

MQ101というクエストに実装されています。

MQ101はニューゲーム直後から稼働するようです。ですが、Start Game Enabledフラグが設定されておらず、なぜ稼働するのかは不明です。

このMQ101にはたくさんのスクリプトが指定されていますが、重要なのが以下の3つになります。

  • クエストに紐づいているMQ101QuestScript
  • クエストのFragmentsのQF_MQ101_0001ED86
  • プレイヤーのReference Aliasに紐づいているMQ101PlayerScript

シーン

MQ101に含まれるMQ101_001_MirrorSceneというシーンが稼働します。こちらはBegin on Quest Startフラグが設定されているため、クエストの開始と同時に稼働を始めるようです。

MQ101_001_MirrorSceneのActionにはダイアログが指定されており、プレイヤーの「War never changes…」から「Right.」までのセリフが用意されています。

このMQ101_001_MirrorSceneに紐づいているスクリプトのSF_MQ101_001_MirrorScene_000A7D3Cも関係してきます。

スクリプト

MQ101QuestScriptにはOnQuestInitイベントの定義がないため、最初は何もしないようです。

FragmentsのQF_MQ101_0001ED86がクエストのStageごとに稼働します。

最初のStageはStage Indexが0から始まります。Run On Startフラグが設定されているためです。このStageにはLog Entryが5つ用意されています。Log Entryの条件式には「グローバル変数MQ101Debugの値がいくつである」が指定されています。MQ101Debugの初期値は1なので、「グローバル変数MQ101Debugの値が1である」のLog Entry #1が選択されます。5つあるのはおそらく開発段階で5通り用意され、製品リリース時に1つが選ばれた、ということのようです。

よって、QF_MQ101_0001ED86のFragment_Stage_0000_Item_01関数が実行されます。これ以外のFragment_Stage_0000_Item_00からFragment_Stage_0000_Item_04はいわゆるボツになったゴミコードなので注意します。

Fragment_Stage_0000_Item_01の処理の流れを読んでみると、以下のようになっています。

  • TimeScaleを0にします。時間が経過して日が暮れてしまっては困るので、永久に昼間にしておくためでしょう。
  • キャラクタ作成画面に必要な準備をします。コンパスを非表示にして、セーブ不可にして、プレイヤーの移動等の操作を禁止し、キャラクタ作成画面専用スケルトンを適用し、プレイヤーを所定の位置に移動させます。
  • 影武者の準備を行います。影武者については後述します。
  • オープニングのムービーを再生します。
  • プレイヤーの所持品をすべて奪ったあとに、戦前の服を着せます。
  • プレイヤーに洗面台(内部的にFurniture)をアクティベートさせます。
  • 画面をフェードインさせます。

このシーンが始まります。正確にはシーンはすでに始まっており、最初のセリフの条件を満たすまで待機しています。そこから一連のセリフを話し終わると、最後のセリフであるPhase 8に用意されているFragment_Phase_08_Begin関数が実行されます。この関数がGame.ShowRaceMenu関数を呼び出し、キャラクタ作成画面が開きます。

ShowRaceMenu関数は動作モードがあり、モード0の新規キャラクタ作成モードで開かれます。編集対象となるActorにプレイヤー、男Actorに影武者男、女Actorに影武者女が指定されています。

挙動はおそらく以下のようになっています。

  • はじめは編集対象となるプレイヤーがアクティブになっています。よってプレイヤーは男であることが前提です。
  • 性別切り替えを行うと、編集対象がプレイヤーから影武者女に切り替わります。
  • 男を選択しているときの編集はすべてプレイヤーに、女を選択しているときの編集はすべて影武者女に実施されます。
  • キャラクタ作成画面を抜けると、プレイヤーへの編集内容が影武者男にコピーされます。
  • 最後に女を選択していた場合は、プレイヤーの性別を女に変更した上で、影武者女の顔データをプレイヤーに移植します。

ちなみにコンソールからSLMコマンドを実行すると動作モードが既存キャラクタ編集モードで開かれるため、編集対象のActorのみを指定し、性別の切り替えはできません。

このあとMQ101のStageが10、12、15、18と遷移していくようです。これはシーンのAcitionに設定されているセリフに、セリフが完了したらStageを設定する処理が指定されているためです。

FragmentsのStage 15に設定されているFragment_Stage_0015_Item_00関数にて、MQ101QuestScriptにおける各種イベントの監視が開始されます。キャラクタ作成画面で性別を切り替えた時、キャラクタ作成画面を抜けた時、スケルトンが元に戻された時などを監視しています。

キャラクタ作成画面を抜けたら家具の使用を終了するようなのですが、これの処理を見つけられませんでした。

MQ101PlayerScriptにはOnGetUpイベントの定義が書かれています。家具の使用を終了した時の処理が記述されています。ここでキャラクタ作成用に行った準備の後始末を行い、影武者の後始末も行います。

影武者

内部的にはSpouse(配偶者)という名称で定義されています。

最初の洗面台の前にいる場面では、男がプレイヤーであり、背後にいる女が影武者女になります。

影武者男もスタンバイしていますが、カメラから見えない位置にいます。

影武者はキャラクタ作成画面における女側の編集対象として必要になりますが、キャラクタ作成画面を抜けたあとのストーリー進行にも必要になります。

プレイヤーとして男を選んだ場合は、影武者男は無効化されて見えなくなり、以降はプレイヤー(男)と影武者女にてストーリーが進行します。

プレイヤーとして女を選んだ場合は、プレイヤーが女に変更されており、影武者男が残って影武者女は無効化されます。以降はプレイヤー(女)と影武者男にてストーリーが進行します。

Vault 111にはプレイヤーの向かいの冷凍ポッドに配偶者の遺体が置かれていますが、遺体は専用のActorが男女それぞれ用意されています。テンプレートとして影武者が指定されているため、容姿を引き継ぎます。

処理変更時の不具合

オープニングの流れを変えるためにデータや処理を変更すると、色々と不具合が発生します。

オープニングムービーはスキップできない

オープニングムービーをスキップすると音声が消えます。

ニューゲーム直後の処理のどこかに音声を消す処理があり、オープニングムービーの終了を持って音声を再開するようです。

よってムービー自体を再生しないと、音声が消えたままになってしまいます。

以降のゲームが完全に無音になりますし、セリフも無音です。シーンはセリフが言い終わると次のActionに移るようですが、無音だとセリフを言い終わったことにならないらしく、シーンが進まなくなります。

性別を変更するとセリフが無音になる

例えば「War never changes…」は男主人公の音声データしか用意されていないようなので、プレイヤーを女にしていると無音になります。シーン自体は進むようです。

別の場所で女主人公が同じセリフを話す場面がありますが、オープニングの物とは別に用意されているセリフになります。

プレイヤーの性別を女にすると服装がお揃いになる

オープニングで着ている服は専用のものになりますが、Armor Addonにて男ならシャツ、女ならドレスの見た目になるようにメッシュが指定されています。

スケルトンについて

キャラクタ作成画面においては専用のスケルトンが有効になっています。

このスケルトンの切り替え処理は前述の通りスクリプトから行われているため、スケルトンを切り替えずにキャラクタ作成画面を開くことも可能です。

コンソールからSLMコマンドでキャラクタ作成画面を開いた場合は、必然的にスケルトンの切り替えなしになります。

この専用スケルトンは、おそらくはキャラクタ作成画面での操作に適したものになっているのだと思われますが、一番の問題が頭身がバニラ用なので、Nanakochan環境だと見た目がおかしくなる点です。

スクリプトからスケルトンの切り替えをしないように書き換えれば、見た目の問題は解決しますが、スケルトンの切り替えのイベントを見て処理が進むため、処理の流れに影響が出ます。

オープニングの儀式を楽にするには

プレイヤーの容姿の初期値はActorレコードのPlayerになります。Form IDでいうと7です。よって、このPlayerのデータを自分用に書き換えておけば何もしなくて済みます。性別を女にしておけば、最初から女としてスタートします。

影武者男と影武者女の容姿も初期値を設定しておきます。影武者女はプレイヤーと合わせておきます。

オープニングのシーンから違和感や不具合が発生しますが、すべてなくしてしまうのが手っ取り早いです。

シーンはMQ101_001_MirrorSceneシーンのRun On Startフラグを外すだけです。これで最初の会話がなくなります。MQ101のStageも進まなくなってしまうため、Stage 0のFragmentであるFragment_Stage_0000_Item_01にてStageを10、12、15、18と進めればいいです。

Fragment_Stage_0000_Item_01に含まれるキャラクタ作成画面のための準備と後始末は必要最小限のものだけ残して、あとはバッサリと削ります。

  • 配偶者のReference Aliasに影武者女を入れている部分を影武者男に変更する
  • 影武者女を無効化する
  • Stageを10、12、15、18と進める

MQ101PlayerScriptが面倒で、OnGetUpイベントを見ているため、コードをまるごと別の関数として定義し、Fragment_Stage_0000_Item_01から呼び出せる形にします。

あるいはMQ101PlayerScriptで行っている処理をすべてFragment_Stage_0000_Item_01に入れてしまう方法でもいいと思いますが、プロパティの紐づけが面倒です。

LooksMenuのMorph

ModのLooksMenuを用いてMorphを設定したい場合、通常であればキャラクタ作成画面を開き、スライダーを動かして編集することになると思います。大抵はLooksMenuのプリセットとして保存してあると思いますので、保存してあるLooksMenuのプリセットを読み込むことになります。

Nanakochan環境だとLooksMenuのプリセットを読み込んだ時点で何故か顔パーツが壊れるので、キャラクタープリセットを選び直して修復する必要があります。

キャラクタープリセットを選ぶと顔パーツがNanakochanの初期値に戻るため、顔パーツを選びなおす必要があります。これはキャラクタープリセットに自分用を用意しておけば選ぶだけで完了するので楽になります。

Morphの適用はLooksMenuが用意してくれている関数からでも行えます。何らかの形でニューゲーム直後にMorphを適用するスクリプトが動くようにすれば、一度もキャラクタ作成画面を開くことなくゲームを開始できます。MQ101に仕込むのでもいいでしょうし、気になるのであれば、別途Modとして作ればいいと思います。

サンプル

自分用に作ったものを置いておきます。

  • AnimeRace Nanakochan
  • 512 Standalone Hair Colors
  • MiscHairstyle
  • Horizon 1.9.3 (マスター指定はないがPlayerの能力がHorizon用)

当然ながらクイックスタート系とは競合する恐れがあります。

Nanakochan StartUpをダウンロード

戦後にスキップするには

ついでにクイックスタートの処理を書いておきます。

以下のSkipToPostWarをよきところで実行します。

Quest Property MQ101 Auto Const Mandatory
Quest Property MQ101TVStation Auto Const Mandatory
Quest Property MQ101SanctuaryHills Auto Const Mandatory
Quest Property MQ101PlayerComments Auto Const Mandatory
Quest Property MQ101Radio Auto Const Mandatory
MQ101PlayerScript Property MQ101_Player Auto Const Mandatory
Keyword Property AnimArchetypePlayer Auto Const Mandatory

Function SkipToPostWar()
	; fade out game
	Game.FadeOutGame(abFadingOut = true, abBlackFade = true, afSecsBeforeFade = 0.0, afFadeDuration = 1.1, abStayFaded = true)
	Utility.Wait(1.0)

	; cleanup player
	PlayerRef.SetHasCharGenSkeleton(False)
	PlayerRef.ChangeAnimFaceArchetype(MQ101_Player.AnimFaceArchetypePlayer)
	PlayerRef.ChangeAnimArchetype(AnimArchetypePlayer)

	; move to vault 111
	MQ101.SetCurrentStageID(900)

	; cleanup quest
	MQ101TVStation.Stop()
	MQ101SanctuaryHills.SetCurrentStageID(1000)
	MQ101PlayerComments.SetCurrentStageID(1000)
	MQ101Radio.SetCurrentStageID(100)
EndFunction

以下は処理の流れの詳細です。

fade out gameは画面をフェードアウトさせて真っ黒にします。雰囲気のためなので無くてもいいです。

cleanup playerはキャラクタ作成画面後の後始末です。MQ101側でも行っているはずなので、無くてもいいはずですが、念のため実行しています。

move to vault 111が肝になる部分で、MQ101のStageを900に進めるだけです。後は自動的にVault 111の冷凍ポッドで目覚めるシーンが始まります。

cleanup questは戦前の世界の後始末です。一連の処理をスキップしているため必要になります。

SkipToPostWar関数の実行タイミング

ひとつはキャラクタ作成画面の終了を見る方法です。

Event OnQuestInit()
	; キャラクタ作成画面の開閉を監視
	RegisterForMenuOpenCloseEvent("LooksMenu")
EndEvent

Event OnMenuOpenCloseEvent(string asMenuName, bool abOpening)
	if asMenuName == "LooksMenu" && !abOpening
		; キャラクタ作成画面の開閉の監視をやめる
		UnregisterForMenuOpenCloseEvent("LooksMenu")

		; 戦後にスキップ
		SkipToPostWar()
	endif
EndEvent

もうひとつはMQ101のStageを見る方法です。

Quest Property MQ101 Auto Const Mandatory

Event OnQuestInit()
	; MQ101のStageを監視
	RegisterForRemoteEvent(MQ101, "OnStageSet")
EndEvent

Event Quest.OnStageSet(Quest akSender, int auiStageID, int auiItemID)
	if auiStageID == 18
		; MQ101のStageの監視をやめる
		UnregisterForRemoteEvent(MQ101, "OnStageSet")

		; 戦後にスキップ
		SkipToPostWar()
	endif
EndEvent

Horizon 1.9.4 Tweaksにはこのクイックスタートの機能がオプションとして含まれています。

タイトルとURLをコピーしました