練習1

  • 概要

    この節では、とにかくScenarioModのソースを実際にいじくってみて、感覚をつかみます。

  • セリフの条件と内容を変更してみる

    前節のソースを見てください。

    これを少し編集することで、まずは、感覚を掴みましょう。

    string カスタム::On_噴出メッセージ直前(string 武将名, string 元メッセージ, メッセージ関連情報型 メッセージ関連情報) {
    
        if (武将名 == "真田幸隆") {
            return "マジかよ…最悪だぉ!!";
        }
    
        // 変更しない場合""
        return "";
    }
    

    まず、常に「マジかよ…最悪だぉ」と言ってるのをなんとか直したいところです。

    そうです、戦場で士気MAX時に「鼓舞」をした時のメッセージだけ、
    書き換えるようにしてみましょう!!

    でも、戦場での鼓舞とは、元々どんなメッセージだったでしょうか?

    Message.n6pをLS11Archieveで解凍するのが正確なメッセージを知る方法ですが、
    今回は練習ですので簡略的に 天翔記 Wikiに掲載されているセリフ を参照してみましょう。

    どうやら士気MAX時にいうセリフは

    「わが隊はすでに(改行)士気旺盛…鼓舞する(改行)必要…(以下メッセージが分かれる)」

    といったことになっているようです。

    天翔記内には他に似たようなメッセージもないようですから、

    わが隊はすでに(改行)士気旺盛

    ぐらいまで含まれれば、ちゃんと 士気MAX時のメッセージに絞ることが出来そうです。

    では、そうしてみましょう。

    string カスタム::On_噴出メッセージ直前(string 武将名, string 元メッセージ, メッセージ関連情報型 メッセージ関連情報) {
    
      if (武将名 == "真田幸隆") {
    
        if (Is_文字列マッチ(元メッセージ, "わが隊はすでに\x0A士気旺盛")) {
          return "士気旺盛じゃ!?";
        }
      }
    
      // 変更しない場合""
      return "";
    }
    
        

    プログラム未経験者の方は、いきなりのことで「げげ!!」と思われる方もいるかもしれません。

    しかし、 「メッセージ中に『ほげほげ』な文字が含まれる」というのは、このように書くものだ と覚えてしまうのも手でしょう。

    \x0A 』は(エン エックス ゼロ エー)となります。(オー エー)ではないので注意して下さい。

  • 動作の確認

    さて、

    • 再び「Release」でビルドして、
    • エラーが出ていないことを確認して
    • ScenarioMod.dllを天翔記ディレクトリにコピーしましょう。
    • 天翔記を起動させたままだとコピー出来ないので注意しましょう。

    このあたりは、「ビルド」の項目を見返して下さい。

    セーブデータエディタなどで、真田幸隆の兵士を100、兵士の忠誠度(=士気)を98など、動作を確認しやすい状況にして、確認してみましょう。

  • 天気による条件分岐を加えてみる

    最後にこのメッセージ変更が「天気」によって内容を分岐するようにしてみましょう。

    string カスタム::On_噴出メッセージ直前(string 武将名, string 元メッセージ, メッセージ関連情報型 メッセージ関連情報) {
    
      if (武将名 == "真田幸隆") {
    
         if (Is_文字列マッチ(元メッセージ, "わが隊はすでに\x0A士気旺盛")) {
            if ( Get_天気() == 天気::晴れ ) {
                return "今日は晴天じゃ\x0A兵どもも士気旺盛じゃ";
    
            } else if ( Get_天気() == 天気::曇り ) {
                return "今日は曇りじゃ\x0A涼しくて士気旺盛じゃ";
    
            } else if ( Get_天気() == 天気::雨 ) {
                return "今日は雨じゃ\x0A潤って士気旺盛じゃ";
    
            } else if ( Get_天気() == 天気::雪 ) {
                return "今日は雪じゃ\x0Aカッチコチじゃ";
    
            }
         }
      }
    
      // 変更しない場合""
      return "";
    }
    

    行は増えましたが、難しいものではありません。

    「Get_天気()」で「現在の天候(番号)」を得て、これを「天候::○○(日本語ですが、その中身は実は番号)」と比較することで、if文で振り分けているのです。

    このあたりはまだ説明されていませんので、「へ~、そういう風に書けるんだー」程度の認識で良いでしょう。

  • 動作の確認

    さて、

    • 再び「Release」でビルドして、
    • エラーが出ていないことを確認して
    • ScenarioMod.dllを天翔記ディレクトリにコピーしましょう。
    • 天翔記を起動させたままだとコピー出来ないので注意しましょう。

    ちゃんと「真田幸隆」が士気MAX時に「鼓舞」すると、「天候」によって発言内容が変化しましたか?

    変化したことを確認出来れば、この練習項目は終了です。
    お疲れ様でした。