… | |
… | |
33 | #include <global.h> |
33 | #include <global.h> |
34 | #include <sproto.h> |
34 | #include <sproto.h> |
35 | #include <sounds.h> |
35 | #include <sounds.h> |
36 | |
36 | |
37 | #include <tr1/unordered_map> |
37 | #include <tr1/unordered_map> |
38 | |
|
|
39 | /** |
|
|
40 | * Maximum distance a player may hear a sound from. |
|
|
41 | * This is only used for new client/server sound. If the sound source |
|
|
42 | * on the map is farther away than this, we don't sent it to the client. |
|
|
43 | */ |
|
|
44 | #define MAX_SOUND_DISTANCE 16 |
|
|
45 | |
38 | |
46 | // the hashtable |
39 | // the hashtable |
47 | typedef std::tr1::unordered_map |
40 | typedef std::tr1::unordered_map |
48 | < |
41 | < |
49 | const char *, |
42 | const char *, |
… | |
… | |
91 | client::play_sound (faceidx sound, int dx, int dy) |
84 | client::play_sound (faceidx sound, int dx, int dy) |
92 | { |
85 | { |
93 | if (!sound) |
86 | if (!sound) |
94 | return; |
87 | return; |
95 | |
88 | |
96 | if (dx < -MAX_SOUND_DISTANCE || dx > MAX_SOUND_DISTANCE) return; |
89 | uint8 vol = 255 - idistance (dx, dy) * 255 / MAX_SOUND_DISTANCE; |
97 | if (dy < -MAX_SOUND_DISTANCE || dy > MAX_SOUND_DISTANCE) return; |
90 | |
|
|
91 | // cut off volume here |
|
|
92 | if (vol <= 0) |
|
|
93 | return; |
98 | |
94 | |
99 | if (fx_want [FT_SOUND]) |
95 | if (fx_want [FT_SOUND]) |
100 | { |
96 | { |
101 | // cfplus |
97 | // cfplus |
102 | send_face (sound); |
98 | send_face (sound); |
103 | flush_fx (); |
99 | flush_fx (); |
104 | |
|
|
105 | uint8 vol = clamp (255 - idistance (dx, dy) * 361 / MAX_SOUND_DISTANCE, 0, 255); |
|
|
106 | |
|
|
107 | // cut off volume here |
|
|
108 | if (vol < 8) |
|
|
109 | return; |
|
|
110 | |
100 | |
111 | packet sl ("sc"); |
101 | packet sl ("sc"); |
112 | |
102 | |
113 | uint8 *len = sl.cur; |
103 | uint8 *len = sl.cur; |
114 | |
104 | |