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; }
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) */ }