MOD/Event Edit/Read・Write のバックアップの現在との差分(No.1)


[[MOD]]
#ここも整理の対象になりうると思うが…
#contents

*DDイベントの編集・追加の方法 [#bd0d1fc0]
DDでは、イベントはエディタでは編集できません。
自分がローマ帝国イベント作ったりしたときの苦労を考え、
多くの人がMODを作りやすいようにイベントデータの読み方や書き方の情報を
ここに書きたいとおもいます。

**イベントの読み方 [#b6263e44]
まず、C:\Program Files\Paradox Interactive\Doomsday\db\eventsのgermany.txtを開いてみましょう。最初のイベントはラインラント進駐のものです。


 	event = {
  		id = 2000
	 	random = no
	 	country = GER
 		trigger = {
		ai = no
	 		NOT = {
	 			war = { country = GER country = FRA }
 				alliance = { country = GER country = FRA }
 			}
 			garrison = { country = GER province = 75 size = 1 }
 		}
 	 	
 		name = "EVT_2000_NAME"
 		desc = "EVT_2000_DESC"
 		style = 0
 		picture = "Rhineland"
 	 	
 		date = { day = 0 month = january year = 1936 }
 		offset = 1
 		deathdate = { day = 30 month = december year = 1947 }
 	 	
 		action_a = {
	 		name = "OK"
	 		command = { type = relation which = FRA value = -15 }
	 		command = { type = relation which = ENG value = -5 }
	 		command = { type = relation which = BEL value = -10 }
 			command = { type = relation which = HOL value = -5 }
	 		command = { type = belligerence which = GER value = 5 }
	 		command = { type = dissent value = -2 }
	 		command = { type = money value = 500 }
	 		command = { type = peacetime_ic_mod value = 10 }
	 		command = { type = manpowerpool value = 50 }
	 		command = { type = trigger which = 51 } # UK Gears up for war
	 		command = { type = trigger which = 52 } # France Gears up for war
	 		command = { type = sleepevent which = 2060 }
	 		command = { type = domestic which = defense_lobby value = 1 }
	 	}
	 	}

色々書いてあって分かりづらいでしょうが、ここで押さえておきたいのは「全てのパラメータは{}で括られている」ということです。
詳細はC言語などの解説ページにお任せするとして、''「{」の内容は必ず対応する「}」で括られなければならない''ことを覚えていてください。

特に見落としやすいのが最初のevent = {に対応する括弧。対応する}は最後の最後に置かれるため、}の総数に注意してください。
もし導入してエラーが出たならば、まず最初に不必要な}があったり、逆に足りなかったりしている}を疑いましょう。

