Stellaris

Stellaris

Not enough ratings
【Stellaris3.8.2】ポートレート&種族の作り方メモ
By fatal_errorjp
このガイドは静的画像を利用したポートレート&種族の作り方のメモになります。
以前も3.3.23.4.2で作っていますが、3.8で種族周りの記述方法に変更があったのと、
これまでの積み重ねで理解が増えた部分もあるので改めてのまとめとなります。

アニメーションをするような種族追加の方法はこのガイドの対象外となりますので、
こちらの方法を知りたい場合は英語Wiki[stellaris.paradoxwikis.com]
6thStrikeUnitさんのガイド、「【Stellaris 3.9.x】アニメーションポートレート作成備忘録」を確認してください。

本ガイド内のソースコードについてですが、基本的には「D-man Portraits」をベースに記載しています。
ただし、「D-man Portraits」に存在していない部分については
[Compatibility Patch]F17 VP/VP」から引っ張ってきています。
そのため全てのサンプルコードを1つにまとめても、そのままでは動作しません。その旨ご了承ください。
   
Award
Favorite
Favorited
Unfavorite
本ガイドの情報は古いです。最新のガイドがあるのでそちらをご確認ください。
Stellaris Ver3.12.1以降で種族追加系Modの仕組みが変更になったので最新のガイドを書きました。
Steamガイドの方だとガイド内の画像が謎に消失するので自分のサイトにて公開しています。
誤字脱字が色々あると思いますが、そのうち直します。

【Stellaris 3.12.2】ポートレート&種族の作り方
https://fatalerrorjp.github.io/stellaris_infomations/guides/create-species.html

























このガイドを読む前にすること
前提としてModの最低限の仕組みの理解のため
「初心者のためのMod導入ガイド」の一読をお願いします。
https://gtm.you1.cn/sharedfiles/filedetails/?id=2900946277
作成にあたって必要なもの
最終的には画像のような項目を揃えていく必要があります。
青で塗りつぶされているものは必須、赤射線のものは任意です。


素材としては以下が必要になります

ポートレートとして追加したい静止画像(*.dds)
横 x 縦 = 472 x 324の大きさで用意してください。
明確なサイズは決まっていないので、必ずしもこのサイズである必要はありませんが、
あまり大きすぎるとゲーム画面上で画像が見切れて表示される可能性があります。
ddsというファイル形式には、フリーソフトであればpaint.netというソフトが対応しています。
保存時のddsの設定は「B8G8R8A8(線形, A8R8G8B8)」にすると比較的劣化が少ないかも。

音声ファイル(*.wav)
任意です。AI帝国を表示した時に音声も欲しい場合には必須となります。
真空波動研Liteというフリーソフトの表記で言う、以下の内容であれば問題ないようです。
PCM 44.10kHz 16Bit 2ch 1411.20kb/s

A.I.VOICEで作成した音源を使いたい場合は、以下のようにすると良いでしょう
1. A.I.VOICEの設定を以下に設定し、必要な内容を喋らせて保存する
・WAVE 44100Hz 16bit PCM

2. ffmpegにて、Stellarisに準拠した音声データに変換する。以下はコマンドの例
・ffmpeg -i (A.I.VOICEで出力したwavファイル) -acodec pcm_s16le -ac 2 -ar 44100 (変換後のファイル名)
1. MOD作成用のフォルダを生成する
Stellarisのランチャーから自動生成できるので、その機能を活用しましょう。

1. Stellarisのランチャーを起動する


2. ランチャーの左メニューの、「インストール済みのすべてのMOD」をクリックする


3. 画面右上の「MODをアップロードする」を押す

4. 「MODを作成する」ボタンを押す


5. 以下の内容を入力して、「OK」ボタンを押す

  • 名称: MODの名前を入力する。日本語も可
  • バージョン: このMODのバージョン。半角英数のみ
  • ディレクトリ: MOD作成用のディレクトリ名。半角英数記号のみ
  • タグ: WorkshopでMOD検索する時に使うタグにチェック

入力例)
  • 名称: d-man portraits
  • バージョン: 1.0.0
  • ディレクトリ: mod/d-man_portraits
  • タグ: Graphics, Leaders, Speciesにチェック

ここまでの操作をすることで、以下のディレクトリが作成されます。
C:\Users\(ユーザー名)\Documents\Paradox Interactive\Stellaris\mod\(5.のディレクトリ名)
これ以降の作業は、原則このディレクトリ以下を基準として記載していきます。

「MODを作成する」領域を作るために、「MODをアップロードする」ボタンを
押さないといけないのは正直意味不明なので
この辺の導線については今後なんとかして欲しいですね…。
2. 素材を所定のパスに配置する
MOD作成用のフォルダに、素材を配置しましょう。


ファイル名については、既存のゲームのファイル名と被らなければ
基本的にはなんでも構いません。
ただし、公式のファイルの配置ルールに合わせてお作法を考えると
以下のような構成にするのが無難かと思います

C:\Users\(ユーザー名)\Documents\Paradox Interactive\Stellaris\mod\(MODのディレクトリ名)
├gfx
│└ models
│ └portraits
│  └(種族名)
│   ├(種族名)_(ポトレ)-(通し番号).dds
│   ├...省略
│   └(種族名)_(ポトレ)-(通し番号).dds
└sound
 └portrait
  └(種族名)
   ├(種族名)_(ポトレ)-(通し番号).wav
   ├...省略
   └(種族名)_(ポトレ)-(通し番号).wav

(種族名)や(ポトレ)と書いている部分は
作りたい種族やポトレに合わせて半角英数で自由に決めてください
例えば「琴葉姉妹」種族の「葵ちゃん」のポトレの場合は
・kotonoha_aoi-01.dds
・kotonoha_aoi-02.dds
のようにファイル名を決めていくと良いのではないかと思います。
一意であれば、01や02の代わりにそのポトレ固有のわかりやすい名前でも良いと思います。
3. 音声定義を作成する(※任意)
音声素材を入れている場合は、音声定義を作成しましょう。


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

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

########################################################### # ポートレート毎の挨拶時の音声設定を定義する ########################################################### # D言語くん種族用挨拶音声定義 category = { name = "Effects" soundeffects = { d-man_portrait_sound_red d-man_portrait_sound_green d-man_portrait_sound_blue d-man_portrait_sound_cyan d-man_portrait_sound_magenta d-man_portrait_sound_yellow } } ## D言語君(赤色) soundeffect = { name = d-man_portrait_sound_red sounds = { sound = d-man_portrait_sound_01 sound = d-man_portrait_sound_02 sound = d-man_portrait_sound_03 } volume = 0.30 } ## D言語君(緑色) soundeffect = { name = d-man_portrait_sound_green sounds = { sound = d-man_portrait_sound_01 sound = d-man_portrait_sound_02 sound = d-man_portrait_sound_03 } volume = 0.30 } ## D言語君(青色) soundeffect = { name = d-man_portrait_sound_blue sounds = { sound = d-man_portrait_sound_01 sound = d-man_portrait_sound_02 sound = d-man_portrait_sound_03 } volume = 0.30 } ## D言語君(シアン) soundeffect = { name = d-man_portrait_sound_cyan sounds = { sound = d-man_portrait_sound_01 sound = d-man_portrait_sound_02 sound = d-man_portrait_sound_03 } volume = 0.30 } ## D言語君(マゼンタ) soundeffect = { name = d-man_portrait_sound_magenta sounds = { sound = d-man_portrait_sound_01 sound = d-man_portrait_sound_02 sound = d-man_portrait_sound_03 } volume = 0.30 } ## D言語君(黄色) soundeffect = { name = d-man_portrait_sound_yellow sounds = { sound = d-man_portrait_sound_01 sound = d-man_portrait_sound_02 sound = d-man_portrait_sound_03 } volume = 0.30 } ## 音声ファイル定義 ## 色毎の種族で変更も可能だが、今回は使い回す sound = { name = "d-man_portrait_sound_01" file = "d-man-01.wav" } sound = { name = "d-man_portrait_sound_02" file = "d-man-02.wav" } sound = { name = "d-man_portrait_sound_03" file = "d-man-03.wav" }

