Stellaris

Stellaris

Not enough ratings
【Stellaris 3.4.3】(メモ)ボタンの増やし方
By fatal_errorjp
自作Mod( https://gtm.steamproxy.vip/sharedfiles/filedetails/?id=2816799181 )作成時に、
わからなくて大分調べて回ったので、後々アップデート対応する時に漏れなくするためのメモです。

なお、初めてModを作成するような方向けには記載していません。
多少なりともイベント関連のModを作るか、書き換えることができる知識がある前提で記載しています。
少なくともEffects、Conditionsなどについての大まかな仕組みを知らないと
ついて行けない可能性が高いのでその点ご了承ください。
特に最後の方はほぼその辺りの知識は知っている前提で内容を端折って書いています。
   
Award
Favorite
Favorited
Unfavorite
作成にあたって必要なもの
最終的には画像のような項目を揃えていく必要があります。
青で塗りつぶされているものは必須、赤射線のものは状況によっては必要です。

(前置き1).何に対してどんな操作をしたいのかを考える
まず、ボタンを増やして何をしたいのかを考えます。
これによって何処にボタンを付ける必要があるのかが変わってきます。

私の自作Mod「艦隊をグループ化したかった」を例としてあげます。
https://gtm.steamproxy.vip/workshop/filedetails/?id=2816799181

このModでやりたいことは主に3つありました。
  1. 特定の艦隊を任意のグループに所属させたい
  2. 特定の艦隊を任意のグループの旗艦として設定したい
  3. 艦隊グループに所属中の艦隊を、旗艦に追従させたい

この「特定の艦隊」の部分が、手順2のボタンを何処に追加するかの判断のポイントになります。
(前置き2).ボタンをどの画面に追加するかを決める
「特定の艦隊」になんらかのパラメータが付与されている場合は、
どこにボタンを追加しても、条件式で対象の艦隊を特定し、操作することが可能です。
ただ、このModでやりたいのは特になんのパラメータも付与されていない普通の艦隊です。
パラメータなどない、「マウス等でプレイヤーがその時思うままに選択した艦隊」に対してなんらかの処理をしたいわけです。

仮に「惑星管理画面」にボタンを追加したとして、「マウス等でプレイヤーがその時思うままに選択した艦隊」を判別できるでしょうか?
或いは「布告画面」にボタンを追加したとして、「マウス等でプレイヤーがその時思うままに選択した艦隊」を判別できるでしょうか?
自分の調べた限りでは、できそうにありませんでした。

「マウス等でプレイヤーがその時思うままに選択したオブジェクト」に対して操作をする場合は、「星系地図や銀河地図上にあるオブジェクトをクリックしたときに表示される画面」上にボタンを増やすと簡単に対応することができます。


私の自作Mod「艦隊をグループ化したかった」を例とすると
  1. 特定の艦隊を任意のグループに所属させたい
  2. 特定の艦隊を任意のグループの旗艦として設定したい

この2つは、「星系地図や銀河地図上にある艦隊をクリックしたときに表示される画面」 = 「個別の艦隊の選択画面」となります。
1.MOD作成用のフォルダを生成する
MOD作成用フォルダの準備については、ポートレート用のガイドとまったく同じため割愛します。
以下ガイドの「1. MOD作成用のフォルダを生成する」を参照してください。

https://gtm.steamproxy.vip/sharedfiles/filedetails/?id=2766755737
2.ボタンを追加したい画面のファイル名を調べる


まず、ボタンを追加したい画面のファイル名を調査しましょう。
Stellarisには、この調査を簡単にするためのデバッグ用コマンドが用意されています。

Stellarisを起動し、「半角/全角」キーを押してコンソールコマンドを表示したら、以下のコマンドを入力してください。
guibounds

その後、マウスカーソルを確認したい画面に移動してみましょう。


普段のツールチップに加え、ファイル名と行番号の表示されたツールチップが表示されているのがわかるかと思います。
Stellarisのインストールディレクトリから、このファイルをコピーしてください。
ファイル名は変更せずに、元のファイル名のままで配置をしてください。

私の自作Modの場合は「個別の艦隊の選択画面」なので、fleet_view.guiが対象のファイルとなります。

・コピー元
(Stellarisのインストールフォルダ)\interface\fleet_view.gui

・コピー先
C:\Users\(ユーザー名)\Documents\Paradox Interactive\Stellaris\mod\(MODのディレクトリ名)
└interface
 └fleet_view.gui ← ここにコピーする
3. 仮置きでボタンを追加してみる
先ほどコピーしたfleet_view.guiをテキストエディタで開き、ボタンの記述を追加していきましょう。

今回はボタンを、「先駆けにする」の左側に配置したいと思います。
ボタン追加の記述自体は別に離れたところに書いても良いのですが、なるべく実態と近い所に記述しておいた方が後々メンテしやすいので、先駆けのボタンの手前に記述するようにします。

guiboundsのコマンドでボタンの定義位置も確認できるようになっています。
マウスを先駆けのボタンに合わせてみましょう。


どうやら336行目に記述されているようですね。
# 先駆けボタンの記述 buttonType = { name = "take_point" quadTextureSprite = "GFX_fleet_order_button_follow_friendlies_off" position = { x= -175 y = 10 } Orientation = "UPPER_RIGHT" buttonFont = "cg_16b" } # 艦隊管理ボタンの記述 buttonType = { name = "open_fleet_manager" quadTextureSprite = "GFX_fleet_manager_button" position = { x= -141 y = 10 } Orientation = "UPPER_RIGHT" buttonFont = "cg_16b" pdx_tooltip = "FLEET_VIEW_OPEN_FLEET_MANAGER" } # 以下略

この先駆けボタンの上に記述を追加してみます。

##### # ここから艦隊グループ化Mod追加箇所 ##### effectButtonType = { name ="set_flagship_0" quadTextureSprite = "GFX_fleet_order_button_follow_friendlies_off" orientation = "UPPER_RIGHT" position = { x = -243 y = 10 } effect = "grouping_fleets_set_flagship_effect_0" } effectButtonType = { name ="add_fleet_groups_0" quadTextureSprite = "GFX_fleet_order_button_follow_friendlies_off" orientation = "UPPER_RIGHT" position = { x = -209 y = 10 } effect = "grouping_fleets_add_fleet_groups_effect_0" } ##### # ここまで艦隊グループ化Mod追加箇所 ##### # 先駆けボタンの記述 buttonType = { name = "take_point" quadTextureSprite = "GFX_fleet_order_button_follow_friendlies_off" position = { x= -175 y = 10 } Orientation = "UPPER_RIGHT" buttonFont = "cg_16b" } # 艦隊管理ボタンの記述 buttonType = { name = "open_fleet_manager" quadTextureSprite = "GFX_fleet_manager_button" position = { x= -141 y = 10 } Orientation = "UPPER_RIGHT" buttonFont = "cg_16b" pdx_tooltip = "FLEET_VIEW_OPEN_FLEET_MANAGER" } # 以下略

effectButtonTypeという記述を2つ追加しました。
これはボタンを押したときに自分の好きなように処理を記述できるようになるボタンです。

effectButtonType内の各パラメータの詳細については英語Wiki[stellaris.paradoxwikis.com]を見て貰うのが確実なのですが、それだとガイドの意味がないので簡単に以下に記載しておきます。

項目名
項目値
name
他の全てのインターフェースと被らない一意の名前にしてください。
quadTextureSprite
ボタン画像と紐付くSprite定義(後述)の名前。例では一旦先駆けボタンのSprite定義を使い回しています。
orientation
xとyがそれぞれ0,0となる起点の位置。例では親要素の一番右上の部分が起点となります。
position
orientationから見た時のボタンの表示位置の座標(x,y)を示しています。
effect
そのボタン固有のeffectの名前(好きに記述して大丈夫ですが、処理する内容をそのまま書いておくとわかりやすいと思います。)

記述ができたらファイルを保存し、以下のコンソールコマンドを入力してみましょう。
reload fleet_view.gui
リアルタイムに、先ほど追加したボタンが追加されたことが確認できると思います。


4.ボタンeffect定義を追加する1
続いてボタンを押したときの処理を追加しましょう


以下の構成で、新規のテキストファイルを作成してください
C:\Users\(ユーザー名)\Documents\Paradox Interactive\Stellaris\mod\(MODのディレクトリ名)
└common
 └button_effects
  └(mod名)_button_effects.txt ← これを作る

テキストエディタを開き、マップモードの定義を記述していきましょう。
保存する際の文字コードはUTF-8 BOMなしを指定してください。

#Scope type varies depending on what is selected # This = selected object (if planet, ship, fleet, system, ambient object, megastructure, federation, espionage operation, arc site or first contact) or player country # From = player country # Note: It's advised to check is_scope_type = planet/whatever in the allow trigger, since it's possible to confuse the scopes if multiple interfaces are open # Usage example in a .gui file: # effectbuttonType = { # name = button_effect_test # quadTextureSprite = GFX_fleetview_destroy_fleet # position = { x = 283 y = 0 } # scale = 1 # orientation = UPPER_LEFT # effect = example_button_effect # } ########################################################### # fleet_view関連のボタンイベント # Scope: # This = fleet # From = player country ########################################################### ##### # 艦隊グループの旗艦でない時の押下イベント # 艦隊グループの旗艦にする ##### grouping_fleets_set_flagship_effect_0 = { potential = { # このボタンを画面上に表示するための条件を記載する # 具体的な記述は省略 } allow = { # このボタンを押すことができるための条件と # ボタンを押せなかったときに出るツールチップの内容を記述する # 具体的な記述は省略 } effect = { # このボタンを押した時の処理内容と # ボタンを押せる時に出るツールチップの内容を記述する # 具体的な記述は省略 } } ### # 艦隊グループ追加ボタン ### grouping_fleets_add_fleet_groups_effect_0 = { potential = { # このボタンを画面上に表示するための条件を記載する # 具体的な記述は省略 } allow = { # このボタンを押すことができるための条件と # ボタンを押せなかったときに出るツールチップの内容を記述する # 具体的な記述は省略 } effect = { # このボタンを押した時の処理内容と # ボタンを押せる時に出るツールチップの内容を記述する # 具体的な記述は省略 } }

関数名の「grouping_fleets_set_flagship_effect_0」と「grouping_fleets_add_fleet_groups_effect_0」は、それぞれボタン追加時に記述した、effectButtonTypeのeffectの値と紐付いています。
この名前が一致しないと当然動作しないので注意です。

先頭の英語の説明は、Stellaris本体の「common/button_effects/example.txt」に記載されている説明文をそのまま引っ張ってきています。
この説明を見てもThisのScopeがよくわからないと思うのですが、これは「星系地図や銀河地図上にある、マウスでクリックした選択中のオブジェクト」のスコープになります。
今回の例では艦隊を選択して出てきた画面にボタンを追加しているので、スコープは艦隊(fleet)になります。

逆にマウスで選択してないときはplayer countryと記載があるのですが、なんか思った通りに取れなかったので、未選択の時は余り信用しない方がいいかもしれません
また、複数を選択している時も意図しない挙動になります(最初にマウスで選択した物がスコープになる?)
この辺り調査が甘いかもしれません。わかる人がいたら補足をお願いします。
5.ボタンeffect定義を追加する2
先ほどの記述例では、処理部分を全部コメントアウトしてしまったので、改めて処理の内容についても記述しておきます


### # 艦隊グループ追加ボタン ### grouping_fleets_add_fleet_groups_effect_0 = { potential = { # このボタンを画面上に表示するための条件を記載する is_scope_type = fleet exists = from from = { is_scope_type = country } owner = { is_same_value = from } # 自国の艦隊のみ is_ship_class = shipclass_military # 軍艦のみ check_variable = { which = grouping_fleets_fleet_group_num value = 0 } } allow = { # このボタンを押すことができるための条件と # ボタンを押せなかったときに出るツールチップの内容を記述する hidden_trigger = { is_ship_class = shipclass_military check_variable = { which = grouping_fleets_fleet_group_num value = 0 } } } effect = { # このボタンを押した時の処理内容と # ボタンを押せる時に出るツールチップの内容を記述する ### # ツールチップの表示設定 # 解説しづらいので解説に関係のあるところだけを抜粋 ### custom_tooltip = "TOOLTIP_ADD_FLEET_GROUPS_0" ### # ボタン押下時の処理内容 # 他にも色々処理をやっているけど、 # 解説しづらいので解説に関係のあるところだけを抜粋 ### hidden_effect = { # 艦隊グループを変更する set_variable = { which = grouping_fleets_fleet_group_num value = 1 } } } }

potential
「個別の艦隊の選択画面」は、コルベット等の戦闘用の艦隊の他、
調査船など他の船でも共通に扱われる画面です。
今回の例では、コルベットなどの戦闘用の艦隊のみを対象としたいので、
「is_ship_class = shipclass_military」と記述をし、表示される範囲を軍船のみに制限しています。
「is_scope_type = fleet」「exists = from」「from = { is_scope_type = country }」の3行は、
意図しない挙動を起こす事がある対策として記述しています。
※何故か絶対に取れる想定のfromの値が取れなかったりすることがあるので…。

grouping_fleets_fleet_group_numは、本Mod専用のパラメータです。
まだパラメータを仕込んでいない場合や、グループに未所属の艦隊の場合は
このパラメータが0の扱いとなるように作ってます。

つまり、このボタンはグループに未所属の軍船の場合のみ表示されるようになっています。

他に使える条件を調べたい場合は英語Wiki[stellaris.paradoxwikis.com]を参照してください。

allow
特にpotentialと条件に変わりがないのでそのまま同じ条件を記述しています。
条件が同じなら正直省略しても良いような気がします。

ボタンが見えるけど条件を満たさないと押せない
といった作りにしたい場合にはこの項目が活きてきます。
ボタンを押せない理由をツールチップとして表示したいときは、
ここにcustom_tooltip[stellaris.paradoxwikis.com]の記述を追加してください。
fail_textで指定した言葉をツールチップとして表示できるはずです。

他に使える条件を調べたい場合は英語Wiki[stellaris.paradoxwikis.com]を参照してください。

effect
今回の例では、グループに所属させたいので、set_variableでグループ1に所属してますよ
というパラメータを艦隊に仕込んでいます。

custom_tooltipはボタンを押せる条件を満たしているときに表示されるツールチップの内容を指定しています。

他に使える記述を調べたい場合は英語Wiki[stellaris.paradoxwikis.com]を参照してください。
6.ローカライズ設定を追加する
custom_tooltipの設定を入れ込んでいるので、ローカライズ設定を追加しましょう。


以下の構成で、新規のテキストファイルを作成してください
C:\Users\(ユーザー名)\Documents\Paradox Interactive\Stellaris\mod\(MODのディレクトリ名)
└localisation
 └(MOD名)_l_japanese.yml ← これを作る

保存する際の文字コードはUTF-8 BOMありを指定してください
このファイルはBOMが必要なので注意してください

l_japanese: TOOLTIP_ADD_FLEET_GROUPS_0:0 "§H[Root.GetFleetName]§!が所属中の艦隊グループ:§H未所属§!"

TOOLTIP_ADD_FLEET_GROUPS_0は先ほどcustom_tooltipで指定したキーですね。
ここまでできたら一回Stellarisを再起動して、ボタン上にマウスカーソルを合わせてみましょう。

上手くコードが描けていたらツールチップの表示は画像のようになるはずです。
ちなみに、インターフェース周りは記述を間違えるとゲームが即落ちる結構融通の効かない作りになっています。
ゲームが落ちる場合はなにかしらの記述ミスがある可能性が高いです。
7.Sprite定義とボタン画像を追加する
アイコン画像素材
サイズ自体は自由で良さそうですが、他のボタンアイコンに合わせて以下のように作りました。

横x縦 = 114x38のddsファイルが必要です。
左側の38x38の領域が未選択時のボタン画像
中央の38x38の領域はマウスでクリックした瞬間(?)のボタン画像
右側の38x38の領域がマウスで選択中のボタン画像
となります。


作成したddsファイルは、以下の場所に配置してください
C:\Users\(ユーザー名)\Documents\Paradox Interactive\Stellaris\mod\(MODのディレクトリ名)
└gfx
 └interface
  └種類によるが今回は fleet_view
   └(mod名)_(アイコン固有の名称).dds ← ここに配置する

Sprite定義
画像素材の配置が終わったら、Sprite定義を作成します。

以下の構成で、新規のテキストファイルを作成してください
C:\Users\(ユーザー名)\Documents\Paradox Interactive\Stellaris\mod\(MODのディレクトリ名)
└interface
 └(mod名)_btn.gfx ← これを作る

テキストエディタを開き、アイコン定義を記述していきましょう。
以下はサンプルです。
保存する際の文字コードはUTF-8 BOMなしを指定してください。

spriteTypes = { spriteType = { name = "GFX_set_flagship_button_0" texturefile = "gfx/interface/fleet_view/fleet_set_flagship_btn0.dds" noOfFrames = 3 } spriteType = { name = "GFX_add_fleet_groups_button_0" texturefile = "gfx/interface/fleet_view/fleet_groups_btn0.dds" noOfFrames = 3 }


nameは、ボタンを追加するときに記述したeffectButtonTypeのquadTextureSpriteの値と一致させる必要があります。
quadTextureSprite側も忘れずに書き換えておきましょう。
texturefileは先ほど配置した画像ファイルのパスを書いておきましょう。
noOfFramesの部分は3固定で大丈夫です。

全て修正が終わったら、もう一度Stellarisを再起動して、内容を表示させてみましょう。
無事追加した画像がボタンとして表示されていればOKです。
8.処理を共通化する
後は必要に応じてボタンをどんどん増やすだけになります。
ただ、自作Modの場合は艦隊グループ1~8を用意するために、その数だけボタンを配置しています。

# fleet_view.guiの艦隊グループ追加ボタンは0~8までの9種類用意している effectButtonType = { name ="add_fleet_groups_0" quadTextureSprite = "GFX_add_fleet_groups_button_0" orientation = "UPPER_RIGHT" position = { x = -209 y = 10 } effect = "grouping_fleets_add_fleet_groups_effect_0" } effectButtonType = { name ="add_fleet_groups_1" quadTextureSprite = "GFX_add_fleet_groups_button_1" orientation = "UPPER_RIGHT" position = { x = -209 y = 10 } effect = "grouping_fleets_add_fleet_groups_effect_1" } effectButtonType = { name ="add_fleet_groups_2" quadTextureSprite = "GFX_add_fleet_groups_button_2" orientation = "UPPER_RIGHT" position = { x = -209 y = 10 } effect = "grouping_fleets_add_fleet_groups_effect_2" } effectButtonType = { name ="add_fleet_groups_3" quadTextureSprite = "GFX_add_fleet_groups_button_3" orientation = "UPPER_RIGHT" position = { x = -209 y = 10 } effect = "grouping_fleets_add_fleet_groups_effect_3" } effectButtonType = { name ="add_fleet_groups_4" quadTextureSprite = "GFX_add_fleet_groups_button_4" orientation = "UPPER_RIGHT" position = { x = -209 y = 10 } effect = "grouping_fleets_add_fleet_groups_effect_4" } effectButtonType = { name ="add_fleet_groups_5" quadTextureSprite = "GFX_add_fleet_groups_button_5" orientation = "UPPER_RIGHT" position = { x = -209 y = 10 } effect = "grouping_fleets_add_fleet_groups_effect_5" } effectButtonType = { name ="add_fleet_groups_6" quadTextureSprite = "GFX_add_fleet_groups_button_6" orientation = "UPPER_RIGHT" position = { x = -209 y = 10 } effect = "grouping_fleets_add_fleet_groups_effect_6" } effectButtonType = { name ="add_fleet_groups_7" quadTextureSprite = "GFX_add_fleet_groups_button_7" orientation = "UPPER_RIGHT" position = { x = -209 y = 10 } effect = "grouping_fleets_add_fleet_groups_effect_7" } effectButtonType = { name ="add_fleet_groups_8" quadTextureSprite = "GFX_add_fleet_groups_button_8" orientation = "UPPER_RIGHT" position = { x = -209 y = 10 } effect = "grouping_fleets_add_fleet_groups_effect_8" }


同じような処理を何度も書くのは辛いので、共通関数的な物を用意して、それを呼び出すように作っています。
### # 艦隊グループ追加ボタンのボタンeffect定義の記述 # 9個のボタンに対応した処理をそれぞれ書いている ### grouping_fleets_add_fleet_groups_effect_0 = { potential = { grouping_fleets_add_fleet_groups_potential = { NUMBER = 0 } } allow = { grouping_fleets_add_fleet_groups_allow = { NUMBER = 0 } } effect = { grouping_fleets_add_fleet_groups_effect = yes } } grouping_fleets_add_fleet_groups_effect_1 = { potential = { grouping_fleets_add_fleet_groups_potential = { NUMBER = 1 } } allow = { grouping_fleets_add_fleet_groups_allow = { NUMBER = 1 } } effect = { grouping_fleets_add_fleet_groups_effect = yes } } grouping_fleets_add_fleet_groups_effect_2 = { potential = { grouping_fleets_add_fleet_groups_potential = { NUMBER = 2 } } allow = { grouping_fleets_add_fleet_groups_allow = { NUMBER = 2 } } effect = { grouping_fleets_add_fleet_groups_effect = yes } } grouping_fleets_add_fleet_groups_effect_3 = { potential = { grouping_fleets_add_fleet_groups_potential = { NUMBER = 3 } } allow = { grouping_fleets_add_fleet_groups_allow = { NUMBER = 3 } } effect = { grouping_fleets_add_fleet_groups_effect = yes } } grouping_fleets_add_fleet_groups_effect_4 = { potential = { grouping_fleets_add_fleet_groups_potential = { NUMBER = 4 } } allow = { grouping_fleets_add_fleet_groups_allow = { NUMBER = 4 } } effect = { grouping_fleets_add_fleet_groups_effect = yes } } grouping_fleets_add_fleet_groups_effect_5 = { potential = { grouping_fleets_add_fleet_groups_potential = { NUMBER = 5 } } allow = { grouping_fleets_add_fleet_groups_allow = { NUMBER = 5 } } effect = { grouping_fleets_add_fleet_groups_effect = yes } } grouping_fleets_add_fleet_groups_effect_6 = { potential = { grouping_fleets_add_fleet_groups_potential = { NUMBER = 6 } } allow = { grouping_fleets_add_fleet_groups_allow = { NUMBER = 6 } } effect = { grouping_fleets_add_fleet_groups_effect = yes } } grouping_fleets_add_fleet_groups_effect_7 = { potential = { grouping_fleets_add_fleet_groups_potential = { NUMBER = 7 } } allow = { grouping_fleets_add_fleet_groups_allow = { NUMBER = 7 } } effect = { grouping_fleets_add_fleet_groups_effect = yes } } grouping_fleets_add_fleet_groups_effect_8 = { potential = { grouping_fleets_add_fleet_groups_potential = { NUMBER = 8 } } allow = { grouping_fleets_add_fleet_groups_allow = { NUMBER = 8 } } effect = { grouping_fleets_add_fleet_groups_effect = yes } }

grouping_fleets_add_fleet_groups_potential
grouping_fleets_add_fleet_groups_allow
grouping_fleets_add_fleet_groups_effect
とそれぞれ共通関数が記述されているのがわかるでしょうか。

potentialとallowはScripted triggers、effectはScripted effectsに記述することで共通化できます。
この辺りの詳細については割愛します。
気になる方は英語Wiki[stellaris.paradoxwikis.com]を参照してください。



以上です。
1 Comments
fatal_errorjp  [author] 29 Jun, 2022 @ 8:31am 
potential周りのサンプルコードを少し修正しました。
意図しない挙動を少しでも防ぐための条件を追加しています。