mrubyに記述しているテーブルデータを、ScenarioMod側へと読み込んでみましょう。
ScenarioModでは、mrb_state* 型のmrbというグローバル変数がすでに登録されています。
又、mrubyに最初から付属しているヘッダーファイルは、ほぼ全て読み込まれていますので、
mrubyの様々なWeb上の情報をそのまま利用しやすいでしょう。
以下のように対象となるtxtファイルを「天翔記フォルダ」に用意します。
(BushouData.txt)側data_list = [ {'名前'=>"武田信玄" , '政治'=>100, '戦闘'=> 90, '智謀'=>80}, {'名前'=>"上杉謙信" , '政治'=>70, '戦闘'=>120, '智謀'=>70}, {'名前'=>"北条氏康" , '政治'=>105, '戦闘'=> 80, '智謀'=>90}, ] for data in data_list do ImportBushouData( data['名前'], data['政治'], data['戦闘'], data['智謀'] ) end
この取り込み用の「ImportBushouData」という関数をScenarioModに用意してやれば良いのです。
struct myパラメタ型 { string 名前; int 政治; int 戦闘; int 智謀; }; vector<myパラメタ型> vBushouDataList; // ImportBushouData に相当する関数。1人分のデータを受け取って、そのままC++内の配列へと付け足す。 static mrb_value mrb_ImportBushouData(mrb_state *mrb, mrb_value self) { myパラメタ型 data; mrb_value 名前; mrb_int 政治; mrb_int 戦闘; mrb_int 智謀; mrb_get_args(mrb, "Siii", &名前, &政治, &戦闘, &智謀); // S=String, i=整数 f=浮動小数 data.名前 = RSTRING_PTR(名前); // RObjectという共用の型をchar*と見なして~ data.政治 = 政治; data.戦闘 = 戦闘; data.智謀 = 智謀; // C++内のリスト変数にdata追加 vBushouDataList.push_back(data); // selfを返す。 return self; } void カスタム::On_起動時() { struct RClass *krnm; krnm = mrb->kernel_module; /* ココ2行は関数を特定のクラス内ではなく、グローバルに登録するため。*/ mrb_define_method(mrb, krnm, "ImportBushouData", mrb_ImportBushouData, MRB_ARGS_REQ(4)); // 関数登録。引数4つだよ try { MRUBY::Do_ファイル("BushouData.txt"); } catch (...) {} for each(myパラメタ型 data in vBushouDataList) { デバッグ出力 << data.名前 << endl; デバッグ出力 << data.政治 << endl; デバッグ出力 << data.戦闘 << endl; デバッグ出力 << data.智謀 << endl; デバッグ出力 << string(20, '-') << endl; } }
というように、比較的簡潔なプログラムとなりました。
ファイルを読み込むよりも先に「ImportBushouData」という関数をmrbへと登録します。
そして、ファイルを読み込み、実行すれば、forループと、ImportBushouData 関数により、データが終わるまで、取得されることがわかるでしょうか。
このように独自の関数を登録を上手く利用すれば、プログラムの見通しをよくすることが可能となります。