「soundeffect - sound - 音声素材」と言った流れで
紐付けされていることがわかるかと思います。

nameは任意で基本的にOKですが、ポートレートの定義と紐付ける際に
soundeffectのnameを書くようになるので、忘れないようにしましょう。

D言語くんの場合は、色単位でポートレートをわけているので、
nameに色をつけるようにしておきました。
4. ポートレート定義を作成する
続いてポートレート定義を作成します。


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

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

############################################################## # D言語くん種族用のポートレート定義 # 本ポートレートを参照する種族の定義は以下に記載しています # common\species_classes\d-man.txt ############################################################## # 画像、音声ファイルとのリンク設定 portraits = { d-man_red = { texturefile = "gfx/models/portraits/d-man/d-man-red.dds" greeting_sound = "d-man_portrait_sound_red" } d-man_green = { texturefile = "gfx/models/portraits/d-man/d-man-green.dds" greeting_sound = "d-man_portrait_sound_green" } d-man_blue = { texturefile = "gfx/models/portraits/d-man/d-man-blue.dds" greeting_sound = "d-man_portrait_sound_blue" } d-man_cyan = { texturefile = "gfx/models/portraits/d-man/d-man-cyan.dds" greeting_sound = "d-man_portrait_sound_cyan" } d-man_magenta = { texturefile = "gfx/models/portraits/d-man/d-man-magenta.dds" greeting_sound = "d-man_portrait_sound_magenta" } d-man_yellow = { texturefile = "gfx/models/portraits/d-man/d-man-yellow.dds" greeting_sound = "d-man_portrait_sound_yellow" } } # 各場面別のポートレート portrait_groups = { # D言語君(有機生命) 単色のみ d-man-biological-01 = { # デフォルト default = d-man_red # 帝国作成時 game_setup = { add = { trigger = { ruler = { OR = { gender = male gender = indeterminable } } } portraits = { d-man_red } } add = { trigger = { ruler = { OR = { gender = female gender = indeterminable } } } portraits = { d-man_red } } } # 汎用 species = { add = { trigger = { exists = species NOT = { species = { species_gender = female } } } portraits = { d-man_red } } add = { trigger = { exists = species NOT = { species = { species_gender = male } } } portraits = { d-man_red } } } # 惑星上のPOP pop = { add = { trigger = { NOT = { species = { species_gender = female } } } portraits = { d-man_red } } add = { trigger = { NOT = { species = { species_gender = male } } } portraits = { d-man_red } } } #リーダー leader = { add = { trigger = { OR = { gender = male gender = indeterminable } } portraits = { d-man_red } } add = { trigger = { OR = { gender = female gender = indeterminable } } portraits = { d-man_red } } } # 国家元首 ruler = { add = { trigger = { OR = { gender = male gender = indeterminable } } portraits = { d-man_red } } add = { trigger = { OR = { gender = female gender = indeterminable } } portraits = { d-man_red } } } } # D言語君(有機生命) 6色カラー d-man-biological-02 = { # デフォルト default = d-man_red # 帝国作成時 game_setup = { add = { trigger = { ruler = { OR = { gender = male gender = indeterminable } } } portraits = { d-man_red d-man_green d-man_blue } } add = { trigger = { ruler = { OR = { gender = female gender = indeterminable } } } portraits = { d-man_cyan d-man_magenta d-man_yellow } } } # 汎用 species = { add = { trigger = { exists = species NOT = { species = { species_gender = female } } } portraits = { d-man_red d-man_green d-man_blue } } add = { trigger = { exists = species NOT = { species = { species_gender = male } } } portraits = { d-man_cyan d-man_magenta d-man_yellow } } } # 惑星上のPOP pop = { add = { trigger = { NOT = { species = { species_gender = female } } } portraits = { d-man_red d-man_green d-man_blue } } add = { trigger = { NOT = { species = { species_gender = male } } } portraits = { d-man_cyan d-man_magenta d-man_yellow } } } #リーダー leader = { add = { trigger = { OR = { gender = male gender = indeterminable } } portraits = { d-man_red d-man_green d-man_blue } } add = { trigger = { OR = { gender = female gender = indeterminable } } portraits = { d-man_cyan d-man_magenta d-man_yellow } } } # 国家元首 ruler = { add = { trigger = { OR = { gender = male gender = indeterminable } } portraits = { d-man_red d-man_green d-man_blue } } add = { trigger = { OR = { gender = female gender = indeterminable } } portraits = { d-man_cyan d-man_magenta d-man_yellow } } } } # D言語君(機械知性) 単色のみ d-man-machine-01 = { # d-man-biological-01と中身は同じなので省略 } # D言語君(機械知性) 6色カラー d-man-machine-02 = { # d-man-biological-02と中身は同じなので省略 } # D言語君(岩石生命) 単色のみ d-man-lithoid-01 = { # d-man-biological-01と中身は同じなので省略 } # D言語君(岩石生命) 6色カラー d-man-lithoid-02 = { # d-man-biological-02と中身は同じなので省略 } }

portraitsにて、画像素材及び音声素材との紐付けをしています。
性別やスキルに応じてどのポートレートを使えるかの条件を
portrait_groupsの中に記述していきます。

赤色単色だけの定義についてはここまで条件を細かく設定しなくてもよさそうですが、
一応下手に弄りたくなかったので、3.3.2の公式の定義を参考にそのままにしています。
triggerの条件を変えれば性別以外に種族やリーダーの特性や幸福度に応じたポートレート画像を指定するなんてことも可能です。

また、同じ画像素材で有機生命、機械知性、岩石生命と種族を分ける場合は
条件が同じでも必ずこのポートレート定義は分けて作るようにしてください。
この定義を使い回すと、以下の動画のように意図しない挙動を起こします。
5. 種族定義を作成する
続いて種族定義を作成します。


バニラに元からあるタイプに対して種族を追加したい場合と、
タイプも含めて新規に種族を追加したい場合で記述方法が違うため、分けて説明します。

ちなみにここでいう「タイプ」は、以下画像でいう爬虫類人とか鳥人とか記載のある赤枠の部分、
種族は青枠の1つ1つのことを指しています。
5-1. 新規のタイプとして種族を作成する場合
以下の構成で、新規のテキストファイルを作成してください。
C:\Users\(ユーザー名)\Documents\Paradox Interactive\Stellaris\mod\(MODのディレクトリ名)
└common
 └species_classes
  └(種族名)_classes.txt ← これを作る

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

