条件イベント概要

条件イベント概要

条件イベントでは、特定の条件に当てはまる状態になった場合に、あらかじめ指定したメッセージや効果を発生させることができる。 この条件イベントを駆使することで、さまざまな効果を発生させることができる。

例:
1.ある年がきたら、メッセージを表示する
2.ある城を攻略したら、城の名前を改名する
3.ある勢力を滅ぼしたら、他の勢力が臣従する

ひとつの条件イベントにつき、最大50個の条件・50個の効果をつけることができる。 また、条件イベント数の上限は1000である。

条件イベントでは、まず、発生条件を設定する。

発生条件には「全て成立したときにイベント発生」と、「一つでも成立したときイベント発生」の2種類ある。

「全て成立したときにイベント発生」を選ぶと、指定した条件が全部成立したときのみイベントが起きる。(すなわち「条件Aかつ条件Bかつ条件Cが成り立つとき・・・」) 「一つでも成立したときイベント発生」を選ぶと、1行でも条件が満たされれば、他の行で条件が満たされていなくてもイベントが起きる。(すなわち「条件Aか、条件Bか、条件Cのどれかが成り立つとき・・・」)

問題になるのは、両方を混在した条件でイベントを発生させたいときである。 たとえば、「ユーザーが大名Aを担当していて、かつ、城Bまたは城Cを所有したとき」にイベントを起こしたいとする。この場合、一つの条件イベントでは記述できない。 このような場合は二つの条件イベントと変数を使用することになる。

条件イベント1(一つでも成立したとき)
 条件:・ユーザー大名が城Bを所有
    ・ユーザー大名が城Cを所有
 イベント:変数 UserSyoyuFlg に 1 を代入
条件イベント2(全て成立したとき)
 条件:・UserSyoyuFlg = 1 
    ・ユーザーが大名Aを担当
 イベント:~

条件イベントでは、条件が成立したときにメッセージを表示することができる。

特徴

  • 1.メッセージがなにもないときは、条件が成立しても画面にメッセージウィンドウは表示されない。
  • 2.%大名(変数名)% や %城(変数名)% 、%武将(変数名)%、 %(変数名)% という形で、表示する内容を動的に変えることができる。
  • 3.一つのメッセージは最大5000文字まで。(改行は2文字とする)

特徴1により、メッセージのないイベントを作ることができる。たとえば、特定条件が成立したときに、ユーザーにはなにも知らせずに変数の値を変更するということができる。

特徴2は、うまくつかうと便利。とくに、大名名や城名が改名するシナリオの場合は必須であろう。 たとえば、前もって変数DaimyouNoに#大名番号(D_ODA) をセットしておいて、メッセージに「%大名DaimyouNo%は勢力が拡大した」と設定すると、実行時に「織田家は勢力が拡大した」と表示される。 注意点としては、変数に値がセットされていないと%大名DaimyouNo%がそのまま表示されてしまう。 また、変数に存在しない大名番号をセットすると、実行時には「???」になってしまう。 城についてもおなじ使い方ができる。 %(変数名)% を使った場合は、実行時に変数の値がそのまま表示される。小数点以下に数字がある場合、小数点以下4桁まで表示される。

%武将(変数名)%を使う場合は、武将番号は毎ターン変化することに注意が必要である。

条件イベントでは、城や武将、大名の改名や、武将の所属変更・移動・石高変更など多くのことができる。

注意点

  • 1.石高や経済の「増加」はできるが、直接の値の指定はできない
  • 2.変数に値を代入する場合に数式を使うことができる

たとえば、城Aの石高を10000にしたいとしても、「城Aの石高を式1の値にする」という発生イベントはない。あるのは「城Aの石高に式1の値を増加させる」という発生イベントのみである。最大石高が10000ならばよいのであるが、10000を超える場合は次の手順を踏む。

・城Aの石高に式1の値を増加させる 式1:-999999
・城Aの石高に式1の値を増加させる 式1:10000

つまり、最初の発生イベントでマイナス999999だけ城Aの石高を増やす(=999999だけ石高を減らす)が、石高の最小値はゼロのため、石高はゼロになる。 そして、次の発生イベントで石高ゼロに10000を加算して、城Aの石高は10000になる。

カッコや四則演算も使える。 ただし、ゼロで割り算を実行するとエラーになるので、注意。

変数とは、値をいれる箱である。たとえば、「変数aaaに10を代入」というのは、「aaaという箱に10という数字を入れる」ということである。また、「変数aaaに変数bbb*3」を代入というのは、「bbbという箱に入っている数字に3をかけた結果をaaaという箱に入れる」ということになる。 つまり、同じ名前の変数でも、そこまでの経過によって、中に入っている値は異なる場合があるのである。

