1 #include "xr_level_snd_static.h"
2 #include "xr_reader.h"
3 #include "xr_writer.h"
4 #include "xr_ini_file.h"
5 #include "xr_utils.h"
6 
7 using namespace xray_re;
8 
~xr_level_snd_static()9 xr_level_snd_static::~xr_level_snd_static()
10 {
11 	delete_elements(m_sound_srcs);
12 }
13 
operator ()read_sound_src14 struct read_sound_src { void operator()(sound_src_data*& _sound_src, xr_reader& r) const {
15 	sound_src_data* sound_src = new sound_src_data;
16 	_sound_src = sound_src;
17 	bool compressed;
18 	size_t size = r.find_chunk(0, &compressed);
19 	xr_assert(size && !compressed);
20 	r.r_sz(sound_src->name);
21 	r.r_fvector3(sound_src->position);
22 	sound_src->volume = r.r_float();
23 	sound_src->freq = r.r_float();
24 	r.r_i32vector2(sound_src->active_time);
25 	r.r_i32vector2(sound_src->play_time);
26 	r.r_i32vector2(sound_src->pause_time);
27 }};
28 
load(xr_reader & r)29 void xr_level_snd_static::load(xr_reader& r)
30 {
31 	r.r_chunks(m_sound_srcs, read_sound_src());
32 }
33 
load(const xr_ini_file & ini)34 void xr_level_snd_static::load(const xr_ini_file& ini)
35 {
36 	if (!ini.section_exist("static_sounds"))
37 		return;
38 	m_sound_srcs.reserve(ini.line_count("static_sounds"));
39 	const char* value;
40 	for (size_t i = 0; ini.r_line("static_sounds", i, 0, &value); ++i) {
41 		char snd_name[128];
42 		float x, y, z;
43 #if defined(_MSC_VER) && _MSC_VER >= 1400
44 		if (4 == sscanf_s(value, "%s,%f,%f,%f", snd_name, sizeof(snd_name), &x, &y, &z)) {
45 #else
46 		// FIXME!!!
47 		if (4 == sscanf(value, "%s,%f,%f,%f", snd_name, &x, &y, &z)) {
48 #endif
49 			sound_src_data* sound_src = new sound_src_data;
50 			sound_src->name = snd_name;
51 			sound_src->position.set(x, y, z);
52 			sound_src->volume = 1.f;
53 			sound_src->freq = 1.f;
54 			sound_src->active_time.set(0, 0);
55 			sound_src->play_time.set(0, 0);
56 			sound_src->pause_time.set(0, 0);
57 			m_sound_srcs.push_back(sound_src);
58 		}
59 	}
60 }
61 
62 struct write_sound_src { void operator()(const sound_src_data* sound_src, xr_writer& w) const {
63 	w.open_chunk(0);
64 	w.w_sz(sound_src->name);
65 	w.w_fvector3(sound_src->position);
66 	w.w_float(sound_src->volume);
67 	w.w_float(sound_src->freq);
68 	w.w_i32vector2(sound_src->active_time);
69 	w.w_i32vector2(sound_src->play_time);
70 	w.w_i32vector2(sound_src->pause_time);
71 }};
72 
73 void xr_level_snd_static::save(xr_writer& w) const
74 {
75 	w.w_chunks(m_sound_srcs, write_sound_src());
76 }
77