예제 #1
0
ArrayT<const SoundShaderT*> SoundShaderManagerImplT::RegisterSoundShaderScript(const std::string& ScriptFile, const std::string& ModDir)
{
    ArrayT<const SoundShaderT*> NewSoundShaders;

    // Check if script has already been loaded and return empty sound shader array if this is the case.
    for (unsigned long Nr=0; Nr<m_SoundShaderScriptFiles.Size(); Nr++)
        if (m_SoundShaderScriptFiles[Nr]==ScriptFile) return NewSoundShaders;

    m_SoundShaderScriptFiles.PushBack(ScriptFile);

    // Get sound shaders from the script.
    TextParserT TextParser(ScriptFile.c_str(), "({[]}),");

    try
    {
        while (!TextParser.IsAtEOF())
        {
            const std::string Token=TextParser.GetNextToken();

            // If the sound shader cannot be parsed (e.g. due to a syntax error or unknown token),
            // the parsing of the entire file is aborted - the file might be something else than a sound shader script.
            // Even if it was, we cannot easily continue anyway.

            SoundShaderT*  NewSoundShader=new SoundShaderT(Token, TextParser, ModDir);
            SoundShaderT*& TestShader    =m_SoundShaders[NewSoundShader->Name];

            // Check if sound shader with this name already exists.
            if (TestShader==NULL)
            {
                TestShader=NewSoundShader;
                NewSoundShaders.PushBack(NewSoundShader);
            }
            else
            {
                std::cout << "File '"<< ScriptFile << "' sound shader '" << NewSoundShader->Name << "' duplicate definition (ignored).\n";
                delete NewSoundShader;
            }
        }
    }
    catch (const TextParserT::ParseError&)
    {
        std::cout << "Error parsing '" << ScriptFile << "' at input byte " << TextParser.GetReadPosByte() << "\n";
    }

    return NewSoundShaders;
}
예제 #2
0
파일: kizuato.c 프로젝트: catmirrors/xlvns
void 
KizuatoMain(Lvns *lvns)
{
    KizuatoState *state = (KizuatoState *)lvns->system_state;
	KizuatoStartScenario(lvns);

	while(1) {

		lvns->inside_state = LVNS_MAIN;

		/* セーブポイント設定 */
		if (lvns->savepoint_flag) {
			LvnsSetSavePoint(lvns, &lvns->savepoint);
			memcpy(state->flag_save, state->flag, sizeof state->flag);
			lvns->savepoint_flag = False;
		}

		/* メニュー起動 */


        switch (c[0]) {
        case 0x20: /* 終了 */
            dprintf((stderr, "[END]\n"));
            c ++;
			return;

        case 0x24: /* ジャンプ命令 */
            dprintf((stderr, "[ジャンプ SCN%03d.DAT - Block %d]\n", c[1], c[2]));
            LvnsLoadScenario(lvns, c[1], c[2]);
			break;

        case 0x25: /* 選択肢 */
			dprintf((stderr, "[選択肢(%d)]-[メッセージ:%d]\n", c[2], c[1]));
            {
                int i;
				TextParser(lvns, c[1], True);
                for (i = 0; i < c[2]; i++) {
                    dprintf((stderr,
                             "[選択肢 %d]-[メッセージ:%d]-[オフセット:%02x]\n",
                             i, c[3 + i*2], c[4 + i*2]));
					lvns->text_attr = i+1;
					TextParser(lvns, c[3+i*2], False);
                }
				lvns->text_attr = 0;
				i = LvnsWaitSelect(lvns, c[2]);
				LvnsAddHistory(lvns, c[3+i*2]);
				
				dprintf((stderr, "選択分岐: %d (+%02x)\n", i, c[4 + i*2]));

				c = c + 3 + c[2] * 2 + c[4 + i*2];
            }
            break;

        case 0x27:
            dprintf((stderr, "[前の選択肢に戻るマーク位置]\n"));
			/* 状態を保存… */
            LvnsSetSavePoint(lvns, &lvns->selectpoint);
            memcpy(state->flag_select, state->flag, sizeof state->flag);
            c ++;
            break;

        case 0x41: /* if 文 */
            dprintf((stderr, "[if flg:%02x == 0x%02x pc += %02x]\n", 
                     c[1], c[2], c[3]));
            if (state->flag[flagmap(c[1])] == c[2])
                lvns->scn_cur += c[3];
            c += 4;
            break;

        case 0x42: /* if 文 (否定) */
            dprintf((stderr, "[if flg:%02x != 0x%02x pc += %02x]\n", 
                     c[1], c[2], c[3]));
            if (state->flag[flagmap(c[1])] != c[2])
                lvns->scn_cur += c[3];
            c += 4;
            break;

        case 0x4b: /* フラグセット */
            dprintf((stderr, "[flg:%02x = 0x%02x]\n", c[1], c[2]));
            state->flag[flagmap(c[1])] = c[2];
            c += 3;
            break;

        case 0x51: /* メッセージ出力 */
            dprintf((stderr, "[メッセージ:%d]\n", c[1])); 
			TextParser(lvns, c[1], True);
            c += 2;
            break;

        case 0x52:		/* 選択肢に存在する。無くても大丈夫か? */
            dprintf((stderr, "[謎 0x%02x]\n", c[0]));
            c ++;
            break;

        case 0x94:		/* 不明。多分引数0 */
            dprintf((stderr, "[エンディング関連 0x%02x]\n", c[0]));
            c ++;
            break;

        case 0x95: /* エンディングBGM 選択 */
            dprintf((stderr, "[エンディング BGM 開始 0x%02x] %d\n", c[0], c[1]));
            /* エンディングテーマ演奏開始 */
            LvnsStartMusic(lvns, bgmmap(c[1]));

            /* エンディング起動 */
            KizuatoEnding(lvns);

            /* 最終的なフラグを反映… */
            memcpy(state->flag_save, state->flag, sizeof state->flag);

            /* エンディング到達につきシナリオデータ初期化 */
            KizuatoScenarioInit(lvns);
            KizuatoSave(lvns);

            c += 2;
            break;

        case 0x96: /* エンディング番号指定 */
            dprintf((stderr, "[エンディング番号指定0x%02x] %d\n", c[0], c[1]));
/*
   0  25 千鶴 True 
   8  24 楓 Happy
   10 23 柳川 END
   15 23 ガチャピンエンド
   16 15 食卓
*/
            state->ending[c[1]] = 1;
            {
                int i;
                for (i=0; i<sizeof state->ending;i++) {
                    if (state->ending[i])
                        break;
                }
                if (i == sizeof state->ending) {
                    state->flag[flagmap(0x73)] = 1;
                }
            }
            c += 2;
            break;

        default:
            if (CommandParser(lvns, &lvns->scn_cur, False))
				return;
        }
    } /* while(1) */
}