普通、プログラミング言語では文字型や整数型などがあるが、戦国史では、数字型(実数型)の変数のみ使える。実数型とは、小数点以下も表示するということである(「10÷4」を変数cccに代入した場合、変数cccには「2」ではなく「2.5」が入る)。 プログラムを作る場合、変数がバグ(不具合)の原因になることが多い。戦国史でも、変数名のタイプミスや代入式のミスにより、バグが発生することがあるので注意が必要である。おかしい動きをした場合は条件イベントの表示のときに「変数一覧」ボタンを押すと各変数の中の値が表示されるので、ここから不具合の調査をすることになる。 戦国史では、変数は、石高や兵士数の保持、ある月からのカウント、イベントが発生したかどうかのフラグ処理などに多く使われることになるであろう。

また、変数名には内容を想像できるような名前の付け方をしたほうがよい。たとえば、ある武将が死亡した場合にある変数に1をセットする場合、変数「abc」に1を代入するより、変数「SibouFlg」に1を代入したほうが良いということである。

配列変数とは、文字通り変数に配列を持たせたものであり、変数にインデックス(ポインタのようなもの)を持たせることができる。ひとつの変数の中をたくさんの部屋に区切って、いろいろな値を入れることができるようになったものとイメージするとよい(インデックスが部屋の番号)。

書式は 配列変数名[インデックス]  という形で使用できる。

インデックスは0~30000までが指定可能。使い道としては、大名ごとに何かパラメータを持たせたり、城ごとにパラメータを持たせたりとすることができる。なお、武将番号は前述の通り変動するので、配列に武将ごとのパラメータを持たせるという用途では使用できない。

例:shiro_daimyou[shiro_number] = #城支配大名(shiro_number)

条件イベントでは大名・城・武将についてループ処理によって繰り返し処理を行うことができる。ループ処理では、次のように動作する(例として大名のループ処理を行う)。

まず、ループ変数に最初の大名番号(=1)がセットされ、その条件イベントが実行される。その条件イベントの処理が終了したら、ループ変数に次の大名の大名番号(=2)がセットされ、ふたたびその条件イベントが実行される。 これが全大名の数だけ繰り返される。

城・武将についても同様である。ただし、武将のループの場合、その時点でシナリオに登場している武将数だけループを行うので注意が必要である。

条件イベントの発生時期に「サブルーチン」を指定すると、ほかの条件イベントから呼び出されない限り実行されない。サブルーチンは、何回も同じような発生イベントをつくるときや、条件イベントをわかりやすくしたいときに役立つ。

サブルーチンからサブルーチンを呼び出すこともできる。また、自分自身を呼び出すこともできる(無限ループにならないように注意する必要がある)。

関数は、プログラミング言語やエクセルなどの表計算ソフト等で使われている。 関数というのは、「Aという値を渡して実行したらBという値に置き換わるもの」である。

たとえば、戦国史では#石高順大名という関数があるが、#石高順大名という関数に1という値を渡して実行すると石高順が1位の大名の大名番号が取得できる。なお、関数に渡す値を引数(ひきすう)という。引数に4を渡せば、石高順が4位の大名の大名番号を取得できる。

実際に使ってみる。

発生条件1:データA=データB  データA:#Month  データB:1
発生回数:「何度でも発生」
発生イベント1:変数(データ1)に演算式(データ2)を代入 
                 データ1:Daimyou1 
                 データ2:#石高順大名(1)
発生イベント2:大名1と他の全大名を宿敵化 
                 大名1:(ダブルクリックしてマップの城以外をクリック)Daimyou1
発生時メッセージ 「%大名Daimyou1%は他の全大名と宿敵になった」

簡単な包囲網イベントである。まず、発生条件1で関数#Monthを使っている。この関数は引数がない。毎回実行するたびに現在の月に置き換わる。3月ならば「3」となる。発生条件1では#Month = 1 となる場合にイベントが発生することになるので、つまり、毎年1月にイベントが発生することになる。

発生イベント1で、変数Daimyou1に石高順が1位の大名の大名番号をセットする。そして、発生イベント2で大名番号がDaimyou1の大名について、他の全大名と宿敵になる。 また、メッセージでどの大名が全大名と宿敵になったかを表示している。   実際に包囲網イベントをつくるには、もっと細かい制御(2年連続で同じ大名が石高順1位の場合はイベントを実行しないようにしたり)が必要だが、基本的にはこのような形になる。

