【C++】ノベルゲームのスクリプト - その2

前回に引き続きスクリプトについて考えてみる。

 

前回はデータを受け取る構造体だけを考えたので、今回はそれにデータを受け渡す方法を考えようと思う。(いちいち構造体のデータを記述するのは面倒なため)

 

まず初めに思いついたのはExcelファイルを読み込むこと。

横で要素数、縦でデータ内容を統一すれば管理が楽だからだ。

問題は、Microsoftさんのライセンス品であるExcelのデータを読み込むのは骨が折れそうなのと、完成後に一般公開しようと思っているため利用するときに何かの有料アプリケーションが必須という事態は避けたいというという方針に反すること。

 

そこでまた色々調べてみるとCSVファイルなるものがあるらしい。

曰く、Excelで言うところの横列が行・縦列はその行の中で「,」で区切って表現されるらしい。

これを利用すればデータの入力は楽になるのではないだろうか。

 

前回のコードを再掲

struct Script{

    char* Name;
    char* Message;
    int BGIHandle;
    int PersonHandle;
    int BGMHandle;

};

Script *p = new Script;

メンバ変数は5つ。

 

// CSVファイルから読み込んだデータをScript構造体に設定
void SetScript(struct Script* pScript, const char* Str) {
    int i = 0, Start = 1, Size;
    char* pStr,pResource;
    char Buff[100];

    for (i = 0; i < 5; ++i) {
        // ","を探す
        pStr = strstr(&Str[start], "\",\"");
        if (pStr == NULL )
            // ","がない場合、最後の"を探す
            pStr = strstr(&str[start], "\"\n");
        size = pStr - &str[start];

        switch (i) {
            case 0:
                // 発言者
                strncpy(pScript->Name, &str[start], size);
                break;
            case 1:
                // メッセージ
                strncpy(pScript->Message, &str[start], size);
                break;
            case 2:
                // 背景画像
                strncpy(pResource, &str[start], size);
                pScript->BGIHandle = LoadGraph(pResource);
                break;
            case 3:
                // キャラ画像
                strncpy(pResource, &str[start], size);
                pScript->PersonHandle = LoadGraph(pResource);
                break;
            case 4:
                // BGM
                strncpy(pResource, &str[start], size);
                pScript->BGMHandle = LoadSoundMem(pResource);
                break;
            default :
                break;
        }
        start = start + size + 3;
    }
}

という関数を組んで、引数に構造体配列の要素とCSVファイルを1行づつ渡して、EOFまでループしてあげればいいはず。
ファイル読み込みにはfgets()関数を使えばいいかな。
fgets()に渡すバッファサイズとかは適宜調整してくださいな。

 

これでCSVファイルで書かれた原稿を渡すだけでScript構造体が使えるはず。(検証自体は未済、あくまでもアイデアのメモですので。)

毎回CSVの原稿を読み込むのは面倒だし、構造体のデータを書き出せるようにして、書きだしたデータをエンジン側で読み込めればいいのかなぁ。

 

次回はその構造体のファイル書き出しによるデータ保持について纏めようと思う。

 

......ということは、これはスクリプト生成用のプログラムであってエンジンそのものには搭載されない気ががががが

まぁ、一緒にパッケージングして配布とかになるかなぁ、(俺主観でだけど)需要はありそうだし。

 

2014/11/14 Fri.

 

以下、参考サイト様

CSVとは 〔 カンマ区切り 〕 【 Comma-Separated Values 】 - 意味/解説/説明/定義 : IT用語辞典
ちゃぱてぃ商店IT部 @ ウィキ - C言語/サンプル/CSVファイルの読込ソート出力