std::string GameTable::tableInfo(){ MutexLockGuard lock(mutex); std::string res = uitos(tableId) + "\n" + uitos(pos) + "\n" + uitos(users.size()) + "\n"; for(std::set<User*>::iterator it = users.begin(); it != users.end(); it++){ res += (*it)->getName() + "\n"; } return res; }
std::string GameTable::allTables(){ MutexLockGuard lock(mutexNum); std::string all = uitos(tables.size()) + "\n"; for(std::map<int, TablePtr>::iterator it = tables.begin(); it != tables.end(); it++){ all += it->second->tableInfo(); } return all; }
bool Satori::Save(bool isOnUnload) { GetSender().next_event(); // メンバ変数を里々変数化 for (std::map<int, string>::iterator it=reserved_talk.begin(); it!=reserved_talk.end() ; ++it) variables[string("次から")+itos(it->first)+"回目のトーク"] = it->second; // 起動時間累計を設定 variables["ゴースト起動時間累計秒"] = uitos(posix_get_current_sec() - sec_count_at_load + sec_count_total,"%lu"); // (互換用) variables["ゴースト起動時間累計ミリ秒"] = uitos((posix_get_current_sec() - sec_count_at_load + sec_count_total)*1000,"%lu"); variables["ゴースト起動時間累計(ms)"] = uitos((posix_get_current_sec() - sec_count_at_load + sec_count_total)*1000,"%lu"); if ( isOnUnload ) { secure_flag = true; (void)GetSentence("OnSatoriUnload"); } string theFullPath = mBaseFolder + "satori_savedata.tmp"; std::ofstream out(theFullPath.c_str()); bool temp = GetSender().is_validated(); GetSender().validate(); GetSender().sender() << "saving " << theFullPath << "... " ; GetSender().validate(temp); if ( !out.is_open() ) { GetSender().sender() << "failed." << std::endl; return false; } string line = "*セーブデータ"; string data; out << ENCODE(line) << std::endl; for (strmap::const_iterator it=variables.begin() ; it!=variables.end() ; ++it) { string str = zen2han(it->first); if ( str[0]=='S' && aredigits(str.c_str()+1) ) { continue; } if ( str == "今回は喋らない" || str == "今回は会話時サーフェス戻し" || str == "今回は会話時サーフィス戻し" || str == "今回は自動アンカー" ) { continue; } data = it->second; replace(data,"φ","φφ"); replace(data,"(","φ("); replace(data,")","φ)"); m_escaper.unescape_for_dic(data); string line = string("$")+it->first+"\t"+data; // 変数を保存 out << ENCODE(line) << std::endl; } for (std::map<string, std::vector<Word> >::const_iterator i=mAppendedWords.begin() ; i!=mAppendedWords.end() ; ++i ) { if ( ! i->second.empty() ) { out << std::endl << ENCODE( string("@") + i->first ) << std::endl; for (std::vector<Word>::const_iterator j=i->second.begin() ; j!=i->second.end() ; ++j ) { out << ENCODE( *j ) << std::endl; } } } out.flush(); out.close(); GetSender().sender() << "ok." << std::endl; //バックアップ string realFullPath = mBaseFolder + "satori_savedata." + (fEncodeSavedata?"sat":"txt"); string realFullPathBackup = mBaseFolder + "satori_savebackup." + (fEncodeSavedata?"sat":"txt"); #ifdef POSIX unlink(realFullPathBackup.c_str()); rename(realFullPath.c_str(),realFullPathBackup.c_str()); rename(theFullPath.c_str(),realFullPath.c_str()); #else ::DeleteFile(realFullPathBackup.c_str()); ::MoveFile(realFullPath.c_str(),realFullPathBackup.c_str()); ::MoveFile(theFullPath.c_str(),realFullPath.c_str()); #endif //いらないほうを消す string delFullPath = mBaseFolder + "satori_savedata." + (fEncodeSavedata?"txt":"sat"); string delFullPathBackup = mBaseFolder + "satori_savebackup." + (fEncodeSavedata?"txt":"sat"); #ifdef POSIX unlink(delFullPath.c_str()); unlink(delFullPathBackup.c_str()); #else ::DeleteFile(delFullPath.c_str()); ::DeleteFile(delFullPathBackup.c_str()); #endif return true; }