「(条件には無関係)」の代入式

条件イベントの条件区分では、基本的には「~のとき」という条件を設定するが、例外的に変数に式の値を代入することができる。それが「変数に演算式を代入(条件には無関係)」というものである。 実は、この「条件には無関係」というのが誤解しやすい点で、場合によっては条件と関係あるのである。

たとえば、次のような二つの条件イベントを作成する。

条件イベント1
(全て成立したときイベント発生)
・変数に演算式を代入(条件には無関係)  データA:aaa データB:11
・データA=データB  データA:1 データB:2
・変数に演算式を代入(条件には無関係)  データA:bbb データB:22

条件イベント2

・メッセージ「%aaa% %bbb%」を表示

戦国史を動かしてみると、変数aaaの値は「11」と表示されるが、変数bbbの値は表示されない。 つまり、変数bbbに値はセットされていないのである。 この原因は、戦国史は「全て成立したときイベント発生」の場合、上から順番に条件を検討し、成立しないものが一つでもあれば、そこから先はなんら評価しないためである。 逆に、「一つでも成立したときイベント発生」にした場合は、成立したものが一つでもあれば、そこから先の条件は評価せず、イベントが発生してしまう。

このように、「変数に演算式を代入(条件には無関係)」とあっても、実際には代入処理が行なわれないことがあるので、注意が必要である。

変数名について

条件イベントの変数名は、実はアルファベットの大文字と小文字を区別する。すなわち、変数AAAと変数aaaは別物ということである。 また、ぜんぶ全角文字の変数は使えないようである(エラーになる)。ただし、「A_あいうえお」という変数は使えるようである。どうやら、最初の文字が全角文字だとエラーになるということのようである。複雑な処理の変数は日本語を使うのもいいかもしれない。

条件「質問文(データB)を表示し、YES(NO)が選択された」の使い方について

