Stellaris

Stellaris

Not enough ratings
【Stellaris】古いModを導入したいときの確認事項について
By fatal_errorjp
Stellaris本体のバージョンアップの度に、対応していないバージョンのModを入れて動かないって騒ぐ人があまりにも多すぎる現状にぶち切れたので書きました。
   
Award
Favorite
Favorited
Unfavorite
はじめに
日本語Wikiを見ているとStellaris本体のバージョンと
Modの対応バージョンに差異があるにも関わらず、
Modを入れたら動なくなったなどと騒ぐ人が目につきます。

そもそも本来自己責任で導入することが前提であるはずのModについて、
仕組みについて理解できていないような自己責任で対応できない人は
作者が保証していないものに手を出すべきではないと筆者は考えています。

また、そこで困っている人に対するアドバイスというのも、
「Modをつけ外しして動かして確認しろ」という実際に正しく動作しているのかの
判断基準の明示されていないような内容であり、
アドバイスとしては不適切ではないか、と感じるものがほとんどです。

そのような人達が多数の中で、何故かMod紹介のページには
古いバージョンのModが今でも問題なく動作するように見える形で掲載され続けており、
これらのModが本当に最新バージョンに対応できているのか個人的には疑問に思っています。

日本語Wikiについては基本的に自分は管理に関わっておらず、
またMod紹介ページについては利用者の総意として現在の形になっているであろうことから
あるべき論についてはここではこれ以上書くのは控えますが、
最新バージョンに対応できているかどうか怪しいものをそのまま導入してしまう人や
本体のバージョンアップが入った直後でも確認をしないでそのまま使い続ける人などが
後を絶たないので、本ガイドではその辺りの対処法について説明します。


このガイドを読む前にすること
前提としてModの最低限の仕組みの理解のため
「初心者のためのMod導入ガイド」の一読をお願いします。
https://steamproxy.net/sharedfiles/filedetails/?id=2900946277
Mod導入時の確認フロー
Mod導入時の確認フローについて、画像で掲載しておきます。


画像内ではかなり端折って記載していると思いますので、
詳細についてはこの後に記載します。
1.Stellaris本体とModの対応バージョンは異なるか
まずは、Stellaris本体とModのバージョンの差異を確認しましょう。
これはランチャーのプレイリストの画面で確認が可能です。
バージョンに差異がある場合は、下記の画像のように「!」が表示されます。
「!」にカーソルを合わせるとバージョンが異なっていることを示す
ツールチップが出てくることがわかります。


特に「!」が出てこない場合は本体バージョンとModの対応バージョンが一致しています。
つまりMod制作者が現行のバージョンで動作することを保証しているということを意味します。

制作者が気がついていない不具合などが存在する可能性はありますが、
そういうケースは今回は割愛します。
必要に応じて制作者に不具合報告など出せば良いと思います。
2. Stellaris本体と対応バージョンの一致する代替Modが存在するか
長いこと更新の止まっているModの中でも人気のあるModは、
最新版への対応を実施したパッチ用のModや代替Modを作っている場合があります

私の自作Modをパッチ用のModの例を1つ出します。
[代理公開]F17 VOICEROID Portraits」に対する更新パッチとして
[Fix Patch]F17 VOICEROID Portraits」があります。
これは、元のModと更新パッチ用のModを両方入れることで
Stellarisの最新版に対応したModとして機能します。

代替Modの例で言うと「Merge Event Ships」に対する「イベント艦を合流したい
などでしょうか。どちらもやりたいことは同じですが、実現方法は異なります。
前者はもうメンテナンスされていないので、後者のModのみを入れましょう。

パッチ用のModや代替Modが作成されていない場合はそれこそ自己責任の上で
Modの中身を確認して判断する必要が出てきます。
3. Modの仕組みについて理解しているか
さて、これ以降はModの仕組みについてある程度理解している方向けの情報になります。

