mrubyで書いてある「グローバル」変数を読み込む

  • 概要

      (※この章は、Lua版の ココ と対応しています。)
    • スクリプト言語「mruby」を用いて外部テキストを記述し、ScenarioMod内の変数へと読み込ませる。
      この章では、それらの機能の入門的利用方を解説します。
  • 一般的用途

    • 外部テキストファイルに、簡易な設定データ等を記述し、その値をScenarioModへと読み込む。
  • 備考

    • mrubyは外にテキストで記述する限り、基本的には「正しさが全く期待できない」。
      記述してあるかもしれないし、ないかもしれないし、記述が間違ってるかもしれない。
      事前に何もチェックできないため、実行してみなければわからないのだ。
      よって、何をやるにしても「例外エラーが」が極めて高い確率で発生しえる。

      このため、必ず try { } catch(...) { } のような記述で囲む必要がある。
      try ... catch ... を省略した場合には、1つでも例外が発生すると、天翔記は不正終了してしまうだろう。
  • 例①

    (カスタム駆動関数.cpp)
    string 読み込み変数 = "デフォ"; // この変数に、外部データから値を読み込む
    
    // 自分で定義した関数
    void Myパラメータインポート() {
        // フィアルの読み取り&実行にかかる。必ず try ... catch
        try {
            MRUBY::Do_ファイル("ScenarioMod.rb"); // ScenarioMod.rb というファイルを「mruby言語解釈」して実行する。
    
        // 何か例外エラーが発生した
        } catch (MRUBY::例外型 e) {
            デバッグ出力 << "ScenarioMod.rbで何かエラー:" << e << endl;
            return;  // このレベルでエラーしてるのはまずい。パラメタ読み取り即終了。
        }
    
        // ここまできたら、ファイルが読み込め、mrubyとしても最低限実行できたようだ。
    
        // 変数の読み取りにかかる。必ず try ... catch
        try {
            読み込み変数 = MRUBY::Get_グローバル文字列("$test_var");
        } catch(...) { }
    
        デバッグ出力 << "変数:" << 読み込み変数 << endl;
    }
    
    void カスタム::On_起動時() {
        Myパラメータインポート();
    }
    

    そして、以下のように対象となるmrubyファイルを「天翔記フォルダ」に用意する。(文字コードはcp932 ≒ shiftjisにて保存のこと)

    (ScenarioMod.rb)側
    $test_var = "ズキュキュン太"
    

    グローバル変数の読み込みは、「実数」と「文字列」の2つに対応している。

    繰り返しとなるが、必ず「try...catch...」するのが必須である。

    それを踏まえて、3種類の変数を読み込んでみよう。

  • 例②

    (カスタム駆動関数.cpp)
    int 読み込み変数1 = 0;
    double 読み込み変数2 = 1.5;
    string 読み込み変数3 = "デフォ";
    
    void インポート関数() {
        try {
            MRUBY::Do_ファイル("MySetting.txt");
        } catch (MRUBY::例外型 e) {
    
            デバッグ出力 << "MySetting.txtで何かエラー:" << e << endl;
            return; // このレベルでエラーしてるのはまずい。パラメタ読み取り即終了。
        }
    
        try {
            読み込み変数1 = (int)MRUBY::Get_グローバル数値("$test_variable"); // 返り値は小数形式の型なので、intにする
        } catch(...) { }
    
        try {
            読み込み変数2 = MRUBY::Get_グローバル数値("$test_double");
        } catch(...) { }
    
        try {
            読み込み変数3 = MRUBY::Get_グローバル文字列("$test_string");
        } catch(...) { }
    
    
        デバッグ出力 << "変数1:" << 読み込み変数1 << endl;
        デバッグ出力 << "変数2:" << 読み込み変数2 << endl;
        デバッグ出力 << "変数3:" << 読み込み変数3 << endl;
    }
    
    void カスタム::On_起動時() {
        インポート関数();
    }
    

    そして、以下のように対象となるtxtファイルを「天翔記フォルダ」に用意する。

    (MySetting.txt)側
    $test_variable = "5.7"       # Luaとは異なり、mrubyでは、暗黙の「数文字」→「数値」への変換は行われない。「例外」が発生し、この値は読み込まれない。
    $test_double = "ジバニャン"  # "ジバニャン"を「実数」として解釈することは不可能である。「例外」が発生し、読み込み代入は行われないであろう。
    $test_string = 13.55         # Luaとは異なり、mrubyでは、暗黙の「数値」→「数文字」への変換は行われない。 「例外」が発生し、この値は読み込まれない。