質問文の表示は、イベント発生条件を満たせば、状況に関係なく発生する。つまり、イベントの対象となる勢力が非プレイヤー勢力でも質問が表示され、その答えに応じたイベント処理が行われることになる、プレイヤーが自分の都合でCOM勢力の展開を操作できてしまうことになる。 そのため、このイベント条件を使う場合には「大名Aがプレイヤー担当」を組み合わせて使う必要がある。

  #Random            実数で0~1.0の間の乱数を返す
  #Year             現在の年を返す
  #Month            現在の月を返す
  #Edition           戦国史FEなら0、戦国史SEなら1を返す 
  #生存大名家数          生存している大名家数を返す
  #生存独立大名家数        生存している独立大名家数を返す
  #石高順大名(順位)       臣従込み石高が指定の順位(1番から指定)の大名家番号を返す (注:指定の順位の大名がいない場合はエラーになる)
  #石高順独立大名(順位)     臣従込み石高が指定の順位(1番から指定)の独立大名家番号を返す (注:指定の順位の大名がいない場合はエラーになる)
  #直轄石高順位大名(順位)    直轄石高が指定の順位(1番から指定)の大名家番号を返す (注:指定の順位の大名がいない場合はエラーになる)
  #ランダム大名         生存する大名家番号をランダムに返す
  #ランダム独立大名       生存する独立大名家番号をランダムに返す
  #ランダム上位大名(順位)    臣従込み石高が指定の順位以内の大名家番号をランダムに返す
  #ランダム上位独立大名(順位)  臣従込み石高が指定の順位以内の独立大名家番号をランダムに返す
  #プレイヤー大名        プレイヤー大名の大名家番号を返す
  #大名番号(大名家ID)      指定した大名家IDの大名家番号を返す
  #城番号(城ID)         指定した城IDの城番号を返す
  #城支配大名(城ID or 番号)   城を支配する大名家番号を返す
  #城包囲大名(城ID or 番号)   城を包囲する大名家番号を返す(非包囲なら0を返す)
  #城武将数(城ID or 番号)    城内に居る武将数を返す
  #城包囲武将数(城ID pr 番号)  城を包囲する武将数を返す
  #主家大名(大名家ID or 番号)  主家(独立大名なら自分自身)の大名家を返す
  #大名家武将数(大名家ID or 番号)    大名家(臣従大名含む)の武将数を返す(捕虜は含まない)
  #大名家直属武将数(大名家ID or 番号)  大名家(臣従大名含まない)の武将数を返す(捕虜は含まない)
  #城数(大名家ID or 番号)    大名家(臣従大名含む)の城数を返す
  #直轄城数(大名家ID or 番号)  大名家(臣従大名含まない)の城数を返す
  #石高(大名家ID or 番号)    大名家(臣従大名含む)の石高を返す
  #直轄石高(大名家ID or 番号)  大名家(臣従大名含まない)の石高を返す
  #経済(大名家ID or 番号)    大名家(臣従大名含む)の経済を返す
  #直轄経済(大名家ID or 番号)  大名家(臣従大名含まない)の経済を返す
  #足軽兵数(大名家ID or 番号)  大名家(臣従大名含む)の足軽兵数を返す
  #直轄足軽兵数(大名家ID or 番号)  大名家(臣従大名含まない)の足軽兵数を返す
  #騎馬兵数(大名家ID or 番号)    大名家(臣従大名含む)の騎馬兵数を返す
  #直轄騎馬兵数(大名家ID or 番号)   大名家(臣従大名含まない)の騎馬兵数を返す
  #鉄砲数(大名家ID or 番号)    大名家(臣従大名含む)の鉄砲数を返す
  #直轄鉄砲数(大名家ID or 番号)  大名家(臣従大名含まない)の鉄砲数を返す
  #従属大名家数(大名家ID or 番号)  大名家の従属大名家数を返す
  #臣従大名家数(大名家ID or 番号)  大名家の臣従大名家数を返す
  #資金(大名家ID or 番号)     大名家の資金を返す
  #航海技術(大名家ID or 番号)   大名家の航海技術を返す
  #鉱山技術(大名家ID or 番号)   大名家の鉱山技術を返す
  #城(武将ID or 番号)       武将の居る(または包囲している)城番号を返す (注:死亡している場合は最後に居た城番号を返す)
  #包囲中(武将ID or 番号)     武将が包囲中なら1を、それ以外なら0を返す
  #所属大名(武将ID or 番号)   武将の所属大名家番号を返す (注:死亡している場合は0を返す。)
  #当主城(大名家ID or 番号)    大名家の当主の居る(または包囲している)城番号を返す
  #捕虜大名(武将ID or 番号)    武将が捕虜ならば拘束している大名家番号を返す(捕虜でなければ0を返す)
  #人質大名(武将ID or 番号)    武将が人質ならば拘束している大名家番号を返す(捕虜でなければ0を返す)
  #武将足軽兵数(武将ID or 番号)  武将の足軽兵数を返す
  #武将騎馬兵数(武将ID or 番号)  武将の騎馬兵数を返す
  #武将鉄砲兵数(武将ID or 番号)  武将の鉄砲数を返す
  #統一成立            統一が成立したら1を、それ以外なら0を返す
  #Round(数値)           小数点以下を四捨五入
  #Floor(数値)           小数点以下を切捨て
  #Ceil(数値)           小数点以下を切り上げ
  変数(データ1)に演算式(データ2)を代入
  変数(データ1)に演算式(データ2)を加算
  武将1をデータ1に改名
  城1をデータ1に改名
  大名1をデータ1に改名
  大名1が独立
  大名1の従属・臣従大名が全て独立
  武将1強制死亡
  武将1強制登場
  大名1と大名2を宿敵化
  大名1と大名2を強制宿敵化(主家の同盟関係無視)
  大名1と大名2を宿敵解除
  大名1と他の全大名を宿敵化
  大名1と他の全大名を宿敵解除
  大名1と大名2を不戦同盟(非独立大名でも強制締結)
  大名2が大名1に従属
  大名2が大名1に臣従
  大名1が大名2の城を全て併呑(大名2は滅亡)
  大名1が大名2の城と武将を全て併呑(大名2は滅亡)
  武将1の足軽兵数にデータ1を加算
  武将1の騎馬兵数にデータ1を加算
  武将1の鉄砲数にデータ1を加算
  大名1の全武将の足軽兵数にデータ1を加算
  大名1の全武将の騎馬兵数にデータ1を加算
  大名1の全武将の鉄砲数にデータ1を加算
  武将2の能力値を武将1にコピー
  城1の最大レベルをデータ1に変更
  城1の最大石高をデータ1に変更
  城1の最大町経済をデータ1に変更
  城1の最大鉱山をデータ1に変更
  城1のレベルにデータ1を加算
  城1の石高にデータ1を加算
  城1の町経済にデータ1を加算
  城1の鉱山にデータ1を加算
  城1の民衆支持にデータ1を加算
  城1の守備兵数にデータ1を加算
  城1の兵糧にデータ1を加算
  城1の交易船数にデータ1を加算
  大名1の全城のレベルにデータ1を加算
  大名1の全城の石高にデータ1を加算
  大名1の全城の町経済にデータ1を加算
  大名1の全城の鉱山にデータ1を加算
  大名1の全城の民衆支持にデータ1を加算
  大名1の全城の守備兵数にデータ1を加算
  大名1の全城の兵糧にデータ1を加算
  大名1の全城の交易船数にデータ1を加算
  大名1の行動タイプを標準に変更
  大名1の行動タイプを移動・出陣なしに変更
  大名1の行動タイプを出陣なしに変更
  武将1を大名1の所属に変更
  城1を大名1の領地に変更
  季節イベント(データ1:季節イベントID)発動
  城1の城タイプをデータ1(城タイプID)に変更
  城1の包囲軍を撤退させる
  大名1の城を攻める包囲軍を撤退させる
  大名1が他家を攻める包囲軍を撤退させる
  武将1の相続権所有大名家を大名1に変更
  武将1(未登場)の登場城を城1に変更
  武将1の継承順位をデータ1に変更
  武将1を強制的に当主にする
  大名1の資金をデータ1にする
  武将1を城1に強制移動
  ゲーム終了(統一メッセージなし)
  ゲーム終了(大名1の統一メッセージあり)
  サブルーチン呼び出し(データ1:条件イベントID)
  閲覧専用形式でセーブ
  質問文と選択肢(データ2:'/'区切り)を表示し、選択結果を変数(データ1)に代入
  質問文(データ2)を表示し、数値入力結果を変数(データ1)に代入
  通常時BGMを指定のファイル(データ1)に変更
  合戦時BGMを指定のファイル(データ1)に変更
  マップ使用エリア変更(データ1にカンマ区切りで数値4つ)
  城1情報閲覧可否(データ1) 0=不可 1=可 2=プレイヤー包囲中可 3=城非表示(0~2はプレイヤー自領なら常に閲覧可、3ならプレイヤー自領でも非表示で選択不可)
  シナリオタイトルをデータ1に変更
  城1と城2の間の経路を、隠す(データ1=1)または復活(データ1=0)する
  大名1を不可侵にする(データ1=1)、または不可侵解除(データ1=0)する
  データ1 = データ2
  データ1 ≠ データ2
  データ1 > データ2
  データ1 ≧ データ2
  データ1 < データ2
  データ1 ≦ データ2
  変数(データ1)に演算式(データ2)を代入(条件には無関係)
  大名Aが独立大名
  大名Aが従属・臣従大名(主家は特定しない)
  大名Aが従属大名(主家は特定しない)
  大名Aが臣従大名(主家は特定しない)
  大名Aが大名Bの従属・臣従大名
  大名Aが大名Bの従属大名
  大名Aが大名Bの臣従大名
  大名Aが大名Bの従属・臣従大名ではない
  大名Aが大名Bの従属大名ではない
  大名Aが大名Bの臣従大名ではない
  大名Aと大名Bが敵対
  大名Aと大名Bが非敵対(不戦同盟・従属・臣従)
  大名Aと大名Bの城(臣従含む)が隣接
  大名Aと大名Bの城(臣従含む)が隣接していない
  大名Aが滅亡済み
  大名Aが生存している
  城Aが大名A(従属・臣従大名含まず)の所有
  城Aが大名A(従属大名含まず・臣従大名含む)の所有
  城Aが大名A(従属・臣従大名含む)の所有
  城Aが大名A(従属・臣従大名含まず)の所有ではない
  城Aが大名A(従属大名含まず・臣従大名含む)の所有ではない
  城Aが大名A(従属・臣従大名含む)の所有ではない
  武将Aが存在している(登場済みで死亡していない)
  武将Aが存在していない(未登場か死亡済み)
  武将Aが未登場
  武将Aが死亡済み
  武将Aが大名Aに所属
  武将Aが大名A以外に所属
  武将Aが当主(大名を特定しない)
  武将Aが当主ではない(大名を特定しない)
  武将Aが大名Aの当主
  武将Aが大名Aの当主ではない
  武将Aが城A内に在城
  武将Aが城A内には居ない
  大名Aがプレイヤー担当ではない
  大名Aがプレイヤー担当
  武将Aがプレイヤー担当大名家の武将ではない
  武将Aがプレイヤー担当大名家の武将
  城Aが包囲されている
  城Aが包囲されていない
  質問文(データB)を表示し、YESが選択された
  質問文(データB)を表示し、NOが選択された

このページは以下のブログより転載し、一部改変して作成している。

  • 条件イベント概要.txt
  • 最終更新: 2020/07/29 23:51
  • (外部編集)