「とりあえずModを入れた状態でゲームを起動して、タイトル画面が出ればOKだろう」
「Modの対応バージョンの数字を書き換えれば大丈夫だろう」
「どのModに問題があるかを確認するためにプレイセットに入れているModを半分ずつ区切り、ゲームを起動して見た目上問題があるかどうかを見れば問題のあるModを見つけられるはずだ」

これらの人はいずれもModの仕組みについて明るくない方です。
諦めてModの更新を待ちましょう。
4.Stellaris本体のバージョンアップ内容に、Modで上書きしているファイルや定義が含まれているか
さて、いよいよ自身でのModの確認フェーズとなります。
まずは、Stellaris本体のバージョンと、Modの対応バージョンについて確認しましょう。

Modの対応バージョンについては1章でも記載したとおり、
ランチャーのプレイリストの画面の「!」のツールチップに記載があります。


Stellaris本体のバージョンはランチャーのホームの右側にあります。
4-1. バージョン毎の差分を見る1
それぞれのバージョンがわかったら現在のバージョンのStellarisと、
Modが保証しているバージョンのStellarisのファイル差分を確認しましょう。

古いバージョンのStellarisには以下の手順で戻すことができます。
1. Steamのローカルアプリを開く
2. [ライブラリ] -> [ホーム]に移動する
3. 左メニューのStellarisを右クリックし、[プロパティ]を選択する
4. [ベータ]の「ベータへの参加」の欄を選択し、変更したいバージョンを指定する

過去の全てのバージョンが残っているわけではないので
Modの対応バージョンと全く同じ物があるとは限りません。
ない場合は近い物を選びましょう。

古いバージョンに戻したら、一旦古いバージョンのファイルをコピーして
別の場所に移動します。この時全ファイルを移動するのは
ファイルサイズが巨大すぎるので、必要な物だけにしましょう。
C:\Program Files (x86)\Steam\steamapps\common\Stellaris
├common
├events
├gfx
├interface
├localisation
├map
├unchecked_defines
など

(任意のフォルダ)
├common
├events
├gfx ※画像ファイルは重いので、テキストファイルのみにすると良い
├interface
├localisation
├map
├unchecked_defines
など

コピーが終わったら、Stellaris本体のバージョンを元に戻した上で、
Diffツールでどのフォルダに更新が入っているか確認しましょう。
・C:\Program Files (x86)\Steam\steamapps\common\Stellaris ← 現在のStellarisのバージョン
・(任意のフォルダ) ← Modで保証しているStellarisのバージョン

画像は3.9.2と3.8.4の差分です。
4-2. バージョン毎の差分を見る2
大量にありますが、見るべきファイルを絞りましょう。
Modで修正しているファイルと同じフォルダ構成になっているファイルのみを対象にします。
仮に、今回確認しようとしているModを[JP_EN]SpeedDial 3.8としましょう。

このModのファイル構成は以下です。
C:\Program Files (x86)\Steam\steamapps\workshop\content\281990\2322850480\
├common
│├button_effects
│├on_actions
│└scripted_effects
├events
├gfx
│└interface
│ └buttons
├interface
└localisation

差分もこのModの構成以外のフォルダにあるものについては基本的に確認は不要です。
(Modから呼び出しているイベント等があれば本当はそちらも確認した方が良いですが、説明が長くなるので割愛します。)

つまり、3.9.2と3.8.4のStellaris本体の差分でチェックすべきものも以下と言うことです。
├common
│├button_effects
│├on_actions
│└scripted_effects
├events
├gfx
│└interface
│ └buttons
├interface
└localisation

この差分ファイルの内容を、更に以下の条件で絞ります。
・差分として抽出されたファイルの中にModと同名のファイルがあるかどうか
・差分として抽出されたファイルの中にMod側で上書きしている定義と重複する定義があるかどうか
存在する場合はMod側に、バージョンアップによるコード差分を反映して上げる必要が出てきます。