############################################################## # D言語くん種族用の定義 ############################################################## # D言語くん種族(有機種族) d-man-biologicals = { # 種別 # BIOLOGICAL:有機種族 # MACHINE:機械知性 # ROBOT:ロボティクス # LITHOID:岩石種族 # PRESAPIENT:準知性 # OTHER:その他 archetype = BIOLOGICAL # この種族の選択条件 # 機械知性は選択不可 possible = { authority = { NOT = { value = auth_machine_intelligence text = SPECIES_CLASS_MUST_NOT_USE_MACHINE_INTELLIGENCE } } } # ポートレート portraits = { "d-man-biological-01" "d-man-biological-02" } # グラフィックカルチャー graphical_culture = no_culture } # D言語くん種族(機械知性) d-man-machines = { # 種別 # BIOLOGICAL:有機種族 # MACHINE:機械知性 # ROBOT:ロボティクス # LITHOID:岩石種族 # PRESAPIENT:準知性 # OTHER:その他 archetype = MACHINE # この種族のプレイヤーとAI帝国の選択条件 # 機械知性はDLC(シンセティック・ドーン)が必須 playable = { host_has_dlc = "Synthetic Dawn Story Pack" } randomized = { host_has_dlc = "Synthetic Dawn Story Pack" NOT = { has_global_flag = game_started } } # この種族の選択条件 # 機械知性のみ設定可 possible = { authority = { OR = { value = auth_machine_intelligence text = SPECIES_CLASS_MUST_USE_MACHINE_INTELLIGENCE } } } possible_secondary = { always = no text = SECONDARY_SPECIES_CLASS_INVALID } # 性別:オリジナルの機械知性だとなしだが、自由度を増やしたいので敢えて外しておく # gender = no # 居住特性の選択:なし use_climate_preference = no # 種族の改造時のポートレートの変更:あり portrait_modding = yes # 雇用時のリーダーの年齢 leader_age_min = 2 leader_age_max = 10 # ポートレート portraits = { "d-man-machine-01" "d-man-machine-02" } # グラフィックカルチャー graphical_culture = no_culture } # D言語くん種族(岩石種族) d-man-lithoids = { # 種別 # BIOLOGICAL:有機種族 # MACHINE:機械知性 # ROBOT:ロボティクス # LITHOID:岩石種族 # PRESAPIENT:準知性 # OTHER:その他 archetype = LITHOID # この種族のプレイヤーとAI帝国の選択条件 # 岩石種族であること playable = { has_lithoids = yes } randomized = { has_lithoids = yes } # この種族の選択条件 # 機械知性は選択不可 possible = { authority = { NOT = { value = auth_machine_intelligence text = SPECIES_CLASS_MUST_NOT_USE_MACHINE_INTELLIGENCE } } } # デフォルト種族特性「岩石」 trait = "trait_lithoid" # ポートレート portraits = { "d-man-lithoid-01" "d-man-lithoid-02" } # グラフィックカルチャー graphical_culture = no_culture }

各内容の意味はコメント行を参考にしてください。
「portraits =」の記述で、ポートレート定義との紐付けを行っています。
基本的には記述をそのまま使い回してもらうだけで大丈夫なはずです。

ちなみにrandomized = noにすると、ランダム生成帝国が出なくなるほか、
自作の帝国にこのポトレを指定してもAI帝国としては出現しなくなるようです。
ランダム生成帝国としては出したくないが自作の帝国をAI帝国として出現させたい場合は、non_randomized_portraits = {}の部分にポートレートを指定するようにしてください。

また、ランダム生成帝国が出現する場合は、ランダム帝国定義の作成が必須となります。
5-2. 既存のタイプ内に新規種族を追加する場合
以下の構成で、新規のテキストファイルを作成してください。
C:\Users\(ユーザー名)\Documents\Paradox Interactive\Stellaris\mod\(MODのディレクトリ名)
└common
 └species_classes
  └(種族名)_classes.txt ← これを作る

テキストエディタを開き、種族の定義を記述していきましょう。
以下はロボットのタイプに対して新規種族の定義を追加した時のサンプルです。
保存する際の文字コードはUTF-8 BOMなしを指定してください。

# ROBOTはバニラに元々存在するタイプ ROBOT = { custom_portraits = { # プレイヤーとAI帝国がこの種族を選択するための条件 # DLC(シンセティック・ドーン)が必須 playable = { host_has_dlc = "Synthetic Dawn Story Pack" } randomized = { host_has_dlc = "Synthetic Dawn Story Pack" } # ポートレート(新規追加したい分だけを書く。バニラの既存のポートレートの指定は不要) portraits = { "yukari" "maki" "zunko" "akane" "aoi" "seika" "kiritan" "akari" "ia" "one" "allvr" } } }