***ID [#be5307de]
まず最初に id = 2000 とあります。各イベントにはIDが割り振られており、改変・追加する際にはIDが重複しないようにしましょう。またMOD製作時は他MODとID重複しないように使用イベントIDをReadMeなどに記しておきましょう。

***random [#h0f64ef7]
random = noとはランダムイベントでないことを意味します。noをyesに変えるとランダムイベント扱いになり、条件を満たしているときに低確率で何回でも発生します。
これを省略すると、非ランダムイベント扱いとなります。

***invention [#s3c22094]
invention = yesの一行を追加すると、発明イベント扱いとなります。
発明イベントはランダムイベントと同様に条件を満たすと低確率で発生しますが、一度しか発生しません。
ゲーム中では秘密兵器の解禁イベントに使用されています。

***country [#ncf1ac77]

つぎにcountry = GERとはイベントが発生する国です。この行を削除すると、後述するトリガーを満たせば他の国でも発生するようになります。

***trigger [#m258a4a0]
トリガーを設定することで、イベント発生条件を詳細に設定できます。
トリガー内にはAND、OR、NOTの条件を入れ子構造で指定することができます。
なお、これらの指定が無く条件を並列で書いた場合は、通常はANDとして、NOT内ではORとして処理されます。

		trigger = {
		ai = no
	 		NOT = {
	 			war = { country = GER country = FRA }
				alliance = { country = GER country = FRA }
			}
			garrison = { country = GER province = 75 size = 1 }
		}
	 	
(size=1はdivisionの数)
この場合のトリガーは
1.発生国がAI操作でない(ai = no)
2.「ドイツとフランスが戦争中、または同盟中」ではない(NOT = {以下3行)
3.75番のプロビンス(ケルン)にドイツの部隊が存在する(garrison = {行)
となり、
country = GERと後述するイベント発生期間を満たすとイベントが起きます。

[[トリガーリスト>MOD/イベントトリガーリスト]]
***テキスト・ピクチャー [#p420ae45]

 		name = "EVT_2000_NAME"
 		desc = "EVT_2000_DESC"
 		style = 0
 		picture = "Rhineland"

とありますが、これはイベント発生時に画面に出てくる文章・ピクチャーを設定してます。
C:\Program Files\Paradox Interactive\Doomsday\configフォルダにあるデフォルトのCSVファイルに収納された文章が実際には出てきます。ただし、対応する文章がCSVファイルに無い場合はイベントファイルの文章がそのまま出てきます。
改変するときはEVT_2000_NAME EVT_2000_DESCをそれぞれ好きな文章にするとよいでしょう。
ピクチャーはC:\Program Files\Paradox Interactive\Doomsday\gfx\events_picsに収納されており、「.bmp」の拡張子は不必要です。bmp以外の画像形式は使用できません。
style = 0はイベントダイアログの外枠を決定しますが、HoI2にはダイアログが1種類しかないので意味の無いものになっています。(訳注:EU2などでは複数のダイアログスタイルを指定できる。)

***アクション [#pbe66388]

アクションの部分には、
1.アクションボタンに表示する文字列
2.選択肢が複数ある場合は、選択肢ごとのAIが選ぶ確率
3.コマンド(イベント発生時の効果)
が書かれています。

1.にあたるのが「name = "OK"」の部分で、ボタンに表示する文字列が「OK」となります
2.にあたるのが「ai_chance = **」で**の部分に1から100の数字をいれ、何%でAIがその選択肢を選択するか設定できます。通常「name = ***」の次の行に入れます。これが無い場合は、デフォルトの選択率が適用されます。
3.にあたるのがcomannd = [****]にあたる部分で、その選択肢を選択した場合***の内容が実行されます


[[コマンドリスト>MOD/イベントコマンドリスト]]
**イベントの書き方 [#y30a55d6]

どんなイベントを書こうか迷い、結局ドイツの戦争準備イベントを作ることにしました。
方針は「技術の枢軸」・「人的資源の共産」・「物量(工業力)の連合」を目指す方向で。

イベントは元々あるイベントファイルに追加してもいいのですが、MODとしての特性を生かせるように別ファイルにします。

***イベントファイルの定義 [#z40f6147]

まずは新しくC:\Program Files\Paradox Interactive\Doomsday\db\eventsに000.txtのファイルを作ります。(中身は空でOK)
この000.txtに新たにイベントを追加すればいいわけですが、DD本体がこのイベントファイルを読み込むように設定しなければなりません。

そのためにはまず、C:\Program Files\Paradox Interactive\Doomsday\dbのevents.txtの末尾に
	event = "db\events\000.txt"
を追加します。
これで000.txtをDD本体が読み込むようになりました。

***イベントの雛形の作成 [#a39da37a]

先ほど解説のために例として挙げたラインラント進駐イベントを参考にイベントファイルを作ってみます。
設定するのは大きく
1.イベントID
2.イベント発生条件
3.イベントの効果
です。
イベントIDは他のイベントと重複していると発生しなくなるので、誰も使わないIDを割り当てるといいでしょう。
MODとして配布する場合は使用してるイベントIDを明記するとよいでしょう。
ということでIDは2340001から2349999を使うことにします。(2349999まで使うとは思えませんが)

では雛形を

	event = {
		id = 2340001
		country = GER
		name = "Title"
		desc = "sentence"
		style = 0
		picture = "Rhineland"
		date = { day = 0 month = january year = 1936 }
		offset = 1
		deathdate = { day = 30 month = december year = 1947 }
		action_a = {
			name = "OK"
			ai_chance = 0
			command = { type = X }
		}
		action_b = {
			name = "Nothing to change"
			ai_chance = 100
			command = { type = dissent value = -2 }
		}
	}

イベントを新しく作る際にはこの雛形を流用していくことにします。
action_aとaction_bがあることで選択肢形式のイベントです。
(通常プレイの邪魔にならないように作りました)
選択肢を増やすにはaction_c、action_dと、最大4つまで増やせます。
今回作るイベントはドイツの戦時体制移行のifイベントですので、AIが操作時は比較的影響の少ない選択肢Bを100%選択するように、
action_aには「ai_chance = 0」があり、
action_bには「ai_chance = 100」があります。
(ai_chanceの値を変える事で**%でAIが選択という感じに変えられます)
不思議世界を堪能したいときはaction_aとaction_bのai_chanceを変更するといいでしょう

***イベントフラグを立てる [#j5737816]

イベントはそれぞれ単体で動作させてもいいのですが、
今回はイベントの形式として最初にIFイベントを起こすかどうかを選択し、
その後フラグを参考に各種イベントを連鎖的に起こす方法を採ることにしました。
そうすることで、最初のフラグを立てるイベントのai_chanceを変更することでAI担当時の不思議世界突入率を変えたり、IFイベントを起こしたくない場合は、最初のフラグ立てるかどうかのイベントでフラグを立てなければ以後発生しなくなり、
色々便利になります。

まずはフラグを立てるイベントを雛形から作ってみた結果を。


	event = {
		id = 2340001
		random = no
		country = GER
		name = "Special Gearing up for war in germany."
		desc = "We do Special Gerring up for war? if you want, choose [OK]"
		style = 0
		picture = "Rhineland"
		date = { day = 0 month = january year = 1936 }
		offset = 1
		deathdate = { day = 30 month = december year = 1947 }
		action_a = {
			name = "OK"
			ai_chance = 0
			command = { type = setflag which = ifevent }
		}
		action_b = {
			name = "Nothing to change"
			ai_chance = 100
			command = { type = dissent value = -2 }
		}
	}

まず
		name = "Special Gearing up for war in germany."
		desc = "We do Special Gerring up for war? if you want, choose [OK!]"
の部分には自分で好きな文章をいれることで好きなタイトルとコメントが表示されます。(必ず""でくくること)

で選択肢A(OK)を選択した場合
			command = { type = setflag which = ifevent }
が実行され、ifeventというグローバルフラグが立ちます。
AIがドイツ担当時はai_chance = 100となってる選択肢Bを選択し、
国民不満度が-2される結果となります。
(ドイツがAIの場合に不思議ワールドを堪能したいときは選択肢AとBのai_chance を逆転させましょう)

あと、
		picture = "Rhineland"
がラインラント進駐のままになってますが、面倒なのでそのままにしてます。

***閣僚変更イベント [#n5099c0a]

次は閣僚を変更させます。Ifイベントなので、登場年に達してない閣僚も登場させます。

登場させるのは
リサーチ速度の上がる情報大臣Wilhelm Frick(1944登場:id=137)
マンパワー増加修正のある国防大臣Walter Buch(1937登場:id=226)
ICが5%増加で、工業研究の時間とコストが10%減になる軍需大臣Franz Xavier-Schwarz(1936登場:id=84)
です。
登場年に達してないのに登場してるのは、能力主義のドイツとういことで脳内補完する方向で。


雛形を参考に作ったイベントスクリプトを。
	event = {
		id = 2340002
		random = no
		country = GER
		trigger = {
				flag = ifevent
		}
		name = "Special Gearing up for war. Minister changing"
		desc = "We have to change minister to prepare for war"
		style = 0
		picture = "Rhineland"
		date = { day = 0 month = january year = 1936 }
		offset = 10
		deathdate = { day = 30 month = december year = 1947 }
		action_a = {
			name = "OK"
			ai_chance = 90
			command = { type = armamentminister which = 84 }
			command = { type = ministerofsecurity which = 226 }
			command = { type = ministerofintelligence which = 137 }
		}
		action_b = {
			name = "Nothing to change"
			ai_chance = 10
			command = { }
		}
	}

トリガーとして先ほど設定したフラグ「ifevent」が立っているかを
		trigger = {
				flag = ifevent
		}
で判断してます。
(ifeventのフラグが立っている場合はそのほか日時や国の指定を満たすとイベントが発生する)

閣僚を変えるコマンドは
			command = { type = armamentminister which = 84 }
			command = { type = ministerofsecurity which = 226 }
			command = { type = ministerofintelligence which = 137 }
になります。
この閣僚変更コマンドは登場年に達してない閣僚でも登用できます。
ただし、政治体制(National Socialist)とあまりにかけ離れていると、すぐクビになる可能性があるので注意。

action_bは変えない場合の選択肢です。
(action_bにも何かしらコマンドをいれないと選択肢そのものが表示されないので、空コマンドをいれてます)

あと
		offset = 10
はイベント発生条件を満たしているかどうかのチェックの頻度となります。(小さいほど頻繁にチェックする


***戦時体制移行イベント [#o441d9be]

WW2の各国の戦時体制移行の具合をDDやHOI2では平時のICのマイナス修正で表現してます。

枢軸国が他国を併合したりするイベントが発生すると英・仏の平時のICマイナス補正が減少し、ドイツや日本の闘争性があがったり枢軸国がメキシコと同盟したりすると米のICマイナス補正が減少し、連合国の実質ICが増加します。

今回のIFイベントでは枢軸の政治体制や他国の併合をいれており、そのままでは枢軸側が圧倒的に有利になってしまうので、それらのイベントでOKを選択した場合に連合と共産陣営の工業力を増加させる(ICマイナス補正を解除する)イベントを発生させることにします。
ついでに、日・伊にも+補正をかけ、ドイツ単体では連合・共産陣営に敵わない状況を作り出したいと思います。

まずは英仏米の戦時体制移行イベントを。

	event = {
		id = 2340101
		random = no
		country = ENG
		persistent = yes
		name = Gearing up for war 
		desc = Gearing up for war 
		picture = "factory"
		style = 0
		trigger = {
			NOT = {
				war = { country = GER country = ENG }
			}
		}
		action_a = {
			name = OK
			command = { type = peacetime_ic_mod value = 20 }
			command = { type = domestic which = defense_lobby value = 1 }
			command = { type = manpowerpool value = 50 }
		}
	}
このイベントは枢軸のイベントと連鎖的に発生させるので、
発生国・ランダムイベントでない・ドイツと戦争中でないの3つの条件にしています。

''(2006/5/23追加)''
戦時体制移行イベントで特筆すべきことは
		persistent = yes
の部分で、通常発生済みのイベントは再度発生させるのは無理なのですが、
(チートコードで発生させても、見かけ上発生してるだけで効果が現れない)
この一行を加えることで繰り返し発生することができます。
''(追加部分終わり)''

発生するコマンドは
			command = { type = peacetime_ic_mod value = 20 }
			command = { type = domestic which = defense_lobby value = 1 }
			command = { type = manpowerpool value = 50 }
で平時のIC補正+20%、ディフェンスロビーにスライダーをひとつ移動(左寄り)、マンパワー+50の効果です。

イベントIDはわかりやすいように2340101〜2340106を使うことにしました。
同様にして、
2340102にはENG>>FRA
2340103にはENG>>USA
2340104にはENG>>SOV
に変えたものをつくり、仏・ソ・米の戦時体制移行イベントを作りました。

次に伊・日の戦時体制移行イベントですが、
日本とイタリアは戦争中であることが多く平時のIC補正を変更しても戦争中や戦争が開始されたら解除されてしまうので、直接ICを増加させることにします。
具体的には
	event = {
		id = 2340105
		random = no
		country = JAP
		name = Gearing up for war 
		desc = Gearing up for war 
		picture = "factory"
		style = 0
		action_a = {
			name = OK
			command = { type = free_ic value = 20 }
			command = { type = free_metal value = 20 }
			command = { type = free_energy value = 40 }
			command = { type = free_rare_materials value = 15 }
			command = { type = domestic which = defense_lobby value = 1 }
			command = { type = manpowerpool value = 50 }
		}
	}
といった感じです。
	command = { type = free_ic value = 20 }
がIC増加でマップ外からのIC増加分です。(全土を占領されてもIC20残る)
IC増加だけでは資源不足に陥るので鉄・石炭・レアマテリアルも増加させました。
レアマテリアルのマップ外収入はtype = free_rare_material''s''ですが付属のevent commands.txtにはtype = free_rare_materialと誤って書いてありますので注意。

同様にして日本の戦時体制移行イベントのidを2340106に、JAPの部分をITAに変更してイタリアバージョンを作りました。

余談ですが、type = add_prov_resourceを利用すれば好きな場所に好きな資源の増加をイベントとして組み込むことができます。
その場合、which = のあとにプロビンスのid、value = のあとに増加量、where = のあとにenergy/metal/oil/rare_materialsのいずれかを入れます。(which  = -1でランダムのプロビンスに、-4で核施設のプロビンスが指定されます。)


***政治体制変更イベント [#d1ef93e5]

そろそろ慣れてきたと思うので、イベント文をいきなり貼り付けます。


	event = {
		id = 2340003
		random = no
		country = GER
		trigger = {
				flag = ifevent
		}
		name = "Special Gearing up for war. Political decision."
		desc = "We have to change the Political system."
		style = 0
		picture = "Rhineland"
		date = { day = 0 month = january year = 1936 }
		offset = 10
		deathdate = { day = 30 month = december year = 1947 }
		action_a = {
			name = "Quality is most important!"
			ai_chance = 90
			command = { type = domestic which = free_market value = 10 }
			command = { type = domestic which = professional_army value = 10 }
			command = { type = domestic which = defense_lobby value = 10 }
			command = { type = domestic which = interventionism value = 10 }
			command = { type = trigger which = 2340101 }
			command = { type = trigger which = 2340102 }
			command = { type = trigger which = 2340103 }
			command = { type = trigger which = 2340104 }
			command = { type = trigger which = 2340105 }
			command = { type = trigger which = 2340106 }
		}
		action_b = {
			name = "Quantity is most important"
			ai_chance = 10
			command = { type = domestic which = free_market value = -10 }
			command = { type = domestic which = professional_army value = -10 }
			command = { type = domestic which = defense_lobby value = 10 }
			command = { type = domestic which = interventionism value = 10 }
			command = { type = relative_manpower value = 25 }
			command = { type = trigger which = 2340101 }
			command = { type = trigger which = 2340102 }
			command = { type = trigger which = 2340103 }
			command = { type = trigger which = 2340104 }
			command = { type = trigger which = 2340105 }
			command = { type = trigger which = 2340106 }
		}
		action_c = {
			name = "Nothing to change"
			ai_chance = 0
			command = { }
		}
	}

メインは選択肢Aで、市場経済・常備軍・ディフェンスロビー・干渉主義に+10(左寄り)に傾けてます。
type = domestic which =のあとに、
democratic/political_left/free_market/freedom/professional_army/defense_lobby/interventionismの変更したい政治スライダーをいれ、valueに変更する値(正の値で左寄り)を入れることで、政治スライダーをイベントでうごかせます。

このイベントよってドイツの生産能力が一気に上がるので、バランスを取るため、
選択肢AとBを選択時に各国の戦時体制移行イベントを発動させ、
各国の生産能力を向上させることにします。
書式は
	command = { type = trigger which = 2340101 }
で、2340101がイベント発生条件を満たす場合([[戦時体制移行イベント参照>#o441d9be]])、強制的に2340101のイベントが発生します。

選択肢Bは統制経済・徴兵軍・ディフェンスロビー・干渉主義に+10で、人的資源がきつくなるとおもうので、
	command = { type = relative_manpower value = 25 }
というマンパワーの収入増加補正(25%)をつけています

***中核州追加イベント [#vca4ed16]

工事中


*MOD配布コーナー(今はまだ未完成品) [#a0c2aa13]

作成中のイベントMODは[[こちら>http://hayasoft.com/hiko/paradox/other/source/up0793.rar]]

現在
-フラグ発生イベント
-閣僚変更イベント
-政治体制スライダー変更イベント
-コアプロビンス追加イベント
-英仏ソ米日伊の戦時体制移行イベント
-工業化イベント
-早期オーストリア併合
を実装

完成したら再度UPします。