ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/socket/sounds.C
Revision: 1.22
Committed: Wed Aug 1 01:07:42 2007 UTC (16 years, 10 months ago) by root
Content type: text/plain
Branch: MAIN
Changes since 1.21: +7 -3 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.13 /*
2 root 1.14 * This file is part of Crossfire TRT, the Roguelike Realtime MORPG.
3 root 1.13 *
4     * Copyright (©) 2005,2006,2007 Marc Alexander Lehmann / Robin Redeker / the Crossfire TRT team
5     * Copyright (©) 2002,2007 Mark Wedel & Crossfire Development Team
6     * Copyright (©) 1992,2007 Frank Tore Johansen
7     *
8 root 1.14 * Crossfire TRT is free software: you can redistribute it and/or modify
9     * it under the terms of the GNU General Public License as published by
10     * the Free Software Foundation, either version 3 of the License, or
11     * (at your option) any later version.
12 root 1.13 *
13 root 1.14 * This program is distributed in the hope that it will be useful,
14     * but WITHOUT ANY WARRANTY; without even the implied warranty of
15     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16     * GNU General Public License for more details.
17 root 1.13 *
18 root 1.14 * You should have received a copy of the GNU General Public License
19     * along with this program. If not, see <http://www.gnu.org/licenses/>.
20 root 1.13 *
21     * The authors can be reached via e-mail to <crossfire@schmorp.de>
22     */
23    
24 elmex 1.1 /* Send bug reports to Raphael Quinet (quinet@montefiore.ulg.ac.be) */
25    
26     /**
27     * \file
28     * Sound-related functions.
29     *
30     * \date 2003-12-02
31     */
32    
33     #include <global.h>
34     #include <sproto.h>
35     #include <sounds.h>
36    
37 root 1.15 #include <tr1/unordered_map>
38    
39 elmex 1.1 /**
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 root 1.21 #define MAX_SOUND_DISTANCE 16
45 elmex 1.1
46 root 1.15 // the hashtable
47     typedef std::tr1::unordered_map
48     <
49     const char *,
50     faceidx,
51     str_hash,
52     str_equal,
53     slice_allocator< std::pair<const char *const, faceidx> >
54     > HT;
55    
56     static HT ht;
57    
58     faceidx
59     sound_find (const char *str)
60     {
61     auto (i, ht.find (str));
62    
63 root 1.22 if (i != ht.end ())
64     return i->second;
65    
66     //TODO: really fall back to face name?
67     char face[128];
68     snprintf (face, 128, "sound/%s", str);
69     return face_find (face);
70 root 1.15 }
71    
72     void
73     sound_set (const char *str, faceidx face)
74     {
75     auto (i, ht.find (str));
76    
77     if (i != ht.end ())
78     i->second = face;
79     else
80     ht.insert (std::make_pair (strdup (str), face));
81     }
82    
83 root 1.17 //TODO: remove
84     // for gcfclient-compatibility, to vanish at some point
85     faceidx old_sound_index [SOUND_CAST_SPELL_0];
86    
87 root 1.15 /*
88 elmex 1.1 * Plays a sound for specified player only
89     */
90 root 1.3 void
91 root 1.15 client::play_sound (faceidx sound, int dx, int dy)
92 elmex 1.1 {
93 root 1.15 if (!sound)
94 root 1.3 return;
95 root 1.6
96 root 1.21 if (dx < -MAX_SOUND_DISTANCE || dx > MAX_SOUND_DISTANCE) return;
97     if (dy < -MAX_SOUND_DISTANCE || dy > MAX_SOUND_DISTANCE) return;
98 root 1.20
99 root 1.16 if (fx_want [FT_SOUND])
100 root 1.15 {
101     // cfplus
102     send_face (sound);
103     flush_fx ();
104 elmex 1.1
105 root 1.21 uint8 vol = clamp (255 - idistance (dx, dy) * 361 / MAX_SOUND_DISTANCE, 0, 255);
106 root 1.18
107     // cut off volume here
108 root 1.21 if (vol < 8)
109 root 1.18 return;
110    
111 root 1.15 packet sl ("sc");
112 root 1.6
113 root 1.15 uint8 *len = sl.cur;
114 root 1.6
115 root 1.15 sl << uint8 (0) // group length
116     << uint8 (0) // type == one-time effect
117     << ber32 (sound)
118     << sint8 (dx)
119 root 1.18 << sint8 (dy)
120 root 1.19 << uint8 (vol); // 0 == silent, 255 max
121 elmex 1.1
122 root 1.15 *len = sl.cur - len; // patch in group length
123 elmex 1.1
124 root 1.15 send_packet (sl);
125 elmex 1.1 }
126 root 1.16 else if (this->sound)
127     {
128 root 1.17 //TODO: remove, or make bearable
129 root 1.16 // gcfclient compatibility
130    
131 root 1.17 int gcfclient_sound;
132     for (gcfclient_sound = SOUND_CAST_SPELL_0; gcfclient_sound--; )
133     if (old_sound_index [gcfclient_sound] == sound)
134     {
135     packet sl ("sound");
136    
137     sl << uint8 (dx)
138     << uint8 (dy)
139     << uint16 (gcfclient_sound)
140     << uint8 (SOUND_NORMAL);
141 root 1.16
142 root 1.17 send_packet (sl);
143 root 1.16
144 root 1.17 break;
145     }
146 root 1.16 }
147 elmex 1.1 }
148 root 1.15