void save_cross_table (IWriter &stream) { stream.w_u32 (m_cross_table.size() + sizeof(u32)); m_cross_table.seek (0); stream.w (m_cross_table.pointer(),m_cross_table.size()); m_cross_table.clear (); }
void CALifeStorageManager::save (LPCSTR save_name_no_check, bool update_name) { LPCSTR game_saves_path = FS.get_path("$game_saves$")->m_Path; string_path save_name; strncpy_s (save_name, sizeof(save_name), save_name_no_check, sizeof(save_name)-5-xr_strlen(SAVE_EXTENSION)-xr_strlen(game_saves_path)); xr_strcpy (g_last_saved_game, save_name); string_path save; xr_strcpy (save,m_save_name); if (save_name) { strconcat (sizeof(m_save_name), m_save_name, save_name, SAVE_EXTENSION); } else { if (!xr_strlen(m_save_name)) { Log ("There is no file name specified!"); return; } } u32 source_count; u32 dest_count; void *dest_data; { CMemoryWriter stream; header().save (stream); time_manager().save (stream); spawns().save (stream); objects().save (stream); registry().save (stream); source_count = stream.tell(); void *source_data = stream.pointer(); dest_count = rtc_csize(source_count); dest_data = xr_malloc(dest_count); dest_count = rtc_compress(dest_data,dest_count,source_data,source_count); } string_path temp; FS.update_path (temp,"$game_saves$",m_save_name); IWriter *writer = FS.w_open(temp); writer->w_u32 (u32(-1)); writer->w_u32 (ALIFE_VERSION); writer->w_u32 (source_count); writer->w (dest_data,dest_count); xr_free (dest_data); FS.w_close (writer); #ifdef DEBUG Msg ("* Game %s is successfully saved to file '%s' (%d bytes compressed to %d)",m_save_name,temp,source_count,dest_count + 4); #else // DEBUG Msg ("* Game %s is successfully saved to file '%s'",m_save_name,temp); #endif // DEBUG if (!update_name) xr_strcpy (m_save_name,save); }
void CBuild::SaveTREE (IWriter &fs) { CMemoryWriter MFS; Status ("Geometry buffers..."); xr_vector<u32> remap; remap.reserve (g_tree.size()); for (u32 rid=0; rid<g_tree.size(); rid++) { OGF* o = dynamic_cast<OGF*> (g_tree[rid]); if (o) remap.push_back(rid); } std::stable_sort (remap.begin(),remap.end(),remap_order); clMsg ("remap-size: %d / %d",remap.size(),g_tree.size()); for (u32 sid=0; sid<remap.size(); sid++) { u32 id = remap[sid]; //clMsg ("%3d: subdiv: %d",sid,id); g_tree[id]->PreSave (id); } Status ("Visuals..."); fs.open_chunk (fsL_VISUALS); for (xr_vector<OGF_Base*>::iterator it = g_tree.begin(); it!=g_tree.end(); it++) { u32 idx = u32(it-g_tree.begin()); MFS.open_chunk (idx); (*it)->Save (MFS); MFS.close_chunk (); Progress (float(idx)/float(g_tree.size())); } fs.w (MFS.pointer(),MFS.size()); fs.close_chunk (); clMsg ("Average: %d verts/%d faces, 50(%2.1f), 100(%2.1f), 500(%2.1f), 1000(%2.1f), 5000(%2.1f)", g_batch_verts/g_batch_count, g_batch_faces/g_batch_count, 100.f * float(g_batch_50)/float(g_batch_count), 100.f * float(g_batch_100)/float(g_batch_count), 100.f * float(g_batch_500)/float(g_batch_count), 100.f * float(g_batch_1000)/float(g_batch_count), 100.f * float(g_batch_5000)/float(g_batch_count) ); mem_Compact (); SaveGEOMs ("level.geom", g_VB,g_IB,g_SWI); // Normal SaveGEOMs ("level.geomx", x_VB,x_IB,x_SWI); // Fast-Path Status ("Shader table..."); fs.open_chunk (fsL_SHADERS); fs.w_u32 (g_Shaders.size()); for (xr_vector<LPCSTR>::iterator T=g_Shaders.begin(); T!=g_Shaders.end(); T++) fs.w_stringZ (*T); fs.close_chunk (); //mem_Compact (); }
void CSoundManager::MakeGameSound(ESoundThumbnail* THM, LPCSTR src_name, LPCSTR game_name) { VerifyPath(game_name); CMemoryWriter F; F.w_u32 (OGG_COMMENT_VERSION); F.w_float (THM->m_fMinDist); F.w_float (THM->m_fMaxDist); F.w_float (THM->m_fBaseVolume); F.w_u32 (THM->m_uGameType); F.w_float (THM->m_fMaxAIDist); if (!ogg_enc(src_name,game_name, THM->m_fQuality,F.pointer(),F.size())){ FS.file_delete(game_name); ELog.DlgMsg(mtError,"Can't make game sound '%s'.",game_name); } }
void CBuild::SaveSectors(IWriter& fs) { CMemoryWriter MFS; Status("Processing..."); // validate & save for (u32 I=0; I<g_sectors.size(); I++) { MFS.open_chunk(I); g_sectors[I]->Validate(); g_sectors[I]->Save(MFS); MFS.close_chunk(); Progress(float(I)/float(g_sectors.size())); } fs.w_chunk(fsL_SECTORS,MFS.pointer(),MFS.size()); }
bool manager::save_current_blend(char* buffer, u32 const& buffer_size) { CInifile temp(0, FALSE, FALSE, FALSE); using editor::environment::weathers::time; time* frame = static_cast<time*>(m_manager.CurrentEnv); frame->save(temp); CMemoryWriter writer; temp.save_as(writer); if (writer.size() > buffer_size) return (false); writer.w_u8(0); writer.seek(0); Memory.mem_copy(buffer, writer.pointer(), writer.size()); return (true); }
bool weather::save_time_frame (shared_str const& frame_id, char* buffer, u32 const& buffer_size) { container_type::iterator i = m_times.begin(); container_type::iterator e = m_times.end(); for ( ; i != e; ++i) { if (frame_id._get() != (*i)->id()._get()) continue; CInifile temp(0, FALSE, FALSE, FALSE); (*i)->save (temp); CMemoryWriter writer; temp.save_as (writer); if (writer.size() > buffer_size) return (false); writer.seek (0); Memory.mem_copy (buffer, writer.pointer(), writer.size()); return (true); } return (false); }
void ClosePack () { fs->close_chunk (); // save list bytesDST = fs->tell (); Log ("...Writing pack desc"); #ifdef MOD_COMPRESS DUMMY_STUFF* _dummy_stuff_tmp; _dummy_stuff_tmp = g_dummy_stuff; g_dummy_stuff = NULL; #endif fs->w_chunk (1|CFS_CompressMark, fs_desc.pointer(),fs_desc.size()); #ifdef MOD_COMPRESS g_dummy_stuff = _dummy_stuff_tmp; #endif Msg ("Data size: %d. Desc size: %d.",bytesDST,fs_desc.size()); FS.w_close (fs); Log ("Pack saved."); u32 dwTimeEnd = timeGetTime(); printf ("\n\nFiles total/skipped/VFS/aliased: %d/%d/%d/%d\nOveral: %dK/%dK, %3.1f%%\nElapsed time: %d:%d\nCompression speed: %3.1f Mb/s", filesTOTAL,filesSKIP,filesVFS,filesALIAS, bytesDST/1024,bytesSRC/1024, 100.f*float(bytesDST)/float(bytesSRC), ((dwTimeEnd-dwTimeStart)/1000)/60, ((dwTimeEnd-dwTimeStart)/1000)%60, float((float(bytesDST)/float(1024*1024))/(t_compress.GetElapsed_sec())) ); Msg ("\n\nFiles total/skipped/VFS/aliased: %d/%d/%d/%d\nOveral: %dK/%dK, %3.1f%%\nElapsed time: %d:%d\nCompression speed: %3.1f Mb/s\n\n", filesTOTAL,filesSKIP,filesVFS,filesALIAS, bytesDST/1024,bytesSRC/1024, 100.f*float(bytesDST)/float(bytesSRC), ((dwTimeEnd-dwTimeStart)/1000)/60, ((dwTimeEnd-dwTimeStart)/1000)%60, float((float(bytesDST)/float(1024*1024))/(t_compress.GetElapsed_sec())) ); }
void xrCompressor::OpenPack(LPCSTR tgt_folder, int num) { VERIFY (0==fs_pack_writer); string_path fname; string128 s_num; #ifdef MOD_COMPRESS strconcat (sizeof(fname),fname,tgt_folder,".xdb",itoa(num,s_num,10)); #else strconcat (sizeof(fname),fname,tgt_folder,".pack_#",itoa(num,s_num,10)); #endif unlink (fname); fs_pack_writer = FS.w_open (fname); fs_desc.clear (); aliases.clear (); bytesSRC = 0; bytesDST = 0; filesTOTAL = 0; filesSKIP = 0; filesVFS = 0; filesALIAS = 0; dwTimeStart = timeGetTime(); //write pack header without compression // DUMMY_STUFF* _dummy_stuff_subst = NULL; // _dummy_stuff_subst = g_dummy_stuff; // g_dummy_stuff = NULL; if(config_ltx && config_ltx->section_exist("header")) { CMemoryWriter W; CInifile::Sect& S = config_ltx->r_section("header"); CInifile::SectCIt it = S.Data.begin(); CInifile::SectCIt it_e = S.Data.end(); string4096 buff; xr_sprintf (buff,"[%s]",S.Name.c_str()); W.w_string (buff); for(;it!=it_e;++it) { const CInifile::Item& I = *it; xr_sprintf (buff, "%s = %s", I.first.c_str(), I.second.c_str()); W.w_string (buff); } W.seek (0); IReader R(W.pointer(), W.size()); printf ("...Writing pack header\n"); fs_pack_writer->open_chunk (CFS_HeaderChunkID); fs_pack_writer->w (R.pointer(), R.length()); fs_pack_writer->close_chunk (); }else if(pPackHeader) { printf ("...Writing pack header\n"); fs_pack_writer->open_chunk (CFS_HeaderChunkID); fs_pack_writer->w (pPackHeader->pointer(), pPackHeader->length()); fs_pack_writer->close_chunk (); }else printf ("...Pack header not found\n"); // g_dummy_stuff = _dummy_stuff_subst; fs_pack_writer->open_chunk (0); }