なお、SpeedDialのModについては、interface以外のコードはMod独自で定義されています。
そのため、実はinterfaceのフォルダ以外は差分チェックの対象にしなくても
良いということになります。
C:\Program Files (x86)\Steam\steamapps\workshop\content\281990\2322850480\interface\speeddial_main_bottom.gui
更にいうと、このModのファイルは、Stellaris本体の
C:\Program Files (x86)\Steam\steamapps\common\Stellaris\interface\main_bottom.gui
を丸々上書きする事で対応しています。
つまりmain_bottom.guiのみチェックすれば良いはずです。

では具体的に差分を見てみましょう。


差分ファイルの中にmain_bottom.guiはないですね。
ということは3.8.4と3.9.2のStellarisの更新では
SpeedDialのModに関連する影響は恐らくないだろうと予想ができると言うことになります。
4-3. バージョン毎の差分を見る3
別のModでも確認しましょう。
おめーの宿ねぇから!」というModを対象に考えて見ます。

このModのファイル構成は以下です。
└common
 ├game_rules
 └script_values

script_valuesはStellaris本体では定義されていないオリジナルの定義を書いているだけです。
common\game_rules\no_resettle_planet_rules.txtは
本体で定義されている、以下の記述を上書きしています。
・can_species_procreate
・can_species_be_assembled

上記を踏まえた上で、3.8.4と3.9.2の差分を見てみましょう。
C:\Program Files (x86)\Steam\steamapps\common\Stellaris\common\game_rules\
内のファイルにコード差分があるでしょうか。

ありますね。


具体的にファイルを開いて差分をチェックしてみます。
画像の黄色で表示されている部分がバージョンアップでの差分です。


幸いなことに、「can_species_procreate」も「can_species_be_assembled」も
黄色のエリアがなく、差分は見つかりませんでした。


ということは3.8.4と3.9.2のStellarisの更新では
おめーの宿ねぇから!のModに関連する影響についても恐らくないであろうという
予想がつけられるということになります。
4-4. バージョン毎の差分を見る4
差分がないケースが続いたので、最後に差分が出るケースについても見てみましょう。
Mod追加種族が放射線栄養生物なことだってあるさ」というModを対象に考えてみます。

このModのファイル構成は以下です。
└common
 └traits

また、このModで修正しているファイル名と
全く同じファイル名のファイルがStellaris本体にも存在します。
C:\Program Files (x86)\Steam\steamapps\common\Stellaris\common\traits\04_species_traits.txt
このファイルが3.8.4と3.9.2の差分として存在するかどうかを見てみましょう。

ありますね。


ファイルの中身を開いてもしっかり差分があるのがわかります。


つまり対応バージョンが3.8.4の頃のこのModは、
そのままでは3.9.2では利用できないということになります。
Modを3.9.2に向けに更新するためには、Stellaris本体の更新内容にあわせて
Modの記述も修正して上げる必要があるということです。

敢えて数学っぽく書くとこういうことです
・3.8.4のModの内容 = 3.8.4のStellaris本体のファイルの内容 + Modで修正したい内容 ・3.9.2のModの内容 = 3.9.2のStellaris本体のファイルの内容 + Modで修正したい内容 = 3.8.4のStellaris本体のファイルの内容 + 3.9.2とのStellaris本体の差分 + Modで修正したい内容

Mod側のcommon\traits\04_species_traits.txtを開き、
3.8.4と3.9.2の差分をMod側にも反映しましょう。
ただ、直接他人のModに手を入れるのはよろしくないので、
自分のModでない場合は修正用のローカルModを作成するようにしましょう。
以下のガイドの2-3を参考にしてください。
見てもやり方がわからない場合は、大人しく作者が最新版に対応するのを待ちましょう。
https://steamproxy.net/sharedfiles/filedetails/?id=3032151667
5. ゲーム起動時に意図しないエラーログが出力されていないか
さて、コード確認と修正が終わったらいよいよ動作確認です。
修正の終わったModを有効化した上で、タイトル画面まで表示してみます。