これだけだとわかりづらいので、バニラの元々のソースコードも掲載しておきます。
common\species_classes\00_species_classes.txt
ROBOT = { archetype = ROBOT playable = { has_global_flag = game_started } randomized = no gender = no use_climate_preference = no portrait_modding = yes leader_age_min = 2 leader_age_max = 10 custom_portraits = { randomized = { host_has_dlc = "Synthetic Dawn Story Pack" } playable = { host_has_dlc = "Synthetic Dawn Story Pack" } portraits = { "sd_hum_robot" "sd_mam_robot" "sd_rep_robot" "sd_avi_robot" "sd_art_robot" "sd_mol_robot" "sd_fun_robot" "sd_pla_robot" } } custom_portraits = { randomized = { has_lithoids = yes } playable = { has_lithoids = yes } portraits = { "lith_machine" } } custom_portraits = { randomized = { has_necroids = yes } playable = { has_necroids = yes } portraits = { "nec_machine" } } custom_portraits = { randomized = { has_aquatics = yes } playable = { has_aquatics = yes } portraits = { "aqu_machine" } } custom_portraits = { randomized = { has_toxoids = yes } playable = { has_toxoids = yes } portraits = { "tox_machine" } } custom_portraits = { # use custom_portraits instead of portraits so we can put them after the custom_portraits above randomized = { always = yes } playable = { always = yes } portraits = { "default_robot" } } graphical_culture = ai_01 move_pop_sound_effect = "robot_pops_move" resources = {} }

leader_age_minやgenderなどバニラにある記述は、
Mod側に記載がなくてもバニラ側の設定値がそのまま採用されます。
そのためcustom_portraits以外の記述は省略できます。
省略せずにMod側に記載をした場合、ファイル名順で読み込まれたときに
後に読み込まれた方の設定が優先されるため注意が必要です。
6. ランダム帝国定義を作成する(※任意)
種族定義にて、randomized = noにしていない場合は、ランダム帝国定義を作成します。
※ゲーム開始時にランダム生成される帝国の名前や星系名を定義するためのファイルです。


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

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

############################################################## # ランダム生成される帝国名用の定義 # name : 種族名 # plural : 種族名(複数形) # home_planet : 惑星名 # home_system : 恒星名 # name_list : ネームリスト…思いつかないので公式のHUM1を使い回し ############################################################## #最大全角6文字 ### D言語くん種族(有機種族) d-man-biologicals = { d-man1 = { name = SPEC_D-MAN plural = SPEC_D-MAN_pl home_planet = SPEC_D-MAN_planet1 home_system = SPEC_D-MAN_system1 name_list = "HUM1" } d-man2 = { name = SPEC_D-MAN plural = SPEC_D-MAN_pl home_planet = SPEC_D-MAN_planet2 home_system = SPEC_D-MAN_system2 name_list = "HUM1" } d-man3 = { name = SPEC_D-MAN plural = SPEC_D-MAN_pl home_planet = SPEC_D-MAN_planet3 home_system = SPEC_D-MAN_system3 name_list = "HUM1" } d-man4 = { name = SPEC_D-MAN plural = SPEC_D-MAN_pl home_planet = SPEC_D-MAN_planet4 home_system = SPEC_D-MAN_system4 name_list = "HUM1" } d-man5 = { name = SPEC_D-MAN plural = SPEC_D-MAN_pl home_planet = SPEC_D-MAN_planet5 home_system = SPEC_D-MAN_system5 name_list = "HUM1" } d-man6 = { name = SPEC_D-MAN plural = SPEC_D-MAN_pl home_planet = SPEC_D-MAN_planet6 home_system = SPEC_D-MAN_system6 name_list = "HUM1" } } # D言語くん種族(機械知性) d-man-machines = { d-man11 = { name = SPEC_D-MAN plural = SPEC_D-MAN_pl home_planet = SPEC_D-MAN_planet1 home_system = SPEC_D-MAN_system1 name_list = "HUM1" } d-man12 = { name = SPEC_D-MAN plural = SPEC_D-MAN_pl home_planet = SPEC_D-MAN_planet2 home_system = SPEC_D-MAN_system2 name_list = "HUM1" } d-man13 = { name = SPEC_D-MAN plural = SPEC_D-MAN_pl home_planet = SPEC_D-MAN_planet3 home_system = SPEC_D-MAN_system3 name_list = "HUM1" } d-man14 = { name = SPEC_D-MAN plural = SPEC_D-MAN_pl home_planet = SPEC_D-MAN_planet4 home_system = SPEC_D-MAN_system4 name_list = "HUM1" } d-man15 = { name = SPEC_D-MAN plural = SPEC_D-MAN_pl home_planet = SPEC_D-MAN_planet5 home_system = SPEC_D-MAN_system5 name_list = "HUM1" } d-man16 = { name = SPEC_D-MAN plural = SPEC_D-MAN_pl home_planet = SPEC_D-MAN_planet6 home_system = SPEC_D-MAN_system6 name_list = "HUM1" } } # D言語くん種族(岩石種族) d-man-lithoids = { d-man21 = { name = SPEC_D-MAN plural = SPEC_D-MAN_pl home_planet = SPEC_D-MAN_planet1 home_system = SPEC_D-MAN_system1 name_list = "HUM1" } d-man22 = { name = SPEC_D-MAN plural = SPEC_D-MAN_pl home_planet = SPEC_D-MAN_planet2 home_system = SPEC_D-MAN_system2 name_list = "HUM1" } d-man23 = { name = SPEC_D-MAN plural = SPEC_D-MAN_pl home_planet = SPEC_D-MAN_planet3 home_system = SPEC_D-MAN_system3 name_list = "HUM1" } d-man24 = { name = SPEC_D-MAN plural = SPEC_D-MAN_pl home_planet = SPEC_D-MAN_planet4 home_system = SPEC_D-MAN_system4 name_list = "HUM1" } d-man25 = { name = SPEC_D-MAN plural = SPEC_D-MAN_pl home_planet = SPEC_D-MAN_planet5 home_system = SPEC_D-MAN_system5 name_list = "HUM1" } d-man26 = { name = SPEC_D-MAN plural = SPEC_D-MAN_pl home_planet = SPEC_D-MAN_planet6 home_system = SPEC_D-MAN_system6 name_list = "HUM1" } }

d-man-biologicalsやd-man-machinesの部分は、種族定義と名前を一致させる必要があります。
その中のd-man1やd-man21などの名前は任意で良いのですが、
ランダム生成される際に数が少なかったり
名前が被ったりするとゲームが強制終了してしまうことがあるみたいです。

1種族定義辺り最低6つ、名前を被らないようにして作れば、
強制終了も滅多に起きなくなるのではないかと思います。

name_list以外の項目の「=」の右側の部分は、後述するローカライズ定義のキー名になります。
古いバージョンだと、キー名ではなく直接ここに日本語で名前を記述していたかと思いますが、
最新の環境では多言語対応を簡単にするため、一旦キー名を記載するようになりました。

なお、name_listは今回は既存のを丸々使い回しているので、既存定義を指定しています。
7. ネームリストを作成する
次にネームリストを作成します。


正直いうと、6.で既存のネームリストを使い回しているのに
なんでこれが必要になるのかよくわかってないです。
が、ないとエラーログで怒られるので作成します。

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

テキストエディタを開き、の定義を記述していきましょう。
以下はD言語くんの定義を作成した時のサンプルです。
保存する際の文字コードはUTF-8 BOMありを指定してください。
なぜかこのファイルはBOMが必要です。

d-man-biologicals = { selectable = { always = no } ship_names = { corvette = { HUMAN1_SHIP_Aardvark HUMAN1_SHIP_Accentor # 以下略 } destroyer = { HUMAN1_SHIP_Amsterdam HUMAN1_SHIP_Austin # 以下略 } cruiser = { HUMAN1_SHIP_Bolivar HUMAN1_SHIP_Brusilov # 以下略 } battleship = { HUMAN1_SHIP_Ulysses HUMAN1_SHIP_Xenophon # 以下略 } titan = { HUMAN1_SHIP_Enterprise HUMAN1_SHIP_Invincible # 以下略 } colossus = { HUMAN1_SHIP_SolInvictus HUMAN1_SHIP_Adjudicator # 以下略 } juggernaut = { HUMAN1_SHIP_Ararat HUMAN1_SHIP_AxisMundi # 以下略 } constructor = { HUMAN1_SHIP_Pacific HUMAN1_SHIP_Atlantic # 以下略 } colonizer = { HUMAN1_SHIP_Mayflower HUMAN1_SHIP_Abundance # 以下略 } sponsored_colonizer = { # needed when there are no generic names HUMAN1_SHIP_Mayflower HUMAN1_SHIP_Abundance # 以下略 } science = { HUMAN1_SHIP_Aldrin HUMAN1_SHIP_Armstrong # 以下略 } transport = { HUMAN1_SHIP_Cowpens HUMAN1_SHIP_BelleauWood # 以下略 } military_station_small = { HUMAN1_SHIP_Citadel HUMAN1_SHIP_Albacore # 以下略 } ion_cannon = { HUMAN1_SHIP_Bombard HUMAN1_SHIP_Ballista # 以下略 } } fleet_names = { sequential_name = HUMAN1_FLEET } army_names = { machine_defense = { sequential_name = HUMAN1_PLANETARYGUARD } machine_assault_1 = { sequential_name = HUMAN1_EXPEDITIONARYFORCE } machine_assault_2 = { sequential_name = HUMAN1_EXPEDITIONARYFORCE } machine_assault_3 = { sequential_name = HUMAN1_EXPEDITIONARYFORCE } defense_army = { sequential_name = HUMAN1_PLANETARYGUARD } assault_army = { sequential_name = HUMAN1_EXPEDITIONARYFORCE } slave_army = { sequential_name = HUMAN1_INDENTUREDRIFLES } clone_army = { sequential_name = HUMAN1_CLONEARMY } undead_army = { sequential_name = HUMAN1_DREADCOMMANDO } robotic_army = { sequential_name = HUMAN1_HUNTERKILLERGROUP } robotic_defense_army = { sequential_name = HUMAN1_GROUNDDEFENSEMATRIX } psionic_army = { sequential_name = HUMAN1_PSICOMMANDO } xenomorph_army = { sequential_name = HUMAN1_BIOWARFAREDIVISION } gene_warrior_army = { random_names = { HUMAN1_ARMY_SARC-AGladiators HUMAN1_ARMY_SARC-BWidowmakers # 以下略 } sequential_name = HUMAN1_BIOENGINEEREDSQUADRON } occupation_army = { sequential_name = HUMAN1_GARRISONFORCE } robotic_occupation_army = { sequential_name = HUMAN1_MECHANIZEDGARRISON } primitive_army = { sequential_name = HUMAN1_PRIMITIVEARMY } industrial_army = { sequential_name = HUMAN1_INDUSTRIALARMY } postatomic_army = { sequential_name = HUMAN1_POSTATOMICARMY } } planet_names = { generic = { names = { HUMAN1_PLANET_NewJerusalem HUMAN1_PLANET_Anchor # 以下略 } } pc_desert = { names = { HUMAN1_PLANET_NovaArabia HUMAN1_PLANET_Sahara # 以下略 } } pc_arid = { names = { HUMAN1_PLANET_Lebanon HUMAN1_PLANET_Tyre # 以下略 } } pc_tropical = { names = { HUMAN1_PLANET_Amazonia HUMAN1_PLANET_Congo # 以下略 } } pc_continental = { names = { HUMAN1_PLANET_Albion HUMAN1_PLANET_Amor # 以下略 } } pc_gaia = { names = { HUMAN1_PLANET_Eden HUMAN1_PLANET_Elysium # 以下略 } } pc_ocean = { names = { HUMAN1_PLANET_Atlantis HUMAN1_PLANET_Oceania # 以下略 } } pc_tundra = { names = { HUMAN1_PLANET_Iceland HUMAN1_PLANET_Canada # 以下略 } } pc_arctic = { names = { HUMAN1_PLANET_Thule HUMAN1_PLANET_Arctica # 以下略 } } pc_savannah = { names = { } } pc_alpine = { names = { } } } ### CHARACTERS character_names = { default = { first_names_male = { HUMAN1_CHR_John HUMAN1_CHR_Brian # 以下略 } first_names_female = { HUMAN1_CHR_Olivia HUMAN1_CHR_Emily # 以下略 } second_names = { HUMAN1_CHR_Smith HUMAN1_CHR_Jones # 以下略 } regnal_first_names_male = { HUMAN1_CHR_Alexander HUMAN1_CHR_Vladimir # 以下略 } regnal_first_names_female = { HUMAN1_CHR_Theodora HUMAN1_CHR_Fatima # 以下略 } regnal_second_names = { HUMAN1_CHR_Habsburg HUMAN1_CHR_Romanov # 以下略 } } } } d-man-machines = { # d-man-biologicalsと同じ内容のため省略 } d-man-lithoids = { # d-man-biologicalsと同じ内容のため省略 }

考えるのが面倒だったので既存の定義を丸々引っ張っています。
d-man-biologicalsやd-man-machinesの部分は、種族定義と名前を一致させる必要があります。
サンプルコード上の「HUMAN1_xxxxx」の部分は、後述するローカライズ定義のキー名になります。
古いバージョンだと、キー名ではなく直接ここに日本語で名前を記述していたかと思いますが、
最新の環境では多言語対応を簡単にするため、一旦キー名を記載するようになりました。

「selectable = { always = no }」の部分は、新規で自作帝国を作成する時の
ネームリストの選択欄にこのネームリストを載せないようにするための記述です。
always = yesにすると逆に載るようになります。
8. ローカライズする
次はローカライズ用のファイルを作成します。


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

以下はD言語くんの定義を作成した時のサンプルです
保存する際の文字コードはUTF-8 BOMありを指定してください
なんでこのファイルはBOMが必要なんだ…

l_japanese: ################################################################### # 種族のローカライズ定義 ################################################################### d-man-biologicals:0 "D言語くん(有機)" d-man-biologicals_desc:0 "プログラム言語の1つ、D言語のマスコットキャラクター。プログラム言語マスコット界隈の中では恐らく最も人気のあるマスコットキャラクターだと思われる" d-man-biologicals_plural:0 "D言語くん" d-man-biologicals_adj:0 "D言語くんX" d-man-biologicals_insult_01:0 "クリーチャー" d-man-biologicals_insult_plural_01:0 "クリーチャー" d-man-biologicals_compliment_01:0 "高級言語" d-man-biologicals_compliment_plural_01:0 "高級言語" d-man-biologicals_spawn:0 "子供" d-man-biologicals_spawn_plural:0 "子供" d-man-biologicals_sound_01:0 "ノイズ" d-man-biologicals_sound_02:0 "ビープ音" d-man-biologicals_sound_03:0 "鳴き声" d-man-biologicals_sound_04:0 "声" d-man-biologicals_sound_05:0 "音" d-man-biologicals_organ:0 "空洞" d-man-biologicals_organ_plural:0 "空洞" d-man-biologicals_mouth:0 "空洞" d-man-biologicals_ear:0 "聴覚器官" d-man-biologicals_ear_plural:0 "聴覚器官" d-man-biologicals_hand:0 "手" d-man-biologicals_hand_plural:0 "手" d-man-biologicals_tooth:0 "空洞" d-man-biologicals_tooth_plural:0 "空洞" d-man-biologicals_fossil:0 "化石" d-man-biologicals_fossil_plural:0 "化石" d-man-biologicals_remnant:0 "骨格" d-man-biologicals_remnant_plural:0 "骨格" d-man-machines:0 "D言語くん(機械)" d-man-machines_desc:0 "プログラム言語の1つ、D言語のマスコットキャラクター。プログラム言語マスコット界隈の中では恐らく最も人気のあるマスコットキャラクターだと思われる" d-man-machines_plural:0 "D言語くん" d-man-machines_adj:0 "D言語くんX" d-man-machines_insult_01:0 "クリーチャー" d-man-machines_insult_plural_01:0 "クリーチャー" d-man-machines_compliment_01:0 "高級言語" d-man-machines_compliment_plural_01:0 "高級言語" d-man-machines_spawn:0 "子供" d-man-machines_spawn_plural:0 "子供" d-man-machines_sound_01:0 "ノイズ" d-man-machines_sound_02:0 "ビープ音" d-man-machines_sound_03:0 "鳴き声" d-man-machines_sound_04:0 "声" d-man-machines_sound_05:0 "音" d-man-machines_organ:0 "空洞" d-man-machines_organ_plural:0 "空洞" d-man-machines_mouth:0 "空洞" d-man-machines_ear:0 "聴覚器官" d-man-machines_ear_plural:0 "聴覚器官" d-man-machines_hand:0 "手" d-man-machines_hand_plural:0 "手" d-man-machines_tooth:0 "空洞" d-man-machines_tooth_plural:0 "空洞" d-man-machines_fossil:0 "化石" d-man-machines_fossil_plural:0 "化石" d-man-machines_remnant:0 "骨格" d-man-machines_remnant_plural:0 "骨格" d-man-lithoids:0 "D言語くん(岩石)" d-man-lithoids_desc:0 "プログラム言語の1つ、D言語のマスコットキャラクター。プログラム言語マスコット界隈の中では恐らく最も人気のあるマスコットキャラクターだと思われる" d-man-lithoids_plural:0 "D言語くん" d-man-lithoids_adj:0 "D言語くんX" d-man-lithoids_insult_01:0 "クリーチャー" d-man-lithoids_insult_plural_01:0 "クリーチャー" d-man-lithoids_compliment_01:0 "高級言語" d-man-lithoids_compliment_plural_01:0 "高級言語" d-man-lithoids_spawn:0 "子供" d-man-lithoids_spawn_plural:0 "子供" d-man-lithoids_sound_01:0 "ノイズ" d-man-lithoids_sound_02:0 "ビープ音" d-man-lithoids_sound_03:0 "鳴き声" d-man-lithoids_sound_04:0 "声" d-man-lithoids_sound_05:0 "音" d-man-lithoids_organ:0 "空洞" d-man-lithoids_organ_plural:0 "空洞" d-man-lithoids_mouth:0 "空洞" d-man-lithoids_ear:0 "聴覚器官" d-man-lithoids_ear_plural:0 "聴覚器官" d-man-lithoids_hand:0 "手" d-man-lithoids_hand_plural:0 "手" d-man-lithoids_tooth:0 "空洞" d-man-lithoids_tooth_plural:0 "空洞" d-man-lithoids_fossil:0 "化石" d-man-lithoids_fossil_plural:0 "化石" d-man-lithoids_remnant:0 "骨格" d-man-lithoids_remnant_plural:0 "骨格" ################################################################### # ランダム帝国ローカライズ定義 ################################################################### SPEC_D-MAN:0 "D-Man" SPEC_D-MAN_pl:0 "D-Man" SPEC_D-MAN_planet1:0 "D Lang" SPEC_D-MAN_planet2:0 "D" SPEC_D-MAN_planet3:0 "D-Man" SPEC_D-MAN_planet4:0 "Go Lang" SPEC_D-MAN_planet5:0 "Go" SPEC_D-MAN_planet6:0 "Lisp" SPEC_D-MAN_system1:0 "DMD" SPEC_D-MAN_system2:0 "GDC" SPEC_D-MAN_system3:0 "LDC" SPEC_D-MAN_system4:0 "gc" SPEC_D-MAN_system5:0 "Gccgo" SPEC_D-MAN_system6:0 "CLISP" ################################################################### # ネームリスト定義 ※今回はバニラのキー名を使い回しているので省略するが # 一応仮に各場合のサンプルを載せておく ################################################################### HUM1_SHIP_KhutmatheGreat:0 "偉大なるクートマ" HUM1_SHIP_RhuntheUnyielding:0 "不屈のルーン" # 以下略

種族のローカライズ定義の意味は上から順に以下の通り。
このローカライズを書いておかないと、他国との外交などの画面の文章がおかしくなります。
  • (種族名):種族の名前
  • (種族名)_desc:種族の説明 ※何処で使ってるのかわからん
  • (種族名)_plural:種族の名前(複数形)
  • (種族名)_adj:種族の名前(形容詞)
  • (種族名)_insult_01:侮辱する時にその種族を揶揄する言葉。昆虫をバグと呼ぶなど。後ろの数字を増やして何個でも定義できる
  • (種族名)_insult_02
  • ...
  • (種族名)_insult_plural_01:(種族名)_insult_01に対する複数形
  • (種族名)_insult_plural_02:
  • ...
  • (種族名)_compliment_01:侮蔑とは逆に賞賛する時に使うらしい。後ろの数字を増やして何個でも定義できる
  • (種族名)_compliment_02
  • ...
  • (種族名)_compliment_plural_01:(種族名)_compliment_01に対する複数形
  • (種族名)_compliment_plural_02:
  • ...
  • (種族名)_spawn:その種族の子供を意味する言葉、蛙っぽいやつならオタマジャクシとか
  • (種族名)_spawn_plural:(種族名)_spawnの複数形
  • (種族名)_sound_01:よくわかってないので英語Wikiの以下原文ママを記載。機械知性への特有の侮蔑用語とかなのか…?
  • (種族名)_sound_02:"CLASS_sound_X" denotes descriptive noises (e.g. "stupid Robot, will you stop that beeping").
  • (種族名)_sound_03:こちらは01~05まで必ず書かないといけないとのこと
  • (種族名)_sound_04:
  • (種族名)_sound_05:
  • (種族名)_organ:種族の身体の一部を記載する。「胃が痛い」とかの表現の時に使うっぽくて、その場合は胃で良さそう
  • (種族名)_organ_plural:organの複数形
  • (種族名)_mouth:その種族が食物を摂取するための器官、人間で言う口に当たる部位を書く
  • (種族名)_ear:その種族が音を聴くための器官、人間で言う耳に当たる部位を書く
  • (種族名)_ear_plural:earの複数形
  • (種族名)_hand:その種族が物を拾うために使う部位、人間でいう手に当たる部位を書く
  • (種族名)_hand_plura:handの複数形
  • (種族名)_tooth:その種族が食物を細かくするための器官、人間で言う歯に当たる部位を書く
  • (種族名)_tooth_plural:toothの複数形
  • (種族名)_fossil:その種族があとから発掘などされた時に表現する物。化石とか残骸とか
  • (種族名)_fossil_plural:fossilの複数形
  • (種族名)_remnant:その種族のfossilとして残る物?骨格とか部品とか
  • (種族名)_remnant_plural:remnantの複数形

よくわからなかったらバニラの以下の定義を参考にして見てください。
localisation\japanese\name_lists\name_lists_l_japanese.yml

ランダム帝国ローカライズ定義とネームリスト定義も忘れずに記載するようにしましょう。
また、今回はネームリストを自作の帝国の作成画面から除外するようにしていますが
もしそこに表示させたい場合は、そちらの定義も必要です。

name_list_d-man-biologicals:0 "D言語くん(有機)" name_list_d-man-machines:0 "D言語くん(機械)" name_list_d-man-lithoids:0 "D言語くん(岩石)"

なお、拡張子ymlのファイルは、YAMLというファイル形式に則った記述をする必要があります。
ただのテキストファイルではないです。

具体的には「l_japanese:」以降の行のインデントは全て揃えてください。
うろ覚えだけど形式上スペースの数自体は何個でも良かったはず。
スペース2個がYAMLでよく見るインデント数かな…。

他の言語にも対応したい場合はそれぞれの言語ファイルも用意しましょう。
今回は自分が多言語で書けないので割愛します。
9. グラフィックカルチャー定義を作成する
まだ終わりではない…先は長いですがグラフィックカルチャー定義を作成しましょう。


これそもそもなに?ってなると思うのですが、「ヒューマノイド」や「鳥人」などのタイプ毎に
都市の背景や基地、艦隊などの見た目のデザインを別々に用意しています。
D言語くんというタイプを今回新しく作ったので
D言語くん用のグラフィックカルチャーが必要になります。

めんどくさい場合は、5-1でグラフィックカルチャーを指定するときに、既存のものを指定するようにすると簡単です。
# 既存の例 graphical_culture = humanoid_01 # 人類 graphical_culture = mammalian_01 # 機械知性 graphical_culture = plantoid_01 # 植物

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

以下はD言語くんの定義を作成した時のサンプルです。
保存する際の文字コードはUTF-8 BOMなしを指定してください。
no_culture = { fallback = mammalian_01 has_city_graphics = no selectable = { always = no } randomized = { always = no } ship_color = yes }

このファイルを作ってゲームを開始すると、自動的にこの定義に沿った
グラフィックカルチャー用の画像ファイルの読み込みが行われます。
読み込み対象のファイルがない場合は、
fallbackで指定した定義のファイルを代わりに読み込みます。

定義名を「no_culture」にしているので、例えば都市の背景として
「gfx\portraits\city_sets\no_culture_city_l01.dds」などといったファイルを読み込もうとします。
ただ、こんなファイルは作ってないので読み込めません。
そこで、fallback = mammalian_01で指定されている
「gfx\portraits\city_sets\mammalian_01_city_l01.dds」が代わりに読み込まれます。

この仕組みがあるので、例えば基地のデザインだけD言語くん専用のデザインに変更しつつも
都市などの他のデザインは人類のものを使い回すなどといった対応が可能です。

正直私はデザインを変更する能力も情熱もエネルギーもないので、
定義だけ用意しておいて、選択はできないように制御しています。
以下の記述がその制御のコードです。
・selectable = { always = no }
・randomized = { always = no }

ただ、この記述を書いていたとしても、
ニューゲーム時の艦船外観の選択の画面には出てきてしまいます。
既存のを使い回せばこの問題は解消しますが、代わりに別の問題も発生するので
この辺りは好みで既存の定義を使い回すかどうかを選択するといいでしょう。

※既存の使い回しの場合は、都市外観と艦船外観の画面で「○○の都市」と表示される○○部分が最後に読み込まれたタイプの名前に置き換わる仕様のため、バニラだと「ヒューマノイドの都市」と表示される部分がModを入れたことにより「D言語くんの都市」と表示されてしまうなどといった現象が起きる。無視しいてもいいがちょっと気持ち悪い。
10. 服を着ている種族である条件を追加する(※任意)
新しく用意した種族が服を着ている種族である場合は、その旨を判定する条件式に対象の種族を追加しましょう。
これを追加しないと、例えば見た目上服を着ているのに、以下のような侮辱のセリフを言われてしまうなどといった事が発生します。
「なぜお前たちは、 そのだらしない部位をはしたなくぶら下げている? そしてなぜほかの有機生命体のように布で身体を覆わない?その見苦しい 肉体を見て喜ぶ者など皆無なのだぞ。」


以下の構成で、新規のテキストファイルを作成してください。
保存する際の文字コードはUTF-8 BOMなしを指定してください。
C:\Users\(ユーザー名)\Documents\Paradox Interactive\Stellaris\mod\(MODのディレクトリ名)
└common
 └scripted_triggers
  └(mod名)_scripted_triggers.txt ← これを作る

バニラのファイルを上書きする形での記述となるので、
バニラより後に読み込まれるように、ファイル名の付け方は工夫してください。
基本的にバニラのファイルが数字開始なので、
ファイル名は英字開始で始めれば大丈夫だと思います。
以下はサンプルとなります。

##################################### # 服を着る種族かどうか # バニラの種族だけでなく、更にこのMODの種族を追加 ##################################### wears_clothes = { OR = { is_human_species = yes species_portrait = humanoid_02 species_portrait = humanoid_03 species_portrait = humanoid_04 species_portrait = humanoid_05 species_portrait = humanoid_hp_01 species_portrait = humanoid_hp_02 species_portrait = humanoid_hp_06 species_portrait = humanoid_hp_07 species_portrait = humanoid_hp_08 species_portrait = humanoid_hp_09 species_portrait = humanoid_hp_10 species_portrait = humanoid_hp_11 species_portrait = humanoid_hp_12 species_portrait = humanoid_hp_13 species_portrait = mam1 species_portrait = mam2 species_portrait = mam3 species_portrait = mam4 species_portrait = mam5 species_portrait = mam6 species_portrait = mam7 species_portrait = mam8 species_portrait = mam9 species_portrait = mam10 species_portrait = mam11 species_portrait = mam12 species_portrait = mam13 species_portrait = mam14 species_portrait = mam15 species_portrait = mam16 species_portrait = mam17 species_portrait = mam_rat species_portrait = rep1 species_portrait = rep2 species_portrait = rep3 species_portrait = rep4 species_portrait = rep5 species_portrait = rep6 species_portrait = rep7 species_portrait = rep8 species_portrait = rep9 species_portrait = rep10 species_portrait = rep11 species_portrait = rep12 species_portrait = rep13 species_portrait = rep15 species_portrait = rep16 species_portrait = avi1 species_portrait = avi2 species_portrait = avi4 species_portrait = avi5 species_portrait = avi6 species_portrait = avi8 species_portrait = avi9 species_portrait = avi10 species_portrait = avi11 species_portrait = avi12 species_portrait = avi13 species_portrait = avi14 species_portrait = avi15 species_portrait = avi16 species_portrait = art6 species_portrait = art7 species_portrait = art8 species_portrait = art9 species_portrait = art10 species_portrait = mol1 species_portrait = mol2 species_portrait = mol3 species_portrait = mol4 species_portrait = mol5 species_portrait = mol11 species_portrait = mol12 species_portrait = mol13 species_portrait = mol14 species_portrait = mol15 species_portrait = fun6 species_portrait = fun7 species_portrait = fun8 species_portrait = fun9 species_portrait = fun10 species_portrait = pla6 species_portrait = pla7 species_portrait = pla8 species_portrait = pla9 species_portrait = pla10 species_portrait = aqu4 species_portrait = aqu5 species_portrait = aqu6 species_portrait = nec10 species_portrait = nec11 species_portrait = nec12 species_portrait = nec13 species_portrait = nec14 species_portrait = nec15 species_portrait = tox2 species_portrait = tox3 species_portrait = tox6 species_portrait = tox8 species_portrait = tox10 species_portrait = tox11 species_portrait = tox12 species_portrait = tox14 species_portrait = tox15 ############################ # ここからMod追加種族 ############################ species_portrait = akari species_portrait = AKAMACH species_portrait = AKALITHOID species_portrait = kotonoha species_portrait = KOTOMACH species_portrait = KOTOLITHOID species_portrait = meika species_portrait = MEKAMACH species_portrait = MEIKALITHOID species_portrait = hinomoto species_portrait = HINOMACH species_portrait = HINOLITHOID species_portrait = sora species_portrait = SORAMACH species_portrait = SORALITHOID species_portrait = touhoku species_portrait = TOHOMACH species_portrait = TOHOLITHOID species_portrait = yukari species_portrait = YUKAMACH species_portrait = YUKALITHOID species_portrait = VOICEROID species_portrait = VOICEMACH species_portrait = VOICELITH ############################ # ここまでMod追加種族 ############################ } }

ちなみにバニラのwears_clothesの記述は、
バニラの新規種族が追加される度に手が入ります。
このVer3.8.2現在のサンプルではなく、
バニラ本体の記述をベースに追加するようにしましょう。
11. ロボット製造ができるようになった時のデフォルトのポートレート画像を指定する(※任意)
Mod制作者によっては、ロボットの製造ができるようになった時の初回に製造されるロボットのポートレートを変更したいと思う方がいるかもしれません。
その場合は、既存のscripted_effectsの処理を書き換えることで対応ができます。


以下の構成で、新規のテキストファイルを作成してください。
保存する際の文字コードはUTF-8 BOMなしを指定してください。
C:\Users\(ユーザー名)\Documents\Paradox Interactive\Stellaris\mod\(MODのディレクトリ名)
└common
 └scripted_effects
  └(mod名)_scripted_effects.txt ← これを作る

バニラのファイルを上書きする形での記述となるので、
バニラより後に読み込まれるように、ファイル名の付け方は工夫してください。
基本的にバニラのファイルが数字開始なので、
ファイル名は英字開始で始めれば大丈夫だと思います。
以下はサンプルとなります。

create_built_robot_species = { create_species = { name = "NAME_Robot" plural = "NAME_Robot_plural" class = ROBOT namelist = this portrait = "default_robot" traits = { trait = "trait_mechanical" } effect = { set_species_flag = mechanical_species@prev if = { limit = { prev = { use_robot_portrait_sd_hum_robot = yes } } change_species_portrait = sd_hum_robot } else_if = { limit = { prev = { use_robot_portrait_sd_mam_robot = yes } } change_species_portrait = sd_mam_robot } else_if = { limit = { prev = { use_robot_portrait_sd_rep_robot = yes } } change_species_portrait = sd_rep_robot } else_if = { limit = { prev = { use_robot_portrait_sd_avi_robot = yes } } change_species_portrait = sd_avi_robot } else_if = { limit = { prev = { use_robot_portrait_sd_art_robot = yes } } change_species_portrait = sd_art_robot } else_if = { limit = { prev = { use_robot_portrait_sd_mol_robot = yes } } change_species_portrait = sd_mol_robot } else_if = { limit = { prev = { use_robot_portrait_sd_fun_robot = yes } } change_species_portrait = sd_fun_robot } else_if = { limit = { prev = { use_robot_portrait_sd_pla_robot = yes } } change_species_portrait = sd_pla_robot } else_if = { limit = { prev = { use_robot_portrait_sd_lit_robot = yes } } change_species_portrait = lith_machine } else_if = { limit = { prev = { use_robot_portrait_sd_nec_robot = yes } } change_species_portrait = nec_machine } else_if = { limit = { prev = { use_robot_portrait_sd_aqu_robot = yes } } change_species_portrait = aqu_machine } else_if = { limit = { prev = { use_robot_portrait_sd_tox_robot = yes } } change_species_portrait = tox_machine } ##################################################### # ここから MOD追加コード ##################################################### else_if = { limit = { prev = { OR = { is_species_class = VOICEROID is_species_class = VOICELITH is_species_class = akari is_species_class = AKALITHOID is_species_class = kotonoha is_species_class = KOTOLITHOID is_species_class = meika is_species_class = MEIKALITHOID is_species_class = hinomoto is_species_class = HINOLITHOID is_species_class = sora is_species_class = SORALITHOID is_species_class = touhoku is_species_class = TOHOLITHOID is_species_class = yukari is_species_class = YUKALITHOID } } } change_species_portrait = allvr } ##################################################### # ここまで MOD追加コード ##################################################### } } set_built_species = last_created_species }

ちなみにバニラのwears_clothesの記述は、
バニラの新規種族が追加される度に手が入ります。
このVer3.8.2現在のサンプルではなく、
バニラ本体の記述をベースに追加するようにしましょう。
12. 人工生命体ルートのデフォルトのポートレート画像を指定する(※任意)
Mod制作者によっては、人工生命体ルートの初回のロボットポートレートを変更したいと思う方がいるかもしれません。
その場合は、既存のイベントを書き換えることで対応ができます。

以下の構成で、新規のテキストファイルを作成してください。
保存する際の文字コードはUTF-8 BOMなしを指定してください。
C:\Users\(ユーザー名)\Documents\Paradox Interactive\Stellaris\mod\(MODのディレクトリ名)
└events
 └(mod名)_events.txt ← これを作る

バニラのファイルを上書きする形での記述となるので、
バニラより前に読み込まれるように、ファイル名の付け方は工夫してください。
前です。後ではありません。scripted_triggersなどとは逆なので注意です。
ファイル名の先頭に数字を付けるなどするといいかもしれません。

namespace = utopia # The Synthetic Age country_event = { id = utopia.2551 title = "utopia.2551.name" desc = "utopia.2551.desc" picture = GFX_evt_robot_assembly_plant show_sound = event_synthetic_evolution is_triggered_only = yes immediate = { # ~中略~ effect = { if = { limit = { host_has_dlc = "Synthetic Dawn Story Pack" } prev = { switch = { trigger = is_species_class HUM = { prev = { change_species_characteristics = { portrait = "sd_hum_robot" } } } MAM = { prev = { change_species_characteristics = { portrait = "sd_mam_robot" } } } REP = { prev = { change_species_characteristics = { portrait = "sd_rep_robot" } } } AVI = { prev = { change_species_characteristics = { portrait = "sd_avi_robot" } } } ART = { prev = { change_species_characteristics = { portrait = "sd_art_robot" } } } MOL = { prev = { change_species_characteristics = { portrait = "sd_mol_robot" } } } FUN = { prev = { change_species_characteristics = { portrait = "sd_fun_robot" } } } PLANT = { prev = { change_species_characteristics = { portrait = "sd_pla_robot" } } } LITHOID = { prev = { change_species_characteristics = { portrait = "lith_machine" } } } NECROID = { prev = { change_species_characteristics = { portrait = "nec_machine" } } } AQUATIC = { prev = { change_species_characteristics = { portrait = "aqu_machine" } } } TOX = { prev = { change_species_characteristics = { portrait = "tox_machine" } } } ##################################################### # ここから MOD追加コード ##################################################### VOICEROID = { switch = { trigger = species_portrait yukari = { prev = { change_species_characteristics = { portrait = "yukari" } } } maki = { prev = { change_species_characteristics = { portrait = "maki" } } } zunko = { prev = { change_species_characteristics = { portrait = "zunko" } } } akane = { prev = { change_species_characteristics = { portrait = "akane" } } } aoi = { prev = { change_species_characteristics = { portrait = "aoi" } } } seika = { prev = { change_species_characteristics = { portrait = "seika" } } } kiritan = { prev = { change_species_characteristics = { portrait = "kiritan" } } } akari = { prev = { change_species_characteristics = { portrait = "akari" } } } ia = { prev = { change_species_characteristics = { portrait = "ia" } } } one = { prev = { change_species_characteristics = { portrait = "one" } } } allvr = { prev = { change_species_characteristics = { portrait = "allvr" } } } } } VOICELITH = { switch = { trigger = species_portrait yukari = { prev = { change_species_characteristics = { portrait = "yukari" } } } maki = { prev = { change_species_characteristics = { portrait = "maki" } } } zunko = { prev = { change_species_characteristics = { portrait = "zunko" } } } akane = { prev = { change_species_characteristics = { portrait = "akane" } } } aoi = { prev = { change_species_characteristics = { portrait = "aoi" } } } seika = { prev = { change_species_characteristics = { portrait = "seika" } } } kiritan = { prev = { change_species_characteristics = { portrait = "kiritan" } } } akari = { prev = { change_species_characteristics = { portrait = "akari" } } } ia = { prev = { change_species_characteristics = { portrait = "ia" } } } one = { prev = { change_species_characteristics = { portrait = "one" } } } allvr = { prev = { change_species_characteristics = { portrait = "allvr" } } } } } akari = { prev = { change_species_characteristics = { portrait = "akari" } } } AKALITHOID = { prev = { change_species_characteristics = { portrait = "akari" } } } kotonoha = { switch = { trigger = species_portrait akaneM = { prev = { change_species_characteristics = { portrait = "akane" } } } aoiM = { prev = { change_species_characteristics = { portrait = "aoi" } } } kotoM = { prev = { random_list = { 1 = { change_species_characteristics = { portrait = "akane" } } 1 = { change_species_characteristics = { portrait = "aoi" } } } } } } } KOTOLITHOID = { switch = { trigger = species_portrait akaneM = { prev = { change_species_characteristics = { portrait = "akane" } } } aoiM = { prev = { change_species_characteristics = { portrait = "aoi" } } } kotoM = { prev = { random_list = { 1 = { change_species_characteristics = { portrait = "akane" } } 1 = { change_species_characteristics = { portrait = "aoi" } } } } } } } meika = { prev = { change_species_characteristics = { portrait = "allvr" } } } MEIKALITHOID = { prev = { change_species_characteristics = { portrait = "allvr" } } } hinomoto = { prev = { change_species_characteristics = { portrait = "allvr" } } } HINOLITHOID = { prev = { change_species_characteristics = { portrait = "allvr" } } } sora = { prev = { change_species_characteristics = { portrait = "allvr" } } } SORALITHOID = { prev = { change_species_characteristics = { portrait = "allvr" } } } touhoku = { switch = { trigger = species_portrait touhoku_zunko = { prev = { change_species_characteristics = { portrait = "zunko" } } } touhoku_kiritan = { prev = { change_species_characteristics = { portrait = "kiritan" } } } itako = { prev = { random_list = { 1 = { change_species_characteristics = { portrait = "zunko" } } 1 = { change_species_characteristics = { portrait = "kiritan" } } } } } touhokusimai = { prev = { random_list = { 1 = { change_species_characteristics = { portrait = "zunko" } } 1 = { change_species_characteristics = { portrait = "kiritan" } } } } } } } TOHOLITHOID = { switch = { trigger = species_portrait touhoku_zunko = { prev = { change_species_characteristics = { portrait = "zunko" } } } touhoku_kiritan = { prev = { change_species_characteristics = { portrait = "kiritan" } } } itako = { prev = { random_list = { 1 = { change_species_characteristics = { portrait = "zunko" } } 1 = { change_species_characteristics = { portrait = "kiritan" } } } } } touhokusimai = { prev = { random_list = { 1 = { change_species_characteristics = { portrait = "zunko" } } 1 = { change_species_characteristics = { portrait = "kiritan" } } } } } } } yukari = { prev = { change_species_characteristics = { portrait = "yukari" } } } YUKALITHOID = { prev = { change_species_characteristics = { portrait = "yukari" } } } ##################################################### # ここまで MOD追加コード ##################################################### } } } # ~中略~ } }

このサンプルも同じくこのVer3.8.2現在のサンプルではなく、
バニラ本体の記述をベースに追加するようにしましょう。

以上です。
3 Comments
fatal_errorjp  [author] 19 May, 2024 @ 8:43am 
Stellaris Ver3.12.1以降で種族追加系Modの仕組みが変更になったので最新のガイドを書きました。
Steamガイドの方だとガイド内の画像が謎に消失するので自分のサイトにて公開しています。
誤字脱字が色々あると思いますが、そのうち直します。

【Stellaris 3.12.2】ポートレート&種族の作り方
https://fatalerrorjp.github.io/stellaris_infomations/guides/create-species.html
fatal_errorjp  [author] 13 May, 2024 @ 5:50am 
最新バージョンで仕組みが変わったこともあり、このガイドは古い情報となりました
気力があれば近いうちにまた新しいガイドを作ろうと思いますが、Steamガイドは謎に画像が消失することが多々あるので、新しいガイドを作る場合はGithubPagesの方で公開する予定です
coleto66a 5 Oct, 2023 @ 5:27am 
初めまして。お礼の書き込みです。
他の製作者様のMODをローカルで自分の趣味に変える程度なのですが、
大変に参考になりました。本当にありがとうございます。