ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/deliantra/server/socket/sounds.C
Revision: 1.27
Committed: Mon Oct 12 14:00:59 2009 UTC (14 years, 8 months ago) by root
Content type: text/plain
Branch: MAIN
CVS Tags: rel-2_82, rel-2_81
Changes since 1.26: +7 -6 lines
Log Message:
clarify license

File Contents

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