タイトル画面が表示された段階で、一旦Modの内容が読み込まれているはずなので、
Modの記述に論理的な問題があれば、エラーログが出力されているはずです。
ということでエラーログを確認しましょう。
C:\Users\(ユーザー名)\Documents\Paradox Interactive\Stellaris\logs\error.log

ちなみに3.9.2の環境で、Modや自作帝国、セーブデータ等なしで起動すると
恐らくエラーログは以下のようになります。
[20:51:08][situation_type.cpp:305]: Missing situation localization key: fallen_empires_situation [20:51:08][situation_type.cpp:305]: Missing situation localization key: fallen_empires_situation_type [20:51:08][situation_type.cpp:305]: Missing situation localization key: fallen_empires_situation_monthly_change_tooltip [20:51:08][situation_type.cpp:305]: Missing situation localization key: fallen_empires_situation_desc

日本語のローカライズ設定に一部漏れがあるらしく、
それがエラーログとして出力されるようです。

これを踏まえた上で、私の今有効化しているMod一式で出てくるエラーログを記載します。
[20:44:16][dlc.cpp:337]: Invalid supported_version in file: mod/ugc_2457972324.mod line: 7 [20:44:16][dlc.cpp:337]: Invalid supported_version in file: mod/ugc_2457973896.mod line: 7 [20:44:16][dlc.cpp:337]: Invalid supported_version in file: mod/ugc_2813338321.mod line: 9 [20:45:16][game_singleobjectdatabase.h:154]: Object with key: relay_bypass already exists, using the one at file: common/bypass/custom_bypasses.txt line: 1 [20:45:16][game_singleobjectdatabase.h:154]: Object with key: quantum_catapult already exists, using the one at file: common/bypass/custom_bypasses.txt line: 21 [20:45:16][game_singleobjectdatabase.h:154]: Object with key: shroud_tunnel already exists, using the one at file: common/bypass/custom_bypasses.txt line: 56 [20:45:17][game_singleobjectdatabase.h:154]: Object with key: action_offer_trade_deal already exists, using the one at file: common/diplomatic_actions/trade_deal_intel_actions.txt line: 2 [20:45:17][game_singleobjectdatabase.h:154]: Object with key: wears_clothes already exists, using the one at file: common/scripted_triggers/mode_species_job_trigger.txt line: 5 [20:45:17][game_singleobjectdatabase.h:154]: Object with key: create_built_robot_species already exists, using the one at file: common/scripted_effects/create_built_robot_species.txt line: 1 [20:45:18][game_singleobjectdatabase.h:154]: Object with key: create_mercenary_enclave_country already exists, using the one at file: common/scripted_effects/replace_enclave_effects.txt line: 2 [20:45:21][eventmanager.cpp:377]: an event with id [ancrel.12090] already exists! file: events/ancient_relics_arcsite_events_2.txt line: 8455 [20:45:21][eventmanager.cpp:377]: an event with id [central.1] already exists! file: events/central_crystal_events.txt line: 9 [20:45:22][eventmanager.cpp:377]: an event with id [game_start.9] already exists! file: events/game_start.txt line: 841 [20:45:22][eventmanager.cpp:377]: an event with id [marauder.50] already exists! file: events/marauder_events.txt line: 3044 [20:45:22][eventmanager.cpp:377]: an event with id [enclave.2015] already exists! file: events/mercenary_enclave_fleets_events.txt line: 86 [20:45:22][eventmanager.cpp:377]: an event with id [enclave.2020] already exists! file: events/mercenary_enclave_fleets_events.txt line: 470 [20:45:22][eventmanager.cpp:377]: an event with id [emperor.2] already exists! file: events/nemesis_emperor_events.txt line: 167 [20:45:22][eventmanager.cpp:377]: an event with id [action.56] already exists! file: events/on_action_events_1.txt line: 5788 [20:45:22][eventmanager.cpp:377]: an event with id [origin.100] already exists! file: events/origin_events_1.txt line: 2627 [20:45:22][eventmanager.cpp:377]: an event with id [enclave.23] already exists! file: events/overlord_enclaves_events.txt line: 347 [20:45:22][eventmanager.cpp:377]: an event with id [enclave.275] already exists! file: events/overlord_enclaves_events.txt line: 2106 [20:45:22][eventmanager.cpp:377]: an event with id [enclave.2015] already exists! file: events/overlord_enclaves_events.txt line: 2971 [20:45:22][eventmanager.cpp:377]: an event with id [enclave.2020] already exists! file: events/overlord_enclaves_events.txt line: 3285 [20:45:22][eventmanager.cpp:377]: an event with id [pirate.1] already exists! file: events/pirate_events.txt line: 9 [20:45:22][eventmanager.cpp:377]: an event with id [pirate.6] already exists! file: events/pirate_events.txt line: 384 [20:45:22][eventmanager.cpp:377]: an event with id [pirate.7] already exists! file: events/pirate_events.txt line: 432 [20:45:22][eventmanager.cpp:377]: an event with id [pirate.50] already exists! file: events/pirate_events.txt line: 1245 [20:45:22][eventmanager.cpp:377]: an event with id [pirate.53] already exists! file: events/pirate_events.txt line: 1300 [20:45:22][eventmanager.cpp:377]: an event with id [pirate.54] already exists! file: events/pirate_events.txt line: 1325 [20:45:22][eventmanager.cpp:377]: an event with id [pirate.56] already exists! file: events/pirate_events.txt line: 1385 [20:45:22][eventmanager.cpp:377]: an event with id [pirate.57] already exists! file: events/pirate_events.txt line: 1410 [20:45:22][eventmanager.cpp:377]: an event with id [utopia.2551] already exists! file: events/utopia_on_action_events.txt line: 738 [20:45:26][game_singleobjectdatabase.h:154]: Object with key: hyper_relay already exists, using the one at file: common/megastructures/zzz_mmghyper_hyper_relay_overwrite.txt line: 1 [20:45:26][game_singleobjectdatabase.h:154]: Object with key: civic_idyllic_bloom already exists, using the one at file: common/governments/civics/civic_idyllic_bloom.txt line: 1 [20:45:26][game_singleobjectdatabase.h:154]: Object with key: civic_hive_idyllic_bloom already exists, using the one at file: common/governments/civics/civic_idyllic_bloom.txt line: 51 [20:45:26][game_singleobjectdatabase.h:154]: Object with key: origin_fruitful already exists, using the one at file: common/governments/civics/origin_fruitful.txt line: 1 [20:45:28][situation_type.cpp:305]: Missing situation localization key: fallen_empires_situation [20:45:28][situation_type.cpp:305]: Missing situation localization key: fallen_empires_situation_type [20:45:28][situation_type.cpp:305]: Missing situation localization key: fallen_empires_situation_monthly_change_tooltip [20:45:28][situation_type.cpp:305]: Missing situation localization key: fallen_empires_situation_desc

なにやら色々出てきましたね。
このエラーログ全てが問題があるというわけではありません。
一つ一つ見てみましょう。
5-1. エラーログの内容について
以下は記載されているとおり、Modの対応バージョンの書き方がおかしいです。
現状は警告だけなので私は無視してしまってますが、Mod作者はちゃんと書くようにしましょう。
[20:54:58][dlc.cpp:337]: Invalid supported_version in file: mod/ugc_2457972324.mod line: 7 [20:54:58][dlc.cpp:337]: Invalid supported_version in file: mod/ugc_2457973896.mod line: 7 [20:54:58][dlc.cpp:337]: Invalid supported_version in file: mod/ugc_2813338321.mod line: 9

以下は定義に重複があるとの警告になります。
既存定義を上書きしているようなModであれば、出るのが当然かとは思います。
そのためこれも気にしなくて良いエラーログになります。
ただし当然ですがMod修正部分以外について、3.9.2の更新内容を適切に反映していることを
4章で論理的に確認しておく必要はあります。
[20:55:54][game_singleobjectdatabase.h:154]: Object with key: relay_bypass already exists, using the one at file: common/bypass/custom_bypasses.txt line: 1 [20:55:54][game_singleobjectdatabase.h:154]: Object with key: quantum_catapult already exists, using the one at file: common/bypass/custom_bypasses.txt line: 21 [20:55:54][game_singleobjectdatabase.h:154]: Object with key: shroud_tunnel already exists, using the one at file: common/bypass/custom_bypasses.txt line: 56 ~ 以下略 ~

以下も同じです。イベント定義に重複がある旨の警告になります。
[20:55:59][eventmanager.cpp:377]: an event with id [ancrel.12090] already exists! file: events/ancient_relics_arcsite_events_2.txt line: 8455 [20:55:59][eventmanager.cpp:377]: an event with id [central.1] already exists! file: events/central_crystal_events.txt line: 9 [20:56:00][eventmanager.cpp:377]: an event with id [game_start.9] already exists! file: events/game_start.txt line: 841 ~ 以下略 ~

ということで私の環境については問題なく対応することができたようです。
仮に漏れなどがあれば、意図しないエラーログが大量に表示されるはずです。
エラーログのコードを見てわかるとおり、具体的にどのファイルが問題なのかまで含めて
内容が出力されているので、きちんと内容を読めばエラーログに対する
対応の仕方も類推できることでしょう。

そもそもエラーログの内容を判断できない場合は、
大人しく作者が最新版に対応するのを待ちましょう。
6. ゲームプレイ中に意図しないエラーログが出力されていないか
タイトル画面までで表示されるエラーログは、
あくまでソースコードの文法チェックなどのレベルでしかチェックはしてくれません。
実際に呼び出したイベントに問題がないかなどをチェックするためには
そのModの機能を実際に動作させて確認する必要があります。

これも、目視での確認だけなくModに関連するイベント等を発生させた後に
エラーログが出力されていないかどうかを必ずチェックしましょう。

私の環境だと、この確認作業により、以下のようなエラーログが出力されました。
[21:03:31][containerwindow.h:128]: interface/widertooltip.gui: Could not find buttonType "tts_button" in window "ToolTipWindow".

widertooltip.guiというコードにtts_buttonという項目がないと警告が出ていますね。
このwidertooltip.guiというファイルを探すと出てくるModは「Wider Tooltip」でした。
これはMod作者が最新版への対応を謳っていましたが、
調べたところ3.9.1~3.9.2で\interface\core.guiというファイルに更新が入ったのに
その更新内容を反映していないのが原因のようでした。
念のため作者にはエラー報告をし、自分の環境ではローカル上で修正を加えた物を
使うことで解決しました。
終わりに
本来は1~6の手順だけでも上手くいかない事があります。
というのもStellarisはModで弄れない部分も多く、
その弄れない部分に変更が入っている事があるからです。

とはいえ、1~6の対応で95%は保証できるはずです。
なんとなくプレイして動くから大丈夫とか、
どのModに問題があるかを確認するためにプレイセットに入れているModを
半分ずつ無効にして確認すれば良いだとか、そういう手法よりは遥かに安全なはずです。

ちゃんとコードを読みましょう。そしてなによりもエラーログを確認しましょう。
問題のあるコードがあれば、ほぼ99%はエラーログに現れます。
そしてエラーログにはファイル名が記載されています。
ファイル名がわかればそのファイルの入っているModが特定できます。
2分探索などそもそもする必要はありません。

よくわからないなら、古いModを使うのはやめましょう。
Mod作者が最新版に対応するのを大人しく待ちましょう。

ということで以上です。